From ebe46c0580bf397dad6e8e8abc72aca1875f76cc Mon Sep 17 00:00:00 2001 From: Sonja Krause-Harder Date: Thu, 6 Aug 2020 21:30:24 +0200 Subject: [PATCH 001/113] Make test less brittle when registry is changed. (#74554) --- x-pack/test/ingest_manager_api_integration/apis/epm/list.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts index 0b6a37d77387e..bfe1954e46c9f 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts @@ -29,7 +29,7 @@ export default function ({ getService }: FtrProviderContext) { return response.body; }; const listResponse = await fetchPackageList(); - expect(listResponse.response.length).to.be(8); + expect(listResponse.response.length).not.to.be(0); } else { warnAndSkipTest(this, log); } From e807ddd1c1f8edcb0708fe2f365c511557986435 Mon Sep 17 00:00:00 2001 From: Chris Roberson Date: Thu, 6 Aug 2020 15:33:24 -0400 Subject: [PATCH 002/113] [Monitoring] Handle getClient call throwing an exception (#74550) * This call can throw an exception in dist builds with ssl disabled * Fix typo --- .../lib/cluster/get_clusters_from_request.js | 106 +++++++++--------- x-pack/plugins/monitoring/server/plugin.ts | 18 ++- 2 files changed, 70 insertions(+), 54 deletions(-) diff --git a/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_from_request.js b/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_from_request.js index 18db738bba38e..16d42d896ca11 100644 --- a/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_from_request.js +++ b/x-pack/plugins/monitoring/server/lib/cluster/get_clusters_from_request.js @@ -119,65 +119,67 @@ export async function getClustersFromRequest( // add alerts data if (isInCodePath(codePaths, [CODE_PATH_ALERTS])) { const alertsClient = req.getAlertsClient(); - for (const cluster of clusters) { - const verification = verifyMonitoringLicense(req.server); - if (!verification.enabled) { - // return metadata detailing that alerts is disabled because of the monitoring cluster license - cluster.alerts = { - alertsMeta: { - enabled: verification.enabled, - message: verification.message, // NOTE: this is only defined when the alert feature is disabled - }, - list: {}, - }; - continue; - } + if (alertsClient) { + for (const cluster of clusters) { + const verification = verifyMonitoringLicense(req.server); + if (!verification.enabled) { + // return metadata detailing that alerts is disabled because of the monitoring cluster license + cluster.alerts = { + alertsMeta: { + enabled: verification.enabled, + message: verification.message, // NOTE: this is only defined when the alert feature is disabled + }, + list: {}, + }; + continue; + } + + // check the license type of the production cluster for alerts feature support + const license = cluster.license || {}; + const prodLicenseInfo = checkLicenseForAlerts( + license.type, + license.status === 'active', + 'production' + ); + if (prodLicenseInfo.clusterAlerts.enabled) { + cluster.alerts = { + list: await fetchStatus( + alertsClient, + req.server.plugins.monitoring.info, + undefined, + cluster.cluster_uuid, + start, + end, + [] + ), + alertsMeta: { + enabled: true, + }, + }; + continue; + } - // check the license type of the production cluster for alerts feature support - const license = cluster.license || {}; - const prodLicenseInfo = checkLicenseForAlerts( - license.type, - license.status === 'active', - 'production' - ); - if (prodLicenseInfo.clusterAlerts.enabled) { cluster.alerts = { - list: await fetchStatus( - alertsClient, - req.server.plugins.monitoring.info, - undefined, - cluster.cluster_uuid, - start, - end, - [] - ), + list: {}, alertsMeta: { enabled: true, }, + clusterMeta: { + enabled: false, + message: i18n.translate( + 'xpack.monitoring.clusterAlerts.unsupportedClusterAlertsDescription', + { + defaultMessage: + 'Cluster [{clusterName}] license type [{licenseType}] does not support Cluster Alerts', + values: { + clusterName: cluster.cluster_name, + licenseType: `${license.type}`, + }, + } + ), + }, }; - continue; } - - cluster.alerts = { - list: {}, - alertsMeta: { - enabled: true, - }, - clusterMeta: { - enabled: false, - message: i18n.translate( - 'xpack.monitoring.clusterAlerts.unsupportedClusterAlertsDescription', - { - defaultMessage: - 'Cluster [{clusterName}] license type [{licenseType}] does not support Cluster Alerts', - values: { - clusterName: cluster.cluster_name, - licenseType: `${license.type}`, - }, - } - ), - }, - }; } } } diff --git a/x-pack/plugins/monitoring/server/plugin.ts b/x-pack/plugins/monitoring/server/plugin.ts index ed091d4b8d7a7..3aedb6831e7ab 100644 --- a/x-pack/plugins/monitoring/server/plugin.ts +++ b/x-pack/plugins/monitoring/server/plugin.ts @@ -325,8 +325,22 @@ export class Plugin { getKibanaStatsCollector: () => this.legacyShimDependencies.kibanaStatsCollector, getUiSettingsService: () => context.core.uiSettings.client, getActionTypeRegistry: () => context.actions?.listTypes(), - getAlertsClient: () => plugins.alerts.getAlertsClientWithRequest(req), - getActionsClient: () => plugins.actions.getActionsClientWithRequest(req), + getAlertsClient: () => { + try { + return plugins.alerts.getAlertsClientWithRequest(req); + } catch (err) { + // If security is disabled, this call will throw an error unless a certain config is set for dist builds + return null; + } + }, + getActionsClient: () => { + try { + return plugins.actions.getActionsClientWithRequest(req); + } catch (err) { + // If security is disabled, this call will throw an error unless a certain config is set for dist builds + return null; + } + }, server: { config: legacyConfigWrapper, newPlatform: { From 47fdd59e1c168a820260e2bd28a71843e4a0f3c1 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Thu, 6 Aug 2020 23:00:40 +0300 Subject: [PATCH 003/113] bump babel deps to support TS v4 (#74495) --- package.json | 10 +- packages/elastic-datemath/package.json | 4 +- packages/kbn-analytics/package.json | 2 +- packages/kbn-babel-preset/package.json | 16 +- packages/kbn-i18n/package.json | 4 +- packages/kbn-interpreter/package.json | 10 +- packages/kbn-optimizer/package.json | 2 +- packages/kbn-plugin-helpers/package.json | 2 +- packages/kbn-pm/package.json | 10 +- packages/kbn-test/package.json | 2 +- packages/kbn-ui-framework/package.json | 2 +- x-pack/package.json | 6 +- yarn.lock | 1289 +++++++++++----------- 13 files changed, 696 insertions(+), 663 deletions(-) diff --git a/package.json b/package.json index fa34fc3d0936a..fc3af14ecae09 100644 --- a/package.json +++ b/package.json @@ -117,9 +117,9 @@ ] }, "dependencies": { - "@babel/core": "^7.10.2", - "@babel/plugin-transform-modules-commonjs": "^7.10.1", - "@babel/register": "^7.10.1", + "@babel/core": "^7.11.1", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/register": "^7.10.5", "@elastic/apm-rum": "^5.2.0", "@elastic/charts": "19.8.1", "@elastic/datemath": "5.0.3", @@ -289,8 +289,8 @@ "yauzl": "2.10.0" }, "devDependencies": { - "@babel/parser": "^7.10.2", - "@babel/types": "^7.10.2", + "@babel/parser": "^7.11.2", + "@babel/types": "^7.11.0", "@elastic/eslint-config-kibana": "0.15.0", "@elastic/eslint-plugin-eui": "0.0.2", "@elastic/github-checks-reporter": "0.0.20b3", diff --git a/packages/elastic-datemath/package.json b/packages/elastic-datemath/package.json index 15040a6243ff2..ad4190f981439 100644 --- a/packages/elastic-datemath/package.json +++ b/packages/elastic-datemath/package.json @@ -11,8 +11,8 @@ "kbn:watch": "yarn build --watch" }, "devDependencies": { - "@babel/cli": "^7.10.1", - "@babel/preset-env": "^7.10.2", + "@babel/cli": "^7.10.5", + "@babel/preset-env": "^7.11.0", "babel-plugin-add-module-exports": "^1.0.2", "moment": "^2.24.0" }, diff --git a/packages/kbn-analytics/package.json b/packages/kbn-analytics/package.json index bd3f5832b7140..873252ceb0a1a 100644 --- a/packages/kbn-analytics/package.json +++ b/packages/kbn-analytics/package.json @@ -14,7 +14,7 @@ "kbn:watch": "node scripts/build --source-maps --watch" }, "devDependencies": { - "@babel/cli": "^7.10.1", + "@babel/cli": "^7.10.5", "@kbn/dev-utils": "1.0.0", "@kbn/babel-preset": "1.0.0", "typescript": "3.9.5" diff --git a/packages/kbn-babel-preset/package.json b/packages/kbn-babel-preset/package.json index 83530beffd2b2..db1f2161b6e38 100644 --- a/packages/kbn-babel-preset/package.json +++ b/packages/kbn-babel-preset/package.json @@ -4,14 +4,14 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@babel/plugin-proposal-class-properties": "^7.10.1", - "@babel/plugin-proposal-export-namespace-from": "^7.10.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.1", - "@babel/plugin-proposal-private-methods": "^7.10.1", - "@babel/preset-env": "^7.10.2", - "@babel/preset-react": "^7.10.1", - "@babel/preset-typescript": "^7.10.1", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/preset-env": "^7.11.0", + "@babel/preset-react": "^7.10.4", + "@babel/preset-typescript": "^7.10.4", "babel-plugin-add-module-exports": "^1.0.2", "babel-plugin-filter-imports": "^3.0.0", "babel-plugin-styled-components": "^1.10.7", diff --git a/packages/kbn-i18n/package.json b/packages/kbn-i18n/package.json index c5da144688c3c..0f830acb284a0 100644 --- a/packages/kbn-i18n/package.json +++ b/packages/kbn-i18n/package.json @@ -12,8 +12,8 @@ "kbn:watch": "node scripts/build --watch --source-maps" }, "devDependencies": { - "@babel/cli": "^7.10.1", - "@babel/core": "^7.10.2", + "@babel/cli": "^7.10.5", + "@babel/core": "^7.11.1", "@kbn/babel-preset": "1.0.0", "@kbn/dev-utils": "1.0.0", "@types/intl-relativeformat": "^2.1.0", diff --git a/packages/kbn-interpreter/package.json b/packages/kbn-interpreter/package.json index c6bb06e68b9c0..aef63229ebe96 100644 --- a/packages/kbn-interpreter/package.json +++ b/packages/kbn-interpreter/package.json @@ -9,16 +9,16 @@ "kbn:watch": "node scripts/build --dev --watch" }, "dependencies": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.11.2", "@kbn/i18n": "1.0.0", "lodash": "^4.17.15", "uuid": "3.3.2" }, "devDependencies": { - "@babel/cli": "^7.10.1", - "@babel/core": "^7.10.2", - "@babel/plugin-transform-modules-commonjs": "^7.10.1", - "@babel/plugin-transform-runtime": "^7.10.1", + "@babel/cli": "^7.10.5", + "@babel/core": "^7.11.1", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-runtime": "^7.11.0", "@kbn/babel-preset": "1.0.0", "@kbn/dev-utils": "1.0.0", "babel-loader": "^8.0.6", diff --git a/packages/kbn-optimizer/package.json b/packages/kbn-optimizer/package.json index e6eb5de31abd8..84e5c79e2e358 100644 --- a/packages/kbn-optimizer/package.json +++ b/packages/kbn-optimizer/package.json @@ -10,7 +10,7 @@ "kbn:watch": "yarn build --watch" }, "dependencies": { - "@babel/cli": "^7.10.1", + "@babel/cli": "^7.10.5", "@kbn/babel-preset": "1.0.0", "@kbn/dev-utils": "1.0.0", "@kbn/ui-shared-deps": "1.0.0", diff --git a/packages/kbn-plugin-helpers/package.json b/packages/kbn-plugin-helpers/package.json index f370265876df3..45582ad2af97a 100644 --- a/packages/kbn-plugin-helpers/package.json +++ b/packages/kbn-plugin-helpers/package.json @@ -12,7 +12,7 @@ "plugin-helpers": "bin/plugin-helpers.js" }, "dependencies": { - "@babel/core": "^7.10.2", + "@babel/core": "^7.11.1", "argv-split": "^2.0.1", "commander": "^3.0.0", "del": "^5.1.0", diff --git a/packages/kbn-pm/package.json b/packages/kbn-pm/package.json index 188db0a8321a2..3e40bf40222e6 100644 --- a/packages/kbn-pm/package.json +++ b/packages/kbn-pm/package.json @@ -10,11 +10,11 @@ "prettier": "prettier --write './src/**/*.ts'" }, "devDependencies": { - "@babel/core": "^7.10.2", - "@babel/plugin-proposal-class-properties": "^7.10.1", - "@babel/plugin-proposal-object-rest-spread": "^7.10.1", - "@babel/preset-env": "^7.10.2", - "@babel/preset-typescript": "^7.10.1", + "@babel/core": "^7.11.1", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/preset-typescript": "^7.10.4", "@types/cmd-shim": "^2.0.0", "@types/cpy": "^5.1.0", "@types/dedent": "^0.7.0", diff --git a/packages/kbn-test/package.json b/packages/kbn-test/package.json index 38e4668fc1e42..9482ea83cc257 100644 --- a/packages/kbn-test/package.json +++ b/packages/kbn-test/package.json @@ -10,7 +10,7 @@ "kbn:watch": "yarn build --watch" }, "devDependencies": { - "@babel/cli": "^7.10.1", + "@babel/cli": "^7.10.5", "@kbn/babel-preset": "1.0.0", "@kbn/dev-utils": "1.0.0", "@types/joi": "^13.4.2", diff --git a/packages/kbn-ui-framework/package.json b/packages/kbn-ui-framework/package.json index 7933ce06d6847..a095d9ac2a77f 100644 --- a/packages/kbn-ui-framework/package.json +++ b/packages/kbn-ui-framework/package.json @@ -30,7 +30,7 @@ "enzyme-adapter-react-16": "^1.9.1" }, "devDependencies": { - "@babel/core": "^7.10.2", + "@babel/core": "^7.11.1", "@elastic/eui": "0.0.55", "@kbn/babel-preset": "1.0.0", "@kbn/optimizer": "1.0.0", diff --git a/x-pack/package.json b/x-pack/package.json index dcba01a771fd5..8fbb94c97c143 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -199,9 +199,9 @@ "yargs": "4.8.1" }, "dependencies": { - "@babel/core": "^7.10.2", - "@babel/register": "^7.10.1", - "@babel/runtime": "^7.10.2", + "@babel/core": "^7.11.1", + "@babel/register": "^7.10.5", + "@babel/runtime": "^7.11.2", "@elastic/apm-rum-react": "^1.1.2", "@elastic/datemath": "5.0.3", "@elastic/ems-client": "7.9.3", diff --git a/yarn.lock b/yarn.lock index f17418f07c5cc..33083667a3c5e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,16 +2,16 @@ # yarn lockfile v1 -"@babel/cli@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.10.1.tgz#b6e5cd43a17b8f639442ab027976408ebe6d79a0" - integrity sha512-cVB+dXeGhMOqViIaZs3A9OUAe4pKw4SBNdMw6yHJMYR7s4TB+Cei7ThquV/84O19PdIFWuwe03vxxES0BHUm5g== +"@babel/cli@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.10.5.tgz#57df2987c8cf89d0fc7d4b157ec59d7619f1b77a" + integrity sha512-j9H9qSf3kLdM0Ao3aGPbGZ73mEA9XazuupcS6cDGWuiyAcANoguhP0r2Lx32H5JGw4sSSoHG3x/mxVnHgvOoyA== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" fs-readdir-recursive "^1.1.0" glob "^7.0.0" - lodash "^4.17.13" + lodash "^4.17.19" make-dir "^2.1.0" slash "^2.0.0" source-map "^0.5.0" @@ -32,17 +32,17 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/code-frame@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" - integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== +"@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: - "@babel/highlight" "^7.10.1" + "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db" - integrity sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw== +"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" + integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== dependencies: browserslist "^4.12.0" invariant "^2.2.4" @@ -79,24 +79,24 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a" - integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ== - dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/generator" "^7.10.2" - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helpers" "^7.10.1" - "@babel/parser" "^7.10.2" - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.2" +"@babel/core@^7.11.1": + version "7.11.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" + integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.0" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.1" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.11.0" + "@babel/types" "^7.11.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" json5 "^2.1.2" - lodash "^4.17.13" + lodash "^4.17.19" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" @@ -111,14 +111,13 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.10.1", "@babel/generator@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9" - integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA== +"@babel/generator@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" + integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== dependencies: - "@babel/types" "^7.10.2" + "@babel/types" "^7.11.0" jsesc "^2.5.1" - lodash "^4.17.13" source-map "^0.5.0" "@babel/generator@^7.9.5": @@ -138,20 +137,20 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-annotate-as-pure@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" - integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw== +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.4" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059" - integrity sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": version "7.8.3" @@ -161,14 +160,14 @@ "@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-builder-react-jsx-experimental@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz#9a7d58ad184d3ac3bafb1a452cec2bad7e4a0bc8" - integrity sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ== +"@babel/helper-builder-react-jsx-experimental@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz#f35e956a19955ff08c1258e44a515a6d6248646b" + integrity sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-module-imports" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/types" "^7.10.5" "@babel/helper-builder-react-jsx-experimental@^7.9.0": version "7.9.0" @@ -179,13 +178,13 @@ "@babel/helper-module-imports" "^7.8.3" "@babel/types" "^7.9.0" -"@babel/helper-builder-react-jsx@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz#a327f0cf983af5554701b1215de54a019f09b532" - integrity sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw== +"@babel/helper-builder-react-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" + integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-builder-react-jsx@^7.9.0": version "7.9.0" @@ -195,12 +194,12 @@ "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/types" "^7.9.0" -"@babel/helper-compilation-targets@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285" - integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA== +"@babel/helper-compilation-targets@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" + integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== dependencies: - "@babel/compat-data" "^7.10.1" + "@babel/compat-data" "^7.10.4" browserslist "^4.12.0" invariant "^2.2.4" levenary "^1.1.1" @@ -217,17 +216,17 @@ levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.10.1": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz#7474295770f217dbcf288bf7572eb213db46ee67" - integrity sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ== +"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" + integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-member-expression-to-functions" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.5" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" "@babel/helper-create-class-features-plugin@^7.8.3": version "7.8.6" @@ -241,13 +240,13 @@ "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-split-export-declaration" "^7.8.3" -"@babel/helper-create-regexp-features-plugin@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd" - integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA== +"@babel/helper-create-regexp-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" + integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-regex" "^7.10.1" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" regexpu-core "^4.7.0" "@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": @@ -259,14 +258,14 @@ "@babel/helper-regex" "^7.8.3" regexpu-core "^4.7.0" -"@babel/helper-define-map@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d" - integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg== +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/types" "^7.10.1" - lodash "^4.17.13" + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" "@babel/helper-define-map@^7.8.3": version "7.8.3" @@ -277,13 +276,13 @@ "@babel/types" "^7.8.3" lodash "^4.17.13" -"@babel/helper-explode-assignable-expression@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz#e9d76305ee1162ca467357ae25df94f179af2b7e" - integrity sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg== +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" + integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== dependencies: - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-explode-assignable-expression@^7.8.3": version "7.8.3" @@ -293,14 +292,14 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-function-name@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4" - integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ== +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== dependencies: - "@babel/helper-get-function-arity" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-function-name@^7.8.3": version "7.8.3" @@ -320,12 +319,12 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.9.5" -"@babel/helper-get-function-arity@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d" - integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw== +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.4" "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" @@ -334,12 +333,12 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-hoist-variables@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz#7e77c82e5dcae1ebf123174c385aaadbf787d077" - integrity sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg== +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.4" "@babel/helper-hoist-variables@^7.8.3": version "7.8.3" @@ -348,12 +347,12 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-member-expression-to-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15" - integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g== +"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" + integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.11.0" "@babel/helper-member-expression-to-functions@^7.8.3": version "7.8.3" @@ -369,25 +368,25 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" - integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== +"@babel/helper-module-imports@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.4" -"@babel/helper-module-transforms@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" - integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== dependencies: - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-simple-access" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" - lodash "^4.17.13" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/types" "^7.11.0" + lodash "^4.17.19" "@babel/helper-module-transforms@^7.9.0": version "7.9.0" @@ -402,12 +401,12 @@ "@babel/types" "^7.9.0" lodash "^4.17.13" -"@babel/helper-optimise-call-expression@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543" - integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg== +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.10.4" "@babel/helper-optimise-call-expression@^7.8.3": version "7.8.3" @@ -421,17 +420,17 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== -"@babel/helper-plugin-utils@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" - integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== +"@babel/helper-plugin-utils@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@babel/helper-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" - integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g== +"@babel/helper-regex@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" + integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== dependencies: - lodash "^4.17.13" + lodash "^4.17.19" "@babel/helper-regex@^7.8.3": version "7.8.3" @@ -440,16 +439,16 @@ dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz#bad6aaa4ff39ce8d4b82ccaae0bfe0f7dbb5f432" - integrity sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A== +"@babel/helper-remap-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" + integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-wrap-function" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-remap-async-to-generator@^7.8.3": version "7.8.3" @@ -462,15 +461,15 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-replace-supers@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" - integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": version "7.8.6" @@ -482,13 +481,13 @@ "@babel/traverse" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/helper-simple-access@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" - integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== dependencies: - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-simple-access@^7.8.3": version "7.8.3" @@ -498,12 +497,19 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-split-export-declaration@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" - integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== +"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" + integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== dependencies: - "@babel/types" "^7.10.1" + "@babel/types" "^7.11.0" "@babel/helper-split-export-declaration@^7.8.3": version "7.8.3" @@ -512,10 +518,10 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-validator-identifier@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" - integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== "@babel/helper-validator-identifier@^7.9.0": version "7.9.0" @@ -527,15 +533,15 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== -"@babel/helper-wrap-function@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9" - integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ== +"@babel/helper-wrap-function@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" + integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helper-wrap-function@^7.8.3": version "7.8.3" @@ -547,14 +553,14 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" - integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== dependencies: - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/helpers@^7.9.0": version "7.9.2" @@ -574,12 +580,12 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" - integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg== +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== dependencies: - "@babel/helper-validator-identifier" "^7.10.1" + "@babel/helper-validator-identifier" "^7.10.4" chalk "^2.0.0" js-tokens "^4.0.0" @@ -588,18 +594,18 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== -"@babel/parser@^7.10.1", "@babel/parser@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0" - integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ== +"@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1", "@babel/parser@^7.11.2": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.2.tgz#0882ab8a455df3065ea2dcb4c753b2460a24bead" + integrity sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw== -"@babel/plugin-proposal-async-generator-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz#6911af5ba2e615c4ff3c497fe2f47b35bf6d7e55" - integrity sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw== +"@babel/plugin-proposal-async-generator-functions@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" + integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-remap-async-to-generator" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-proposal-async-generator-functions@^7.8.3": @@ -611,13 +617,13 @@ "@babel/helper-remap-async-to-generator" "^7.8.3" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" - integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw== +"@babel/plugin-proposal-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" + integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-proposal-class-properties@^7.7.0": version "7.8.3" @@ -627,12 +633,12 @@ "@babel/helper-create-class-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-proposal-dynamic-import@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0" - integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA== +"@babel/plugin-proposal-dynamic-import@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" + integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-proposal-dynamic-import@^7.8.3": @@ -643,20 +649,20 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-export-namespace-from@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.1.tgz#512ee069cd866256600bdf89639cf7e1b51fbfe9" - integrity sha512-eR4CoYb6mh5y9LWjnb4CyUatuhtZ8pNLXLDi46GkqtF7WPafFqXycHdvF5qWviozZVGRSAmHzdayc8wUReCdjA== +"@babel/plugin-proposal-export-namespace-from@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" + integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09" - integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg== +"@babel/plugin-proposal-json-strings@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" + integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-proposal-json-strings@^7.8.3": @@ -667,12 +673,20 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78" - integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA== +"@babel/plugin-proposal-logical-assignment-operators@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" + integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" + integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": @@ -683,13 +697,13 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123" - integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA== +"@babel/plugin-proposal-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" + integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-numeric-separator" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-proposal-numeric-separator@^7.8.3": version "7.8.3" @@ -699,14 +713,14 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.8.3" -"@babel/plugin-proposal-object-rest-spread@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6" - integrity sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ== +"@babel/plugin-proposal-object-rest-spread@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" + integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.10.1" + "@babel/plugin-transform-parameters" "^7.10.4" "@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.9.0": version "7.9.0" @@ -716,12 +730,12 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" -"@babel/plugin-proposal-optional-catch-binding@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2" - integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA== +"@babel/plugin-proposal-optional-catch-binding@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" + integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-proposal-optional-catch-binding@^7.8.3": @@ -732,12 +746,13 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz#15f5d6d22708629451a91be28f8facc55b0e818c" - integrity sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA== +"@babel/plugin-proposal-optional-chaining@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" + integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" "@babel/plugin-proposal-optional-chaining@^7.9.0": @@ -748,21 +763,21 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-private-methods@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598" - integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg== +"@babel/plugin-proposal-private-methods@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" + integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-unicode-property-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f" - integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ== +"@babel/plugin-proposal-unicode-property-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" + integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": version "7.8.8" @@ -786,12 +801,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" - integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== +"@babel/plugin-syntax-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" + integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-class-properties@^7.8.3": version "7.8.3" @@ -828,12 +843,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz#0ae371134a42b91d5418feb3c8c8d43e1565d2da" - integrity sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ== +"@babel/plugin-syntax-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz#39abaae3cbf710c4373d8429484e6ba21340166c" + integrity sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx@^7.8.3": version "7.8.3" @@ -842,6 +857,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" @@ -856,12 +878,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" - integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.8.3" @@ -891,12 +913,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362" - integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ== +"@babel/plugin-syntax-top-level-await@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" + integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.8.3" @@ -905,19 +927,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-typescript@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.1.tgz#5e82bc27bb4202b93b949b029e699db536733810" - integrity sha512-X/d8glkrAtra7CaQGMiGs/OGa6XgUzqPcBXCIGFCpCqnfGlT0Wfbzo/B89xHhnInTaItPK8LALblVXcUOEh95Q== +"@babel/plugin-syntax-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" + integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-arrow-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b" - integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA== +"@babel/plugin-transform-arrow-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" + integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-arrow-functions@^7.8.3": version "7.8.3" @@ -926,14 +948,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-async-to-generator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062" - integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg== +"@babel/plugin-transform-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" + integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== dependencies: - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-remap-async-to-generator" "^7.10.1" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" "@babel/plugin-transform-async-to-generator@^7.8.3": version "7.8.3" @@ -944,12 +966,12 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-remap-async-to-generator" "^7.8.3" -"@babel/plugin-transform-block-scoped-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d" - integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q== +"@babel/plugin-transform-block-scoped-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" + integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-block-scoped-functions@^7.8.3": version "7.8.3" @@ -958,13 +980,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-block-scoping@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" - integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== +"@babel/plugin-transform-block-scoping@^7.10.4": + version "7.11.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215" + integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - lodash "^4.17.13" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-block-scoping@^7.8.3": version "7.8.3" @@ -974,18 +995,18 @@ "@babel/helper-plugin-utils" "^7.8.3" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f" - integrity sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-define-map" "^7.10.1" - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" +"@babel/plugin-transform-classes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" + integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" "@babel/plugin-transform-classes@^7.9.0": @@ -1002,12 +1023,12 @@ "@babel/helper-split-export-declaration" "^7.8.3" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz#59aa399064429d64dce5cf76ef9b90b7245ebd07" - integrity sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ== +"@babel/plugin-transform-computed-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" + integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-computed-properties@^7.8.3": version "7.8.3" @@ -1016,12 +1037,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-destructuring@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" - integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== +"@babel/plugin-transform-destructuring@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" + integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-destructuring@^7.8.3": version "7.8.8" @@ -1030,13 +1051,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-dotall-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee" - integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA== +"@babel/plugin-transform-dotall-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" + integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": version "7.8.3" @@ -1046,12 +1067,12 @@ "@babel/helper-create-regexp-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-duplicate-keys@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9" - integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA== +"@babel/plugin-transform-duplicate-keys@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" + integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-duplicate-keys@^7.8.3": version "7.8.3" @@ -1060,13 +1081,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3" - integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA== +"@babel/plugin-transform-exponentiation-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" + integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-exponentiation-operator@^7.8.3": version "7.8.3" @@ -1084,12 +1105,12 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow" "^7.8.3" -"@babel/plugin-transform-for-of@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5" - integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w== +"@babel/plugin-transform-for-of@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" + integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-for-of@^7.9.0": version "7.9.0" @@ -1098,13 +1119,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-function-name@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d" - integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw== +"@babel/plugin-transform-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" + integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-function-name@^7.8.3": version "7.8.3" @@ -1114,12 +1135,12 @@ "@babel/helper-function-name" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a" - integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw== +"@babel/plugin-transform-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" + integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-literals@^7.8.3": version "7.8.3" @@ -1128,12 +1149,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-member-expression-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39" - integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA== +"@babel/plugin-transform-member-expression-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" + integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-member-expression-literals@^7.8.3": version "7.8.3" @@ -1142,13 +1163,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-modules-amd@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a" - integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw== +"@babel/plugin-transform-modules-amd@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" + integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== dependencies: - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-amd@^7.9.0": @@ -1160,14 +1181,14 @@ "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301" - integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg== +"@babel/plugin-transform-modules-commonjs@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" + integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== dependencies: - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-simple-access" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-commonjs@^7.9.0": @@ -1180,14 +1201,14 @@ "@babel/helper-simple-access" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz#9962e4b0ac6aaf2e20431ada3d8ec72082cbffb6" - integrity sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA== +"@babel/plugin-transform-modules-systemjs@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" + integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== dependencies: - "@babel/helper-hoist-variables" "^7.10.1" - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.9.0": @@ -1200,13 +1221,13 @@ "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-umd@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595" - integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA== +"@babel/plugin-transform-modules-umd@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" + integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== dependencies: - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-modules-umd@^7.9.0": version "7.9.0" @@ -1216,6 +1237,13 @@ "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" + integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" @@ -1223,12 +1251,12 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.8.3" -"@babel/plugin-transform-new-target@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324" - integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw== +"@babel/plugin-transform-new-target@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" + integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-new-target@^7.8.3": version "7.8.3" @@ -1237,13 +1265,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-object-super@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde" - integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw== +"@babel/plugin-transform-object-super@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" + integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" "@babel/plugin-transform-object-super@^7.8.3": version "7.8.3" @@ -1253,13 +1281,13 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.3" -"@babel/plugin-transform-parameters@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd" - integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg== +"@babel/plugin-transform-parameters@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" + integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== dependencies: - "@babel/helper-get-function-arity" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-parameters@^7.8.7": version "7.9.3" @@ -1269,12 +1297,12 @@ "@babel/helper-get-function-arity" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-property-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d" - integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA== +"@babel/plugin-transform-property-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" + integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-property-literals@^7.8.3": version "7.8.3" @@ -1290,12 +1318,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-display-name@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz#e6a33f6d48dfb213dda5e007d0c7ff82b6a3d8ef" - integrity sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ== +"@babel/plugin-transform-react-display-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz#b5795f4e3e3140419c3611b7a2a3832b9aef328d" + integrity sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-react-display-name@^7.8.3": version "7.8.3" @@ -1304,14 +1332,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-jsx-development@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.1.tgz#1ac6300d8b28ef381ee48e6fec430cc38047b7f3" - integrity sha512-XwDy/FFoCfw9wGFtdn5Z+dHh6HXKHkC6DwKNWpN74VWinUagZfDcEJc3Y8Dn5B3WMVnAllX8Kviaw7MtC5Epwg== +"@babel/plugin-transform-react-jsx-development@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz#6ec90f244394604623880e15ebc3c34c356258ba" + integrity sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ== dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-jsx" "^7.10.1" + "@babel/helper-builder-react-jsx-experimental" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" "@babel/plugin-transform-react-jsx-development@^7.9.0": version "7.9.0" @@ -1322,13 +1350,13 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-jsx-self@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz#22143e14388d72eb88649606bb9e46f421bc3821" - integrity sha512-4p+RBw9d1qV4S749J42ZooeQaBomFPrSxa9JONLHJ1TxCBo3TzJ79vtmG2S2erUT8PDDrPdw4ZbXGr2/1+dILA== +"@babel/plugin-transform-react-jsx-self@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz#cd301a5fed8988c182ed0b9d55e9bd6db0bd9369" + integrity sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-jsx" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" "@babel/plugin-transform-react-jsx-self@^7.9.0": version "7.9.0" @@ -1338,13 +1366,13 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-jsx-source@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz#30db3d4ee3cdebbb26a82a9703673714777a4273" - integrity sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA== +"@babel/plugin-transform-react-jsx-source@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4" + integrity sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-jsx" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" "@babel/plugin-transform-react-jsx-source@^7.9.0": version "7.9.0" @@ -1354,15 +1382,15 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-jsx@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz#91f544248ba131486decb5d9806da6a6e19a2896" - integrity sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw== +"@babel/plugin-transform-react-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2" + integrity sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A== dependencies: - "@babel/helper-builder-react-jsx" "^7.10.1" - "@babel/helper-builder-react-jsx-experimental" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-jsx" "^7.10.1" + "@babel/helper-builder-react-jsx" "^7.10.4" + "@babel/helper-builder-react-jsx-experimental" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" "@babel/plugin-transform-react-jsx@^7.9.4": version "7.9.4" @@ -1374,18 +1402,18 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-pure-annotations@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.1.tgz#f5e7c755d3e7614d4c926e144f501648a5277b70" - integrity sha512-mfhoiai083AkeewsBHUpaS/FM1dmUENHBMpS/tugSJ7VXqXO5dCN1Gkint2YvM1Cdv1uhmAKt1ZOuAjceKmlLA== +"@babel/plugin-transform-react-pure-annotations@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz#3eefbb73db94afbc075f097523e445354a1c6501" + integrity sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490" - integrity sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw== +"@babel/plugin-transform-regenerator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" + integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== dependencies: regenerator-transform "^0.14.2" @@ -1396,12 +1424,12 @@ dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86" - integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ== +"@babel/plugin-transform-reserved-words@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" + integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-reserved-words@^7.8.3": version "7.8.3" @@ -1410,22 +1438,22 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-runtime@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz#fd1887f749637fb2ed86dc278e79eb41df37f4b1" - integrity sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw== +"@babel/plugin-transform-runtime@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz#e27f78eb36f19448636e05c33c90fd9ad9b8bccf" + integrity sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw== dependencies: - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3" - integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g== +"@babel/plugin-transform-shorthand-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" + integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-shorthand-properties@^7.8.3": version "7.8.3" @@ -1434,12 +1462,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-spread@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8" - integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw== +"@babel/plugin-transform-spread@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" + integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" "@babel/plugin-transform-spread@^7.8.3": version "7.8.3" @@ -1448,13 +1477,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-sticky-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00" - integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA== +"@babel/plugin-transform-sticky-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" + integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-regex" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" "@babel/plugin-transform-sticky-regex@^7.8.3": version "7.8.3" @@ -1464,13 +1493,13 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-regex" "^7.8.3" -"@babel/plugin-transform-template-literals@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz#914c7b7f4752c570ea00553b4284dad8070e8628" - integrity sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg== +"@babel/plugin-transform-template-literals@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" + integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-template-literals@^7.8.3": version "7.8.3" @@ -1480,12 +1509,12 @@ "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-typeof-symbol@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e" - integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g== +"@babel/plugin-transform-typeof-symbol@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" + integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-typeof-symbol@^7.8.4": version "7.8.4" @@ -1494,29 +1523,29 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-typescript@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.1.tgz#2c54daea231f602468686d9faa76f182a94507a6" - integrity sha512-v+QWKlmCnsaimLeqq9vyCsVRMViZG1k2SZTlcZvB+TqyH570Zsij8nvVUZzOASCRiQFUxkLrn9Wg/kH0zgy5OQ== +"@babel/plugin-transform-typescript@^7.10.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz#2b4879676af37342ebb278216dd090ac67f13abb" + integrity sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-syntax-typescript" "^7.10.1" + "@babel/helper-create-class-features-plugin" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.10.4" -"@babel/plugin-transform-unicode-escapes@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940" - integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw== +"@babel/plugin-transform-unicode-escapes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" + integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-unicode-regex@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f" - integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw== +"@babel/plugin-transform-unicode-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" + integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-unicode-regex@^7.8.3": version "7.8.3" @@ -1592,70 +1621,74 @@ levenary "^1.1.1" semver "^5.5.0" -"@babel/preset-env@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.2.tgz#715930f2cf8573b0928005ee562bed52fb65fdfb" - integrity sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA== - dependencies: - "@babel/compat-data" "^7.10.1" - "@babel/helper-compilation-targets" "^7.10.2" - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-proposal-async-generator-functions" "^7.10.1" - "@babel/plugin-proposal-class-properties" "^7.10.1" - "@babel/plugin-proposal-dynamic-import" "^7.10.1" - "@babel/plugin-proposal-json-strings" "^7.10.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" - "@babel/plugin-proposal-numeric-separator" "^7.10.1" - "@babel/plugin-proposal-object-rest-spread" "^7.10.1" - "@babel/plugin-proposal-optional-catch-binding" "^7.10.1" - "@babel/plugin-proposal-optional-chaining" "^7.10.1" - "@babel/plugin-proposal-private-methods" "^7.10.1" - "@babel/plugin-proposal-unicode-property-regex" "^7.10.1" +"@babel/preset-env@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" + integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== + dependencies: + "@babel/compat-data" "^7.11.0" + "@babel/helper-compilation-targets" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-async-generator-functions" "^7.10.4" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-dynamic-import" "^7.10.4" + "@babel/plugin-proposal-export-namespace-from" "^7.10.4" + "@babel/plugin-proposal-json-strings" "^7.10.4" + "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread" "^7.11.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" + "@babel/plugin-proposal-optional-chaining" "^7.11.0" + "@babel/plugin-proposal-private-methods" "^7.10.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.10.1" + "@babel/plugin-syntax-class-properties" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.1" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.10.1" - "@babel/plugin-transform-arrow-functions" "^7.10.1" - "@babel/plugin-transform-async-to-generator" "^7.10.1" - "@babel/plugin-transform-block-scoped-functions" "^7.10.1" - "@babel/plugin-transform-block-scoping" "^7.10.1" - "@babel/plugin-transform-classes" "^7.10.1" - "@babel/plugin-transform-computed-properties" "^7.10.1" - "@babel/plugin-transform-destructuring" "^7.10.1" - "@babel/plugin-transform-dotall-regex" "^7.10.1" - "@babel/plugin-transform-duplicate-keys" "^7.10.1" - "@babel/plugin-transform-exponentiation-operator" "^7.10.1" - "@babel/plugin-transform-for-of" "^7.10.1" - "@babel/plugin-transform-function-name" "^7.10.1" - "@babel/plugin-transform-literals" "^7.10.1" - "@babel/plugin-transform-member-expression-literals" "^7.10.1" - "@babel/plugin-transform-modules-amd" "^7.10.1" - "@babel/plugin-transform-modules-commonjs" "^7.10.1" - "@babel/plugin-transform-modules-systemjs" "^7.10.1" - "@babel/plugin-transform-modules-umd" "^7.10.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.10.1" - "@babel/plugin-transform-object-super" "^7.10.1" - "@babel/plugin-transform-parameters" "^7.10.1" - "@babel/plugin-transform-property-literals" "^7.10.1" - "@babel/plugin-transform-regenerator" "^7.10.1" - "@babel/plugin-transform-reserved-words" "^7.10.1" - "@babel/plugin-transform-shorthand-properties" "^7.10.1" - "@babel/plugin-transform-spread" "^7.10.1" - "@babel/plugin-transform-sticky-regex" "^7.10.1" - "@babel/plugin-transform-template-literals" "^7.10.1" - "@babel/plugin-transform-typeof-symbol" "^7.10.1" - "@babel/plugin-transform-unicode-escapes" "^7.10.1" - "@babel/plugin-transform-unicode-regex" "^7.10.1" + "@babel/plugin-syntax-top-level-await" "^7.10.4" + "@babel/plugin-transform-arrow-functions" "^7.10.4" + "@babel/plugin-transform-async-to-generator" "^7.10.4" + "@babel/plugin-transform-block-scoped-functions" "^7.10.4" + "@babel/plugin-transform-block-scoping" "^7.10.4" + "@babel/plugin-transform-classes" "^7.10.4" + "@babel/plugin-transform-computed-properties" "^7.10.4" + "@babel/plugin-transform-destructuring" "^7.10.4" + "@babel/plugin-transform-dotall-regex" "^7.10.4" + "@babel/plugin-transform-duplicate-keys" "^7.10.4" + "@babel/plugin-transform-exponentiation-operator" "^7.10.4" + "@babel/plugin-transform-for-of" "^7.10.4" + "@babel/plugin-transform-function-name" "^7.10.4" + "@babel/plugin-transform-literals" "^7.10.4" + "@babel/plugin-transform-member-expression-literals" "^7.10.4" + "@babel/plugin-transform-modules-amd" "^7.10.4" + "@babel/plugin-transform-modules-commonjs" "^7.10.4" + "@babel/plugin-transform-modules-systemjs" "^7.10.4" + "@babel/plugin-transform-modules-umd" "^7.10.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" + "@babel/plugin-transform-new-target" "^7.10.4" + "@babel/plugin-transform-object-super" "^7.10.4" + "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-transform-property-literals" "^7.10.4" + "@babel/plugin-transform-regenerator" "^7.10.4" + "@babel/plugin-transform-reserved-words" "^7.10.4" + "@babel/plugin-transform-shorthand-properties" "^7.10.4" + "@babel/plugin-transform-spread" "^7.11.0" + "@babel/plugin-transform-sticky-regex" "^7.10.4" + "@babel/plugin-transform-template-literals" "^7.10.4" + "@babel/plugin-transform-typeof-symbol" "^7.10.4" + "@babel/plugin-transform-unicode-escapes" "^7.10.4" + "@babel/plugin-transform-unicode-regex" "^7.10.4" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.10.2" + "@babel/types" "^7.11.0" browserslist "^4.12.0" core-js-compat "^3.6.2" invariant "^2.2.2" @@ -1693,34 +1726,34 @@ "@babel/plugin-transform-react-jsx-self" "^7.9.0" "@babel/plugin-transform-react-jsx-source" "^7.9.0" -"@babel/preset-react@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.1.tgz#e2ab8ae9a363ec307b936589f07ed753192de041" - integrity sha512-Rw0SxQ7VKhObmFjD/cUcKhPTtzpeviEFX1E6PgP+cYOhQ98icNqtINNFANlsdbQHrmeWnqdxA4Tmnl1jy5tp3Q== +"@babel/preset-react@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf" + integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-transform-react-display-name" "^7.10.1" - "@babel/plugin-transform-react-jsx" "^7.10.1" - "@babel/plugin-transform-react-jsx-development" "^7.10.1" - "@babel/plugin-transform-react-jsx-self" "^7.10.1" - "@babel/plugin-transform-react-jsx-source" "^7.10.1" - "@babel/plugin-transform-react-pure-annotations" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.10.4" + "@babel/plugin-transform-react-jsx" "^7.10.4" + "@babel/plugin-transform-react-jsx-development" "^7.10.4" + "@babel/plugin-transform-react-jsx-self" "^7.10.4" + "@babel/plugin-transform-react-jsx-source" "^7.10.4" + "@babel/plugin-transform-react-pure-annotations" "^7.10.4" -"@babel/preset-typescript@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.10.1.tgz#a8d8d9035f55b7d99a2461a0bdc506582914d07e" - integrity sha512-m6GV3y1ShiqxnyQj10600ZVOFrSSAa8HQ3qIUk2r+gcGtHTIRw0dJnFLt1WNXpKjtVw7yw1DAPU/6ma2ZvgJuA== +"@babel/preset-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz#7d5d052e52a682480d6e2cc5aa31be61c8c25e36" + integrity sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-transform-typescript" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-typescript" "^7.10.4" -"@babel/register@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.1.tgz#b6567c5cb5049f44bbf8c35d6ff68ca3c43238ed" - integrity sha512-sl96+kB3IA2B9EzpwwBmYadOT14vw3KaXOknGDbJaZCOj52GDA4Tivudq9doCJcB+bEIKCEARZYwRgBBsCGXyg== +"@babel/register@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.5.tgz#354f3574895f1307f79efe37a51525e52fd38d89" + integrity sha512-eYHdLv43nyvmPn9bfNfrcC4+iYNwdQ8Pxk1MFJuU/U5LpSYl/PH4dFMazCYZDFVi8ueG3shvO+AQfLrxpYulQw== dependencies: find-cache-dir "^2.0.0" - lodash "^4.17.13" + lodash "^4.17.19" make-dir "^2.1.0" pirates "^4.0.0" source-map-support "^0.5.16" @@ -1747,10 +1780,10 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" - integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== +"@babel/runtime@^7.11.2": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== dependencies: regenerator-runtime "^0.13.4" @@ -1775,14 +1808,14 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/template@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811" - integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig== +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/parser" "^7.10.1" - "@babel/types" "^7.10.1" + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.4.5", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": version "7.9.0" @@ -1799,20 +1832,20 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/traverse@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" - integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== - dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/generator" "^7.10.1" - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" - "@babel/parser" "^7.10.1" - "@babel/types" "^7.10.1" +"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" + integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.0" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.11.0" + "@babel/types" "^7.11.0" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.13" + lodash "^4.17.19" "@babel/traverse@^7.7.4": version "7.9.5" @@ -1838,13 +1871,13 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.10.1", "@babel/types@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" - integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng== +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" + integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== dependencies: - "@babel/helper-validator-identifier" "^7.10.1" - lodash "^4.17.13" + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" to-fast-properties "^2.0.0" "@babel/types@^7.3.3": @@ -20330,7 +20363,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.11, lodash@4.17.19, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: +lodash@4.17.11, lodash@4.17.19, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.19, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== From 810ff87afbac92aa8b655dc944b27894f1c4682a Mon Sep 17 00:00:00 2001 From: Kevin Qualters <56408403+kqualters-elastic@users.noreply.github.com> Date: Thu, 6 Aug 2020 16:29:09 -0400 Subject: [PATCH 004/113] [Security Solution][Resolver] standardize resolver panel component naming (#74537) --- ...ess_cube_icon.tsx => cube_for_process.tsx} | 90 +-- ...ounts.tsx => event_counts_for_process.tsx} | 288 +++---- .../view/{panel.tsx => panels/index.tsx} | 28 +- ...process_detail.tsx => process_details.tsx} | 2 +- ...elated_list.tsx => process_event_list.tsx} | 580 +++++++------- ..._list.tsx => process_list_with_counts.tsx} | 2 +- ...ed_detail.tsx => related_event_detail.tsx} | 750 +++++++++--------- .../public/resolver/view/styles.tsx | 2 +- 8 files changed, 871 insertions(+), 871 deletions(-) rename x-pack/plugins/security_solution/public/resolver/view/panels/{process_cube_icon.tsx => cube_for_process.tsx} (96%) rename x-pack/plugins/security_solution/public/resolver/view/panels/{panel_content_related_counts.tsx => event_counts_for_process.tsx} (97%) rename x-pack/plugins/security_solution/public/resolver/view/{panel.tsx => panels/index.tsx} (90%) rename x-pack/plugins/security_solution/public/resolver/view/panels/{panel_content_process_detail.tsx => process_details.tsx} (98%) rename x-pack/plugins/security_solution/public/resolver/view/panels/{panel_content_related_list.tsx => process_event_list.tsx} (95%) rename x-pack/plugins/security_solution/public/resolver/view/panels/{panel_content_process_list.tsx => process_list_with_counts.tsx} (99%) rename x-pack/plugins/security_solution/public/resolver/view/panels/{panel_content_related_detail.tsx => related_event_detail.tsx} (97%) diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/process_cube_icon.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx similarity index 96% rename from x-pack/plugins/security_solution/public/resolver/view/panels/process_cube_icon.tsx rename to x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx index b073324b27f9b..0d8f65b4e39e6 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/process_cube_icon.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx @@ -1,45 +1,45 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { memo } from 'react'; -import { useResolverTheme } from '../assets'; - -/** - * During user testing, one user indicated they wanted to see stronger visual relationships between - * Nodes on the graph and what's in the table. Using the same symbol in both places (as below) could help with that. - */ -export const CubeForProcess = memo(function CubeForProcess({ - isProcessTerminated, -}: { - isProcessTerminated: boolean; -}) { - const { cubeAssetsForNode } = useResolverTheme(); - const { cubeSymbol, descriptionText } = cubeAssetsForNode(isProcessTerminated, false); - - return ( - <> - - {descriptionText} - - - - ); -}); +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { memo } from 'react'; +import { useResolverTheme } from '../assets'; + +/** + * During user testing, one user indicated they wanted to see stronger visual relationships between + * Nodes on the graph and what's in the table. Using the same symbol in both places (as below) could help with that. + */ +export const CubeForProcess = memo(function CubeForProcess({ + isProcessTerminated, +}: { + isProcessTerminated: boolean; +}) { + const { cubeAssetsForNode } = useResolverTheme(); + const { cubeSymbol, descriptionText } = cubeAssetsForNode(isProcessTerminated, false); + + return ( + <> + + {descriptionText} + + + + ); +}); diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_related_counts.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/event_counts_for_process.tsx similarity index 97% rename from x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_related_counts.tsx rename to x-pack/plugins/security_solution/public/resolver/view/panels/event_counts_for_process.tsx index 880ee1dc7a10a..129aff776808a 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_related_counts.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/event_counts_for_process.tsx @@ -1,144 +1,144 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { memo, useMemo } from 'react'; -import { i18n } from '@kbn/i18n'; -import { EuiBasicTableColumn, EuiButtonEmpty, EuiSpacer, EuiInMemoryTable } from '@elastic/eui'; -import { FormattedMessage } from 'react-intl'; -import { CrumbInfo, StyledBreadcrumbs } from './panel_content_utilities'; - -import * as event from '../../../../common/endpoint/models/event'; -import { ResolverEvent, ResolverNodeStats } from '../../../../common/endpoint/types'; - -/** - * This view gives counts for all the related events of a process grouped by related event type. - * It should look something like: - * - * | Count | Event Type | - * | :--------------------- | :------------------------- | - * | 5 | DNS | - * | 12 | Registry | - * | 2 | Network | - * - */ -export const EventCountsForProcess = memo(function EventCountsForProcess({ - processEvent, - pushToQueryParams, - relatedStats, -}: { - processEvent: ResolverEvent; - pushToQueryParams: (queryStringKeyValuePair: CrumbInfo) => unknown; - relatedStats: ResolverNodeStats; -}) { - interface EventCountsTableView { - name: string; - count: number; - } - - const relatedEventsState = { stats: relatedStats.events.byCategory }; - const processName = processEvent && event.eventName(processEvent); - const processEntityId = event.entityId(processEvent); - /** - * totalCount: This will reflect the aggregated total by category for all related events - * e.g. [dns,file],[dns,file],[registry] will have an aggregate total of 5. This is to keep the - * total number consistent with the "broken out" totals we see elsewhere in the app. - * E.g. on the rleated list by type, the above would show as: - * 2 dns - * 2 file - * 1 registry - * So it would be extremely disorienting to show the user a "3" above that as a total. - */ - const totalCount = Object.values(relatedStats.events.byCategory).reduce( - (sum, val) => sum + val, - 0 - ); - const eventsString = i18n.translate( - 'xpack.securitySolution.endpoint.resolver.panel.processEventCounts.events', - { - defaultMessage: 'Events', - } - ); - const crumbs = useMemo(() => { - return [ - { - text: eventsString, - onClick: () => { - pushToQueryParams({ crumbId: '', crumbEvent: '' }); - }, - }, - { - text: processName, - onClick: () => { - pushToQueryParams({ crumbId: processEntityId, crumbEvent: '' }); - }, - }, - { - text: ( - <> - - - ), - onClick: () => { - pushToQueryParams({ crumbId: processEntityId, crumbEvent: '' }); - }, - }, - ]; - }, [processName, totalCount, processEntityId, pushToQueryParams, eventsString]); - const rows = useMemo(() => { - return Object.entries(relatedEventsState.stats).map( - ([eventType, count]): EventCountsTableView => { - return { - name: eventType, - count, - }; - } - ); - }, [relatedEventsState]); - const columns = useMemo>>( - () => [ - { - field: 'count', - name: i18n.translate('xpack.securitySolution.endpoint.resolver.panel.table.row.count', { - defaultMessage: 'Count', - }), - width: '20%', - sortable: true, - }, - { - field: 'name', - name: i18n.translate('xpack.securitySolution.endpoint.resolver.panel.table.row.eventType', { - defaultMessage: 'Event Type', - }), - width: '80%', - sortable: true, - render(name: string) { - return ( - { - pushToQueryParams({ crumbId: event.entityId(processEvent), crumbEvent: name }); - }} - > - {name} - - ); - }, - }, - ], - [pushToQueryParams, processEvent] - ); - return ( - <> - - - items={rows} columns={columns} sorting /> - - ); -}); -EventCountsForProcess.displayName = 'EventCountsForProcess'; +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { memo, useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiBasicTableColumn, EuiButtonEmpty, EuiSpacer, EuiInMemoryTable } from '@elastic/eui'; +import { FormattedMessage } from 'react-intl'; +import { CrumbInfo, StyledBreadcrumbs } from './panel_content_utilities'; + +import * as event from '../../../../common/endpoint/models/event'; +import { ResolverEvent, ResolverNodeStats } from '../../../../common/endpoint/types'; + +/** + * This view gives counts for all the related events of a process grouped by related event type. + * It should look something like: + * + * | Count | Event Type | + * | :--------------------- | :------------------------- | + * | 5 | DNS | + * | 12 | Registry | + * | 2 | Network | + * + */ +export const EventCountsForProcess = memo(function EventCountsForProcess({ + processEvent, + pushToQueryParams, + relatedStats, +}: { + processEvent: ResolverEvent; + pushToQueryParams: (queryStringKeyValuePair: CrumbInfo) => unknown; + relatedStats: ResolverNodeStats; +}) { + interface EventCountsTableView { + name: string; + count: number; + } + + const relatedEventsState = { stats: relatedStats.events.byCategory }; + const processName = processEvent && event.eventName(processEvent); + const processEntityId = event.entityId(processEvent); + /** + * totalCount: This will reflect the aggregated total by category for all related events + * e.g. [dns,file],[dns,file],[registry] will have an aggregate total of 5. This is to keep the + * total number consistent with the "broken out" totals we see elsewhere in the app. + * E.g. on the rleated list by type, the above would show as: + * 2 dns + * 2 file + * 1 registry + * So it would be extremely disorienting to show the user a "3" above that as a total. + */ + const totalCount = Object.values(relatedStats.events.byCategory).reduce( + (sum, val) => sum + val, + 0 + ); + const eventsString = i18n.translate( + 'xpack.securitySolution.endpoint.resolver.panel.processEventCounts.events', + { + defaultMessage: 'Events', + } + ); + const crumbs = useMemo(() => { + return [ + { + text: eventsString, + onClick: () => { + pushToQueryParams({ crumbId: '', crumbEvent: '' }); + }, + }, + { + text: processName, + onClick: () => { + pushToQueryParams({ crumbId: processEntityId, crumbEvent: '' }); + }, + }, + { + text: ( + <> + + + ), + onClick: () => { + pushToQueryParams({ crumbId: processEntityId, crumbEvent: '' }); + }, + }, + ]; + }, [processName, totalCount, processEntityId, pushToQueryParams, eventsString]); + const rows = useMemo(() => { + return Object.entries(relatedEventsState.stats).map( + ([eventType, count]): EventCountsTableView => { + return { + name: eventType, + count, + }; + } + ); + }, [relatedEventsState]); + const columns = useMemo>>( + () => [ + { + field: 'count', + name: i18n.translate('xpack.securitySolution.endpoint.resolver.panel.table.row.count', { + defaultMessage: 'Count', + }), + width: '20%', + sortable: true, + }, + { + field: 'name', + name: i18n.translate('xpack.securitySolution.endpoint.resolver.panel.table.row.eventType', { + defaultMessage: 'Event Type', + }), + width: '80%', + sortable: true, + render(name: string) { + return ( + { + pushToQueryParams({ crumbId: event.entityId(processEvent), crumbEvent: name }); + }} + > + {name} + + ); + }, + }, + ], + [pushToQueryParams, processEvent] + ); + return ( + <> + + + items={rows} columns={columns} sorting /> + + ); +}); +EventCountsForProcess.displayName = 'EventCountsForProcess'; diff --git a/x-pack/plugins/security_solution/public/resolver/view/panel.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/index.tsx similarity index 90% rename from x-pack/plugins/security_solution/public/resolver/view/panel.tsx rename to x-pack/plugins/security_solution/public/resolver/view/panels/index.tsx index f378ab36bac94..7e7e8b757baf7 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panel.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/index.tsx @@ -7,17 +7,17 @@ import React, { memo, useMemo, useContext, useLayoutEffect, useState } from 'react'; import { useSelector } from 'react-redux'; import { EuiPanel } from '@elastic/eui'; -import * as selectors from '../store/selectors'; -import { useResolverDispatch } from './use_resolver_dispatch'; -import * as event from '../../../common/endpoint/models/event'; -import { ResolverEvent, ResolverNodeStats } from '../../../common/endpoint/types'; -import { SideEffectContext } from './side_effect_context'; -import { ProcessEventListNarrowedByType } from './panels/panel_content_related_list'; -import { EventCountsForProcess } from './panels/panel_content_related_counts'; -import { ProcessDetails } from './panels/panel_content_process_detail'; -import { ProcessListWithCounts } from './panels/panel_content_process_list'; -import { RelatedEventDetail } from './panels/panel_content_related_detail'; -import { useResolverQueryParams } from './use_resolver_query_params'; +import * as selectors from '../../store/selectors'; +import { useResolverDispatch } from '../use_resolver_dispatch'; +import * as event from '../../../../common/endpoint/models/event'; +import { ResolverEvent, ResolverNodeStats } from '../../../../common/endpoint/types'; +import { SideEffectContext } from '../side_effect_context'; +import { ProcessEventList } from './process_event_list'; +import { EventCountsForProcess } from './event_counts_for_process'; +import { ProcessDetails } from './process_details'; +import { ProcessListWithCounts } from './process_list_with_counts'; +import { RelatedEventDetail } from './related_event_detail'; +import { useResolverQueryParams } from '../use_resolver_query_params'; /** * The team decided to use this table to determine which breadcrumbs/view to display: @@ -145,7 +145,7 @@ const PanelContent = memo(function PanelContent() { */ if (crumbEvent && crumbEvent.length && uiSelectedEvent) { - return 'processEventListNarrowedByType'; + return 'processEventList'; } } @@ -179,9 +179,9 @@ const PanelContent = memo(function PanelContent() { ); } - if (panelToShow === 'processEventListNarrowedByType') { + if (panelToShow === 'processEventList') { return ( - void; -} - -const StyledRelatedLimitWarning = styled(RelatedEventLimitWarning)` - flex-flow: row wrap; - display: block; - align-items: baseline; - margin-top: 1em; - - & .euiCallOutHeader { - display: inline; - margin-right: 0.25em; - } - - & .euiText { - display: inline; - } - - & .euiText p { - display: inline; - } -`; - -const DisplayList = memo(function DisplayList({ - crumbs, - matchingEventEntries, - eventType, - processEntityId, -}: { - crumbs: Array<{ text: string | JSX.Element; onClick: () => void }>; - matchingEventEntries: MatchingEventEntry[]; - eventType: string; - processEntityId: string; -}) { - const relatedLookupsByCategory = useSelector(selectors.relatedEventInfoByEntityId); - const lookupsForThisNode = relatedLookupsByCategory(processEntityId); - const shouldShowLimitWarning = lookupsForThisNode?.shouldShowLimitForCategory(eventType); - const numberDisplayed = lookupsForThisNode?.numberActuallyDisplayedForCategory(eventType); - const numberMissing = lookupsForThisNode?.numberNotDisplayedForCategory(eventType); - - return ( - <> - - {shouldShowLimitWarning && typeof numberDisplayed !== 'undefined' && numberMissing ? ( - - ) : null} - - <> - {matchingEventEntries.map((eventView, index) => { - const { subject, descriptor = '' } = eventView.name; - return ( - - - - - - - - - - - - - - {index === matchingEventEntries.length - 1 ? null : } - - ); - })} - - - ); -}); - -export const ProcessEventListNarrowedByType = memo(function ProcessEventListNarrowedByType({ - processEvent, - eventType, - relatedStats, - pushToQueryParams, -}: { - processEvent: ResolverEvent; - pushToQueryParams: (arg0: CrumbInfo) => unknown; - eventType: string; - relatedStats: ResolverNodeStats; -}) { - const processName = processEvent && event.eventName(processEvent); - const processEntityId = event.entityId(processEvent); - const totalCount = Object.values(relatedStats.events.byCategory).reduce( - (sum, val) => sum + val, - 0 - ); - const eventsString = i18n.translate( - 'xpack.securitySolution.endpoint.resolver.panel.processEventListByType.events', - { - defaultMessage: 'Events', - } - ); - const waitingString = i18n.translate( - 'xpack.securitySolution.endpoint.resolver.panel.processEventListByType.wait', - { - defaultMessage: 'Waiting For Events...', - } - ); - - const relatedsReadyMap = useSelector(selectors.relatedEventsReady); - const relatedsReady = relatedsReadyMap.get(processEntityId); - - const dispatch = useResolverDispatch(); - - useEffect(() => { - if (typeof relatedsReady === 'undefined') { - dispatch({ - type: 'appDetectedMissingEventData', - payload: processEntityId, - }); - } - }, [relatedsReady, dispatch, processEntityId]); - - const waitCrumbs = useMemo(() => { - return [ - { - text: eventsString, - onClick: () => { - pushToQueryParams({ crumbId: '', crumbEvent: '' }); - }, - }, - ]; - }, [pushToQueryParams, eventsString]); - - const relatedByCategory = useSelector(selectors.relatedEventsByCategory); - - /** - * A list entry will be displayed for each of these - */ - const matchingEventEntries: MatchingEventEntry[] = useMemo(() => { - const relateds = relatedByCategory(processEntityId)(eventType).map((resolverEvent) => { - const eventTime = event.eventTimestamp(resolverEvent); - const formattedDate = typeof eventTime === 'undefined' ? '' : formatDate(eventTime); - const entityId = event.eventId(resolverEvent); - - return { - formattedDate, - eventCategory: `${eventType}`, - eventType: `${event.ecsEventType(resolverEvent)}`, - name: event.descriptiveName(resolverEvent), - setQueryParams: () => { - pushToQueryParams({ - crumbId: entityId === undefined ? '' : String(entityId), - crumbEvent: processEntityId, - }); - }, - }; - }); - return relateds; - }, [relatedByCategory, eventType, processEntityId, pushToQueryParams]); - - const crumbs = useMemo(() => { - return [ - { - text: eventsString, - onClick: () => { - pushToQueryParams({ crumbId: '', crumbEvent: '' }); - }, - }, - { - text: processName, - onClick: () => { - pushToQueryParams({ crumbId: processEntityId, crumbEvent: '' }); - }, - }, - { - text: ( - <> - - - ), - onClick: () => { - pushToQueryParams({ crumbId: processEntityId, crumbEvent: 'all' }); - }, - }, - { - text: ( - <> - - - ), - onClick: () => {}, - }, - ]; - }, [ - eventType, - eventsString, - matchingEventEntries.length, - processEntityId, - processName, - pushToQueryParams, - totalCount, - ]); - - /** - * Wait here until the effect resolves... - */ - if (!relatedsReady) { - return ( - <> - - - -

{waitingString}

-
- - ); - } - - return ( - - ); -}); -ProcessEventListNarrowedByType.displayName = 'ProcessEventListNarrowedByType'; +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { memo, useMemo, useEffect, Fragment } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiTitle, EuiSpacer, EuiText, EuiButtonEmpty, EuiHorizontalRule } from '@elastic/eui'; +import { useSelector } from 'react-redux'; +import { FormattedMessage } from 'react-intl'; +import styled from 'styled-components'; +import { + CrumbInfo, + formatDate, + StyledBreadcrumbs, + BoldCode, + StyledTime, +} from './panel_content_utilities'; +import * as event from '../../../../common/endpoint/models/event'; +import { ResolverEvent, ResolverNodeStats } from '../../../../common/endpoint/types'; +import * as selectors from '../../store/selectors'; +import { useResolverDispatch } from '../use_resolver_dispatch'; +import { RelatedEventLimitWarning } from '../limit_warnings'; + +/** + * This view presents a list of related events of a given type for a given process. + * It will appear like: + * + * | | + * | :----------------------------------------------------- | + * | **registry deletion** @ *3:32PM..* *HKLM/software...* | + * | **file creation** @ *3:34PM..* *C:/directory/file.exe* | + */ + +interface MatchingEventEntry { + formattedDate: string; + eventType: string; + eventCategory: string; + name: { subject: string; descriptor?: string }; + setQueryParams: () => void; +} + +const StyledRelatedLimitWarning = styled(RelatedEventLimitWarning)` + flex-flow: row wrap; + display: block; + align-items: baseline; + margin-top: 1em; + + & .euiCallOutHeader { + display: inline; + margin-right: 0.25em; + } + + & .euiText { + display: inline; + } + + & .euiText p { + display: inline; + } +`; + +const DisplayList = memo(function DisplayList({ + crumbs, + matchingEventEntries, + eventType, + processEntityId, +}: { + crumbs: Array<{ text: string | JSX.Element; onClick: () => void }>; + matchingEventEntries: MatchingEventEntry[]; + eventType: string; + processEntityId: string; +}) { + const relatedLookupsByCategory = useSelector(selectors.relatedEventInfoByEntityId); + const lookupsForThisNode = relatedLookupsByCategory(processEntityId); + const shouldShowLimitWarning = lookupsForThisNode?.shouldShowLimitForCategory(eventType); + const numberDisplayed = lookupsForThisNode?.numberActuallyDisplayedForCategory(eventType); + const numberMissing = lookupsForThisNode?.numberNotDisplayedForCategory(eventType); + + return ( + <> + + {shouldShowLimitWarning && typeof numberDisplayed !== 'undefined' && numberMissing ? ( + + ) : null} + + <> + {matchingEventEntries.map((eventView, index) => { + const { subject, descriptor = '' } = eventView.name; + return ( + + + + + + + + + + + + + + {index === matchingEventEntries.length - 1 ? null : } + + ); + })} + + + ); +}); + +export const ProcessEventList = memo(function ProcessEventList({ + processEvent, + eventType, + relatedStats, + pushToQueryParams, +}: { + processEvent: ResolverEvent; + pushToQueryParams: (arg0: CrumbInfo) => unknown; + eventType: string; + relatedStats: ResolverNodeStats; +}) { + const processName = processEvent && event.eventName(processEvent); + const processEntityId = event.entityId(processEvent); + const totalCount = Object.values(relatedStats.events.byCategory).reduce( + (sum, val) => sum + val, + 0 + ); + const eventsString = i18n.translate( + 'xpack.securitySolution.endpoint.resolver.panel.processEventListByType.events', + { + defaultMessage: 'Events', + } + ); + const waitingString = i18n.translate( + 'xpack.securitySolution.endpoint.resolver.panel.processEventListByType.wait', + { + defaultMessage: 'Waiting For Events...', + } + ); + + const relatedsReadyMap = useSelector(selectors.relatedEventsReady); + const relatedsReady = relatedsReadyMap.get(processEntityId); + + const dispatch = useResolverDispatch(); + + useEffect(() => { + if (typeof relatedsReady === 'undefined') { + dispatch({ + type: 'appDetectedMissingEventData', + payload: processEntityId, + }); + } + }, [relatedsReady, dispatch, processEntityId]); + + const waitCrumbs = useMemo(() => { + return [ + { + text: eventsString, + onClick: () => { + pushToQueryParams({ crumbId: '', crumbEvent: '' }); + }, + }, + ]; + }, [pushToQueryParams, eventsString]); + + const relatedByCategory = useSelector(selectors.relatedEventsByCategory); + + /** + * A list entry will be displayed for each of these + */ + const matchingEventEntries: MatchingEventEntry[] = useMemo(() => { + const relateds = relatedByCategory(processEntityId)(eventType).map((resolverEvent) => { + const eventTime = event.eventTimestamp(resolverEvent); + const formattedDate = typeof eventTime === 'undefined' ? '' : formatDate(eventTime); + const entityId = event.eventId(resolverEvent); + + return { + formattedDate, + eventCategory: `${eventType}`, + eventType: `${event.ecsEventType(resolverEvent)}`, + name: event.descriptiveName(resolverEvent), + setQueryParams: () => { + pushToQueryParams({ + crumbId: entityId === undefined ? '' : String(entityId), + crumbEvent: processEntityId, + }); + }, + }; + }); + return relateds; + }, [relatedByCategory, eventType, processEntityId, pushToQueryParams]); + + const crumbs = useMemo(() => { + return [ + { + text: eventsString, + onClick: () => { + pushToQueryParams({ crumbId: '', crumbEvent: '' }); + }, + }, + { + text: processName, + onClick: () => { + pushToQueryParams({ crumbId: processEntityId, crumbEvent: '' }); + }, + }, + { + text: ( + <> + + + ), + onClick: () => { + pushToQueryParams({ crumbId: processEntityId, crumbEvent: 'all' }); + }, + }, + { + text: ( + <> + + + ), + onClick: () => {}, + }, + ]; + }, [ + eventType, + eventsString, + matchingEventEntries.length, + processEntityId, + processName, + pushToQueryParams, + totalCount, + ]); + + /** + * Wait here until the effect resolves... + */ + if (!relatedsReady) { + return ( + <> + + + +

{waitingString}

+
+ + ); + } + + return ( + + ); +}); +ProcessEventList.displayName = 'ProcessEventList'; diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_list.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx similarity index 99% rename from x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_list.tsx rename to x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx index 70422a6919e51..046c840470262 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_list.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx @@ -19,7 +19,7 @@ import * as selectors from '../../store/selectors'; import { CrumbInfo, formatter, StyledBreadcrumbs } from './panel_content_utilities'; import { useResolverDispatch } from '../use_resolver_dispatch'; import { SideEffectContext } from '../side_effect_context'; -import { CubeForProcess } from './process_cube_icon'; +import { CubeForProcess } from './cube_for_process'; import { SafeResolverEvent } from '../../../../common/endpoint/types'; import { LimitWarning } from '../limit_warnings'; diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_related_detail.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/related_event_detail.tsx similarity index 97% rename from x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_related_detail.tsx rename to x-pack/plugins/security_solution/public/resolver/view/panels/related_event_detail.tsx index 10e57a09b5da4..3579b1b2f69b8 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_related_detail.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/related_event_detail.tsx @@ -1,375 +1,375 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { memo, useMemo, useEffect, Fragment } from 'react'; -import { i18n } from '@kbn/i18n'; -import { EuiSpacer, EuiText, EuiDescriptionList, EuiTextColor, EuiTitle } from '@elastic/eui'; -import styled from 'styled-components'; -import { useSelector } from 'react-redux'; -import { FormattedMessage } from 'react-intl'; -import { - CrumbInfo, - formatDate, - StyledBreadcrumbs, - BoldCode, - StyledTime, -} from './panel_content_utilities'; -import * as event from '../../../../common/endpoint/models/event'; -import { ResolverEvent } from '../../../../common/endpoint/types'; -import * as selectors from '../../store/selectors'; -import { useResolverDispatch } from '../use_resolver_dispatch'; -import { PanelContentError } from './panel_content_error'; - -/** - * A helper function to turn objects into EuiDescriptionList entries. - * This reflects the strategy of more or less "dumping" metadata for related processes - * in description lists with little/no 'prettification'. This has the obvious drawback of - * data perhaps appearing inscrutable/daunting, but the benefit of presenting these fields - * to the user "as they occur" in ECS, which may help them with e.g. EQL queries. - * - * Given an object like: {a:{b: 1}, c: 'd'} it will yield title/description entries like so: - * {title: "a.b", description: "1"}, {title: "c", description: "d"} - * - * @param {object} obj The object to turn into `
` entries - */ -const objectToDescriptionListEntries = function* ( - obj: object, - prefix = '' -): Generator<{ title: string; description: string }> { - const nextPrefix = prefix.length ? `${prefix}.` : ''; - for (const [metaKey, metaValue] of Object.entries(obj)) { - if (typeof metaValue === 'number' || typeof metaValue === 'string') { - yield { title: nextPrefix + metaKey, description: `${metaValue}` }; - } else if (metaValue instanceof Array) { - yield { - title: nextPrefix + metaKey, - description: metaValue - .filter((arrayEntry) => { - return typeof arrayEntry === 'number' || typeof arrayEntry === 'string'; - }) - .join(','), - }; - } else if (typeof metaValue === 'object') { - yield* objectToDescriptionListEntries(metaValue, nextPrefix + metaKey); - } - } -}; - -// Adding some styles to prevent horizontal scrollbars, per request from UX review -const StyledDescriptionList = memo(styled(EuiDescriptionList)` - &.euiDescriptionList.euiDescriptionList--column dt.euiDescriptionList__title.desc-title { - max-width: 8em; - } - &.euiDescriptionList.euiDescriptionList--column dd.euiDescriptionList__description { - max-width: calc(100% - 8.5em); - overflow-wrap: break-word; - } -`); - -// Styling subtitles, per UX review: -const StyledFlexTitle = memo(styled('h3')` - display: flex; - flex-flow: row; - font-size: 1.2em; -`); -const StyledTitleRule = memo(styled('hr')` - &.euiHorizontalRule.euiHorizontalRule--full.euiHorizontalRule--marginSmall.override { - display: block; - flex: 1; - margin-left: 0.5em; - } -`); - -const TitleHr = memo(() => { - return ( - - ); -}); -TitleHr.displayName = 'TitleHR'; - -/** - * This view presents a detailed view of all the available data for a related event, split and titled by the "section" - * it appears in the underlying ResolverEvent - */ -export const RelatedEventDetail = memo(function RelatedEventDetail({ - relatedEventId, - parentEvent, - pushToQueryParams, - countForParent, -}: { - relatedEventId: string; - parentEvent: ResolverEvent; - pushToQueryParams: (queryStringKeyValuePair: CrumbInfo) => unknown; - countForParent: number | undefined; -}) { - const processName = (parentEvent && event.eventName(parentEvent)) || '*'; - const processEntityId = parentEvent && event.entityId(parentEvent); - const totalCount = countForParent || 0; - const eventsString = i18n.translate( - 'xpack.securitySolution.endpoint.resolver.panel.relatedEventDetail.events', - { - defaultMessage: 'Events', - } - ); - const naString = i18n.translate( - 'xpack.securitySolution.endpoint.resolver.panel.relatedEventDetail.NA', - { - defaultMessage: 'N/A', - } - ); - - const relatedsReadyMap = useSelector(selectors.relatedEventsReady); - const relatedsReady = relatedsReadyMap.get(processEntityId!); - const dispatch = useResolverDispatch(); - - /** - * If we don't have the related events for the parent yet, use this effect - * to request them. - */ - useEffect(() => { - if (typeof relatedsReady === 'undefined') { - dispatch({ - type: 'appDetectedMissingEventData', - payload: processEntityId, - }); - } - }, [relatedsReady, dispatch, processEntityId]); - - const relatedEventsForThisProcess = useSelector(selectors.relatedEventsByEntityId).get( - processEntityId! - ); - - const [relatedEventToShowDetailsFor, countBySameCategory, relatedEventCategory] = useMemo(() => { - if (!relatedEventsForThisProcess) { - return [undefined, 0]; - } - const specificEvent = relatedEventsForThisProcess.events.find( - (evt) => event.eventId(evt) === relatedEventId - ); - // For breadcrumbs: - const specificCategory = specificEvent && event.primaryEventCategory(specificEvent); - const countOfCategory = relatedEventsForThisProcess.events.reduce((sumtotal, evt) => { - return event.primaryEventCategory(evt) === specificCategory ? sumtotal + 1 : sumtotal; - }, 0); - return [specificEvent, countOfCategory, specificCategory || naString]; - }, [relatedEventsForThisProcess, naString, relatedEventId]); - - const [sections, formattedDate] = useMemo(() => { - if (!relatedEventToShowDetailsFor) { - // This could happen if user relaods from URL param and requests an eventId that no longer exists - return [[], naString]; - } - // Assuming these details (agent, ecs, process) aren't as helpful, can revisit - const { - agent, - ecs, - process, - ...relevantData - } = relatedEventToShowDetailsFor as ResolverEvent & { - // Type this with various unknown keys so that ts will let us delete those keys - ecs: unknown; - process: unknown; - }; - let displayDate = ''; - const sectionData: Array<{ - sectionTitle: string; - entries: Array<{ title: string; description: string }>; - }> = Object.entries(relevantData) - .map(([sectionTitle, val]) => { - if (sectionTitle === '@timestamp') { - displayDate = formatDate(val); - return { sectionTitle: '', entries: [] }; - } - if (typeof val !== 'object') { - return { sectionTitle, entries: [{ title: sectionTitle, description: `${val}` }] }; - } - return { sectionTitle, entries: [...objectToDescriptionListEntries(val)] }; - }) - .filter((v) => v.sectionTitle !== '' && v.entries.length); - return [sectionData, displayDate]; - }, [relatedEventToShowDetailsFor, naString]); - - const waitCrumbs = useMemo(() => { - return [ - { - text: eventsString, - onClick: () => { - pushToQueryParams({ crumbId: '', crumbEvent: '' }); - }, - }, - ]; - }, [pushToQueryParams, eventsString]); - - const { subject = '', descriptor = '' } = relatedEventToShowDetailsFor - ? event.descriptiveName(relatedEventToShowDetailsFor) - : {}; - const crumbs = useMemo(() => { - return [ - { - text: eventsString, - onClick: () => { - pushToQueryParams({ crumbId: '', crumbEvent: '' }); - }, - }, - { - text: processName, - onClick: () => { - pushToQueryParams({ crumbId: processEntityId!, crumbEvent: '' }); - }, - }, - { - text: ( - <> - - - ), - onClick: () => { - pushToQueryParams({ crumbId: processEntityId!, crumbEvent: 'all' }); - }, - }, - { - text: ( - <> - - - ), - onClick: () => { - pushToQueryParams({ - crumbId: processEntityId!, - crumbEvent: relatedEventCategory || 'all', - }); - }, - }, - { - text: relatedEventToShowDetailsFor ? ( - - ) : ( - naString - ), - onClick: () => {}, - }, - ]; - }, [ - processName, - processEntityId, - eventsString, - pushToQueryParams, - totalCount, - countBySameCategory, - naString, - relatedEventCategory, - relatedEventToShowDetailsFor, - subject, - descriptor, - ]); - - /** - * If the ship hasn't come in yet, wait on the dock - */ - if (!relatedsReady) { - const waitingString = i18n.translate( - 'xpack.securitySolution.endpoint.resolver.panel.relatedDetail.wait', - { - defaultMessage: 'Waiting For Events...', - } - ); - return ( - <> - - - -

{waitingString}

-
- - ); - } - - /** - * Could happen if user e.g. loads a URL with a bad crumbEvent - */ - if (!relatedEventToShowDetailsFor) { - const errString = i18n.translate( - 'xpack.securitySolution.endpoint.resolver.panel.relatedDetail.missing', - { - defaultMessage: 'Related event not found.', - } - ); - return ( - - ); - } - - return ( - <> - - - - - - - - - - - - - - - - {sections.map(({ sectionTitle, entries }, index) => { - return ( - - {index === 0 ? null : } - - - - {sectionTitle} - - - - - - - {index === sections.length - 1 ? null : } - - ); - })} - - ); -}); +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { memo, useMemo, useEffect, Fragment } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiSpacer, EuiText, EuiDescriptionList, EuiTextColor, EuiTitle } from '@elastic/eui'; +import styled from 'styled-components'; +import { useSelector } from 'react-redux'; +import { FormattedMessage } from 'react-intl'; +import { + CrumbInfo, + formatDate, + StyledBreadcrumbs, + BoldCode, + StyledTime, +} from './panel_content_utilities'; +import * as event from '../../../../common/endpoint/models/event'; +import { ResolverEvent } from '../../../../common/endpoint/types'; +import * as selectors from '../../store/selectors'; +import { useResolverDispatch } from '../use_resolver_dispatch'; +import { PanelContentError } from './panel_content_error'; + +/** + * A helper function to turn objects into EuiDescriptionList entries. + * This reflects the strategy of more or less "dumping" metadata for related processes + * in description lists with little/no 'prettification'. This has the obvious drawback of + * data perhaps appearing inscrutable/daunting, but the benefit of presenting these fields + * to the user "as they occur" in ECS, which may help them with e.g. EQL queries. + * + * Given an object like: {a:{b: 1}, c: 'd'} it will yield title/description entries like so: + * {title: "a.b", description: "1"}, {title: "c", description: "d"} + * + * @param {object} obj The object to turn into `
` entries + */ +const objectToDescriptionListEntries = function* ( + obj: object, + prefix = '' +): Generator<{ title: string; description: string }> { + const nextPrefix = prefix.length ? `${prefix}.` : ''; + for (const [metaKey, metaValue] of Object.entries(obj)) { + if (typeof metaValue === 'number' || typeof metaValue === 'string') { + yield { title: nextPrefix + metaKey, description: `${metaValue}` }; + } else if (metaValue instanceof Array) { + yield { + title: nextPrefix + metaKey, + description: metaValue + .filter((arrayEntry) => { + return typeof arrayEntry === 'number' || typeof arrayEntry === 'string'; + }) + .join(','), + }; + } else if (typeof metaValue === 'object') { + yield* objectToDescriptionListEntries(metaValue, nextPrefix + metaKey); + } + } +}; + +// Adding some styles to prevent horizontal scrollbars, per request from UX review +const StyledDescriptionList = memo(styled(EuiDescriptionList)` + &.euiDescriptionList.euiDescriptionList--column dt.euiDescriptionList__title.desc-title { + max-width: 8em; + } + &.euiDescriptionList.euiDescriptionList--column dd.euiDescriptionList__description { + max-width: calc(100% - 8.5em); + overflow-wrap: break-word; + } +`); + +// Styling subtitles, per UX review: +const StyledFlexTitle = memo(styled('h3')` + display: flex; + flex-flow: row; + font-size: 1.2em; +`); +const StyledTitleRule = memo(styled('hr')` + &.euiHorizontalRule.euiHorizontalRule--full.euiHorizontalRule--marginSmall.override { + display: block; + flex: 1; + margin-left: 0.5em; + } +`); + +const TitleHr = memo(() => { + return ( + + ); +}); +TitleHr.displayName = 'TitleHR'; + +/** + * This view presents a detailed view of all the available data for a related event, split and titled by the "section" + * it appears in the underlying ResolverEvent + */ +export const RelatedEventDetail = memo(function RelatedEventDetail({ + relatedEventId, + parentEvent, + pushToQueryParams, + countForParent, +}: { + relatedEventId: string; + parentEvent: ResolverEvent; + pushToQueryParams: (queryStringKeyValuePair: CrumbInfo) => unknown; + countForParent: number | undefined; +}) { + const processName = (parentEvent && event.eventName(parentEvent)) || '*'; + const processEntityId = parentEvent && event.entityId(parentEvent); + const totalCount = countForParent || 0; + const eventsString = i18n.translate( + 'xpack.securitySolution.endpoint.resolver.panel.relatedEventDetail.events', + { + defaultMessage: 'Events', + } + ); + const naString = i18n.translate( + 'xpack.securitySolution.endpoint.resolver.panel.relatedEventDetail.NA', + { + defaultMessage: 'N/A', + } + ); + + const relatedsReadyMap = useSelector(selectors.relatedEventsReady); + const relatedsReady = relatedsReadyMap.get(processEntityId!); + const dispatch = useResolverDispatch(); + + /** + * If we don't have the related events for the parent yet, use this effect + * to request them. + */ + useEffect(() => { + if (typeof relatedsReady === 'undefined') { + dispatch({ + type: 'appDetectedMissingEventData', + payload: processEntityId, + }); + } + }, [relatedsReady, dispatch, processEntityId]); + + const relatedEventsForThisProcess = useSelector(selectors.relatedEventsByEntityId).get( + processEntityId! + ); + + const [relatedEventToShowDetailsFor, countBySameCategory, relatedEventCategory] = useMemo(() => { + if (!relatedEventsForThisProcess) { + return [undefined, 0]; + } + const specificEvent = relatedEventsForThisProcess.events.find( + (evt) => event.eventId(evt) === relatedEventId + ); + // For breadcrumbs: + const specificCategory = specificEvent && event.primaryEventCategory(specificEvent); + const countOfCategory = relatedEventsForThisProcess.events.reduce((sumtotal, evt) => { + return event.primaryEventCategory(evt) === specificCategory ? sumtotal + 1 : sumtotal; + }, 0); + return [specificEvent, countOfCategory, specificCategory || naString]; + }, [relatedEventsForThisProcess, naString, relatedEventId]); + + const [sections, formattedDate] = useMemo(() => { + if (!relatedEventToShowDetailsFor) { + // This could happen if user relaods from URL param and requests an eventId that no longer exists + return [[], naString]; + } + // Assuming these details (agent, ecs, process) aren't as helpful, can revisit + const { + agent, + ecs, + process, + ...relevantData + } = relatedEventToShowDetailsFor as ResolverEvent & { + // Type this with various unknown keys so that ts will let us delete those keys + ecs: unknown; + process: unknown; + }; + let displayDate = ''; + const sectionData: Array<{ + sectionTitle: string; + entries: Array<{ title: string; description: string }>; + }> = Object.entries(relevantData) + .map(([sectionTitle, val]) => { + if (sectionTitle === '@timestamp') { + displayDate = formatDate(val); + return { sectionTitle: '', entries: [] }; + } + if (typeof val !== 'object') { + return { sectionTitle, entries: [{ title: sectionTitle, description: `${val}` }] }; + } + return { sectionTitle, entries: [...objectToDescriptionListEntries(val)] }; + }) + .filter((v) => v.sectionTitle !== '' && v.entries.length); + return [sectionData, displayDate]; + }, [relatedEventToShowDetailsFor, naString]); + + const waitCrumbs = useMemo(() => { + return [ + { + text: eventsString, + onClick: () => { + pushToQueryParams({ crumbId: '', crumbEvent: '' }); + }, + }, + ]; + }, [pushToQueryParams, eventsString]); + + const { subject = '', descriptor = '' } = relatedEventToShowDetailsFor + ? event.descriptiveName(relatedEventToShowDetailsFor) + : {}; + const crumbs = useMemo(() => { + return [ + { + text: eventsString, + onClick: () => { + pushToQueryParams({ crumbId: '', crumbEvent: '' }); + }, + }, + { + text: processName, + onClick: () => { + pushToQueryParams({ crumbId: processEntityId!, crumbEvent: '' }); + }, + }, + { + text: ( + <> + + + ), + onClick: () => { + pushToQueryParams({ crumbId: processEntityId!, crumbEvent: 'all' }); + }, + }, + { + text: ( + <> + + + ), + onClick: () => { + pushToQueryParams({ + crumbId: processEntityId!, + crumbEvent: relatedEventCategory || 'all', + }); + }, + }, + { + text: relatedEventToShowDetailsFor ? ( + + ) : ( + naString + ), + onClick: () => {}, + }, + ]; + }, [ + processName, + processEntityId, + eventsString, + pushToQueryParams, + totalCount, + countBySameCategory, + naString, + relatedEventCategory, + relatedEventToShowDetailsFor, + subject, + descriptor, + ]); + + /** + * If the ship hasn't come in yet, wait on the dock + */ + if (!relatedsReady) { + const waitingString = i18n.translate( + 'xpack.securitySolution.endpoint.resolver.panel.relatedDetail.wait', + { + defaultMessage: 'Waiting For Events...', + } + ); + return ( + <> + + + +

{waitingString}

+
+ + ); + } + + /** + * Could happen if user e.g. loads a URL with a bad crumbEvent + */ + if (!relatedEventToShowDetailsFor) { + const errString = i18n.translate( + 'xpack.securitySolution.endpoint.resolver.panel.relatedDetail.missing', + { + defaultMessage: 'Related event not found.', + } + ); + return ( + + ); + } + + return ( + <> + + + + + + + + + + + + + + + + {sections.map(({ sectionTitle, entries }, index) => { + return ( + + {index === 0 ? null : } + + + + {sectionTitle} + + + + + + + {index === sections.length - 1 ? null : } + + ); + })} + + ); +}); diff --git a/x-pack/plugins/security_solution/public/resolver/view/styles.tsx b/x-pack/plugins/security_solution/public/resolver/view/styles.tsx index 4cdb29b283f1e..dfc2f970f1e6f 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/styles.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/styles.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import styled from 'styled-components'; -import { Panel } from './panel'; +import { Panel } from './panels'; /** * The top level DOM element for Resolver From ccf8e2b045869f0274534fd6350b896055e8313f Mon Sep 17 00:00:00 2001 From: Shahzad Date: Thu, 6 Aug 2020 22:45:55 +0200 Subject: [PATCH 005/113] [uptime] Ping Redirects (#65292) --- .../uptime/common/runtime_types/ping/ping.ts | 2 +- .../__snapshots__/expanded_row.test.tsx.snap | 26 +++-- .../monitor/ping_list/expanded_row.tsx | 8 +- .../monitor/ping_list/ping_list.tsx | 1 + .../monitor/ping_list/ping_redirects.tsx | 97 +++++++++++++++++++ .../status_bar/monitor_redirects.tsx | 58 +++++++++++ .../status_details/status_bar/status_bar.tsx | 2 + .../__tests__/get_latest_monitor.test.ts | 2 +- .../server/lib/requests/get_latest_monitor.ts | 2 +- .../rest/fixtures/monitor_latest_status.json | 28 +++++- .../functional/apps/uptime/certificates.ts | 2 +- x-pack/test/functional/apps/uptime/index.ts | 4 + .../test/functional/apps/uptime/locations.ts | 5 +- .../functional/apps/uptime/ping_redirects.ts | 74 ++++++++++++++ .../functional/page_objects/uptime_page.ts | 3 +- .../services/uptime/certificates.ts | 8 -- .../test/functional/services/uptime/common.ts | 8 ++ .../functional/services/uptime/monitor.ts | 28 +++++- 18 files changed, 332 insertions(+), 26 deletions(-) create mode 100644 x-pack/plugins/uptime/public/components/monitor/ping_list/ping_redirects.tsx create mode 100644 x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/monitor_redirects.tsx create mode 100644 x-pack/test/functional/apps/uptime/ping_redirects.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts b/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts index 5ed71acaf7739..0a4d6310927c4 100644 --- a/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts +++ b/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts @@ -143,7 +143,7 @@ export const PingType = t.intersection([ response: t.partial({ body: HttpResponseBodyType, bytes: t.number, - redirects: t.string, + redirects: t.array(t.string), status_code: t.number, }), version: t.string, diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap index 004de391a51a4..11bdf134bd0e8 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap @@ -1,7 +1,9 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`PingListExpandedRow doesn't render list items if the body field is undefined 1`] = ` - + + + + +
+ { }); } return ( - + + {ping?.http?.response?.redirects && ( + + + + )} diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx index 576810bba24fd..09782c1b76edb 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx @@ -237,6 +237,7 @@ export const PingListComponent = (props: Props) => { render: (item: Ping) => { return ( toggleDetails(item, expandedRows, setExpandedRows)} disabled={!item.error && !(item.http?.response?.body?.bytes ?? 0 > 0)} aria-label={ diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_redirects.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_redirects.tsx new file mode 100644 index 0000000000000..b3e59615cbce5 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_redirects.tsx @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import styled from 'styled-components'; +import { EuiListGroup, EuiListGroupItemProps, EuiPanel, EuiSpacer, EuiText } from '@elastic/eui'; +import { Ping } from '../../../../common/runtime_types/ping'; + +const ListGroup = styled(EuiListGroup)` + &&& { + a { + padding-left: 0; + } + } +`; + +interface Props { + monitorStatus: Ping | null; + showTitle?: boolean; +} + +export const PingRedirects: React.FC = ({ monitorStatus, showTitle }) => { + const monitorUrl = monitorStatus?.url?.full; + + const list = monitorStatus?.http?.response?.redirects; + + const listOfRedirects: EuiListGroupItemProps[] = [ + { + label: monitorUrl, + href: monitorUrl, + iconType: 'globe', + size: 's', + target: '_blank', + extraAction: { + color: 'subdued', + iconType: 'popout', + iconSize: 's', + alwaysShow: true, + 'aria-label': i18n.translate('xpack.uptime.monitorList.redirects.openWindow', { + defaultMessage: 'Link will open in new window.', + }), + }, + }, + ]; + + (list ?? []).forEach((url: string) => { + listOfRedirects.push({ + label: url, + href: url, + iconType: 'sortDown', + size: 's', + target: '_blank', + extraAction: { + color: 'subdued', + iconType: 'popout', + iconSize: 's', + 'aria-label': i18n.translate('xpack.uptime.monitorList.redirects.openWindow', { + defaultMessage: 'Link will open in new window.', + }), + alwaysShow: true, + }, + }); + }); + + const Panel = showTitle ? EuiPanel : 'div'; + + return list ? ( + + {showTitle && ( + +

+ {i18n.translate('xpack.uptime.monitorList.redirects.title', { + defaultMessage: 'Redirects', + })} +

+
+ )} + + { + + {i18n.translate('xpack.uptime.monitorList.redirects.description', { + defaultMessage: 'Heartbeat followed {number} redirects while executing ping.', + values: { + number: list?.length ?? 0, + }, + })} + + } + + +
+ ) : null; +}; diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/monitor_redirects.tsx b/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/monitor_redirects.tsx new file mode 100644 index 0000000000000..5129db9c2135b --- /dev/null +++ b/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/monitor_redirects.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiPopover } from '@elastic/eui'; +import styled from 'styled-components'; +import { Ping } from '../../../../../common/runtime_types'; +import { PingRedirects } from '../../ping_list/ping_redirects'; +import { MonListDescription, MonListTitle } from './status_bar'; + +interface Props { + monitorStatus: Ping | null; +} + +const RedirectBtn = styled.span` + cursor: pointer; +`; + +export const MonitorRedirects: React.FC = ({ monitorStatus }) => { + const list = monitorStatus?.http?.response?.redirects; + + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + + const button = ( + + setIsPopoverOpen(!isPopoverOpen)} + data-test-subj="uptimeMonitorRedirectInfo" + > + {i18n.translate('xpack.uptime.monitorList.redirects.title.number', { + defaultMessage: '{number}', + values: { + number: list?.length ?? 0, + }, + })} + + + ); + + return list ? ( + <> + Redirects + setIsPopoverOpen(false)} + > + + + + ) : null; +}; diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.tsx b/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.tsx index afcc8fae7a8ac..4ea383567d71c 100644 --- a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.tsx @@ -23,6 +23,7 @@ import { MonitorIDLabel, OverallAvailability } from '../translations'; import { URL_LABEL } from '../../../common/translations'; import { MonitorLocations } from '../../../../../common/runtime_types/monitor'; import { formatAvailabilityValue } from '../availability_reporting/availability_reporting'; +import { MonitorRedirects } from './monitor_redirects'; export const MonListTitle = styled(EuiDescriptionListTitle)` &&& { @@ -76,6 +77,7 @@ export const MonitorStatusBar: React.FC = () => { {MonitorIDLabel} {monitorId} +
); diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.test.ts b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.test.ts index 01384ec145236..669033fc6524a 100644 --- a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.test.ts +++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.test.ts @@ -32,7 +32,7 @@ describe('getLatestMonitor', () => { }, }, size: 1, - _source: ['url', 'monitor', 'observer', '@timestamp', 'tls.*'], + _source: ['url', 'monitor', 'observer', '@timestamp', 'tls.*', 'http'], sort: { '@timestamp': { order: 'desc' }, }, diff --git a/x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.ts b/x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.ts index a58208fc2bb96..3b4aeaf92c508 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.ts @@ -45,7 +45,7 @@ export const getLatestMonitor: UMElasticsearchQueryFn { }); it('can navigate to cert page', async () => { - await uptimeService.cert.isUptimeDataMissing(); + await uptimeService.common.waitUntilDataIsLoaded(); await uptimeService.cert.hasViewCertButton(); await uptimeService.navigation.goToCertificates(); }); diff --git a/x-pack/test/functional/apps/uptime/index.ts b/x-pack/test/functional/apps/uptime/index.ts index 6b2b61cba2b64..261f685eeb9cc 100644 --- a/x-pack/test/functional/apps/uptime/index.ts +++ b/x-pack/test/functional/apps/uptime/index.ts @@ -56,6 +56,10 @@ export default ({ loadTestFile, getService }: FtrProviderContext) => { loadTestFile(require.resolve('./certificates')); }); + describe('with generated data but no data reset', () => { + loadTestFile(require.resolve('./ping_redirects')); + }); + describe('with real-world data', () => { before(async () => { await esArchiver.unload(ARCHIVE); diff --git a/x-pack/test/functional/apps/uptime/locations.ts b/x-pack/test/functional/apps/uptime/locations.ts index 8aefca6a70195..6bfa19c6ef578 100644 --- a/x-pack/test/functional/apps/uptime/locations.ts +++ b/x-pack/test/functional/apps/uptime/locations.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import moment from 'moment'; import { makeChecksWithStatus } from '../../../api_integration/apis/uptime/rest/helper/make_checks'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -40,8 +39,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }; describe('Observer location', () => { - const start = moment().subtract('15', 'm').toISOString(); - const end = moment().toISOString(); + const start = '~ 15 minutes ago'; + const end = 'now'; before(async () => { await addMonitorWithNoLocation(); diff --git a/x-pack/test/functional/apps/uptime/ping_redirects.ts b/x-pack/test/functional/apps/uptime/ping_redirects.ts new file mode 100644 index 0000000000000..b87e8c1748c82 --- /dev/null +++ b/x-pack/test/functional/apps/uptime/ping_redirects.ts @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { makeChecksWithStatus } from '../../../api_integration/apis/uptime/rest/helper/make_checks'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +export default ({ getPageObjects, getService }: FtrProviderContext) => { + const { uptime: uptimePage, header } = getPageObjects(['uptime', 'header']); + const uptime = getService('uptime'); + const esArchiver = getService('esArchiver'); + + const archive = 'uptime/blank'; + + const monitor = () => uptime.monitor; + + describe('Ping redirects', () => { + const start = '~ 15 minutes ago'; + const end = 'now'; + + const MONITOR_ID = 'redirect-testing-id'; + + before(async () => { + await esArchiver.loadIfNeeded(archive); + }); + + after('unload', async () => { + await esArchiver.unload(archive); + }); + + beforeEach(async () => { + await makeChecksWithStatus( + getService('legacyEs'), + MONITOR_ID, + 5, + 2, + 10000, + { + http: { + rtt: { total: { us: 157784 } }, + response: { + status_code: 200, + redirects: ['http://localhost:3000/first', 'https://www.washingtonpost.com/'], + body: { + bytes: 642102, + hash: '597a8cfb33ff8e09bff16283306553c3895282aaf5386e1843d466d44979e28a', + }, + }, + }, + }, + 'up' + ); + await delay(1000); + }); + + it('loads and goes to details page', async () => { + await uptime.navigation.goToUptime(); + await uptimePage.loadDataAndGoToMonitorPage(start, end, MONITOR_ID); + }); + + it('display redirect info in detail panel', async () => { + await header.waitUntilLoadingHasFinished(); + await monitor().hasRedirectInfo(); + }); + + it('displays redirects in ping list expand row', async () => { + await monitor().hasRedirectInfoInPingList(); + }); + }); +}; diff --git a/x-pack/test/functional/page_objects/uptime_page.ts b/x-pack/test/functional/page_objects/uptime_page.ts index 074a2d598be8a..8102d8b95680e 100644 --- a/x-pack/test/functional/page_objects/uptime_page.ts +++ b/x-pack/test/functional/page_objects/uptime_page.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../ftr_provider_context'; export function UptimePageProvider({ getPageObjects, getService }: FtrProviderContext) { - const pageObjects = getPageObjects(['common', 'timePicker']); + const pageObjects = getPageObjects(['common', 'timePicker', 'header']); const { common: commonService, monitor, navigation } = getService('uptime'); const retry = getService('retry'); @@ -42,6 +42,7 @@ export function UptimePageProvider({ getPageObjects, getService }: FtrProviderCo } public async loadDataAndGoToMonitorPage(dateStart: string, dateEnd: string, monitorId: string) { + await pageObjects.header.waitUntilLoadingHasFinished(); await this.setDateRange(dateStart, dateEnd); await navigation.goToMonitor(monitorId); } diff --git a/x-pack/test/functional/services/uptime/certificates.ts b/x-pack/test/functional/services/uptime/certificates.ts index 06de9be5af7e9..ab43604786282 100644 --- a/x-pack/test/functional/services/uptime/certificates.ts +++ b/x-pack/test/functional/services/uptime/certificates.ts @@ -24,14 +24,6 @@ export function UptimeCertProvider({ getService, getPageObjects }: FtrProviderCo }; return { - async isUptimeDataMissing() { - return retry.tryForTime(60 * 1000, async () => { - if (await testSubjects.exists('data-missing', { timeout: 0 })) { - await refreshApp(); - } - await testSubjects.missingOrFail('data-missing'); - }); - }, async hasViewCertButton() { return retry.tryForTime(15000, async () => { await testSubjects.existOrFail('uptimeCertificatesLink'); diff --git a/x-pack/test/functional/services/uptime/common.ts b/x-pack/test/functional/services/uptime/common.ts index 5f544b5e46010..13c9ead89d09d 100644 --- a/x-pack/test/functional/services/uptime/common.ts +++ b/x-pack/test/functional/services/uptime/common.ts @@ -91,5 +91,13 @@ export function UptimeCommonProvider({ getService }: FtrProviderContext) { 5000 ); }, + async waitUntilDataIsLoaded() { + return retry.tryForTime(60 * 1000, async () => { + if (await testSubjects.exists('data-missing')) { + await testSubjects.click('superDatePickerApplyTimeButton'); + } + await testSubjects.missingOrFail('data-missing'); + }); + }, }; } diff --git a/x-pack/test/functional/services/uptime/monitor.ts b/x-pack/test/functional/services/uptime/monitor.ts index 593950fbb7619..c45454e731696 100644 --- a/x-pack/test/functional/services/uptime/monitor.ts +++ b/x-pack/test/functional/services/uptime/monitor.ts @@ -7,11 +7,13 @@ import expect from '@kbn/expect/expect.js'; import { FtrProviderContext } from '../../ftr_provider_context'; -export function UptimeMonitorProvider({ getService }: FtrProviderContext) { +export function UptimeMonitorProvider({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const retry = getService('retry'); const find = getService('find'); + const PageObjects = getPageObjects(['header']); + return { async locationMissingExists() { return await testSubjects.existOrFail('xpack.uptime.locationMap.locationMissing', { @@ -56,5 +58,29 @@ export function UptimeMonitorProvider({ getService }: FtrProviderContext) { async toggleToMapView() { await testSubjects.click('uptimeMonitorToggleMapBtn'); }, + async hasRedirectInfo() { + return retry.tryForTime(30000, async () => { + await testSubjects.existOrFail('uptimeMonitorRedirectInfo'); + }); + }, + async expandPingRow() { + return retry.tryForTime( + 60 * 3000, + async () => { + await testSubjects.existOrFail('uptimePingListExpandBtn', { timeout: 5000 }); + await testSubjects.click('uptimePingListExpandBtn'); + }, + async () => { + await testSubjects.click('superDatePickerApplyTimeButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + } + ); + }, + async hasRedirectInfoInPingList() { + await this.expandPingRow(); + return retry.tryForTime(60 * 1000, async () => { + await testSubjects.existOrFail('uptimeMonitorPingListRedirectInfo'); + }); + }, }; } From 979bdaa56f4aa42f9e962cb803133aaea80d6977 Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Thu, 6 Aug 2020 19:37:38 -0400 Subject: [PATCH 006/113] [Security Solution][Tech Debt] - Cleans up error formatter to not return duplicate error messages (#74600) ## Summary Using the `formatErrors` util would result in duplicate error messages sometimes. Was noticing this in particular when using union types, where the type validation would check every item in a union and report an error for each one. This resulted in large, repeating errors. Used `uniq` to filter out duplicates. Updated unit tests. --- .../lists/common/schemas/types/comment.test.ts | 3 --- .../schemas/types/default_comments_array.test.ts | 2 -- .../types/default_update_comments_array.test.ts | 2 -- .../lists/common/schemas/types/entries.test.ts | 7 ------- .../types/non_empty_entries_array.test.ts | 4 ---- .../types/non_empty_nested_entries_array.test.ts | 15 --------------- .../common/schemas/types/update_comment.test.ts | 2 -- .../request/create_rules_bulk_schema.test.ts | 1 - .../request/update_rules_bulk_schema.test.ts | 1 - .../common/format_errors.test.ts | 16 ++++++++++++++++ .../security_solution/common/format_errors.ts | 4 +++- .../routes/export_timelines_route.test.ts | 2 +- .../routes/import_timelines_route.test.ts | 10 ++-------- 13 files changed, 22 insertions(+), 47 deletions(-) diff --git a/x-pack/plugins/lists/common/schemas/types/comment.test.ts b/x-pack/plugins/lists/common/schemas/types/comment.test.ts index 081bb9b4bae54..9b6f0e76bdd54 100644 --- a/x-pack/plugins/lists/common/schemas/types/comment.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/comment.test.ts @@ -60,7 +60,6 @@ describe('Comment', () => { expect(getPaths(left(message.errors))).toEqual([ 'Invalid value "undefined" supplied to "({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)"', - 'Invalid value "undefined" supplied to "({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)"', ]); expect(message.schema).toEqual({}); }); @@ -200,7 +199,6 @@ describe('Comment', () => { expect(getPaths(left(message.errors))).toEqual([ 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', - 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', ]); expect(message.schema).toEqual({}); }); @@ -232,7 +230,6 @@ describe('Comment', () => { expect(getPaths(left(message.errors))).toEqual([ 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', - 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/lists/common/schemas/types/default_comments_array.test.ts b/x-pack/plugins/lists/common/schemas/types/default_comments_array.test.ts index ee2dc0cf2a478..0f5ed2ee4a98b 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_comments_array.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/default_comments_array.test.ts @@ -39,7 +39,6 @@ describe('default_comments_array', () => { expect(getPaths(left(message.errors))).toEqual([ 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', - 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', ]); expect(message.schema).toEqual({}); }); @@ -51,7 +50,6 @@ describe('default_comments_array', () => { expect(getPaths(left(message.errors))).toEqual([ 'Invalid value "some string" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', - 'Invalid value "some string" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.test.ts b/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.test.ts index 25c84af8c9ee3..a0f6a2b2a6eaa 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.test.ts @@ -39,7 +39,6 @@ describe('default_update_comments_array', () => { expect(getPaths(left(message.errors))).toEqual([ 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', - 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', ]); expect(message.schema).toEqual({}); }); @@ -51,7 +50,6 @@ describe('default_update_comments_array', () => { expect(getPaths(left(message.errors))).toEqual([ 'Invalid value "some string" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', - 'Invalid value "some string" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/lists/common/schemas/types/entries.test.ts b/x-pack/plugins/lists/common/schemas/types/entries.test.ts index f5c022c7a394f..0537b0b9c6c6a 100644 --- a/x-pack/plugins/lists/common/schemas/types/entries.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/entries.test.ts @@ -61,17 +61,10 @@ describe('Entries', () => { const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "undefined" supplied to "operator"', - 'Invalid value "nested" supplied to "type"', - 'Invalid value "undefined" supplied to "value"', 'Invalid value "undefined" supplied to "operator"', 'Invalid value "nested" supplied to "type"', 'Invalid value "undefined" supplied to "value"', 'Invalid value "undefined" supplied to "list"', - 'Invalid value "undefined" supplied to "operator"', - 'Invalid value "nested" supplied to "type"', - 'Invalid value "undefined" supplied to "operator"', - 'Invalid value "nested" supplied to "type"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.test.ts b/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.test.ts index 42d476a9fefb2..d81509d080056 100644 --- a/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.test.ts @@ -125,10 +125,6 @@ describe('non_empty_entries_array', () => { expect(getPaths(left(message.errors))).toEqual([ 'Invalid value "1" supplied to "NonEmptyEntriesArray"', - 'Invalid value "1" supplied to "NonEmptyEntriesArray"', - 'Invalid value "1" supplied to "NonEmptyEntriesArray"', - 'Invalid value "1" supplied to "NonEmptyEntriesArray"', - 'Invalid value "1" supplied to "NonEmptyEntriesArray"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/lists/common/schemas/types/non_empty_nested_entries_array.test.ts b/x-pack/plugins/lists/common/schemas/types/non_empty_nested_entries_array.test.ts index 7dbc3465610c0..2e54590368959 100644 --- a/x-pack/plugins/lists/common/schemas/types/non_empty_nested_entries_array.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/non_empty_nested_entries_array.test.ts @@ -86,19 +86,6 @@ describe('non_empty_nested_entries_array', () => { 'Invalid value "undefined" supplied to "operator"', 'Invalid value "nested" supplied to "type"', 'Invalid value "undefined" supplied to "value"', - 'Invalid value "undefined" supplied to "operator"', - 'Invalid value "nested" supplied to "type"', - 'Invalid value "undefined" supplied to "value"', - 'Invalid value "undefined" supplied to "operator"', - 'Invalid value "nested" supplied to "type"', - 'Invalid value "undefined" supplied to "operator"', - 'Invalid value "nested" supplied to "type"', - 'Invalid value "undefined" supplied to "value"', - 'Invalid value "undefined" supplied to "operator"', - 'Invalid value "nested" supplied to "type"', - 'Invalid value "undefined" supplied to "value"', - 'Invalid value "undefined" supplied to "operator"', - 'Invalid value "nested" supplied to "type"', ]); expect(message.schema).toEqual({}); }); @@ -123,8 +110,6 @@ describe('non_empty_nested_entries_array', () => { expect(getPaths(left(message.errors))).toEqual([ 'Invalid value "1" supplied to "NonEmptyNestedEntriesArray"', - 'Invalid value "1" supplied to "NonEmptyNestedEntriesArray"', - 'Invalid value "1" supplied to "NonEmptyNestedEntriesArray"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/lists/common/schemas/types/update_comment.test.ts b/x-pack/plugins/lists/common/schemas/types/update_comment.test.ts index ac4d0304cbb8e..ba07421fe60f4 100644 --- a/x-pack/plugins/lists/common/schemas/types/update_comment.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/update_comment.test.ts @@ -110,7 +110,6 @@ describe('CommentsUpdate', () => { expect(getPaths(left(message.errors))).toEqual([ 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', - 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', ]); expect(message.schema).toEqual({}); }); @@ -142,7 +141,6 @@ describe('CommentsUpdate', () => { expect(getPaths(left(message.errors))).toEqual([ 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', - 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts index 00854f1ed5526..d335cafdb7885 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts @@ -127,7 +127,6 @@ describe('create_rules_bulk_schema', () => { const output = foldLeftRight(checked); expect(formatErrors(output.errors)).toEqual([ 'Invalid value "undefined" supplied to "risk_score"', - 'Invalid value "undefined" supplied to "risk_score"', ]); expect(output.schema).toEqual({}); }); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts index 4cb38889045fc..33a22d9a5f805 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts @@ -123,7 +123,6 @@ describe('update_rules_bulk_schema', () => { const output = foldLeftRight(checked); expect(formatErrors(output.errors)).toEqual([ 'Invalid value "undefined" supplied to "risk_score"', - 'Invalid value "undefined" supplied to "risk_score"', ]); expect(output.schema).toEqual({}); }); diff --git a/x-pack/plugins/security_solution/common/format_errors.test.ts b/x-pack/plugins/security_solution/common/format_errors.test.ts index c8cd72b72816b..06bdf67097764 100644 --- a/x-pack/plugins/security_solution/common/format_errors.test.ts +++ b/x-pack/plugins/security_solution/common/format_errors.test.ts @@ -41,6 +41,22 @@ describe('utils', () => { expect(output).toEqual(['some error 1', 'some error 2']); }); + test('it filters out duplicate error messages', () => { + const validationError1: t.ValidationError = { + value: 'Some existing error 1', + context: [], + message: 'some error 1', + }; + const validationError2: t.ValidationError = { + value: 'Some existing error 1', + context: [], + message: 'some error 1', + }; + const errors: t.Errors = [validationError1, validationError2]; + const output = formatErrors(errors); + expect(output).toEqual(['some error 1']); + }); + test('will use message before context if it is set', () => { const context: t.Context = ([{ key: 'some string key' }] as unknown) as t.Context; const validationError1: t.ValidationError = { diff --git a/x-pack/plugins/security_solution/common/format_errors.ts b/x-pack/plugins/security_solution/common/format_errors.ts index ba963f34f2983..4e1f5e4796152 100644 --- a/x-pack/plugins/security_solution/common/format_errors.ts +++ b/x-pack/plugins/security_solution/common/format_errors.ts @@ -8,7 +8,7 @@ import * as t from 'io-ts'; import { isObject } from 'lodash/fp'; export const formatErrors = (errors: t.Errors): string[] => { - return errors.map((error) => { + const err = errors.map((error) => { if (error.message != null) { return error.message; } else { @@ -26,4 +26,6 @@ export const formatErrors = (errors: t.Errors): string[] => { return `Invalid value "${value}" supplied to "${suppliedValue}"`; } }); + + return [...new Set(err)]; }; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/export_timelines_route.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/export_timelines_route.test.ts index a6f0ce232fa7b..5a976ee7521af 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/export_timelines_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/export_timelines_route.test.ts @@ -110,7 +110,7 @@ describe('export timelines', () => { const result = server.validate(request); expect(result.badRequest.mock.calls[0][0]).toEqual( - 'Invalid value "someId" supplied to "ids",Invalid value "someId" supplied to "ids",Invalid value "{"ids":"someId"}" supplied to "(Partial<{ ids: (Array | null) }> | null)"' + 'Invalid value "someId" supplied to "ids",Invalid value "{"ids":"someId"}" supplied to "(Partial<{ ids: (Array | null) }> | null)"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/import_timelines_route.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/import_timelines_route.test.ts index 2ad6c5d6fff60..ff76045db90cb 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/import_timelines_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/import_timelines_route.test.ts @@ -494,10 +494,7 @@ describe('import timelines', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - [ - 'Invalid value "undefined" supplied to "file"', - 'Invalid value "undefined" supplied to "file"', - ].join(',') + 'Invalid value "undefined" supplied to "file"' ); }); }); @@ -923,10 +920,7 @@ describe('import timeline templates', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - [ - 'Invalid value "undefined" supplied to "file"', - 'Invalid value "undefined" supplied to "file"', - ].join(',') + 'Invalid value "undefined" supplied to "file"' ); }); }); From fbd79ea72677bb4d7aca1c5fc809c2f710e05071 Mon Sep 17 00:00:00 2001 From: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Date: Thu, 6 Aug 2020 19:41:18 -0400 Subject: [PATCH 007/113] skip query of detections page when we do not have .siem-signals index (#74580) * skip query of detections page when we do not have .siem-signals index * review I --- .../timelines/containers/helpers.test.ts | 54 +++++++++++++++++++ .../public/timelines/containers/helpers.ts | 17 ++++++ .../public/timelines/containers/index.tsx | 7 ++- 3 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/timelines/containers/helpers.test.ts create mode 100644 x-pack/plugins/security_solution/public/timelines/containers/helpers.ts diff --git a/x-pack/plugins/security_solution/public/timelines/containers/helpers.test.ts b/x-pack/plugins/security_solution/public/timelines/containers/helpers.test.ts new file mode 100644 index 0000000000000..043b5fe39a8bf --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/containers/helpers.test.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { TimelineId } from '../../../common/types/timeline'; +import { skipQueryForDetectionsPage } from './helpers'; + +describe('skipQueryForDetectionsPage', () => { + test('Make sure to NOT skip the query when it is not a timeline from a detection pages', () => { + expect(skipQueryForDetectionsPage(TimelineId.active, ['auditbeat-*', 'filebeat-*'])).toBe( + false + ); + expect( + skipQueryForDetectionsPage(TimelineId.hostsPageEvents, ['auditbeat-*', 'filebeat-*']) + ).toBe(false); + expect( + skipQueryForDetectionsPage(TimelineId.hostsPageExternalAlerts, ['auditbeat-*', 'filebeat-*']) + ).toBe(false); + expect( + skipQueryForDetectionsPage(TimelineId.networkPageExternalAlerts, [ + 'auditbeat-*', + 'filebeat-*', + ]) + ).toBe(false); + }); + + test('Make sure to SKIP the query when it is a timeline from a detection pages without the siem-signals', () => { + expect( + skipQueryForDetectionsPage(TimelineId.detectionsPage, ['auditbeat-*', 'filebeat-*']) + ).toBe(true); + expect( + skipQueryForDetectionsPage(TimelineId.detectionsRulesDetailsPage, [ + 'auditbeat-*', + 'filebeat-*', + ]) + ).toBe(true); + }); + + test('Make sure to NOT skip the query when it is a timeline from a detection pages with the siem-signals', () => { + expect( + skipQueryForDetectionsPage(TimelineId.detectionsPage, [ + 'auditbeat-*', + '.siem-signals-rainbow-butterfly', + ]) + ).toBe(false); + expect( + skipQueryForDetectionsPage(TimelineId.detectionsRulesDetailsPage, [ + '.siem-signals-rainbow-butterfly', + ]) + ).toBe(false); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/containers/helpers.ts b/x-pack/plugins/security_solution/public/timelines/containers/helpers.ts new file mode 100644 index 0000000000000..aef6f4df6f41b --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/containers/helpers.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { TimelineId } from '../../../common/types/timeline'; + +export const detectionsTimelineIds = [ + TimelineId.detectionsPage, + TimelineId.detectionsRulesDetailsPage, +]; + +export const skipQueryForDetectionsPage = (id: string, defaultIndex: string[]) => + id != null && + detectionsTimelineIds.some((timelineId) => timelineId === id) && + !defaultIndex.some((di) => di.toLowerCase().startsWith('.siem-signals')); diff --git a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx index 562999108b4b0..de7175f0a7f97 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx @@ -11,7 +11,6 @@ import { Query } from 'react-apollo'; import { compose, Dispatch } from 'redux'; import { connect, ConnectedProps } from 'react-redux'; -import { TimelineId } from '../../../common/types/timeline'; import { DEFAULT_INDEX_KEY } from '../../../common/constants'; import { IIndexPattern } from '../../../../../../src/plugins/data/common/index_patterns'; import { @@ -28,8 +27,7 @@ import { QueryTemplate, QueryTemplateProps } from '../../common/containers/query import { EventType } from '../../timelines/store/timeline/model'; import { timelineQuery } from './index.gql_query'; import { timelineActions } from '../../timelines/store/timeline'; - -const timelineIds = [TimelineId.detectionsPage, TimelineId.detectionsRulesDetailsPage]; +import { detectionsTimelineIds, skipQueryForDetectionsPage } from './helpers'; export interface TimelineArgs { events: TimelineItem[]; @@ -130,6 +128,7 @@ class TimelineQueryComponent extends QueryTemplate< query={timelineQuery} fetchPolicy="network-only" notifyOnNetworkStatusChange + skip={skipQueryForDetectionsPage(id, defaultIndex)} variables={variables} > {({ data, loading, fetchMore, refetch }) => { @@ -202,7 +201,7 @@ const makeMapStateToProps = () => { const mapDispatchToProps = (dispatch: Dispatch) => ({ clearSignalsState: ({ id }: { id?: string }) => { - if (id != null && timelineIds.some((timelineId) => timelineId === id)) { + if (id != null && detectionsTimelineIds.some((timelineId) => timelineId === id)) { dispatch(timelineActions.clearEventsLoading({ id })); dispatch(timelineActions.clearEventsDeleted({ id })); } From 5d9f329a36d8be7fe8601498beadb1e8f7cfd072 Mon Sep 17 00:00:00 2001 From: Sandra Gonzales Date: Fri, 7 Aug 2020 08:03:13 -0500 Subject: [PATCH 008/113] [Ingest Manager] Integration tests for updating a package (#74593) * add integration tests for updating a package's assets * update to update tests and change to dataset to data_stream * add datastream test --- .../services/epm/elasticsearch/ilm/install.ts | 1 - .../apis/epm/data_stream.ts | 130 ++++++++ .../apis/epm/index.js | 2 + .../apis/epm/install_remove_assets.ts | 5 +- .../apis/epm/update_assets.ts | 299 ++++++++++++++++++ .../0.1.0/dataset/test_logs/fields/ecs.yml | 3 + .../0.1.0/dataset/test_metrics/fields/ecs.yml | 3 + .../visualization/sample_visualization.json | 2 +- .../elasticsearch/ilm_policy/all_assets.json | 15 + .../elasticsearch/ingest_pipeline/default.yml | 7 + .../0.2.0/dataset/test_logs/fields/ecs.yml | 6 + .../0.2.0/dataset/test_logs/fields/fields.yml | 16 + .../0.2.0/dataset/test_logs/manifest.yml | 9 + .../0.2.0/dataset/test_logs2/fields/ecs.yml | 3 + .../dataset/test_logs2/fields/fields.yml | 16 + .../0.2.0/dataset/test_logs2/manifest.yml | 3 + .../0.2.0/dataset/test_metrics/fields/ecs.yml | 3 + .../dataset/test_metrics/fields/fields.yml | 16 + .../0.2.0/dataset/test_metrics/manifest.yml | 3 + .../all_assets/0.2.0/docs/README.md | 3 + .../0.2.0/img/logo_overrides_64_color.svg | 7 + .../kibana/dashboard/sample_dashboard.json | 16 + .../0.2.0/kibana/search/sample_search2.json | 24 ++ .../visualization/sample_visualization.json | 11 + .../all_assets/0.2.0/manifest.yml | 20 ++ .../elasticsearch/ilm_policy/all_assets.json | 15 + .../elasticsearch/ingest_pipeline/default.yml | 7 + .../0.1.0/dataset/test_logs/fields/ecs.yml | 3 + .../0.1.0/dataset/test_logs/fields/fields.yml | 16 + .../0.1.0/dataset/test_logs/manifest.yml | 9 + .../0.1.0/dataset/test_metrics/fields/ecs.yml | 3 + .../dataset/test_metrics/fields/fields.yml | 16 + .../0.1.0/dataset/test_metrics/manifest.yml | 3 + .../datastreams/0.1.0/docs/README.md | 3 + .../datastreams/0.1.0/manifest.yml | 20 ++ .../elasticsearch/ilm_policy/all_assets.json | 15 + .../elasticsearch/ingest_pipeline/default.yml | 7 + .../0.2.0/dataset/test_logs/fields/ecs.yml | 6 + .../0.2.0/dataset/test_logs/fields/fields.yml | 16 + .../0.2.0/dataset/test_logs/manifest.yml | 9 + .../0.2.0/dataset/test_metrics/fields/ecs.yml | 6 + .../dataset/test_metrics/fields/fields.yml | 16 + .../0.2.0/dataset/test_metrics/manifest.yml | 3 + .../datastreams/0.2.0/docs/README.md | 3 + .../datastreams/0.2.0/manifest.yml | 20 ++ 45 files changed, 816 insertions(+), 3 deletions(-) create mode 100644 x-pack/test/ingest_manager_api_integration/apis/epm/data_stream.ts create mode 100644 x-pack/test/ingest_manager_api_integration/apis/epm/update_assets.ts create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/ecs.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/ecs.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/ecs.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/fields.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/manifest.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/ecs.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/fields.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/manifest.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/ecs.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/fields.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/manifest.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/docs/README.md create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/img/logo_overrides_64_color.svg create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/dashboard/sample_dashboard.json create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/search/sample_search2.json create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/visualization/sample_visualization.json create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/manifest.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/ecs.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/fields.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/manifest.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/ecs.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/fields.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/manifest.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/docs/README.md create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/manifest.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/ecs.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/fields.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/manifest.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/ecs.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/fields.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/manifest.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/docs/README.md create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/manifest.yml diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ilm/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ilm/install.ts index 9590167657d98..c5253e4902cab 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ilm/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ilm/install.ts @@ -16,7 +16,6 @@ export async function installILMPolicy(paths: string[], callCluster: CallESAsCur const { file } = Registry.pathParts(path); const name = file.substr(0, file.lastIndexOf('.')); try { - if (await policyExists(name, callCluster)) return; await callCluster('transport.request', { method: 'PUT', path: '/_ilm/policy/' + name, diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/data_stream.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/data_stream.ts new file mode 100644 index 0000000000000..68a4812d4af40 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/data_stream.ts @@ -0,0 +1,130 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; +import { skipIfNoDockerRegistry } from '../../helpers'; + +export default function (providerContext: FtrProviderContext) { + const { getService } = providerContext; + const supertest = getService('supertest'); + const es = getService('es'); + const pkgName = 'datastreams'; + const pkgVersion = '0.1.0'; + const pkgUpdateVersion = '0.2.0'; + const pkgKey = `${pkgName}-${pkgVersion}`; + const pkgUpdateKey = `${pkgName}-${pkgUpdateVersion}`; + const logsTemplateName = `logs-${pkgName}.test_logs`; + const metricsTemplateName = `metrics-${pkgName}.test_metrics`; + + const uninstallPackage = async (pkg: string) => { + await supertest.delete(`/api/ingest_manager/epm/packages/${pkg}`).set('kbn-xsrf', 'xxxx'); + }; + const installPackage = async (pkg: string) => { + await supertest + .post(`/api/ingest_manager/epm/packages/${pkg}`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }); + }; + + describe('datastreams', async () => { + skipIfNoDockerRegistry(providerContext); + before(async () => { + await installPackage(pkgKey); + await es.transport.request({ + method: 'POST', + path: `/${logsTemplateName}-default/_doc`, + body: { + '@timestamp': '2015-01-01', + logs_test_name: 'test', + data_stream: { + dataset: `${pkgName}.test_logs`, + namespace: 'default', + type: 'logs', + }, + }, + }); + await es.transport.request({ + method: 'POST', + path: `/${metricsTemplateName}-default/_doc`, + body: { + '@timestamp': '2015-01-01', + logs_test_name: 'test', + data_stream: { + dataset: `${pkgName}.test_metrics`, + namespace: 'default', + type: 'metrics', + }, + }, + }); + }); + after(async () => { + await uninstallPackage(pkgUpdateKey); + await es.transport.request({ + method: 'DELETE', + path: `/_data_stream/${logsTemplateName}-default`, + }); + await es.transport.request({ + method: 'DELETE', + path: `/_data_stream/${metricsTemplateName}-default`, + }); + }); + describe('get datastreams after data sent', async () => { + skipIfNoDockerRegistry(providerContext); + let resLogsDatastream: any; + let resMetricsDatastream: any; + before(async () => { + resLogsDatastream = await es.transport.request({ + method: 'GET', + path: `/_data_stream/${logsTemplateName}-default`, + }); + resMetricsDatastream = await es.transport.request({ + method: 'GET', + path: `/_data_stream/${metricsTemplateName}-default`, + }); + }); + it('should list the logs datastream', async function () { + expect(resLogsDatastream.body.data_streams.length).equal(1); + expect(resLogsDatastream.body.data_streams[0].indices.length).equal(1); + expect(resLogsDatastream.body.data_streams[0].indices[0].index_name).equal( + `.ds-${logsTemplateName}-default-000001` + ); + }); + it('should list the metrics datastream', async function () { + expect(resMetricsDatastream.body.data_streams.length).equal(1); + expect(resMetricsDatastream.body.data_streams[0].indices.length).equal(1); + expect(resMetricsDatastream.body.data_streams[0].indices[0].index_name).equal( + `.ds-${metricsTemplateName}-default-000001` + ); + }); + }); + describe('rollover datastream when mappings are not compatible', async () => { + skipIfNoDockerRegistry(providerContext); + let resLogsDatastream: any; + let resMetricsDatastream: any; + before(async () => { + await installPackage(pkgUpdateKey); + resLogsDatastream = await es.transport.request({ + method: 'GET', + path: `/_data_stream/${logsTemplateName}-default`, + }); + resMetricsDatastream = await es.transport.request({ + method: 'GET', + path: `/_data_stream/${metricsTemplateName}-default`, + }); + }); + it('should have rolled over logs datastream', async function () { + expect(resLogsDatastream.body.data_streams[0].indices.length).equal(2); + expect(resLogsDatastream.body.data_streams[0].indices[1].index_name).equal( + `.ds-${logsTemplateName}-default-000002` + ); + }); + it('should have not rolled over metrics datastream', async function () { + expect(resMetricsDatastream.body.data_streams[0].indices.length).equal(1); + }); + }); + }); +} diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/index.js b/x-pack/test/ingest_manager_api_integration/apis/epm/index.js index 1582f72dd1cd8..0f32d2b4ae703 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/index.js +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/index.js @@ -13,5 +13,7 @@ export default function loadTests({ loadTestFile }) { loadTestFile(require.resolve('./install_overrides')); loadTestFile(require.resolve('./install_remove_assets')); loadTestFile(require.resolve('./install_update')); + loadTestFile(require.resolve('./update_assets')); + loadTestFile(require.resolve('./data_stream')); }); } diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts index 35058de0684b2..03d0b6abb4802 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts @@ -23,7 +23,10 @@ export default function (providerContext: FtrProviderContext) { await supertest.delete(`/api/ingest_manager/epm/packages/${pkg}`).set('kbn-xsrf', 'xxxx'); }; const installPackage = async (pkg: string) => { - await supertest.post(`/api/ingest_manager/epm/packages/${pkg}`).set('kbn-xsrf', 'xxxx'); + await supertest + .post(`/api/ingest_manager/epm/packages/${pkg}`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }); }; describe('installs and uninstalls all assets', async () => { diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/update_assets.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/update_assets.ts new file mode 100644 index 0000000000000..59ad7a9744ae1 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/update_assets.ts @@ -0,0 +1,299 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; +import { skipIfNoDockerRegistry } from '../../helpers'; + +export default function (providerContext: FtrProviderContext) { + const { getService } = providerContext; + const kibanaServer = getService('kibanaServer'); + const supertest = getService('supertest'); + const es = getService('es'); + const pkgName = 'all_assets'; + const pkgVersion = '0.1.0'; + const pkgUpdateVersion = '0.2.0'; + const pkgKey = `${pkgName}-${pkgVersion}`; + const pkgUpdateKey = `${pkgName}-${pkgUpdateVersion}`; + const logsTemplateName = `logs-${pkgName}.test_logs`; + const logsTemplateName2 = `logs-${pkgName}.test_logs2`; + const metricsTemplateName = `metrics-${pkgName}.test_metrics`; + + const uninstallPackage = async (pkg: string) => { + await supertest.delete(`/api/ingest_manager/epm/packages/${pkg}`).set('kbn-xsrf', 'xxxx'); + }; + const installPackage = async (pkg: string) => { + await supertest + .post(`/api/ingest_manager/epm/packages/${pkg}`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }); + }; + + describe('updates all assets when updating a package to a different version', async () => { + skipIfNoDockerRegistry(providerContext); + before(async () => { + await installPackage(pkgKey); + await installPackage(pkgUpdateKey); + }); + after(async () => { + await uninstallPackage(pkgUpdateKey); + }); + it('should have updated the ILM policy', async function () { + const resPolicy = await es.transport.request({ + method: 'GET', + path: `/_ilm/policy/all_assets`, + }); + expect(resPolicy.body.all_assets.policy).eql({ + phases: { + hot: { + min_age: '1ms', + actions: { + rollover: { + max_size: '50gb', + max_age: '31d', + }, + }, + }, + }, + }); + }); + it('should have updated the index templates', async function () { + const resLogsTemplate = await es.transport.request({ + method: 'GET', + path: `/_index_template/${logsTemplateName}`, + }); + expect(resLogsTemplate.statusCode).equal(200); + expect( + resLogsTemplate.body.index_templates[0].index_template.template.mappings.properties + ).eql({ + '@timestamp': { + type: 'date', + }, + logs_test_name: { + type: 'text', + }, + new_field_name: { + ignore_above: 1024, + type: 'keyword', + }, + data_stream: { + properties: { + dataset: { + type: 'constant_keyword', + }, + namespace: { + type: 'constant_keyword', + }, + type: { + type: 'constant_keyword', + }, + }, + }, + }); + const resMetricsTemplate = await es.transport.request({ + method: 'GET', + path: `/_index_template/${metricsTemplateName}`, + }); + expect(resMetricsTemplate.statusCode).equal(200); + expect( + resMetricsTemplate.body.index_templates[0].index_template.template.mappings.properties + ).eql({ + '@timestamp': { + type: 'date', + }, + metrics_test_name2: { + ignore_above: 1024, + type: 'keyword', + }, + data_stream: { + properties: { + dataset: { + type: 'constant_keyword', + }, + namespace: { + type: 'constant_keyword', + }, + type: { + type: 'constant_keyword', + }, + }, + }, + }); + }); + it('should have installed the new index template', async function () { + const resLogsTemplate = await es.transport.request({ + method: 'GET', + path: `/_index_template/${logsTemplateName2}`, + }); + expect(resLogsTemplate.statusCode).equal(200); + expect( + resLogsTemplate.body.index_templates[0].index_template.template.mappings.properties + ).eql({ + '@timestamp': { + type: 'date', + }, + test_logs2: { + ignore_above: 1024, + type: 'keyword', + }, + data_stream: { + properties: { + dataset: { + type: 'constant_keyword', + }, + namespace: { + type: 'constant_keyword', + }, + type: { + type: 'constant_keyword', + }, + }, + }, + }); + }); + it('should have installed the new versionized pipeline', async function () { + const res = await es.transport.request({ + method: 'GET', + path: `/_ingest/pipeline/${logsTemplateName}-${pkgUpdateVersion}`, + }); + expect(res.statusCode).equal(200); + }); + it('should have removed the old versionized pipelines', async function () { + let res; + try { + res = await es.transport.request({ + method: 'GET', + path: `/_ingest/pipeline/${logsTemplateName}-${pkgVersion}`, + }); + } catch (err) { + res = err; + } + expect(res.statusCode).equal(404); + }); + it('should have updated the template components', async function () { + const res = await es.transport.request({ + method: 'GET', + path: `/_component_template/${logsTemplateName}-mappings`, + }); + expect(res.statusCode).equal(200); + expect(res.body.component_templates[0].component_template.template.mappings).eql({ + dynamic: true, + properties: { '@timestamp': { type: 'date' } }, + }); + const resSettings = await es.transport.request({ + method: 'GET', + path: `/_component_template/${logsTemplateName}-settings`, + }); + expect(res.statusCode).equal(200); + expect(resSettings.body.component_templates[0].component_template.template.settings).eql({ + index: { lifecycle: { name: 'reference2' } }, + }); + }); + it('should have updated the index patterns', async function () { + const resIndexPatternLogs = await kibanaServer.savedObjects.get({ + type: 'index-pattern', + id: 'logs-*', + }); + const fields = JSON.parse(resIndexPatternLogs.attributes.fields); + const updated = fields.filter((field: { name: string }) => field.name === 'new_field_name'); + expect(!!updated.length).equal(true); + const resIndexPatternMetrics = await kibanaServer.savedObjects.get({ + type: 'index-pattern', + id: 'metrics-*', + }); + const fieldsMetrics = JSON.parse(resIndexPatternMetrics.attributes.fields); + const updatedMetrics = fieldsMetrics.filter( + (field: { name: string }) => field.name === 'metrics_test_name2' + ); + expect(!!updatedMetrics.length).equal(true); + }); + it('should have updated the kibana assets', async function () { + const resDashboard = await kibanaServer.savedObjects.get({ + type: 'dashboard', + id: 'sample_dashboard', + }); + expect(resDashboard.id).equal('sample_dashboard'); + let resDashboard2; + try { + resDashboard2 = await kibanaServer.savedObjects.get({ + type: 'dashboard', + id: 'sample_dashboard2', + }); + } catch (err) { + resDashboard2 = err; + } + expect(resDashboard2.response.data.statusCode).equal(404); + const resVis = await kibanaServer.savedObjects.get({ + type: 'visualization', + id: 'sample_visualization', + }); + expect(resVis.attributes.description).equal('sample visualization 0.2.0'); + let resSearch; + try { + resSearch = await kibanaServer.savedObjects.get({ + type: 'search', + id: 'sample_search', + }); + } catch (err) { + resSearch = err; + } + expect(resSearch.response.data.statusCode).equal(404); + const resSearch2 = await kibanaServer.savedObjects.get({ + type: 'search', + id: 'sample_search2', + }); + expect(resSearch2.id).equal('sample_search2'); + }); + it('should have updated the saved object', async function () { + const res = await kibanaServer.savedObjects.get({ + type: 'epm-packages', + id: 'all_assets', + }); + expect(res.attributes).eql({ + installed_kibana: [ + { + id: 'sample_dashboard', + type: 'dashboard', + }, + { + id: 'sample_search2', + type: 'search', + }, + { + id: 'sample_visualization', + type: 'visualization', + }, + ], + installed_es: [ + { + id: 'logs-all_assets.test_logs-0.2.0', + type: 'ingest_pipeline', + }, + { + id: 'logs-all_assets.test_logs', + type: 'index_template', + }, + { + id: 'logs-all_assets.test_logs2', + type: 'index_template', + }, + { + id: 'metrics-all_assets.test_metrics', + type: 'index_template', + }, + ], + es_index_patterns: { + test_logs: 'logs-all_assets.test_logs-*', + test_metrics: 'metrics-all_assets.test_metrics-*', + }, + name: 'all_assets', + version: '0.2.0', + internal: false, + removable: true, + }); + }); + }); +} diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/ecs.yml new file mode 100644 index 0000000000000..3d88fe5dfefb6 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/ecs.yml @@ -0,0 +1,3 @@ +- name: logs_test_name + title: logs_test_title + type: keyword \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/ecs.yml new file mode 100644 index 0000000000000..a30e3c7a87856 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/ecs.yml @@ -0,0 +1,3 @@ +- name: metrics_test_name + title: metrics_test_title + type: keyword \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/kibana/visualization/sample_visualization.json b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/kibana/visualization/sample_visualization.json index e814b83bbf324..917479fd7d120 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/kibana/visualization/sample_visualization.json +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/kibana/visualization/sample_visualization.json @@ -1,6 +1,6 @@ { "attributes": { - "description": "sample visualization", + "description": "sample visualization update", "title": "sample vis title", "uiStateJSON": "{}", "version": 1, diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json new file mode 100644 index 0000000000000..d8bab8a75f680 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json @@ -0,0 +1,15 @@ +{ + "policy": { + "phases": { + "hot": { + "min_age": "1ms", + "actions": { + "rollover": { + "max_size": "50gb", + "max_age": "31d" + } + } + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml new file mode 100644 index 0000000000000..580db049d0d5d --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml @@ -0,0 +1,7 @@ +--- +description: Pipeline for parsing test logs + plugins. +processors: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/ecs.yml new file mode 100644 index 0000000000000..7df52cc11fd20 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/ecs.yml @@ -0,0 +1,6 @@ +- name: logs_test_name + title: logs_test_title + type: text +- name: new_field_name + title: new_field_title + type: keyword diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/fields.yml new file mode 100644 index 0000000000000..6e003ed0ad147 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/fields/fields.yml @@ -0,0 +1,16 @@ +- name: data_stream.type + type: constant_keyword + description: > + Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: > + Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: > + Data stream namespace. +- name: '@timestamp' + type: date + description: > + Event timestamp. diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/manifest.yml new file mode 100644 index 0000000000000..8a53f9e26e827 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs/manifest.yml @@ -0,0 +1,9 @@ +title: Test Dataset + +type: logs + +elasticsearch: + index_template.mappings: + dynamic: true + index_template.settings: + index.lifecycle.name: reference2 \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/ecs.yml new file mode 100644 index 0000000000000..c5819deb1ee37 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/ecs.yml @@ -0,0 +1,3 @@ +- name: test_logs2 + title: test_logs2 + type: keyword \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/fields.yml new file mode 100644 index 0000000000000..6e003ed0ad147 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/fields/fields.yml @@ -0,0 +1,16 @@ +- name: data_stream.type + type: constant_keyword + description: > + Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: > + Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: > + Data stream namespace. +- name: '@timestamp' + type: date + description: > + Event timestamp. diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/manifest.yml new file mode 100644 index 0000000000000..e12f454657ea2 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_logs2/manifest.yml @@ -0,0 +1,3 @@ +title: Test Dataset + +type: logs \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/ecs.yml new file mode 100644 index 0000000000000..9529c3a8eaf1a --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/ecs.yml @@ -0,0 +1,3 @@ +- name: metrics_test_name2 + title: metrics_test_title2 + type: keyword \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/fields.yml new file mode 100644 index 0000000000000..6e003ed0ad147 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/fields/fields.yml @@ -0,0 +1,16 @@ +- name: data_stream.type + type: constant_keyword + description: > + Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: > + Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: > + Data stream namespace. +- name: '@timestamp' + type: date + description: > + Event timestamp. diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/manifest.yml new file mode 100644 index 0000000000000..6bc20442bd432 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/dataset/test_metrics/manifest.yml @@ -0,0 +1,3 @@ +title: Test Dataset + +type: metrics \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/docs/README.md b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/docs/README.md new file mode 100644 index 0000000000000..2617f1fcabe11 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/docs/README.md @@ -0,0 +1,3 @@ +# Test package + +For testing that a package installs its elasticsearch assets when installed for the first time (not updating) and removing the package diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/img/logo_overrides_64_color.svg b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/img/logo_overrides_64_color.svg new file mode 100644 index 0000000000000..b03007a76ffcc --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/img/logo_overrides_64_color.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/dashboard/sample_dashboard.json b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/dashboard/sample_dashboard.json new file mode 100644 index 0000000000000..ef08d69324210 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/dashboard/sample_dashboard.json @@ -0,0 +1,16 @@ +{ + "attributes": { + "description": "Sample dashboard", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"filter\":[],\"highlightAll\":true,\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"version\":true}" + }, + "optionsJSON": "{\"darkTheme\":false}", + "panelsJSON": "[{\"embeddableConfig\":{},\"gridData\":{\"h\":12,\"i\":\"1\",\"w\":24,\"x\":0,\"y\":0},\"panelIndex\":\"1\",\"panelRefName\":\"panel_0\",\"version\":\"7.3.0\"},{\"embeddableConfig\":{\"columns\":[\"kafka.log.class\",\"kafka.log.trace.class\",\"kafka.log.trace.full\"],\"sort\":[\"@timestamp\",\"desc\"]},\"gridData\":{\"h\":12,\"i\":\"2\",\"w\":24,\"x\":24,\"y\":0},\"panelIndex\":\"2\",\"panelRefName\":\"panel_1\",\"version\":\"7.3.0\"},{\"embeddableConfig\":{\"columns\":[\"log.level\",\"kafka.log.component\",\"message\"],\"sort\":[\"@timestamp\",\"desc\"]},\"gridData\":{\"h\":20,\"i\":\"3\",\"w\":48,\"x\":0,\"y\":20},\"panelIndex\":\"3\",\"panelRefName\":\"panel_2\",\"version\":\"7.3.0\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":8,\"i\":\"4\",\"w\":48,\"x\":0,\"y\":12},\"panelIndex\":\"4\",\"panelRefName\":\"panel_3\",\"version\":\"7.3.0\"}]", + "timeRestore": false, + "title": "[Logs Sample] Overview ECS", + "version": 1 + }, + "id": "sample_dashboard", + "type": "dashboard" +} \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/search/sample_search2.json b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/search/sample_search2.json new file mode 100644 index 0000000000000..aa5cea19208a4 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/search/sample_search2.json @@ -0,0 +1,24 @@ +{ + "attributes": { + "columns": [ + "log.level", + "kafka.log.component", + "message" + ], + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\",\"key\":\"dataset.name\",\"negate\":false,\"params\":{\"query\":\"kafka.log\",\"type\":\"phrase\"},\"type\":\"phrase\",\"value\":\"log\"},\"query\":{\"match\":{\"dataset.name\":{\"query\":\"kafka.log\",\"type\":\"phrase\"}}}}],\"highlightAll\":true,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\",\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"version\":true}" + }, + "sort": [ + [ + "@timestamp", + "desc" + ] + ], + "title": "All logs [Logs Kafka] ECS", + "version": 1 + }, + "id": "sample_search2", + "type": "search" +} \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/visualization/sample_visualization.json b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/visualization/sample_visualization.json new file mode 100644 index 0000000000000..626f1f787f421 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/kibana/visualization/sample_visualization.json @@ -0,0 +1,11 @@ +{ + "attributes": { + "description": "sample visualization 0.2.0", + "title": "sample vis title", + "uiStateJSON": "{}", + "version": 1, + "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"extended_bounds\":{},\"field\":\"@timestamp\",\"interval\":\"auto\",\"min_doc_count\":1},\"schema\":\"segment\",\"type\":\"date_histogram\"},{\"enabled\":true,\"id\":\"3\",\"params\":{\"customLabel\":\"Log Level\",\"field\":\"log.level\",\"order\":\"desc\",\"orderBy\":\"1\",\"size\":5},\"schema\":\"group\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"@timestamp per day\"},\"type\":\"category\"}],\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"legendPosition\":\"right\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"drawLinesBetweenPoints\":true,\"mode\":\"stacked\",\"show\":\"true\",\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\"}],\"times\":[],\"type\":\"histogram\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"left\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Count\"},\"type\":\"value\"}]},\"title\":\"Log levels over time [Logs Kafka] ECS\",\"type\":\"histogram\"}" + }, + "id": "sample_visualization", + "type": "visualization" +} \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/manifest.yml new file mode 100644 index 0000000000000..70da51a14bce8 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.2.0/manifest.yml @@ -0,0 +1,20 @@ +format_version: 1.0.0 +name: all_assets +title: All Assets Updated +description: tests that all assets are updated +version: 0.2.0 +categories: [] +release: beta +type: integration +license: basic + +requirement: + elasticsearch: + versions: '>7.7.0' + kibana: + versions: '>7.7.0' + +icons: + - src: '/img/logo_overrides_64_color.svg' + size: '16x16' + type: 'image/svg+xml' diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json new file mode 100644 index 0000000000000..7cf62e890f865 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json @@ -0,0 +1,15 @@ +{ + "policy": { + "phases": { + "hot": { + "min_age": "0ms", + "actions": { + "rollover": { + "max_size": "50gb", + "max_age": "30d" + } + } + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml new file mode 100644 index 0000000000000..580db049d0d5d --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml @@ -0,0 +1,7 @@ +--- +description: Pipeline for parsing test logs + plugins. +processors: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/ecs.yml new file mode 100644 index 0000000000000..3d88fe5dfefb6 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/ecs.yml @@ -0,0 +1,3 @@ +- name: logs_test_name + title: logs_test_title + type: keyword \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/fields.yml new file mode 100644 index 0000000000000..6e003ed0ad147 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/fields/fields.yml @@ -0,0 +1,16 @@ +- name: data_stream.type + type: constant_keyword + description: > + Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: > + Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: > + Data stream namespace. +- name: '@timestamp' + type: date + description: > + Event timestamp. diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/manifest.yml new file mode 100644 index 0000000000000..8cd522e2845bb --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_logs/manifest.yml @@ -0,0 +1,9 @@ +title: Test Dataset + +type: logs + +elasticsearch: + index_template.mappings: + dynamic: false + index_template.settings: + index.lifecycle.name: reference \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/ecs.yml new file mode 100644 index 0000000000000..a30e3c7a87856 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/ecs.yml @@ -0,0 +1,3 @@ +- name: metrics_test_name + title: metrics_test_title + type: keyword \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/fields.yml new file mode 100644 index 0000000000000..6e003ed0ad147 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/fields/fields.yml @@ -0,0 +1,16 @@ +- name: data_stream.type + type: constant_keyword + description: > + Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: > + Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: > + Data stream namespace. +- name: '@timestamp' + type: date + description: > + Event timestamp. diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/manifest.yml new file mode 100644 index 0000000000000..6bc20442bd432 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/dataset/test_metrics/manifest.yml @@ -0,0 +1,3 @@ +title: Test Dataset + +type: metrics \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/docs/README.md b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/docs/README.md new file mode 100644 index 0000000000000..34b1f08a55cbe --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/docs/README.md @@ -0,0 +1,3 @@ +# Test package + +For testing that datastream rolls over when mappings are not compatible diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/manifest.yml new file mode 100644 index 0000000000000..0ab43760b7ee8 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.1.0/manifest.yml @@ -0,0 +1,20 @@ +format_version: 1.0.0 +name: datastreams +title: datastream test +description: This is a test package for testing that datastreams rollover when mappings are incompatible +version: 0.1.0 +categories: [] +release: beta +type: integration +license: basic + +requirement: + elasticsearch: + versions: '>7.7.0' + kibana: + versions: '>7.7.0' + +icons: + - src: '/img/logo_overrides_64_color.svg' + size: '16x16' + type: 'image/svg+xml' diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json new file mode 100644 index 0000000000000..d8bab8a75f680 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ilm_policy/all_assets.json @@ -0,0 +1,15 @@ +{ + "policy": { + "phases": { + "hot": { + "min_age": "1ms", + "actions": { + "rollover": { + "max_size": "50gb", + "max_age": "31d" + } + } + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml new file mode 100644 index 0000000000000..580db049d0d5d --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/elasticsearch/ingest_pipeline/default.yml @@ -0,0 +1,7 @@ +--- +description: Pipeline for parsing test logs + plugins. +processors: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/ecs.yml new file mode 100644 index 0000000000000..7df52cc11fd20 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/ecs.yml @@ -0,0 +1,6 @@ +- name: logs_test_name + title: logs_test_title + type: text +- name: new_field_name + title: new_field_title + type: keyword diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/fields.yml new file mode 100644 index 0000000000000..6e003ed0ad147 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/fields/fields.yml @@ -0,0 +1,16 @@ +- name: data_stream.type + type: constant_keyword + description: > + Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: > + Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: > + Data stream namespace. +- name: '@timestamp' + type: date + description: > + Event timestamp. diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/manifest.yml new file mode 100644 index 0000000000000..8a53f9e26e827 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_logs/manifest.yml @@ -0,0 +1,9 @@ +title: Test Dataset + +type: logs + +elasticsearch: + index_template.mappings: + dynamic: true + index_template.settings: + index.lifecycle.name: reference2 \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/ecs.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/ecs.yml new file mode 100644 index 0000000000000..8fb3ccd3de8fd --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/ecs.yml @@ -0,0 +1,6 @@ +- name: metrics_test_name + title: metrics_test_title + type: keyword +- name: metrics_test_name2 + title: metrics_test_title2 + type: keyword \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/fields.yml new file mode 100644 index 0000000000000..6e003ed0ad147 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/fields/fields.yml @@ -0,0 +1,16 @@ +- name: data_stream.type + type: constant_keyword + description: > + Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: > + Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: > + Data stream namespace. +- name: '@timestamp' + type: date + description: > + Event timestamp. diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/manifest.yml new file mode 100644 index 0000000000000..6bc20442bd432 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/dataset/test_metrics/manifest.yml @@ -0,0 +1,3 @@ +title: Test Dataset + +type: metrics \ No newline at end of file diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/docs/README.md b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/docs/README.md new file mode 100644 index 0000000000000..34b1f08a55cbe --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/docs/README.md @@ -0,0 +1,3 @@ +# Test package + +For testing that datastream rolls over when mappings are not compatible diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/manifest.yml new file mode 100644 index 0000000000000..1aa1410bd0aef --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/datastreams/0.2.0/manifest.yml @@ -0,0 +1,20 @@ +format_version: 1.0.0 +name: datastreams +title: datastream test +description: This is a test package for testing that datastreams rollover when mappings are incompatible +version: 0.2.0 +categories: [] +release: beta +type: integration +license: basic + +requirement: + elasticsearch: + versions: '>7.7.0' + kibana: + versions: '>7.7.0' + +icons: + - src: '/img/logo_overrides_64_color.svg' + size: '16x16' + type: 'image/svg+xml' From 7dc33f9ba8f93873dcd15509da125587c1730bb4 Mon Sep 17 00:00:00 2001 From: Robert Austin Date: Fri, 7 Aug 2020 09:15:35 -0400 Subject: [PATCH 009/113] [Resolver] UI tests for the panel and bug fix (#74421) * Change the way the resolver simulator works * refactor resolver tree and data access layer mocks * Fix bug where timestamp and pid sometimes don't show in the node detail view * add a few tests for the panel (not done, but worth committing.) --- .../common/endpoint/types.ts | 9 + ...ildren.ts => no_ancestors_two_children.ts} | 48 ++--- ..._children_with_related_events_on_origin.ts | 94 +++++++++ .../{store => }/mocks/endpoint_event.ts | 21 +- .../{store => }/mocks/resolver_tree.ts | 48 +++-- .../resolver/store/data/selectors.test.ts | 2 +- .../resolver/store/mocks/related_event.ts | 36 ---- .../public/resolver/store/selectors.test.ts | 2 +- .../test_utilities/simulator/index.tsx | 194 ++++++++---------- .../resolver/view/clickthrough.test.tsx | 81 ++++---- .../public/resolver/view/panel.test.tsx | 59 ++++++ .../resolver/view/panels/process_details.tsx | 26 ++- .../view/panels/process_list_with_counts.tsx | 7 +- 13 files changed, 390 insertions(+), 237 deletions(-) rename x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/{one_ancestor_two_children.ts => no_ancestors_two_children.ts} (62%) create mode 100644 x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/no_ancestors_two_children_with_related_events_on_origin.ts rename x-pack/plugins/security_solution/public/resolver/{store => }/mocks/endpoint_event.ts (66%) rename x-pack/plugins/security_solution/public/resolver/{store => }/mocks/resolver_tree.ts (89%) delete mode 100644 x-pack/plugins/security_solution/public/resolver/store/mocks/related_event.ts create mode 100644 x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx diff --git a/x-pack/plugins/security_solution/common/endpoint/types.ts b/x-pack/plugins/security_solution/common/endpoint/types.ts index 61ce672405fd5..ffde47825b501 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types.ts @@ -182,6 +182,15 @@ export interface ResolverRelatedEvents { nextEvent: string | null; } +/** + * Safe version of `ResolverRelatedEvents` + */ +export interface SafeResolverRelatedEvents { + entityID: string; + events: SafeResolverEvent[]; + nextEvent: string | null; +} + /** * Response structure for the alerts route. */ diff --git a/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/one_ancestor_two_children.ts b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/no_ancestors_two_children.ts similarity index 62% rename from x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/one_ancestor_two_children.ts rename to x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/no_ancestors_two_children.ts index 94c176d343d17..b0407fa5d7c1d 100644 --- a/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/one_ancestor_two_children.ts +++ b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/no_ancestors_two_children.ts @@ -9,11 +9,8 @@ import { ResolverTree, ResolverEntityIndex, } from '../../../../common/endpoint/types'; -import { mockEndpointEvent } from '../../store/mocks/endpoint_event'; -import { - mockTreeWithNoAncestorsAnd2Children, - withRelatedEventsOnOrigin, -} from '../../store/mocks/resolver_tree'; +import { mockEndpointEvent } from '../../mocks/endpoint_event'; +import { mockTreeWithNoAncestorsAnd2Children } from '../../mocks/resolver_tree'; import { DataAccessLayer } from '../../types'; interface Metadata { @@ -43,24 +40,11 @@ interface Metadata { /** * A simple mock dataAccessLayer possible that returns a tree with 0 ancestors and 2 direct children. 1 related event is returned. The parameter to `entities` is ignored. */ -export function oneAncestorTwoChildren( - { withRelatedEvents }: { withRelatedEvents: Iterable<[string, string]> | null } = { - withRelatedEvents: null, - } -): { dataAccessLayer: DataAccessLayer; metadata: Metadata } { +export function noAncestorsTwoChildren(): { dataAccessLayer: DataAccessLayer; metadata: Metadata } { const metadata: Metadata = { databaseDocumentID: '_id', entityIDs: { origin: 'origin', firstChild: 'firstChild', secondChild: 'secondChild' }, }; - const baseTree = mockTreeWithNoAncestorsAnd2Children({ - originID: metadata.entityIDs.origin, - firstChildID: metadata.entityIDs.firstChild, - secondChildID: metadata.entityIDs.secondChild, - }); - const composedTree = withRelatedEvents - ? withRelatedEventsOnOrigin(baseTree, withRelatedEvents) - : baseTree; - return { metadata, dataAccessLayer: { @@ -70,17 +54,13 @@ export function oneAncestorTwoChildren( relatedEvents(entityID: string): Promise { return Promise.resolve({ entityID, - events: - /* Respond with the mocked related events when the origin's related events are fetched*/ withRelatedEvents && - entityID === metadata.entityIDs.origin - ? composedTree.relatedEvents.events - : [ - mockEndpointEvent({ - entityID, - name: 'event', - timestamp: 0, - }), - ], + events: [ + mockEndpointEvent({ + entityID, + name: 'event', + timestamp: 0, + }), + ], nextEvent: null, }); }, @@ -89,7 +69,13 @@ export function oneAncestorTwoChildren( * Fetch a ResolverTree for a entityID */ resolverTree(): Promise { - return Promise.resolve(composedTree); + return Promise.resolve( + mockTreeWithNoAncestorsAnd2Children({ + originID: metadata.entityIDs.origin, + firstChildID: metadata.entityIDs.firstChild, + secondChildID: metadata.entityIDs.secondChild, + }) + ); }, /** diff --git a/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/no_ancestors_two_children_with_related_events_on_origin.ts b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/no_ancestors_two_children_with_related_events_on_origin.ts new file mode 100644 index 0000000000000..01e75e3eefdbf --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/no_ancestors_two_children_with_related_events_on_origin.ts @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DataAccessLayer } from '../../types'; +import { mockTreeWithNoAncestorsAndTwoChildrenAndRelatedEventsOnOrigin } from '../../mocks/resolver_tree'; +import { + ResolverRelatedEvents, + ResolverTree, + ResolverEntityIndex, +} from '../../../../common/endpoint/types'; + +interface Metadata { + /** + * The `_id` of the document being analyzed. + */ + databaseDocumentID: string; + /** + * A record of entityIDs to be used in tests assertions. + */ + entityIDs: { + /** + * The entityID of the node related to the document being analyzed. + */ + origin: 'origin'; + /** + * The entityID of the first child of the origin. + */ + firstChild: 'firstChild'; + /** + * The entityID of the second child of the origin. + */ + secondChild: 'secondChild'; + }; +} + +export function noAncestorsTwoChildrenWithRelatedEventsOnOrigin(): { + dataAccessLayer: DataAccessLayer; + metadata: Metadata; +} { + const metadata: Metadata = { + databaseDocumentID: '_id', + entityIDs: { origin: 'origin', firstChild: 'firstChild', secondChild: 'secondChild' }, + }; + const tree = mockTreeWithNoAncestorsAndTwoChildrenAndRelatedEventsOnOrigin({ + originID: metadata.entityIDs.origin, + firstChildID: metadata.entityIDs.firstChild, + secondChildID: metadata.entityIDs.secondChild, + }); + + return { + metadata, + dataAccessLayer: { + /** + * Fetch related events for an entity ID + */ + relatedEvents(entityID: string): Promise { + /** + * Respond with the mocked related events when the origin's related events are fetched. + **/ + const events = entityID === metadata.entityIDs.origin ? tree.relatedEvents.events : []; + + return Promise.resolve({ + entityID, + events, + nextEvent: null, + } as ResolverRelatedEvents); + }, + + /** + * Fetch a ResolverTree for a entityID + */ + resolverTree(): Promise { + return Promise.resolve(tree); + }, + + /** + * Get an array of index patterns that contain events. + */ + indexPatterns(): string[] { + return ['index pattern']; + }, + + /** + * Get entities matching a document. + */ + entities(): Promise { + return Promise.resolve([{ entity_id: metadata.entityIDs.origin }]); + }, + }, + }; +} diff --git a/x-pack/plugins/security_solution/public/resolver/store/mocks/endpoint_event.ts b/x-pack/plugins/security_solution/public/resolver/mocks/endpoint_event.ts similarity index 66% rename from x-pack/plugins/security_solution/public/resolver/store/mocks/endpoint_event.ts rename to x-pack/plugins/security_solution/public/resolver/mocks/endpoint_event.ts index 709f2faf13b00..c822fdf647c16 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/mocks/endpoint_event.ts +++ b/x-pack/plugins/security_solution/public/resolver/mocks/endpoint_event.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EndpointEvent } from '../../../../common/endpoint/types'; +import { EndpointEvent } from '../../../common/endpoint/types'; /** * Simple mock endpoint event that works for tree layouts. @@ -28,10 +28,29 @@ export function mockEndpointEvent({ type: lifecycleType ? lifecycleType : 'start', category: 'process', }, + agent: { + id: 'agent.id', + version: 'agent.version', + type: 'agent.type', + }, + ecs: { + version: 'ecs.version', + }, + user: { + name: 'user.name', + domain: 'user.domain', + }, process: { entity_id: entityID, + executable: 'executable', + args: 'args', name, + pid: 0, + hash: { + md5: 'hash.md5', + }, parent: { + pid: 0, entity_id: parentEntityId, }, }, diff --git a/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts b/x-pack/plugins/security_solution/public/resolver/mocks/resolver_tree.ts similarity index 89% rename from x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts rename to x-pack/plugins/security_solution/public/resolver/mocks/resolver_tree.ts index 21d0309501aa8..5d2cbb2eab0dc 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts +++ b/x-pack/plugins/security_solution/public/resolver/mocks/resolver_tree.ts @@ -5,8 +5,7 @@ */ import { mockEndpointEvent } from './endpoint_event'; -import { mockRelatedEvent } from './related_event'; -import { ResolverTree, ResolverEvent } from '../../../../common/endpoint/types'; +import { ResolverTree, ResolverEvent, SafeResolverEvent } from '../../../common/endpoint/types'; export function mockTreeWith2AncestorsAndNoChildren({ originID, @@ -125,11 +124,11 @@ type RelatedEventType = string; * @param treeToAddRelatedEventsTo the ResolverTree to modify * @param relatedEventsToAddByCategoryAndType Iterable of `[category, type]` pairs describing related events. e.g. [['dns','info'],['registry','access']] */ -export function withRelatedEventsOnOrigin( +function withRelatedEventsOnOrigin( treeToAddRelatedEventsTo: ResolverTree, relatedEventsToAddByCategoryAndType: Iterable<[RelatedEventCategory, RelatedEventType]> ): ResolverTree { - const events = []; + const events: SafeResolverEvent[] = []; const byCategory: Record = {}; const stats = { totalAlerts: 0, @@ -139,14 +138,18 @@ export function withRelatedEventsOnOrigin( }, }; for (const [category, type] of relatedEventsToAddByCategoryAndType) { - events.push( - mockRelatedEvent({ - entityID: treeToAddRelatedEventsTo.entityID, - timestamp: 1, - category, + events.push({ + '@timestamp': 1, + event: { + kind: 'event', type, - }) - ); + category, + id: 'xyz', + }, + process: { + entity_id: treeToAddRelatedEventsTo.entityID, + }, + }); stats.events.total++; stats.events.byCategory[category] = stats.events.byCategory[category] ? stats.events.byCategory[category] + 1 @@ -156,7 +159,7 @@ export function withRelatedEventsOnOrigin( ...treeToAddRelatedEventsTo, stats, relatedEvents: { - events, + events: events as ResolverEvent[], nextEvent: null, }, }; @@ -309,3 +312,24 @@ export function mockTreeWithNoProcessEvents(): ResolverTree { }, }; } + +export function mockTreeWithNoAncestorsAndTwoChildrenAndRelatedEventsOnOrigin({ + originID, + firstChildID, + secondChildID, +}: { + originID: string; + firstChildID: string; + secondChildID: string; +}) { + const baseTree = mockTreeWithNoAncestorsAnd2Children({ + originID, + firstChildID, + secondChildID, + }); + const withRelatedEvents: Array<[string, string]> = [ + ['registry', 'access'], + ['registry', 'access'], + ]; + return withRelatedEventsOnOrigin(baseTree, withRelatedEvents); +} diff --git a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts index 6786a93f1d9ca..15a981d460730 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts @@ -15,7 +15,7 @@ import { mockTreeWith1AncestorAnd2ChildrenAndAllNodesHave2GraphableEvents, mockTreeWithAllProcessesTerminated, mockTreeWithNoProcessEvents, -} from '../mocks/resolver_tree'; +} from '../../mocks/resolver_tree'; import { uniquePidForProcess } from '../../models/process_event'; import { EndpointEvent } from '../../../../common/endpoint/types'; diff --git a/x-pack/plugins/security_solution/public/resolver/store/mocks/related_event.ts b/x-pack/plugins/security_solution/public/resolver/store/mocks/related_event.ts deleted file mode 100644 index 1e0c460a3a711..0000000000000 --- a/x-pack/plugins/security_solution/public/resolver/store/mocks/related_event.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { EndpointEvent } from '../../../../common/endpoint/types'; - -/** - * Simple mock related event. - */ -export function mockRelatedEvent({ - entityID, - timestamp, - category, - type, - id, -}: { - entityID: string; - timestamp: number; - category: string; - type: string; - id?: string; -}): EndpointEvent { - return { - '@timestamp': timestamp, - event: { - kind: 'event', - type, - category, - id: id ?? 'xyz', - }, - process: { - entity_id: entityID, - }, - } as EndpointEvent; -} diff --git a/x-pack/plugins/security_solution/public/resolver/store/selectors.test.ts b/x-pack/plugins/security_solution/public/resolver/store/selectors.test.ts index dfbc6bd290686..f113e861d3ce9 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/selectors.test.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/selectors.test.ts @@ -12,7 +12,7 @@ import * as selectors from './selectors'; import { mockTreeWith2AncestorsAndNoChildren, mockTreeWithNoAncestorsAnd2Children, -} from './mocks/resolver_tree'; +} from '../mocks/resolver_tree'; import { SafeResolverEvent } from '../../../common/endpoint/types'; describe('resolver selectors', () => { diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx index ed30643ed871e..6f44c5aee7cac 100644 --- a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx @@ -113,83 +113,21 @@ export class Simulator { } /** - * Return a promise that resolves after the `store`'s next state transition. - * Used by `mapStateTransitions` + * Yield the result of `mapper` over and over, once per event-loop cycle. + * After 10 times, quit. + * Use this to continually check a value. See `toYieldEqualTo`. */ - private stateTransitioned(): Promise { - // keep track of the resolve function of the promise that has been returned. - let resolveState: (() => void) | null = null; - - const promise: Promise = new Promise((resolve) => { - // Immediately expose the resolve function in the outer scope. It will be resolved when the next state transition occurs. - resolveState = resolve; - }); - - // Subscribe to the store - const unsubscribe = this.store.subscribe(() => { - // Once a state transition occurs, unsubscribe. - unsubscribe(); - // Resolve the promise. The null assertion is safe here as Promise initializers run immediately (according to spec and node/browser implementations.) - // NB: the state is not resolved here. Code using the simulator should not rely on state or selectors of state. - resolveState!(); - }); - - // Return the promise that will be resolved on the next state transition, allowing code to `await` for the next state transition. - return promise; - } - - /** - * This will yield the return value of `mapper` after each state transition. If no state transition occurs for 10 event loops in a row, this will give up. - */ - public async *mapStateTransitions(mapper: () => R): AsyncIterable { - // Yield the value before any state transitions have occurred. - yield mapper(); - - /** Increment this each time an event loop completes without a state transition. - * If this value hits `10`, end the loop. - * - * Code will test assertions after each state transition. If the assertion hasn't passed and no further state transitions occur, - * then the jest timeout will happen. The timeout doesn't give a useful message about the assertion. - * By short-circuiting this function, code that uses it can short circuit the test timeout and print a useful error message. - * - * NB: the logic to short-circuit the loop is here because knowledge of state is a concern of the simulator, not tests. - */ + public async *map(mapper: () => R): AsyncIterable { let timeoutCount = 0; - while (true) { - /** - * `await` a race between the next state transition and a timeout that happens after `0`ms. - * If the timeout wins, no `dispatch` call caused a state transition in the last loop. - * If this keeps happening, assume that Resolver isn't going to do anything else. - * - * If Resolver adds intentional delay logic (e.g. waiting before making a request), this code might have to change. - * In that case, Resolver should use the side effect context to schedule future work. This code could then subscribe to some event published by the side effect context. That way, this code will be aware of Resolver's intention to do work. - */ - const timedOut: boolean = await Promise.race([ - (async (): Promise => { - await this.stateTransitioned(); - // If a state transition occurs, return false for `timedOut` - return false; - })(), - new Promise((resolve) => { - setTimeout(() => { - // If a timeout occurs, resolve `timedOut` as true - return resolve(true); - }, 0); - }), - ]); - - if (timedOut) { - // If a timout occurred, note it. - timeoutCount++; - if (timeoutCount === 10) { - // if 10 timeouts happen in a row, end the loop early - return; - } - } else { - // If a state transition occurs, reset the timeout count and yield the value - timeoutCount = 0; - yield mapper(); - } + while (timeoutCount < 10) { + timeoutCount++; + yield mapper(); + await new Promise((resolve) => { + setTimeout(() => { + this.wrapper.update(); + resolve(); + }, 0); + }); } } @@ -198,25 +136,22 @@ export class Simulator { * returns a `ReactWrapper` even if nothing is found, as that is how `enzyme` does things. */ public processNodeElements(options: ProcessNodeElementSelectorOptions = {}): ReactWrapper { - return this.findInDOM(processNodeElementSelector(options)); + return this.domNodes(processNodeElementSelector(options)); } /** - * true if a process node element is found for the entityID and if it has an [aria-selected] attribute. + * Return the node element with the given `entityID`. */ - public processNodeElementLooksSelected(entityID: string): boolean { - return this.processNodeElements({ entityID, selected: true }).length === 1; + public selectedProcessNode(entityID: string): ReactWrapper { + return this.processNodeElements({ entityID, selected: true }); } /** - * true if a process node element is found for the entityID and if it *does not have* an [aria-selected] attribute. + * Return the node element with the given `entityID`. It will only be returned if it is not selected. */ - public processNodeElementLooksUnselected(entityID: string): boolean { - // find the process node, then exclude it if its selected. - return ( - this.processNodeElements({ entityID }).not( - processNodeElementSelector({ entityID, selected: true }) - ).length === 1 + public unselectedProcessNode(entityID: string): ReactWrapper { + return this.processNodeElements({ entityID }).not( + processNodeElementSelector({ entityID, selected: true }) ); } @@ -234,11 +169,8 @@ export class Simulator { * @param entityID The entity ID of the proocess node to select in */ public processNodeRelatedEventButton(entityID: string): ReactWrapper { - return this.processNodeElements({ entityID }).findWhere( - (wrapper) => - // Filter out React components - typeof wrapper.type() === 'string' && - wrapper.prop('data-test-subj') === 'resolver:submenu:button' + return this.domNodes( + `${processNodeElementSelector({ entityID })} [data-test-subj="resolver:submenu:button"]` ); } @@ -256,42 +188,98 @@ export class Simulator { * The element that shows when Resolver is waiting for the graph data. */ public graphLoadingElement(): ReactWrapper { - return this.findInDOM('[data-test-subj="resolver:graph:loading"]'); + return this.domNodes('[data-test-subj="resolver:graph:loading"]'); } /** * The element that shows if Resolver couldn't draw the graph. */ public graphErrorElement(): ReactWrapper { - return this.findInDOM('[data-test-subj="resolver:graph:error"]'); + return this.domNodes('[data-test-subj="resolver:graph:error"]'); } /** * The element where nodes get drawn. */ public graphElement(): ReactWrapper { - return this.findInDOM('[data-test-subj="resolver:graph"]'); + return this.domNodes('[data-test-subj="resolver:graph"]'); + } + + /** + * An element with a list of all nodes. + */ + public nodeListElement(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-list"]'); + } + + /** + * Return the items in the node list (the default panel view.) + */ + public nodeListItems(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-list:item"]'); + } + + /** + * The element containing the details for the selected node. + */ + public nodeDetailElement(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-detail"]'); + } + + /** + * The details of the selected node are shown in a description list. This returns the title elements of the description list. + */ + private nodeDetailEntryTitle(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-detail:entry-title"]'); } /** - * The outer panel container. + * The details of the selected node are shown in a description list. This returns the description elements of the description list. */ - public panelElement(): ReactWrapper { - return this.findInDOM('[data-test-subj="resolver:panel"]'); + private nodeDetailEntryDescription(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-detail:entry-description"]'); } /** - * The panel content element (which may include tables, lists, other data depending on the view). + * Return DOM nodes that match `enzymeSelector`. */ - public panelContentElement(): ReactWrapper { - return this.findInDOM('[data-test-subj^="resolver:panel:"]'); + private domNodes(enzymeSelector: string): ReactWrapper { + return this.wrapper + .find(enzymeSelector) + .filterWhere((wrapper) => typeof wrapper.type() === 'string'); } /** - * Like `this.wrapper.find` but only returns DOM nodes. + * The titles and descriptions (as text) from the node detail panel. */ - private findInDOM(selector: string): ReactWrapper { - return this.wrapper.find(selector).filterWhere((wrapper) => typeof wrapper.type() === 'string'); + public nodeDetailDescriptionListEntries(): Array<[string, string]> { + const titles = this.nodeDetailEntryTitle(); + const descriptions = this.nodeDetailEntryDescription(); + const entries: Array<[string, string]> = []; + for (let index = 0; index < Math.min(titles.length, descriptions.length); index++) { + const title = titles.at(index).text(); + const description = descriptions.at(index).text(); + + // Exclude timestamp since we can't currently calculate the expected description for it from tests + if (title !== '@timestamp') { + entries.push([title, description]); + } + } + return entries; + } + + /** + * Resolve the wrapper returned by `wrapperFactory` only once it has at least 1 element in it. + */ + public async resolveWrapper( + wrapperFactory: () => ReactWrapper, + predicate: (wrapper: ReactWrapper) => boolean = (wrapper) => wrapper.length > 0 + ): Promise { + for await (const wrapper of this.map(wrapperFactory)) { + if (predicate(wrapper)) { + return wrapper; + } + } } } diff --git a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx index c819491dd28f0..98ea235d3524f 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx @@ -4,10 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { oneAncestorTwoChildren } from '../data_access_layer/mocks/one_ancestor_two_children'; +import { noAncestorsTwoChildren } from '../data_access_layer/mocks/no_ancestors_two_children'; import { Simulator } from '../test_utilities/simulator'; // Extend jest with a custom matcher import '../test_utilities/extend_jest'; +import { noAncestorsTwoChildrenWithRelatedEventsOnOrigin } from '../data_access_layer/mocks/no_ancestors_two_children_with_related_events_on_origin'; let simulator: Simulator; let databaseDocumentID: string; @@ -16,10 +17,10 @@ let entityIDs: { origin: string; firstChild: string; secondChild: string }; // the resolver component instance ID, used by the react code to distinguish piece of global state from those used by other resolver instances const resolverComponentInstanceID = 'resolverComponentInstanceID'; -describe('Resolver, when analyzing a tree that has 1 ancestor and 2 children', () => { +describe('Resolver, when analyzing a tree that has no ancestors and 2 children', () => { beforeEach(async () => { // create a mock data access layer - const { metadata: dataAccessLayerMetadata, dataAccessLayer } = oneAncestorTwoChildren(); + const { metadata: dataAccessLayerMetadata, dataAccessLayer } = noAncestorsTwoChildren(); // save a reference to the entity IDs exposed by the mock data layer entityIDs = dataAccessLayerMetadata.entityIDs; @@ -40,7 +41,7 @@ describe('Resolver, when analyzing a tree that has 1 ancestor and 2 children', ( * * For example, there might be no loading element at one point, and 1 graph element at one point, but never a single time when there is both 1 graph element and 0 loading elements. */ - simulator.mapStateTransitions(() => ({ + simulator.map(() => ({ graphElements: simulator.graphElement().length, graphLoadingElements: simulator.graphLoadingElement().length, graphErrorElements: simulator.graphErrorElement().length, @@ -55,22 +56,23 @@ describe('Resolver, when analyzing a tree that has 1 ancestor and 2 children', ( // Combining assertions here for performance. Unfortunately, Enzyme + jsdom + React is slow. it(`should have 3 nodes, with the entityID's 'origin', 'firstChild', and 'secondChild'. 'origin' should be selected.`, async () => { - expect(simulator.processNodeElementLooksSelected(entityIDs.origin)).toBe(true); - - expect(simulator.processNodeElementLooksUnselected(entityIDs.firstChild)).toBe(true); - expect(simulator.processNodeElementLooksUnselected(entityIDs.secondChild)).toBe(true); - - expect(simulator.processNodeElements().length).toBe(3); + await expect( + simulator.map(() => ({ + selectedOriginCount: simulator.selectedProcessNode(entityIDs.origin).length, + unselectedFirstChildCount: simulator.unselectedProcessNode(entityIDs.firstChild).length, + unselectedSecondChildCount: simulator.unselectedProcessNode(entityIDs.secondChild).length, + processNodeCount: simulator.processNodeElements().length, + })) + ).toYieldEqualTo({ + selectedOriginCount: 1, + unselectedFirstChildCount: 1, + unselectedSecondChildCount: 1, + processNodeCount: 3, + }); }); - it(`should have the default "process list" panel present`, async () => { - expect(simulator.panelElement().length).toBe(1); - expect(simulator.panelContentElement().length).toBe(1); - const testSubjectName = simulator - .panelContentElement() - .getDOMNode() - .getAttribute('data-test-subj'); - expect(testSubjectName).toMatch(/process-list/g); + it(`should show the node list`, async () => { + await expect(simulator.map(() => simulator.nodeListElement().length)).toYieldEqualTo(1); }); describe("when the second child node's first button has been clicked", () => { @@ -82,42 +84,37 @@ describe('Resolver, when analyzing a tree that has 1 ancestor and 2 children', ( .first() .simulate('click'); }); - it('should render the second child node as selected, and the first child not as not selected, and the query string should indicate that the second child is selected', async () => { + it('should render the second child node as selected, and the origin as not selected, and the query string should indicate that the second child is selected', async () => { await expect( - simulator.mapStateTransitions(function value() { - return { - // the query string has a key showing that the second child is selected - queryStringSelectedNode: simulator.queryStringValues().selectedNode, - // the second child is rendered in the DOM, and shows up as selected - secondChildLooksSelected: simulator.processNodeElementLooksSelected( - entityIDs.secondChild - ), - // the origin is in the DOM, but shows up as unselected - originLooksUnselected: simulator.processNodeElementLooksUnselected(entityIDs.origin), - }; - }) + simulator.map(() => ({ + // the query string has a key showing that the second child is selected + queryStringSelectedNode: simulator.queryStringValues().selectedNode, + // the second child is rendered in the DOM, and shows up as selected + selectedSecondChildNodeCount: simulator.selectedProcessNode(entityIDs.secondChild) + .length, + // the origin is in the DOM, but shows up as unselected + unselectedOriginNodeCount: simulator.unselectedProcessNode(entityIDs.origin).length, + })) ).toYieldEqualTo({ // Just the second child should be marked as selected in the query string queryStringSelectedNode: [entityIDs.secondChild], // The second child is rendered and has `[aria-selected]` - secondChildLooksSelected: true, + selectedSecondChildNodeCount: 1, // The origin child is rendered and doesn't have `[aria-selected]` - originLooksUnselected: true, + unselectedOriginNodeCount: 1, }); }); }); }); }); -describe('Resolver, when analyzing a tree that has some related events', () => { +describe('Resolver, when analyzing a tree that has two related events for the origin', () => { beforeEach(async () => { // create a mock data access layer with related events - const { metadata: dataAccessLayerMetadata, dataAccessLayer } = oneAncestorTwoChildren({ - withRelatedEvents: [ - ['registry', 'access'], - ['registry', 'access'], - ], - }); + const { + metadata: dataAccessLayerMetadata, + dataAccessLayer, + } = noAncestorsTwoChildrenWithRelatedEventsOnOrigin(); // save a reference to the entity IDs exposed by the mock data layer entityIDs = dataAccessLayerMetadata.entityIDs; @@ -132,7 +129,7 @@ describe('Resolver, when analyzing a tree that has some related events', () => { describe('when it has loaded', () => { beforeEach(async () => { await expect( - simulator.mapStateTransitions(() => ({ + simulator.map(() => ({ graphElements: simulator.graphElement().length, graphLoadingElements: simulator.graphLoadingElement().length, graphErrorElements: simulator.graphErrorElement().length, @@ -148,7 +145,7 @@ describe('Resolver, when analyzing a tree that has some related events', () => { it('should render a related events button', async () => { await expect( - simulator.mapStateTransitions(() => ({ + simulator.map(() => ({ relatedEventButtons: simulator.processNodeRelatedEventButton(entityIDs.origin).length, })) ).toYieldEqualTo({ diff --git a/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx new file mode 100644 index 0000000000000..78e5fd79bea13 --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { noAncestorsTwoChildren } from '../data_access_layer/mocks/no_ancestors_two_children'; +import { Simulator } from '../test_utilities/simulator'; +// Extend jest with a custom matcher +import '../test_utilities/extend_jest'; + +describe('Resolver: when analyzing a tree with no ancestors and two children', () => { + let simulator: Simulator; + let databaseDocumentID: string; + + // the resolver component instance ID, used by the react code to distinguish piece of global state from those used by other resolver instances + const resolverComponentInstanceID = 'resolverComponentInstanceID'; + + beforeEach(async () => { + // create a mock data access layer + const { metadata: dataAccessLayerMetadata, dataAccessLayer } = noAncestorsTwoChildren(); + + // save a reference to the `_id` supported by the mock data layer + databaseDocumentID = dataAccessLayerMetadata.databaseDocumentID; + + // create a resolver simulator, using the data access layer and an arbitrary component instance ID + simulator = new Simulator({ databaseDocumentID, dataAccessLayer, resolverComponentInstanceID }); + }); + + it('should show the node list', async () => { + await expect(simulator.map(() => simulator.nodeListElement().length)).toYieldEqualTo(1); + }); + + it('should have 3 nodes in the node list', async () => { + await expect(simulator.map(() => simulator.nodeListItems().length)).toYieldEqualTo(3); + }); + describe('when there is an item in the node list and it has been clicked', () => { + beforeEach(async () => { + const nodeListItems = await simulator.resolveWrapper(() => simulator.nodeListItems()); + expect(nodeListItems && nodeListItems.length).toBeTruthy(); + if (nodeListItems) { + nodeListItems.first().find('button').simulate('click'); + } + }); + it('should show the details for the first node', async () => { + await expect( + simulator.map(() => simulator.nodeDetailDescriptionListEntries()) + ).toYieldEqualTo([ + ['process.executable', 'executable'], + ['process.pid', '0'], + ['user.name', 'user.name'], + ['user.domain', 'user.domain'], + ['process.parent.pid', '0'], + ['process.hash.md5', 'hash.md5'], + ['process.args', 'args'], + ]); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx index 03d9e4c2d5a2b..112a3400c4947 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { memo, useMemo } from 'react'; +import React, { memo, useMemo, HTMLAttributes } from 'react'; import { useSelector } from 'react-redux'; import { i18n } from '@kbn/i18n'; import { @@ -16,6 +16,7 @@ import { } from '@elastic/eui'; import styled from 'styled-components'; import { FormattedMessage } from 'react-intl'; +import { EuiDescriptionListProps } from '@elastic/eui/src/components/description_list/description_list'; import * as selectors from '../../store/selectors'; import * as event from '../../../../common/endpoint/models/event'; import { CrumbInfo, formatDate, StyledBreadcrumbs } from './panel_content_utilities'; @@ -51,9 +52,9 @@ export const ProcessDetails = memo(function ProcessDetails({ const processName = event.eventName(processEvent); const entityId = event.entityId(processEvent); const isProcessTerminated = useSelector(selectors.isProcessTerminated)(entityId); - const processInfoEntry = useMemo(() => { + const processInfoEntry: EuiDescriptionListProps['listItems'] = useMemo(() => { const eventTime = event.eventTimestamp(processEvent); - const dateTime = eventTime ? formatDate(eventTime) : ''; + const dateTime = eventTime === undefined ? null : formatDate(eventTime); const createdEntry = { title: '@timestamp', @@ -95,7 +96,7 @@ export const ProcessDetails = memo(function ProcessDetails({ description: argsForProcess(processEvent), }; - // This is the data in {title, description} form for the EUIDescriptionList to display + // This is the data in {title, description} form for the EuiDescriptionList to display const processDescriptionListData = [ createdEntry, pathEntry, @@ -107,7 +108,7 @@ export const ProcessDetails = memo(function ProcessDetails({ commandLineEntry, ] .filter((entry) => { - return entry.description; + return entry.description !== undefined; }) .map((entry) => { return { @@ -172,13 +173,24 @@ export const ProcessDetails = memo(function ProcessDetails({ + } + descriptionProps={ + { 'data-test-subj': 'resolver:node-detail:entry-description' } as HTMLAttributes< + HTMLElement + > + } compressed listItems={processInfoEntry} /> ); }); -ProcessDetails.displayName = 'ProcessDetails'; diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx index 046c840470262..11f005f8acbcd 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx @@ -150,7 +150,7 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ const processTableView: ProcessTableView[] = useMemo( () => [...processNodePositions.keys()].map((processEvent) => { - let dateTime; + let dateTime: Date | undefined; const eventTime = event.timestampSafeVersion(processEvent); const name = event.processNameSafeVersion(processEvent); if (eventTime) { @@ -186,13 +186,15 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ const children = useSelector(selectors.hasMoreChildren); const ancestors = useSelector(selectors.hasMoreAncestors); const showWarning = children === true || ancestors === true; + const rowProps = useMemo(() => ({ 'data-test-subj': 'resolver:node-list:item' }), []); return ( <> {showWarning && } - data-test-subj="resolver:panel:process-list" + rowProps={rowProps} + data-test-subj="resolver:node-list" items={processTableView} columns={columns} sorting @@ -200,4 +202,3 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ ); }); -ProcessListWithCounts.displayName = 'ProcessListWithCounts'; From c6c300e8f82d138f28a080a7a34a78ebc27d9776 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Fri, 7 Aug 2020 11:21:44 -0400 Subject: [PATCH 010/113] [Canvas][tech-debt] Add Typescript to apps directory (#73766) Co-authored-by: Elastic Machine --- .../export/__tests__/export_app.test.tsx | 8 +- .../export/export/export_app.component.tsx | 63 ++++++++++++++ .../public/apps/export/export/export_app.js | 59 ------------- .../public/apps/export/export/export_app.ts | 21 +++++ .../canvas/public/apps/export/export/index.js | 30 ------- .../export/index.ts} | 5 +- .../public/apps/export/{index.js => index.ts} | 0 .../apps/export/{routes.js => routes.ts} | 13 ++- .../{home_app.js => home_app.component.tsx} | 10 ++- .../home/home_app/{index.js => home_app.ts} | 8 +- .../home_app/index.ts} | 5 +- .../public/apps/home/{index.js => index.ts} | 0 .../public/apps/home/{routes.js => routes.ts} | 0 .../canvas/public/apps/{index.js => index.ts} | 1 + .../apps/workpad/{index.js => index.ts} | 0 .../apps/workpad/{routes.js => routes.ts} | 24 ++++-- .../public/apps/workpad/workpad_app/index.js | 41 --------- .../public/apps/workpad/workpad_app/index.ts | 8 ++ .../workpad_app/workpad_app.component.tsx | 83 +++++++++++++++++++ .../apps/workpad/workpad_app/workpad_app.js | 81 ------------------ .../apps/workpad/workpad_app/workpad_app.ts | 32 +++++++ .../workpad_header.component.tsx | 12 ++- .../workpad_header/workpad_header.tsx | 29 +------ x-pack/plugins/canvas/types/canvas.ts | 4 + 24 files changed, 274 insertions(+), 263 deletions(-) create mode 100644 x-pack/plugins/canvas/public/apps/export/export/export_app.component.tsx delete mode 100644 x-pack/plugins/canvas/public/apps/export/export/export_app.js create mode 100644 x-pack/plugins/canvas/public/apps/export/export/export_app.ts delete mode 100644 x-pack/plugins/canvas/public/apps/export/export/index.js rename x-pack/plugins/canvas/public/apps/{workpad/workpad_app/load_workpad.js => export/export/index.ts} (67%) rename x-pack/plugins/canvas/public/apps/export/{index.js => index.ts} (100%) rename x-pack/plugins/canvas/public/apps/export/{routes.js => routes.ts} (79%) rename x-pack/plugins/canvas/public/apps/home/home_app/{home_app.js => home_app.component.tsx} (79%) rename x-pack/plugins/canvas/public/apps/home/home_app/{index.js => home_app.ts} (69%) rename x-pack/plugins/canvas/public/apps/{export/export/load_workpad.js => home/home_app/index.ts} (69%) rename x-pack/plugins/canvas/public/apps/home/{index.js => index.ts} (100%) rename x-pack/plugins/canvas/public/apps/home/{routes.js => routes.ts} (100%) rename x-pack/plugins/canvas/public/apps/{index.js => index.ts} (88%) rename x-pack/plugins/canvas/public/apps/workpad/{index.js => index.ts} (100%) rename x-pack/plugins/canvas/public/apps/workpad/{routes.js => routes.ts} (82%) delete mode 100644 x-pack/plugins/canvas/public/apps/workpad/workpad_app/index.js create mode 100644 x-pack/plugins/canvas/public/apps/workpad/workpad_app/index.ts create mode 100644 x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.component.tsx delete mode 100644 x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.js create mode 100644 x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.ts diff --git a/x-pack/plugins/canvas/public/apps/export/export/__tests__/export_app.test.tsx b/x-pack/plugins/canvas/public/apps/export/export/__tests__/export_app.test.tsx index b0a8d1e990e75..1bb58919b7fa6 100644 --- a/x-pack/plugins/canvas/public/apps/export/export/__tests__/export_app.test.tsx +++ b/x-pack/plugins/canvas/public/apps/export/export/__tests__/export_app.test.tsx @@ -6,8 +6,8 @@ import React from 'react'; import { mount } from 'enzyme'; -// @ts-expect-error untyped local -import { ExportApp } from '../export_app'; +import { ExportApp } from '../export_app.component'; +import { CanvasWorkpad } from '../../../../../types'; jest.mock('style-it', () => ({ it: (css: string, Component: any) => Component, @@ -23,7 +23,7 @@ jest.mock('../../../../components/link', () => ({ describe('', () => { test('renders as expected', () => { - const sampleWorkpad = { + const sampleWorkpad = ({ id: 'my-workpad-abcd', css: '', pages: [ @@ -34,7 +34,7 @@ describe('', () => { elements: [3, 4, 5, 6], }, ], - }; + } as any) as CanvasWorkpad; const page1 = mount( {}} /> diff --git a/x-pack/plugins/canvas/public/apps/export/export/export_app.component.tsx b/x-pack/plugins/canvas/public/apps/export/export/export_app.component.tsx new file mode 100644 index 0000000000000..03121e749d0dc --- /dev/null +++ b/x-pack/plugins/canvas/public/apps/export/export/export_app.component.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FC, useEffect } from 'react'; +import PropTypes from 'prop-types'; +// @ts-expect-error untyped library +import Style from 'style-it'; +// @ts-expect-error untyped local +import { WorkpadPage } from '../../../components/workpad_page'; +import { Link } from '../../../components/link'; +import { CanvasWorkpad } from '../../../../types'; + +interface Props { + workpad: CanvasWorkpad; + selectedPageIndex: number; + initializeWorkpad: () => void; +} + +export const ExportApp: FC = ({ workpad, selectedPageIndex, initializeWorkpad }) => { + const { id, pages, height, width } = workpad; + const activePage = pages[selectedPageIndex]; + const pageElementCount = activePage.elements.length; + + useEffect(() => initializeWorkpad()); + + return ( +
+
+
+ + Edit Workpad + +
+ {Style.it( + workpad.css, +
+ {}} + unregisterLayout={() => {}} + /> +
+ )} +
+
+ ); +}; + +ExportApp.propTypes = { + workpad: PropTypes.shape({ + id: PropTypes.string.isRequired, + pages: PropTypes.array.isRequired, + }).isRequired, + selectedPageIndex: PropTypes.number.isRequired, + initializeWorkpad: PropTypes.func.isRequired, +}; diff --git a/x-pack/plugins/canvas/public/apps/export/export/export_app.js b/x-pack/plugins/canvas/public/apps/export/export/export_app.js deleted file mode 100644 index 1d02d85cae0b3..0000000000000 --- a/x-pack/plugins/canvas/public/apps/export/export/export_app.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import PropTypes from 'prop-types'; -import Style from 'style-it'; -import { WorkpadPage } from '../../../components/workpad_page'; -import { Link } from '../../../components/link'; - -export class ExportApp extends React.PureComponent { - static propTypes = { - workpad: PropTypes.shape({ - id: PropTypes.string.isRequired, - pages: PropTypes.array.isRequired, - }).isRequired, - selectedPageIndex: PropTypes.number.isRequired, - initializeWorkpad: PropTypes.func.isRequired, - }; - - componentDidMount() { - this.props.initializeWorkpad(); - } - - render() { - const { workpad, selectedPageIndex } = this.props; - const { pages, height, width } = workpad; - const activePage = pages[selectedPageIndex]; - const pageElementCount = activePage.elements.length; - - return ( -
-
-
- - Edit Workpad - -
- {Style.it( - workpad.css, -
- {}} - unregisterLayout={() => {}} - /> -
- )} -
-
- ); - } -} diff --git a/x-pack/plugins/canvas/public/apps/export/export/export_app.ts b/x-pack/plugins/canvas/public/apps/export/export/export_app.ts new file mode 100644 index 0000000000000..b47d1950ec2b7 --- /dev/null +++ b/x-pack/plugins/canvas/public/apps/export/export/export_app.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { connect } from 'react-redux'; +import { initializeWorkpad } from '../../../state/actions/workpad'; +import { getWorkpad, getSelectedPageIndex } from '../../../state/selectors/workpad'; +import { ExportApp as Component } from './export_app.component'; +import { State } from '../../../../types'; + +export const ExportApp = connect( + (state: State) => ({ + workpad: getWorkpad(state), + selectedPageIndex: getSelectedPageIndex(state), + }), + (dispatch) => ({ + initializeWorkpad: () => dispatch(initializeWorkpad()), + }) +)(Component); diff --git a/x-pack/plugins/canvas/public/apps/export/export/index.js b/x-pack/plugins/canvas/public/apps/export/export/index.js deleted file mode 100644 index 95c46d9e1c8ae..0000000000000 --- a/x-pack/plugins/canvas/public/apps/export/export/index.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { connect } from 'react-redux'; -import { compose, branch, renderComponent } from 'recompose'; -import { initializeWorkpad } from '../../../state/actions/workpad'; -import { getWorkpad, getSelectedPageIndex } from '../../../state/selectors/workpad'; -import { LoadWorkpad } from './load_workpad'; -import { ExportApp as Component } from './export_app'; - -const mapStateToProps = (state) => ({ - workpad: getWorkpad(state), - selectedPageIndex: getSelectedPageIndex(state), -}); - -const mapDispatchToProps = (dispatch) => ({ - initializeWorkpad() { - dispatch(initializeWorkpad()); - }, -}); - -const branches = [branch(({ workpad }) => workpad == null, renderComponent(LoadWorkpad))]; - -export const ExportApp = compose( - connect(mapStateToProps, mapDispatchToProps), - ...branches -)(Component); diff --git a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/load_workpad.js b/x-pack/plugins/canvas/public/apps/export/export/index.ts similarity index 67% rename from x-pack/plugins/canvas/public/apps/workpad/workpad_app/load_workpad.js rename to x-pack/plugins/canvas/public/apps/export/export/index.ts index 388bf00723f82..81939d550a7ab 100644 --- a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/load_workpad.js +++ b/x-pack/plugins/canvas/public/apps/export/export/index.ts @@ -4,6 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; - -export const LoadWorkpad = () =>
Load a workpad...
; +export { ExportApp } from './export_app'; +export { ExportApp as ExportAppComponent } from './export_app.component'; diff --git a/x-pack/plugins/canvas/public/apps/export/index.js b/x-pack/plugins/canvas/public/apps/export/index.ts similarity index 100% rename from x-pack/plugins/canvas/public/apps/export/index.js rename to x-pack/plugins/canvas/public/apps/export/index.ts diff --git a/x-pack/plugins/canvas/public/apps/export/routes.js b/x-pack/plugins/canvas/public/apps/export/routes.ts similarity index 79% rename from x-pack/plugins/canvas/public/apps/export/routes.js rename to x-pack/plugins/canvas/public/apps/export/routes.ts index 33e375115aa19..0b4f74149fb4f 100644 --- a/x-pack/plugins/canvas/public/apps/export/routes.js +++ b/x-pack/plugins/canvas/public/apps/export/routes.ts @@ -4,10 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Dispatch } from 'redux'; +// @ts-expect-error Untyped local import * as workpadService from '../../lib/workpad_service'; import { setWorkpad } from '../../state/actions/workpad'; +// @ts-expect-error Untyped local import { fetchAllRenderables } from '../../state/actions/elements'; +// @ts-expect-error Untyped local import { setPage } from '../../state/actions/pages'; +// @ts-expect-error Untyped local import { setAssets } from '../../state/actions/assets'; import { ExportApp } from './export'; @@ -18,7 +23,13 @@ export const routes = [ { name: 'exportWorkpad', path: '/pdf/:id/page/:page', - action: (dispatch) => async ({ params, router }) => { + action: (dispatch: Dispatch) => async ({ + params, + // @ts-expect-error Fix when Router is typed. + router, + }: { + params: { id: string; page: string }; + }) => { // load workpad if given a new id via url param const fetchedWorkpad = await workpadService.get(params.id); const pageNumber = parseInt(params.page, 10); diff --git a/x-pack/plugins/canvas/public/apps/home/home_app/home_app.js b/x-pack/plugins/canvas/public/apps/home/home_app/home_app.component.tsx similarity index 79% rename from x-pack/plugins/canvas/public/apps/home/home_app/home_app.js rename to x-pack/plugins/canvas/public/apps/home/home_app/home_app.component.tsx index bfa4abbf7c56d..3c2e989cc8e51 100644 --- a/x-pack/plugins/canvas/public/apps/home/home_app/home_app.js +++ b/x-pack/plugins/canvas/public/apps/home/home_app/home_app.component.tsx @@ -4,12 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC } from 'react'; import { EuiPage, EuiPageBody, EuiPageContent } from '@elastic/eui'; +// @ts-expect-error untyped local import { WorkpadManager } from '../../../components/workpad_manager'; +// @ts-expect-error untyped local import { setDocTitle } from '../../../lib/doc_title'; -export const HomeApp = ({ onLoad = () => {} }) => { +interface Props { + onLoad: () => void; +} + +export const HomeApp: FC = ({ onLoad = () => {} }) => { onLoad(); setDocTitle('Canvas'); return ( diff --git a/x-pack/plugins/canvas/public/apps/home/home_app/index.js b/x-pack/plugins/canvas/public/apps/home/home_app/home_app.ts similarity index 69% rename from x-pack/plugins/canvas/public/apps/home/home_app/index.js rename to x-pack/plugins/canvas/public/apps/home/home_app/home_app.ts index f78ee1f8a18af..ff9d1c1cc63ac 100644 --- a/x-pack/plugins/canvas/public/apps/home/home_app/index.js +++ b/x-pack/plugins/canvas/public/apps/home/home_app/home_app.ts @@ -6,12 +6,10 @@ import { connect } from 'react-redux'; import { resetWorkpad } from '../../../state/actions/workpad'; -import { HomeApp as Component } from './home_app'; +import { HomeApp as Component } from './home_app.component'; -const mapDispatchToProps = (dispatch) => ({ +export const HomeApp = connect(null, (dispatch) => ({ onLoad() { dispatch(resetWorkpad()); }, -}); - -export const HomeApp = connect(null, mapDispatchToProps)(Component); +}))(Component); diff --git a/x-pack/plugins/canvas/public/apps/export/export/load_workpad.js b/x-pack/plugins/canvas/public/apps/home/home_app/index.ts similarity index 69% rename from x-pack/plugins/canvas/public/apps/export/export/load_workpad.js rename to x-pack/plugins/canvas/public/apps/home/home_app/index.ts index 388bf00723f82..8ea92312e3e50 100644 --- a/x-pack/plugins/canvas/public/apps/export/export/load_workpad.js +++ b/x-pack/plugins/canvas/public/apps/home/home_app/index.ts @@ -4,6 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; - -export const LoadWorkpad = () =>
Load a workpad...
; +export { HomeApp } from './home_app'; +export { HomeApp as HomeAppComponent } from './home_app.component'; diff --git a/x-pack/plugins/canvas/public/apps/home/index.js b/x-pack/plugins/canvas/public/apps/home/index.ts similarity index 100% rename from x-pack/plugins/canvas/public/apps/home/index.js rename to x-pack/plugins/canvas/public/apps/home/index.ts diff --git a/x-pack/plugins/canvas/public/apps/home/routes.js b/x-pack/plugins/canvas/public/apps/home/routes.ts similarity index 100% rename from x-pack/plugins/canvas/public/apps/home/routes.js rename to x-pack/plugins/canvas/public/apps/home/routes.ts diff --git a/x-pack/plugins/canvas/public/apps/index.js b/x-pack/plugins/canvas/public/apps/index.ts similarity index 88% rename from x-pack/plugins/canvas/public/apps/index.js rename to x-pack/plugins/canvas/public/apps/index.ts index c014349ca18da..8b3d378e23f80 100644 --- a/x-pack/plugins/canvas/public/apps/index.js +++ b/x-pack/plugins/canvas/public/apps/index.ts @@ -8,6 +8,7 @@ import * as home from './home'; import * as workpad from './workpad'; import * as exp from './export'; +// @ts-expect-error Router and routes are not yet strongly typed export const routes = [].concat(workpad.routes, home.routes, exp.routes); export const apps = [workpad.WorkpadApp, home.HomeApp, exp.ExportApp]; diff --git a/x-pack/plugins/canvas/public/apps/workpad/index.js b/x-pack/plugins/canvas/public/apps/workpad/index.ts similarity index 100% rename from x-pack/plugins/canvas/public/apps/workpad/index.js rename to x-pack/plugins/canvas/public/apps/workpad/index.ts diff --git a/x-pack/plugins/canvas/public/apps/workpad/routes.js b/x-pack/plugins/canvas/public/apps/workpad/routes.ts similarity index 82% rename from x-pack/plugins/canvas/public/apps/workpad/routes.js rename to x-pack/plugins/canvas/public/apps/workpad/routes.ts index a330020b741ac..d83f85f717305 100644 --- a/x-pack/plugins/canvas/public/apps/workpad/routes.js +++ b/x-pack/plugins/canvas/public/apps/workpad/routes.ts @@ -4,17 +4,24 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ErrorStrings } from '../../../i18n'; +import { Dispatch } from 'redux'; +// @ts-expect-error import * as workpadService from '../../lib/workpad_service'; import { notifyService } from '../../services'; import { getBaseBreadcrumb, getWorkpadBreadcrumb, setBreadcrumb } from '../../lib/breadcrumbs'; +// @ts-expect-error import { getDefaultWorkpad } from '../../state/defaults'; import { setWorkpad } from '../../state/actions/workpad'; +// @ts-expect-error import { setAssets, resetAssets } from '../../state/actions/assets'; +// @ts-expect-error import { setPage } from '../../state/actions/pages'; import { getWorkpad } from '../../state/selectors/workpad'; +// @ts-expect-error import { setZoomScale } from '../../state/actions/transient'; +import { ErrorStrings } from '../../../i18n'; import { WorkpadApp } from './workpad_app'; +import { State } from '../../../types'; const { workpadRoutes: strings } = ErrorStrings; @@ -25,7 +32,8 @@ export const routes = [ { name: 'createWorkpad', path: '/create', - action: (dispatch) => async ({ router }) => { + // @ts-expect-error Fix when Router is typed. + action: (dispatch: Dispatch) => async ({ router }) => { const newWorkpad = getDefaultWorkpad(); try { await workpadService.create(newWorkpad); @@ -46,7 +54,13 @@ export const routes = [ { name: 'loadWorkpad', path: '/:id(/page/:page)', - action: (dispatch, getState) => async ({ params, router }) => { + action: (dispatch: Dispatch, getState: () => State) => async ({ + params, + // @ts-expect-error Fix when Router is typed. + router, + }: { + params: { id: string; page?: string }; + }) => { // load workpad if given a new id via url param const state = getState(); const currentWorkpad = getWorkpad(state); @@ -70,10 +84,10 @@ export const routes = [ // fetch the workpad again, to get changes const workpad = getWorkpad(getState()); - const pageNumber = parseInt(params.page, 10); + const pageNumber = params.page ? parseInt(params.page, 10) : null; // no page provided, append current page to url - if (isNaN(pageNumber)) { + if (!pageNumber || isNaN(pageNumber)) { return router.redirectTo('loadWorkpad', { id: workpad.id, page: workpad.page + 1 }); } diff --git a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/index.js b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/index.js deleted file mode 100644 index ac50cd3fb99b6..0000000000000 --- a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/index.js +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { connect } from 'react-redux'; -import { compose, branch, renderComponent } from 'recompose'; -import { selectToplevelNodes } from '../../../state/actions/transient'; -import { canUserWrite, getAppReady } from '../../../state/selectors/app'; -import { getWorkpad, isWriteable } from '../../../state/selectors/workpad'; -import { LoadWorkpad } from './load_workpad'; -import { WorkpadApp as Component } from './workpad_app'; -import { withElementsLoadedTelemetry } from './workpad_telemetry'; - -export { WORKPAD_CONTAINER_ID } from './workpad_app'; - -const mapStateToProps = (state) => { - const appReady = getAppReady(state); - - return { - isWriteable: isWriteable(state) && canUserWrite(state), - appReady: typeof appReady === 'object' ? appReady : { ready: appReady }, - workpad: getWorkpad(state), - }; -}; - -const mapDispatchToProps = (dispatch) => ({ - deselectElement(ev) { - ev && ev.stopPropagation(); - dispatch(selectToplevelNodes([])); - }, -}); - -const branches = [branch(({ workpad }) => workpad == null, renderComponent(LoadWorkpad))]; - -export const WorkpadApp = compose( - connect(mapStateToProps, mapDispatchToProps), - ...branches, - withElementsLoadedTelemetry -)(Component); diff --git a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/index.ts b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/index.ts new file mode 100644 index 0000000000000..a00bf855ba376 --- /dev/null +++ b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { WorkpadApp } from './workpad_app'; +export { WorkpadApp as WorkpadAppComponent } from './workpad_app.component'; diff --git a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.component.tsx b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.component.tsx new file mode 100644 index 0000000000000..791f40f0219cd --- /dev/null +++ b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.component.tsx @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FC, MouseEventHandler, useRef } from 'react'; +import PropTypes from 'prop-types'; +import { Sidebar } from '../../../components/sidebar'; +import { Toolbar } from '../../../components/toolbar'; +// @ts-expect-error Untyped local +import { Workpad } from '../../../components/workpad'; +import { WorkpadHeader } from '../../../components/workpad_header'; +import { CANVAS_LAYOUT_STAGE_CONTENT_SELECTOR } from '../../../../common/lib/constants'; +import { CommitFn } from '../../../../types'; + +export const WORKPAD_CONTAINER_ID = 'canvasWorkpadContainer'; + +interface Props { + deselectElement?: MouseEventHandler; + isWriteable: boolean; +} + +export const WorkpadApp: FC = ({ deselectElement, isWriteable }) => { + const interactivePageLayout = useRef(null); // future versions may enable editing on multiple pages => use array then + + const registerLayout = (newLayout: CommitFn) => { + if (interactivePageLayout.current !== newLayout) { + interactivePageLayout.current = newLayout; + } + }; + + const unregisterLayout = (oldLayout: CommitFn) => { + if (interactivePageLayout.current === oldLayout) { + interactivePageLayout.current = null; + } + }; + + const commit = interactivePageLayout.current || (() => {}); + + return ( +
+
+
+
+
+ +
+ +
+ {/* NOTE: canvasWorkpadContainer is used for exporting */} +
+ +
+
+
+ + {isWriteable && ( +
+ +
+ )} +
+ +
+ +
+
+
+ ); +}; + +WorkpadApp.propTypes = { + isWriteable: PropTypes.bool.isRequired, + deselectElement: PropTypes.func, +}; diff --git a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.js b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.js deleted file mode 100644 index fc3ac9922355a..0000000000000 --- a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.js +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import PropTypes from 'prop-types'; -import { Sidebar } from '../../../components/sidebar'; -import { Toolbar } from '../../../components/toolbar'; -import { Workpad } from '../../../components/workpad'; -import { WorkpadHeader } from '../../../components/workpad_header'; -import { CANVAS_LAYOUT_STAGE_CONTENT_SELECTOR } from '../../../../common/lib/constants'; - -export const WORKPAD_CONTAINER_ID = 'canvasWorkpadContainer'; - -export class WorkpadApp extends React.PureComponent { - static propTypes = { - isWriteable: PropTypes.bool.isRequired, - deselectElement: PropTypes.func, - }; - - interactivePageLayout = null; // future versions may enable editing on multiple pages => use array then - - registerLayout(newLayout) { - if (this.interactivePageLayout !== newLayout) { - this.interactivePageLayout = newLayout; - } - } - - unregisterLayout(oldLayout) { - if (this.interactivePageLayout === oldLayout) { - this.interactivePageLayout = null; - } - } - - render() { - const { isWriteable, deselectElement } = this.props; - - return ( -
-
-
-
-
- {})} /> -
- -
- {/* NOTE: canvasWorkpadContainer is used for exporting */} -
- -
-
-
- - {isWriteable && ( -
- -
- )} -
- -
- -
-
-
- ); - } -} diff --git a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.ts b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.ts new file mode 100644 index 0000000000000..46f2efaf5e7d2 --- /dev/null +++ b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_app.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { MouseEventHandler } from 'react'; +import { Dispatch } from 'redux'; +import { connect } from 'react-redux'; +// @ts-expect-error untyped local +import { selectToplevelNodes } from '../../../state/actions/transient'; +import { canUserWrite } from '../../../state/selectors/app'; +import { getWorkpad, isWriteable } from '../../../state/selectors/workpad'; +import { WorkpadApp as Component } from './workpad_app.component'; +import { withElementsLoadedTelemetry } from './workpad_telemetry'; +import { State } from '../../../../types'; + +export { WORKPAD_CONTAINER_ID } from './workpad_app.component'; + +const mapDispatchToProps = (dispatch: Dispatch): { deselectElement: MouseEventHandler } => ({ + deselectElement: (ev) => { + ev.stopPropagation(); + dispatch(selectToplevelNodes([])); + }, +}); + +export const WorkpadApp = connect( + (state: State) => ({ + isWriteable: isWriteable(state) && canUserWrite(state), + workpad: getWorkpad(state), + }), + mapDispatchToProps +)(withElementsLoadedTelemetry(Component)); diff --git a/x-pack/plugins/canvas/public/components/workpad_header/workpad_header.component.tsx b/x-pack/plugins/canvas/public/components/workpad_header/workpad_header.component.tsx index eb4b451896b46..b1e87ca67f5e5 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/workpad_header.component.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/workpad_header.component.tsx @@ -18,22 +18,25 @@ import { EditMenu } from './edit_menu'; import { ElementMenu } from './element_menu'; import { ShareMenu } from './share_menu'; import { ViewMenu } from './view_menu'; +import { CommitFn } from '../../../types'; const { WorkpadHeader: strings } = ComponentStrings; export interface Props { isWriteable: boolean; - toggleWriteable: () => void; canUserWrite: boolean; - commit: (type: string, payload: any) => any; + commit: CommitFn; + onSetWriteable?: (writeable: boolean) => void; } export const WorkpadHeader: FunctionComponent = ({ isWriteable, canUserWrite, - toggleWriteable, commit, + onSetWriteable = () => {}, }) => { + const toggleWriteable = () => onSetWriteable(!isWriteable); + const keyHandler = (action: string) => { if (action === 'EDITING') { toggleWriteable(); @@ -145,6 +148,7 @@ export const WorkpadHeader: FunctionComponent = ({ WorkpadHeader.propTypes = { isWriteable: PropTypes.bool, - toggleWriteable: PropTypes.func, + commit: PropTypes.func.isRequired, + onSetWriteable: PropTypes.func, canUserWrite: PropTypes.bool, }; diff --git a/x-pack/plugins/canvas/public/components/workpad_header/workpad_header.tsx b/x-pack/plugins/canvas/public/components/workpad_header/workpad_header.tsx index 1f630040b0c36..0661aa4be4313 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/workpad_header.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/workpad_header.tsx @@ -10,37 +10,16 @@ import { canUserWrite } from '../../state/selectors/app'; import { getSelectedPage, isWriteable } from '../../state/selectors/workpad'; import { setWriteable } from '../../state/actions/workpad'; import { State } from '../../../types'; -import { WorkpadHeader as Component, Props as ComponentProps } from './workpad_header.component'; +import { WorkpadHeader as Component } from './workpad_header.component'; -interface StateProps { - isWriteable: boolean; - canUserWrite: boolean; - selectedPage: string; -} - -interface DispatchProps { - setWriteable: (isWorkpadWriteable: boolean) => void; -} - -const mapStateToProps = (state: State): StateProps => ({ +const mapStateToProps = (state: State) => ({ isWriteable: isWriteable(state) && canUserWrite(state), canUserWrite: canUserWrite(state), selectedPage: getSelectedPage(state), }); const mapDispatchToProps = (dispatch: Dispatch) => ({ - setWriteable: (isWorkpadWriteable: boolean) => dispatch(setWriteable(isWorkpadWriteable)), -}); - -const mergeProps = ( - stateProps: StateProps, - dispatchProps: DispatchProps, - ownProps: ComponentProps -): ComponentProps => ({ - ...stateProps, - ...dispatchProps, - ...ownProps, - toggleWriteable: () => dispatchProps.setWriteable(!stateProps.isWriteable), + onSetWriteable: (isWorkpadWriteable: boolean) => dispatch(setWriteable(isWorkpadWriteable)), }); -export const WorkpadHeader = connect(mapStateToProps, mapDispatchToProps, mergeProps)(Component); +export const WorkpadHeader = connect(mapStateToProps, mapDispatchToProps)(Component); diff --git a/x-pack/plugins/canvas/types/canvas.ts b/x-pack/plugins/canvas/types/canvas.ts index cc07f498f1eec..6b3f9ad3e8043 100644 --- a/x-pack/plugins/canvas/types/canvas.ts +++ b/x-pack/plugins/canvas/types/canvas.ts @@ -76,3 +76,7 @@ export interface CanvasWorkpadBoundingBox { top: number; bottom: number; } + +export type LayoutState = any; + +export type CommitFn = (type: string, payload: any) => LayoutState; From 37ce10158ad8911bbbd951a5b5e329858beec091 Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Mon, 10 Aug 2020 09:08:36 +0200 Subject: [PATCH 011/113] RFC: encryption key rotation support for the `encryptedSavedObjects` plugin (#72828) --- rfcs/text/0012_encryption_key_rotation.md | 119 ++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 rfcs/text/0012_encryption_key_rotation.md diff --git a/rfcs/text/0012_encryption_key_rotation.md b/rfcs/text/0012_encryption_key_rotation.md new file mode 100644 index 0000000000000..d984d1157a0a1 --- /dev/null +++ b/rfcs/text/0012_encryption_key_rotation.md @@ -0,0 +1,119 @@ +- Start Date: 2020-07-22 +- RFC PR: [#72828](https://github.com/elastic/kibana/pull/72828) +- Kibana Issue: (leave this empty) + +# Summary + +This RFC proposes a way of the encryption key (`xpack.encryptedSavedObjects.encryptionKey`) rotation that would allow administrators to seamlessly change existing encryption key without any data loss and manual intervention. + +# Basic example + +When administrators decide to rotate encryption key they will have to generate a new one and move the old key(s) to the `keyRotation` section in the `kibana.yml`: + +```yaml +xpack.encryptedSavedObjects: + encryptionKey: "NEW-encryption-key" + keyRotation: + decryptionOnlyKeys: ["OLD-encryption-key-1", "OLD-encryption-key-2"] +``` + +Before old decryption-only key is disposed administrators may want to call a dedicated and _protected_ API endpoint that will go through all registered Saved Objects with encrypted attributes and try to re-encrypt them with the primary encryption key: + +```http request +POST https://localhost:5601/api/encrypted_saved_objects/rotate_key?conflicts=abort +Content-Type: application/json +Kbn-Xsrf: true +``` + +# Motivation + +Today when encryption key changes we can no longer decrypt Saved Objects attributes that were previously encrypted with the `EncryptedSavedObjects` plugin. We handle this case in two different ways depending on whether consumers explicitly requested decryption or not: + +* If consumers explicitly request decryption via `getDecryptedAsInternalUser()` we abort operation and throw exception. +* If consumers fetch Saved Objects with encrypted attributes that should be automatically decrypted (the ones with `dangerouslyExposeValue: true` marker) via standard Saved Objects APIs we don't abort operation, but rather strip all encrypted attributes from the response and record decryption error in the `error` Saved Object field. +* If Kibana tries to migrate encrypted Saved Objects at the start up time we abort operation and throw exception. + +In both of these cases we throw or record error with the specific type to allow consumers to gracefully handle this scenario and either drop Saved Objects with unrecoverable encrypted attributes or facilitate the process of re-entering and re-encryption of the new values. + +This approach works reasonably well in some scenarios, but it may become very troublesome if we have to deal with lots of Saved Objects. Moreover, we'd like to recommend our users to periodically rotate encryption keys even if they aren't compromised. Hence, we need to provide a way of seamless migration of the existing encrypted Saved Objects to a new encryption key. + +There are two main scenarios we'd like to cover in this RFC: + +## Encryption key is not available + +Administrators may lose existing encryption key or explicitly decide to not use it if it was compromised and users can no longer trust encrypted content that may have been tampered with. In this scenario encrypted portion of the existing Saved Objects is considered lost, and the only way to recover from this state is a manual intervention described previously. That means `EncryptedSavedObjects` plugin consumers __should__ continue supporting this scenario even after we implement a proper encryption key rotation mechanism described in this RFC. + +## Encryption key is available, but needs to be rotated + +In this scenario a new encryption key (primary encryption key) will be generated, and we will use it to encrypt new or updated Saved Objects. We will still need to know the old encryption key to decrypt existing attributes, but we will no longer use this key to encrypt any of the new or existing Saved Objects. It's also should be possible to have multiple old decryption-only keys. + +The old old decryption-only keys should be eventually disposed and users should have a way to make sure all existing Saved Objects are re-encrypted with the new primary encryption key. + +__NOTE:__ users can get into a state when different Saved Objects are encrypted with different encryption keys even if they didn't intend to rotate the encryption key. We anticipate that it can happen during initial Elastic Stack HA setup, when by mistake or intentionally different Kibana instances were using different encryption keys. Key rotation mechanism can help to fix this issue without a data loss. + +# Detailed design + +The core idea is that when the encryption key needs to be rotated then a new key is generated and becomes a primary one, and the old one moves to the `keyRotation` section: + +```yaml +xpack.encryptedSavedObjects: + encryptionKey: "NEW-encryption-key" + keyRotation: + decryptionOnlyKeys: ["OLD-encryption-key"] +``` + +As the name implies, the key from the `decryptionOnlyKeys` is only used to decrypt content that we cannot decrypt with the primary encryption key. It's allowed to have multiple decryption-only keys at the same time. When user creates a new Saved Object or updates the existing one then its content is always encrypted with the primary encryption key. Config schema won't allow having the same key in `encryptionKey` and `decryptionOnlyKeys`. + +Having multiple decryption keys at the same time brings one problem though: we need to figure out which key to use to decrypt specific Saved Object. If our encryption keys could have a unique ID that we would store together with the encrypted data (we cannot use encryption key hash for that for obvious reasons) we could know for sure which key to use, but we don't have such functionality right now and it may not be the easiest one to manage through `yml` configuration anyway. + +Instead, this RFC proposes to try available existing decryption keys one by one to decrypt Saved Object and always start from the primary one. This way we won't incur any penalty while decrypting Saved Objects that are already encrypted with the primary encryption key, but there will still be some cost when we have to perform multiple decryption attempts. See the [`Drawbacks`](#drawbacks) section for the details. + +Technically just having `decryptionOnlyKeys` would be enough to cover the majority of the use cases, but the old decryption-only keys should be eventually disposed. At this point administrators would like to make sure _all_ Saved Objects are encrypted with the new primary encryption key. Another reason to re-encrypt all existing Saved Objects with the new key at once is to preventively reduce the performance impact of the multiple decryption attempts. + +We'd like to make this process as simple as possible while meeting the following requirements: + +* It should not be required to restart Kibana to perform this type of migration since Saved Objects encrypted with the another encryption key can theoretically appear at any point in time. +* It should be possible to integrate this operation into other operational flows our users may have and any user-friendly key management UIs we may introduce in this future. +* Any possible failures that may happen during this operation shouldn't make Kibana nonfunctional. +* Ordinary users should not be able to trigger this migration since it may consume a considerable amount of computing resources. + +We think that the best option we have right now is a dedicated API endpoint that would trigger this migration: + +```http request +POST https://localhost:5601/api/encrypted_saved_objects/rotate_key?conflicts=abort +Content-Type: application/json +Kbn-Xsrf: true +``` + +This will be a protected endpoint and only user with enough privileges will be able to use it. + +Under the hood we'll scroll over all Saved Objects that are registered with `EncryptedSavedObjects` plugin and re-encrypt attributes only for those of them that can only be decrypted with any of the old decryption-only keys. Saved Objects that can be decrypted with the primary encryption key will be ignored. We'll also ignore the ones that cannot be decrypted with any of the available decryption keys at all, and presumably return their IDs in the response. + +As for any other encryption or decryption operation we'll record relevant bits in the audit logs. + +# Benefits + +* The concept of decryption-only keys is easy to grasp and allows Kibana to function even if it has a mix of Saved Objects encrypted with different encryption keys. +* Support of the key rotation out of the box decreases the chances of the data loss and makes `EncryptedSavedObjects` story more secure and approachable overall. + +# Drawbacks + +* Multiple decryption attempts affect performance. See [the performance test results](https://github.com/elastic/kibana/pull/72420#issue-453400211) for more details, but making two decryption attempts is basically twice as slow as with a single attempt. Although it's only relevant for the encrypted Saved Objects migration performed at the start up time and batch operations that trigger automatic decryption (only for the Saved Objects registered with `dangerouslyExposeValue: true` marker that nobody is using in Kibana right now), we may have more use cases in the future. +* Historically we supported Kibana features with either configuration or dedicated UI, but in this case we want to introduce an API endpoint that _should be_ used directly. We may have a key management UI in the future though. + +# Alternatives + +We cannot think of any better alternative for `decryptionOnlyKeys` at the moment, but instead of API endpoint for the batch re-encryption we could potentially use another `kibana.yml` config option. For example `keyRotation.mode: onWrite | onStart | both`, but it feels a bit hacky and cannot be really integrated with anything else. + +# Adoption strategy + +Adoption strategy is pretty straightforward since the feature is an enhancement and doesn't bring any BWC concerns. + +# How we teach this + +Key rotation is a well-known paradigm. We'll update `README.md` of the `EncryptedSavedObjects` plugin and create a dedicated section in the public Kibana documentation. + +# Unresolved questions + +* Is it reasonable to have this feature in Basic? +* Are there any other use-cases that are not covered by the proposal? From 0a65e172a1563c9b0e39d06c5a4c0a3a4af480ec Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Mon, 10 Aug 2020 09:30:51 +0200 Subject: [PATCH 012/113] [ES UI Shared] Added README (#72034) * Added readme to es-ui-shared * implement PR feedback; clarify terms and tighten grammar * added note about intended users of es ui shared modules --- src/plugins/es_ui_shared/README.md | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/plugins/es_ui_shared/README.md diff --git a/src/plugins/es_ui_shared/README.md b/src/plugins/es_ui_shared/README.md new file mode 100644 index 0000000000000..5a9091e2dd1eb --- /dev/null +++ b/src/plugins/es_ui_shared/README.md @@ -0,0 +1,32 @@ +## ES UI shared modules + +This plugin contains reusable code in the form of self-contained modules (or libraries). Each of these modules exports a set of functionality relevant to the domain of the module. + +**Please note**: Modules in ES UI shared are intended for use by the ES UI Management Team (elastic/es-ui@) only. Please reach out to us if there is something you would like to contribute or use in these modules. + +## Files and folders overview + +- `./public` | `./server`. Folders for grouping server or public code according to the Kibana plugin pattern. +- `./__packages_do_not_import__` is where actual functionality is kept. This enables modules more control over what functionality is directly exported and prevents parts of modules to be depended on externally in unintended ways. +- `./public/index.ts` | `./server/index.ts` These files export modules (simple JavaScript objects). For example, `Monaco` is the name of a module. In this way, modules namespace all of their exports and do not have to be concerned about name collisions from other modules. + +## Conventions for adding code + +When adding new functionality, look at the folders in `./__packages_do_not_import__` and consider whether your functionality falls into any of those modules. + +If it does not, you should create a module and expose it to public or server code (or both) following the conventions described above. + +### Example + +If I wanted to add functionality for calculating a Fibonacci sequence browser-side one would do the following: + +1. Create a folder `./__packages_do_not_import__/math`. The name of the folder should be a snake_case version of the module name. In this case `Math` -> `math`. Another case, `IndexManagement` -> `index_management`. +2. Write your function in `./__packages_do_not_import__/math/calculate_fibonacci.ts`, adding any relevant tests in the same folder. +3. Export functionality intended _for consumers_ from `./__packages_do_not_import__/math/index.ts`. +4. Create a folder `./public/math`. +5. Export all functionality from `./__packages_do_not_import__/math` in `./public/math/index.ts`. +6. In `./public/index.ts` import `./public/math` using `import * as Math from './public/math;`. The name (`Math`) given here is really important and will be what consumers depend on. +7. Add the `Math` module to the list of exported modules in `./public/index.ts`, e.g. `export { <...other modules>, Math }` +8. Use `Math` in your public side code elsewhere! + +This example assumes no other appropriate home for such a function exists. From ce025732a17bb1a1488e6d01abf73545d9a393ba Mon Sep 17 00:00:00 2001 From: Dmitry Lemeshko Date: Mon, 10 Aug 2020 10:09:30 +0200 Subject: [PATCH 013/113] add retry for checking Add button (#74551) Co-authored-by: Elastic Machine --- .../test/functional/apps/dashboard/_async_dashboard.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/x-pack/test/functional/apps/dashboard/_async_dashboard.ts b/x-pack/test/functional/apps/dashboard/_async_dashboard.ts index cc30a7a7e640f..8851c83dea1ff 100644 --- a/x-pack/test/functional/apps/dashboard/_async_dashboard.ts +++ b/x-pack/test/functional/apps/dashboard/_async_dashboard.ts @@ -27,8 +27,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'timePicker', ]); - // Flakky: https://github.com/elastic/kibana/issues/65949 - describe.skip('sample data dashboard', function describeIndexTests() { + describe('sample data dashboard', function describeIndexTests() { before(async () => { await PageObjects.common.sleep(5000); await PageObjects.common.navigateToUrl('home', '/tutorial_directory/sampleData', { @@ -36,8 +35,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.home.addSampleDataSet('flights'); - const isInstalled = await PageObjects.home.isSampleDataSetInstalled('flights'); - expect(isInstalled).to.be(true); + await retry.tryForTime(10000, async () => { + const isInstalled = await PageObjects.home.isSampleDataSetInstalled('flights'); + expect(isInstalled).to.be(true); + }); + // add the range of the sample data so we can pick it in the quick pick list const SAMPLE_DATA_RANGE = `[ { From ad8502c8d9cbf35822ed187aae9ea31e5eca21ab Mon Sep 17 00:00:00 2001 From: spalger Date: Mon, 10 Aug 2020 01:25:29 -0700 Subject: [PATCH 014/113] update code-exploration docs --- docs/developer/architecture/code-exploration.asciidoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/developer/architecture/code-exploration.asciidoc b/docs/developer/architecture/code-exploration.asciidoc index bb7222020180c..d9502e4cb47ee 100644 --- a/docs/developer/architecture/code-exploration.asciidoc +++ b/docs/developer/architecture/code-exploration.asciidoc @@ -86,9 +86,9 @@ Contains the Discover application and the saved search embeddable. Embeddables are re-usable widgets that can be rendered in any environment or plugin. Developers can embed them directly in their plugin. End users can dynamically add them to any embeddable containers. -- {kib-repo}blob/{branch}/src/plugins/es_ui_shared[esUiShared] +- {kib-repo}blob/{branch}/src/plugins/es_ui_shared/README.md[esUiShared] -WARNING: Missing README. +This plugin contains reusable code in the form of self-contained modules (or libraries). Each of these modules exports a set of functionality relevant to the domain of the module. - {kib-repo}blob/{branch}/src/plugins/expressions/README.md[expressions] From f7f2988aa2d6a557ee2aa6aa184ea774bb57f345 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Mon, 10 Aug 2020 13:04:57 +0200 Subject: [PATCH 015/113] [ML] Functional tests - stabilize DFA job type check (#74631) This PR stabilizes the data frame analytics job type assertion by adding a retry. --- .../ml/data_frame_analytics_creation.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts b/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts index a49febfe68f61..d8df2fb869ed7 100644 --- a/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts +++ b/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts @@ -46,14 +46,16 @@ export function MachineLearningDataFrameAnalyticsCreationProvider( }, async assertJobTypeSelection(expectedSelection: string) { - const actualSelection = await testSubjects.getAttribute( - 'mlAnalyticsCreateJobWizardJobTypeSelect', - 'value' - ); - expect(actualSelection).to.eql( - expectedSelection, - `Job type selection should be '${expectedSelection}' (got '${actualSelection}')` - ); + await retry.tryForTime(5000, async () => { + const actualSelection = await testSubjects.getAttribute( + 'mlAnalyticsCreateJobWizardJobTypeSelect', + 'value' + ); + expect(actualSelection).to.eql( + expectedSelection, + `Job type selection should be '${expectedSelection}' (got '${actualSelection}')` + ); + }); }, async selectJobType(jobType: string) { From cccf15a3f42943aa81393fe532bfb4ce48ea6994 Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Mon, 10 Aug 2020 07:35:12 -0500 Subject: [PATCH 016/113] Index pattern field class refactor (#73180) - Better distinction and relationship between IndexPatternField and its spec - IndexPatternField class is no longer defined via object mutation - Reduction of dependencies - UI code moved into Index Pattern class (will be removed in next ticket) - IndexPattern field list was previously composed of IndexPatternFields or specs, now only IndexPatternFields - IndexPattern field list was previously redefined when loading fields, now only its contents are replaced. --- ...ins-data-public.fieldlist._constructor_.md | 23 +++ ...lugin-plugins-data-public.fieldlist.add.md | 11 + ...plugins-data-public.fieldlist.getbyname.md | 11 + ...plugins-data-public.fieldlist.getbytype.md | 11 + ...na-plugin-plugins-data-public.fieldlist.md | 31 +++ ...in-plugins-data-public.fieldlist.remove.md | 11 + ...plugins-data-public.fieldlist.removeall.md | 11 + ...lugins-data-public.fieldlist.replaceall.md | 11 + ...in-plugins-data-public.fieldlist.tospec.md | 25 +++ ...in-plugins-data-public.fieldlist.update.md | 11 + ...-public.getindexpatternfieldlistcreator.md | 11 - ...public.iindexpatternfieldlist.getbyname.md | 6 +- ...public.iindexpatternfieldlist.getbytype.md | 6 +- ...gins-data-public.iindexpatternfieldlist.md | 4 +- ...public.iindexpatternfieldlist.removeall.md | 15 ++ ...ublic.iindexpatternfieldlist.replaceall.md | 22 ++ ...data-public.indexpattern.getfieldbyname.md | 4 +- ...ublic.indexpattern.getformatterforfield.md | 22 ++ ...ublic.indexpattern.getnonscriptedfields.md | 4 +- ...a-public.indexpattern.getscriptedfields.md | 4 +- ...s-data-public.indexpattern.gettimefield.md | 4 +- ...plugin-plugins-data-public.indexpattern.md | 3 +- ...public.indexpattern.removescriptedfield.md | 4 +- ...-public.indexpatternfield._constructor_.md | 12 +- ...a-public.indexpatternfield.aggregatable.md | 2 +- ....indexpatternfield.conflictdescriptions.md | 4 +- ...ins-data-public.indexpatternfield.count.md | 4 +- ...ta-public.indexpatternfield.displayname.md | 2 +- ...s-data-public.indexpatternfield.estypes.md | 2 +- ...ata-public.indexpatternfield.filterable.md | 2 +- ...ns-data-public.indexpatternfield.format.md | 2 +- ...a-public.indexpatternfield.indexpattern.md | 2 +- ...gins-data-public.indexpatternfield.lang.md | 4 +- ...n-plugins-data-public.indexpatternfield.md | 28 ++- ...gins-data-public.indexpatternfield.name.md | 2 +- ...lic.indexpatternfield.readfromdocvalues.md | 2 +- ...ns-data-public.indexpatternfield.script.md | 4 +- ...-data-public.indexpatternfield.scripted.md | 2 +- ...ata-public.indexpatternfield.searchable.md | 2 +- ...-data-public.indexpatternfield.sortable.md | 2 +- ...ins-data-public.indexpatternfield.spec.md} | 6 +- ...s-data-public.indexpatternfield.subtype.md | 2 +- ...ns-data-public.indexpatternfield.tojson.md | 41 ++++ ...ns-data-public.indexpatternfield.tospec.md | 36 +++- ...gins-data-public.indexpatternfield.type.md | 2 +- ...a-public.indexpatternfield.visualizable.md | 2 +- .../kibana-plugin-plugins-data-public.md | 2 +- ....snap => index_pattern_field.test.ts.snap} | 0 .../common/index_patterns/fields/field.ts | 176 ---------------- .../index_patterns/fields/field_list.ts | 159 ++++++++------- .../common/index_patterns/fields/index.ts | 2 +- ...ld.test.ts => index_pattern_field.test.ts} | 105 ++-------- .../fields/index_pattern_field.ts | 188 ++++++++++++++++++ .../index_patterns/fields/obj_define.js | 158 --------------- .../index_patterns/fields/obj_define.test.js | 149 -------------- .../index_patterns/index_pattern.test.ts | 22 +- .../index_patterns/index_pattern.ts | 119 ++++++----- .../index_patterns/index_patterns.ts | 28 +-- .../data/common/index_patterns/types.ts | 15 +- .../kbn_field_types/kbn_field_types.test.ts | 4 +- .../common/kbn_field_types/kbn_field_types.ts | 6 +- .../kbn_field_types_factory.ts | 8 +- src/plugins/data/public/index.ts | 5 +- .../data/public/index_patterns/index.ts | 6 +- src/plugins/data/public/public.api.md | 169 +++++++++++----- .../public/search/aggs/agg_configs.test.ts | 2 +- .../public/search/aggs/param_types/field.ts | 2 +- .../doc_table/components/row_headers.test.js | 43 ++-- .../sidebar/discover_field.test.tsx | 30 +-- .../components/sidebar/discover_sidebar.tsx | 11 +- .../lib/get_index_pattern_field_list.ts | 12 +- .../components/sidebar/lib/group_fields.tsx | 4 +- .../create_edit_field/create_edit_field.tsx | 31 ++- .../indexed_fields_table.test.tsx.snap | 20 +- .../indexed_fields_table.test.tsx | 21 +- .../indexed_fields_table.tsx | 2 +- .../__snapshots__/field_editor.test.tsx.snap | 5 + .../editors/string/string.tsx | 2 +- .../field_editor/field_editor.test.tsx | 23 ++- .../components/field_editor/field_editor.tsx | 166 ++++++++-------- .../public/components/test_utils.tsx | 4 +- src/test_utils/public/stub_index_pattern.js | 22 +- .../management/_index_pattern_popularity.js | 2 +- .../apps/management/_scripted_fields.js | 3 +- .../management/_scripted_fields_filter.js | 4 +- 85 files changed, 1086 insertions(+), 1076 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist._constructor_.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.add.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getbyname.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getbytype.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.remove.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.removeall.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.replaceall.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.tospec.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.update.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getindexpatternfieldlistcreator.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.removeall.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.replaceall.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getformatterforfield.md rename docs/development/plugins/data/public/{kibana-plugin-plugins-data-public.indexpatternfield.__spec.md => kibana-plugin-plugins-data-public.indexpatternfield.spec.md} (56%) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.tojson.md rename src/plugins/data/common/index_patterns/fields/__snapshots__/{field.test.ts.snap => index_pattern_field.test.ts.snap} (100%) delete mode 100644 src/plugins/data/common/index_patterns/fields/field.ts rename src/plugins/data/common/index_patterns/fields/{field.test.ts => index_pattern_field.test.ts} (64%) create mode 100644 src/plugins/data/common/index_patterns/fields/index_pattern_field.ts delete mode 100644 src/plugins/data/common/index_patterns/fields/obj_define.js delete mode 100644 src/plugins/data/common/index_patterns/fields/obj_define.test.js diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist._constructor_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist._constructor_.md new file mode 100644 index 0000000000000..3b60ac0f48edd --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist._constructor_.md @@ -0,0 +1,23 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) > [(constructor)](./kibana-plugin-plugins-data-public.fieldlist._constructor_.md) + +## FieldList.(constructor) + +Constructs a new instance of the `FieldList` class + +Signature: + +```typescript +constructor(indexPattern: IndexPattern, specs?: FieldSpec[], shortDotsEnable?: boolean, onNotification?: () => void); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| indexPattern | IndexPattern | | +| specs | FieldSpec[] | | +| shortDotsEnable | boolean | | +| onNotification | () => void | | + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.add.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.add.md new file mode 100644 index 0000000000000..ae3d82f0cc3ea --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.add.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) > [add](./kibana-plugin-plugins-data-public.fieldlist.add.md) + +## FieldList.add property + +Signature: + +```typescript +readonly add: (field: FieldSpec) => void; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getbyname.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getbyname.md new file mode 100644 index 0000000000000..af368d003423a --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getbyname.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) > [getByName](./kibana-plugin-plugins-data-public.fieldlist.getbyname.md) + +## FieldList.getByName property + +Signature: + +```typescript +readonly getByName: (name: IndexPatternField['name']) => IndexPatternField | undefined; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getbytype.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getbytype.md new file mode 100644 index 0000000000000..16bae3ee7c555 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getbytype.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) > [getByType](./kibana-plugin-plugins-data-public.fieldlist.getbytype.md) + +## FieldList.getByType property + +Signature: + +```typescript +readonly getByType: (type: IndexPatternField['type']) => any[]; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md new file mode 100644 index 0000000000000..ef740575dff4e --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md @@ -0,0 +1,31 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) + +## FieldList class + +Signature: + +```typescript +export declare class FieldList extends Array implements IIndexPatternFieldList +``` + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(indexPattern, specs, shortDotsEnable, onNotification)](./kibana-plugin-plugins-data-public.fieldlist._constructor_.md) | | Constructs a new instance of the FieldList class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [add](./kibana-plugin-plugins-data-public.fieldlist.add.md) | | (field: FieldSpec) => void | | +| [getByName](./kibana-plugin-plugins-data-public.fieldlist.getbyname.md) | | (name: IndexPatternField['name']) => IndexPatternField | undefined | | +| [getByType](./kibana-plugin-plugins-data-public.fieldlist.getbytype.md) | | (type: IndexPatternField['type']) => any[] | | +| [remove](./kibana-plugin-plugins-data-public.fieldlist.remove.md) | | (field: IFieldType) => void | | +| [removeAll](./kibana-plugin-plugins-data-public.fieldlist.removeall.md) | | () => void | | +| [replaceAll](./kibana-plugin-plugins-data-public.fieldlist.replaceall.md) | | (specs: FieldSpec[]) => void | | +| [toSpec](./kibana-plugin-plugins-data-public.fieldlist.tospec.md) | | () => {
count: number;
script: string | undefined;
lang: string | undefined;
conflictDescriptions: Record<string, string[]> | undefined;
name: string;
type: string;
esTypes: string[] | undefined;
scripted: boolean;
searchable: boolean;
aggregatable: boolean;
readFromDocValues: boolean;
subType: import("../types").IFieldSubType | undefined;
format: any;
}[] | | +| [update](./kibana-plugin-plugins-data-public.fieldlist.update.md) | | (field: FieldSpec) => void | | + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.remove.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.remove.md new file mode 100644 index 0000000000000..149410adb3550 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.remove.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) > [remove](./kibana-plugin-plugins-data-public.fieldlist.remove.md) + +## FieldList.remove property + +Signature: + +```typescript +readonly remove: (field: IFieldType) => void; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.removeall.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.removeall.md new file mode 100644 index 0000000000000..92a45349ad005 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.removeall.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) > [removeAll](./kibana-plugin-plugins-data-public.fieldlist.removeall.md) + +## FieldList.removeAll property + +Signature: + +```typescript +readonly removeAll: () => void; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.replaceall.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.replaceall.md new file mode 100644 index 0000000000000..5330440e6b96a --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.replaceall.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) > [replaceAll](./kibana-plugin-plugins-data-public.fieldlist.replaceall.md) + +## FieldList.replaceAll property + +Signature: + +```typescript +readonly replaceAll: (specs: FieldSpec[]) => void; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.tospec.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.tospec.md new file mode 100644 index 0000000000000..e646339feb495 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.tospec.md @@ -0,0 +1,25 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) > [toSpec](./kibana-plugin-plugins-data-public.fieldlist.tospec.md) + +## FieldList.toSpec property + +Signature: + +```typescript +readonly toSpec: () => { + count: number; + script: string | undefined; + lang: string | undefined; + conflictDescriptions: Record | undefined; + name: string; + type: string; + esTypes: string[] | undefined; + scripted: boolean; + searchable: boolean; + aggregatable: boolean; + readFromDocValues: boolean; + subType: import("../types").IFieldSubType | undefined; + format: any; + }[]; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.update.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.update.md new file mode 100644 index 0000000000000..c718e47b31b50 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.update.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) > [update](./kibana-plugin-plugins-data-public.fieldlist.update.md) + +## FieldList.update property + +Signature: + +```typescript +readonly update: (field: FieldSpec) => void; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getindexpatternfieldlistcreator.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getindexpatternfieldlistcreator.md deleted file mode 100644 index 880acdc8956d4..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getindexpatternfieldlistcreator.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [getIndexPatternFieldListCreator](./kibana-plugin-plugins-data-public.getindexpatternfieldlistcreator.md) - -## getIndexPatternFieldListCreator variable - -Signature: - -```typescript -getIndexPatternFieldListCreator: ({ fieldFormats, onNotification, }: FieldListDependencies) => CreateIndexPatternFieldList -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbyname.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbyname.md index 14b5aa7137dc2..e277df87fe908 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbyname.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbyname.md @@ -7,16 +7,16 @@ Signature: ```typescript -getByName(name: Field['name']): Field | undefined; +getByName(name: IndexPatternField['name']): IndexPatternField | undefined; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| name | Field['name'] | | +| name | IndexPatternField['name'] | | Returns: -`Field | undefined` +`IndexPatternField | undefined` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbytype.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbytype.md index 3c65b78e5291d..9a7b3ab36b0c1 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbytype.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbytype.md @@ -7,16 +7,16 @@ Signature: ```typescript -getByType(type: Field['type']): Field[]; +getByType(type: IndexPatternField['type']): IndexPatternField[]; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| type | Field['type'] | | +| type | IndexPatternField['type'] | | Returns: -`Field[]` +`IndexPatternField[]` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md index 47d7c7491aa86..4ab012a2601d2 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md @@ -7,7 +7,7 @@ Signature: ```typescript -export interface IIndexPatternFieldList extends Array +export interface IIndexPatternFieldList extends Array ``` ## Methods @@ -18,5 +18,7 @@ export interface IIndexPatternFieldList extends Array | [getByName(name)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbyname.md) | | | [getByType(type)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbytype.md) | | | [remove(field)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.remove.md) | | +| [removeAll()](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.removeall.md) | | +| [replaceAll(specs)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.replaceall.md) | | | [update(field)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.update.md) | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.removeall.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.removeall.md new file mode 100644 index 0000000000000..55e7ca98e2637 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.removeall.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IIndexPatternFieldList](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.md) > [removeAll](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.removeall.md) + +## IIndexPatternFieldList.removeAll() method + +Signature: + +```typescript +removeAll(): void; +``` +Returns: + +`void` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.replaceall.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.replaceall.md new file mode 100644 index 0000000000000..c7e8cdd578bfe --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.replaceall.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IIndexPatternFieldList](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.md) > [replaceAll](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.replaceall.md) + +## IIndexPatternFieldList.replaceAll() method + +Signature: + +```typescript +replaceAll(specs: FieldSpec[]): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| specs | FieldSpec[] | | + +Returns: + +`void` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getfieldbyname.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getfieldbyname.md index e6a23c5c70aab..75cdfd0a2e22e 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getfieldbyname.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getfieldbyname.md @@ -7,7 +7,7 @@ Signature: ```typescript -getFieldByName(name: string): Field | void; +getFieldByName(name: string): IndexPatternField | undefined; ``` ## Parameters @@ -18,5 +18,5 @@ getFieldByName(name: string): Field | void; Returns: -`Field | void` +`IndexPatternField | undefined` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getformatterforfield.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getformatterforfield.md new file mode 100644 index 0000000000000..7984f7aff1d2d --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getformatterforfield.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IndexPattern](./kibana-plugin-plugins-data-public.indexpattern.md) > [getFormatterForField](./kibana-plugin-plugins-data-public.indexpattern.getformatterforfield.md) + +## IndexPattern.getFormatterForField() method + +Signature: + +```typescript +getFormatterForField(field: IndexPatternField | IndexPatternField['spec']): FieldFormat; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| field | IndexPatternField | IndexPatternField['spec'] | | + +Returns: + +`FieldFormat` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getnonscriptedfields.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getnonscriptedfields.md index 4e49304484815..77ce6f6f23a67 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getnonscriptedfields.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getnonscriptedfields.md @@ -7,9 +7,9 @@ Signature: ```typescript -getNonScriptedFields(): Field[]; +getNonScriptedFields(): IndexPatternField[]; ``` Returns: -`Field[]` +`IndexPatternField[]` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getscriptedfields.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getscriptedfields.md index 9ab4f9a9aaed5..055f07367c96e 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getscriptedfields.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.getscriptedfields.md @@ -7,9 +7,9 @@ Signature: ```typescript -getScriptedFields(): Field[]; +getScriptedFields(): IndexPatternField[]; ``` Returns: -`Field[]` +`IndexPatternField[]` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.gettimefield.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.gettimefield.md index 8e68e8c35aff7..24de0be3794bb 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.gettimefield.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.gettimefield.md @@ -7,9 +7,9 @@ Signature: ```typescript -getTimeField(): Field | undefined; +getTimeField(): IndexPatternField | undefined; ``` Returns: -`Field | undefined` +`IndexPatternField | undefined` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.md index a37f115358922..d340aaeeef25e 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.md @@ -42,6 +42,7 @@ export declare class IndexPattern implements IIndexPattern | [getAggregationRestrictions()](./kibana-plugin-plugins-data-public.indexpattern.getaggregationrestrictions.md) | | | | [getComputedFields()](./kibana-plugin-plugins-data-public.indexpattern.getcomputedfields.md) | | | | [getFieldByName(name)](./kibana-plugin-plugins-data-public.indexpattern.getfieldbyname.md) | | | +| [getFormatterForField(field)](./kibana-plugin-plugins-data-public.indexpattern.getformatterforfield.md) | | | | [getNonScriptedFields()](./kibana-plugin-plugins-data-public.indexpattern.getnonscriptedfields.md) | | | | [getScriptedFields()](./kibana-plugin-plugins-data-public.indexpattern.getscriptedfields.md) | | | | [getSourceFiltering()](./kibana-plugin-plugins-data-public.indexpattern.getsourcefiltering.md) | | | @@ -55,7 +56,7 @@ export declare class IndexPattern implements IIndexPattern | [popularizeField(fieldName, unit)](./kibana-plugin-plugins-data-public.indexpattern.popularizefield.md) | | | | [prepBody()](./kibana-plugin-plugins-data-public.indexpattern.prepbody.md) | | | | [refreshFields()](./kibana-plugin-plugins-data-public.indexpattern.refreshfields.md) | | | -| [removeScriptedField(field)](./kibana-plugin-plugins-data-public.indexpattern.removescriptedfield.md) | | | +| [removeScriptedField(fieldName)](./kibana-plugin-plugins-data-public.indexpattern.removescriptedfield.md) | | | | [save(saveAttempts)](./kibana-plugin-plugins-data-public.indexpattern.save.md) | | | | [toJSON()](./kibana-plugin-plugins-data-public.indexpattern.tojson.md) | | | | [toSpec()](./kibana-plugin-plugins-data-public.indexpattern.tospec.md) | | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.removescriptedfield.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.removescriptedfield.md index 2a6811f501152..42c6dd72b8c4e 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.removescriptedfield.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.removescriptedfield.md @@ -7,14 +7,14 @@ Signature: ```typescript -removeScriptedField(field: IFieldType): Promise; +removeScriptedField(fieldName: string): Promise; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| field | IFieldType | | +| fieldName | string | | Returns: diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield._constructor_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield._constructor_.md index 7a195702b6f13..10b65bdccdf87 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield._constructor_.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield._constructor_.md @@ -4,20 +4,20 @@ ## IndexPatternField.(constructor) -Constructs a new instance of the `Field` class +Constructs a new instance of the `IndexPatternField` class Signature: ```typescript -constructor(indexPattern: IIndexPattern, spec: FieldSpecExportFmt | FieldSpec | Field, shortDotsEnable: boolean, { fieldFormats, onNotification }: FieldDependencies); +constructor(indexPattern: IndexPattern, spec: FieldSpec, displayName: string, onNotification: OnNotification); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| indexPattern | IIndexPattern | | -| spec | FieldSpecExportFmt | FieldSpec | Field | | -| shortDotsEnable | boolean | | -| { fieldFormats, onNotification } | FieldDependencies | | +| indexPattern | IndexPattern | | +| spec | FieldSpec | | +| displayName | string | | +| onNotification | OnNotification | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.aggregatable.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.aggregatable.md index 267c8f786b5dd..6ef87d08600a3 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.aggregatable.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.aggregatable.md @@ -7,5 +7,5 @@ Signature: ```typescript -aggregatable?: boolean; +get aggregatable(): boolean; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.conflictdescriptions.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.conflictdescriptions.md index ec19a4854bf0e..6d62053726197 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.conflictdescriptions.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.conflictdescriptions.md @@ -7,5 +7,7 @@ Signature: ```typescript -conflictDescriptions?: FieldSpecConflictDescriptions; +get conflictDescriptions(): Record | undefined; + +set conflictDescriptions(conflictDescriptions: Record | undefined); ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.count.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.count.md index 8e848276f21c4..84c0a75fd206d 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.count.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.count.md @@ -7,5 +7,7 @@ Signature: ```typescript -count?: number; +get count(): number; + +set count(count: number); ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.displayname.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.displayname.md index ed9630f92fc97..c0ce2fff419bf 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.displayname.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.displayname.md @@ -7,5 +7,5 @@ Signature: ```typescript -displayName?: string; +readonly displayName: string; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.estypes.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.estypes.md index dec74df099d43..ac088cb69a3d6 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.estypes.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.estypes.md @@ -7,5 +7,5 @@ Signature: ```typescript -esTypes?: string[]; +get esTypes(): string[] | undefined; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.filterable.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.filterable.md index 4290c4a2f86b3..1149047c0eccd 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.filterable.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.filterable.md @@ -7,5 +7,5 @@ Signature: ```typescript -filterable?: boolean; +get filterable(): boolean; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.format.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.format.md index d5df8ed628cb0..f28d5b1bca7e5 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.format.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.format.md @@ -7,5 +7,5 @@ Signature: ```typescript -format: any; +get format(): FieldFormat; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md index 4acaaa8c0dc2c..3d145cce9d07d 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md @@ -7,5 +7,5 @@ Signature: ```typescript -indexPattern?: IIndexPattern; +readonly indexPattern: IndexPattern; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.lang.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.lang.md index f731be8f613cf..0a8446d40e5ec 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.lang.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.lang.md @@ -7,5 +7,7 @@ Signature: ```typescript -lang?: string; +get lang(): string | undefined; + +set lang(lang: string | undefined); ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.md index d82999e7a96af..713b29ea3a3d3 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.md @@ -7,37 +7,43 @@ Signature: ```typescript -export declare class Field implements IFieldType +export declare class IndexPatternField implements IFieldType ``` ## Constructors | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(indexPattern, spec, shortDotsEnable, { fieldFormats, onNotification })](./kibana-plugin-plugins-data-public.indexpatternfield._constructor_.md) | | Constructs a new instance of the Field class | +| [(constructor)(indexPattern, spec, displayName, onNotification)](./kibana-plugin-plugins-data-public.indexpatternfield._constructor_.md) | | Constructs a new instance of the IndexPatternField class | ## Properties | Property | Modifiers | Type | Description | | --- | --- | --- | --- | -| [$$spec](./kibana-plugin-plugins-data-public.indexpatternfield.__spec.md) | | FieldSpec | | | [aggregatable](./kibana-plugin-plugins-data-public.indexpatternfield.aggregatable.md) | | boolean | | -| [conflictDescriptions](./kibana-plugin-plugins-data-public.indexpatternfield.conflictdescriptions.md) | | FieldSpecConflictDescriptions | | +| [conflictDescriptions](./kibana-plugin-plugins-data-public.indexpatternfield.conflictdescriptions.md) | | Record<string, string[]> | undefined | | | [count](./kibana-plugin-plugins-data-public.indexpatternfield.count.md) | | number | | | [displayName](./kibana-plugin-plugins-data-public.indexpatternfield.displayname.md) | | string | | -| [esTypes](./kibana-plugin-plugins-data-public.indexpatternfield.estypes.md) | | string[] | | +| [esTypes](./kibana-plugin-plugins-data-public.indexpatternfield.estypes.md) | | string[] | undefined | | | [filterable](./kibana-plugin-plugins-data-public.indexpatternfield.filterable.md) | | boolean | | -| [format](./kibana-plugin-plugins-data-public.indexpatternfield.format.md) | | any | | -| [indexPattern](./kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md) | | IIndexPattern | | -| [lang](./kibana-plugin-plugins-data-public.indexpatternfield.lang.md) | | string | | +| [format](./kibana-plugin-plugins-data-public.indexpatternfield.format.md) | | FieldFormat | | +| [indexPattern](./kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md) | | IndexPattern | | +| [lang](./kibana-plugin-plugins-data-public.indexpatternfield.lang.md) | | string | undefined | | | [name](./kibana-plugin-plugins-data-public.indexpatternfield.name.md) | | string | | | [readFromDocValues](./kibana-plugin-plugins-data-public.indexpatternfield.readfromdocvalues.md) | | boolean | | -| [script](./kibana-plugin-plugins-data-public.indexpatternfield.script.md) | | string | | +| [script](./kibana-plugin-plugins-data-public.indexpatternfield.script.md) | | string | undefined | | | [scripted](./kibana-plugin-plugins-data-public.indexpatternfield.scripted.md) | | boolean | | | [searchable](./kibana-plugin-plugins-data-public.indexpatternfield.searchable.md) | | boolean | | | [sortable](./kibana-plugin-plugins-data-public.indexpatternfield.sortable.md) | | boolean | | -| [subType](./kibana-plugin-plugins-data-public.indexpatternfield.subtype.md) | | IFieldSubType | | -| [toSpec](./kibana-plugin-plugins-data-public.indexpatternfield.tospec.md) | | () => FieldSpecExportFmt | | +| [spec](./kibana-plugin-plugins-data-public.indexpatternfield.spec.md) | | FieldSpec | | +| [subType](./kibana-plugin-plugins-data-public.indexpatternfield.subtype.md) | | import("../types").IFieldSubType | undefined | | | [type](./kibana-plugin-plugins-data-public.indexpatternfield.type.md) | | string | | | [visualizable](./kibana-plugin-plugins-data-public.indexpatternfield.visualizable.md) | | boolean | | +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [toJSON()](./kibana-plugin-plugins-data-public.indexpatternfield.tojson.md) | | | +| [toSpec()](./kibana-plugin-plugins-data-public.indexpatternfield.tospec.md) | | | + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.name.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.name.md index cb24621e73209..c690edeafea6e 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.name.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.name.md @@ -7,5 +7,5 @@ Signature: ```typescript -name: string; +get name(): string; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.readfromdocvalues.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.readfromdocvalues.md index 4b012c26a8620..22f727e3c00e8 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.readfromdocvalues.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.readfromdocvalues.md @@ -7,5 +7,5 @@ Signature: ```typescript -readFromDocValues?: boolean; +get readFromDocValues(): boolean; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.script.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.script.md index 132ba25a47637..27f9c797c92f2 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.script.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.script.md @@ -7,5 +7,7 @@ Signature: ```typescript -script?: string; +get script(): string | undefined; + +set script(script: string | undefined); ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.scripted.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.scripted.md index 1dd6bc865a75d..f3810b9698a11 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.scripted.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.scripted.md @@ -7,5 +7,5 @@ Signature: ```typescript -scripted?: boolean; +get scripted(): boolean; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.searchable.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.searchable.md index 42f984d851435..431907b154dc0 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.searchable.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.searchable.md @@ -7,5 +7,5 @@ Signature: ```typescript -searchable?: boolean; +get searchable(): boolean; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.sortable.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.sortable.md index 72d225185140b..871320c9586d3 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.sortable.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.sortable.md @@ -7,5 +7,5 @@ Signature: ```typescript -sortable?: boolean; +get sortable(): boolean; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.__spec.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.spec.md similarity index 56% rename from docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.__spec.md rename to docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.spec.md index f52a3324af36f..9884faaa6c7bb 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.__spec.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.spec.md @@ -1,11 +1,11 @@ -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IndexPatternField](./kibana-plugin-plugins-data-public.indexpatternfield.md) > [$$spec](./kibana-plugin-plugins-data-public.indexpatternfield.__spec.md) +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IndexPatternField](./kibana-plugin-plugins-data-public.indexpatternfield.md) > [spec](./kibana-plugin-plugins-data-public.indexpatternfield.spec.md) -## IndexPatternField.$$spec property +## IndexPatternField.spec property Signature: ```typescript -$$spec: FieldSpec; +readonly spec: FieldSpec; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.subtype.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.subtype.md index 2d807f8a5739c..5c3c4d54ad099 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.subtype.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.subtype.md @@ -7,5 +7,5 @@ Signature: ```typescript -subType?: IFieldSubType; +get subType(): import("../types").IFieldSubType | undefined; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.tojson.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.tojson.md new file mode 100644 index 0000000000000..a6a3a5a093c8e --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.tojson.md @@ -0,0 +1,41 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IndexPatternField](./kibana-plugin-plugins-data-public.indexpatternfield.md) > [toJSON](./kibana-plugin-plugins-data-public.indexpatternfield.tojson.md) + +## IndexPatternField.toJSON() method + +Signature: + +```typescript +toJSON(): { + count: number; + script: string | undefined; + lang: string | undefined; + conflictDescriptions: Record | undefined; + name: string; + type: string; + esTypes: string[] | undefined; + scripted: boolean; + searchable: boolean; + aggregatable: boolean; + readFromDocValues: boolean; + subType: import("../types").IFieldSubType | undefined; + }; +``` +Returns: + +`{ + count: number; + script: string | undefined; + lang: string | undefined; + conflictDescriptions: Record | undefined; + name: string; + type: string; + esTypes: string[] | undefined; + scripted: boolean; + searchable: boolean; + aggregatable: boolean; + readFromDocValues: boolean; + subType: import("../types").IFieldSubType | undefined; + }` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.tospec.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.tospec.md index 35714faa03bc9..5037cb0049e82 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.tospec.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.tospec.md @@ -2,10 +2,42 @@ [Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IndexPatternField](./kibana-plugin-plugins-data-public.indexpatternfield.md) > [toSpec](./kibana-plugin-plugins-data-public.indexpatternfield.tospec.md) -## IndexPatternField.toSpec property +## IndexPatternField.toSpec() method Signature: ```typescript -toSpec: () => FieldSpecExportFmt; +toSpec(): { + count: number; + script: string | undefined; + lang: string | undefined; + conflictDescriptions: Record | undefined; + name: string; + type: string; + esTypes: string[] | undefined; + scripted: boolean; + searchable: boolean; + aggregatable: boolean; + readFromDocValues: boolean; + subType: import("../types").IFieldSubType | undefined; + format: any; + }; ``` +Returns: + +`{ + count: number; + script: string | undefined; + lang: string | undefined; + conflictDescriptions: Record | undefined; + name: string; + type: string; + esTypes: string[] | undefined; + scripted: boolean; + searchable: boolean; + aggregatable: boolean; + readFromDocValues: boolean; + subType: import("../types").IFieldSubType | undefined; + format: any; + }` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.type.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.type.md index c8483c9b83c9a..45085b9e74bcc 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.type.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.type.md @@ -7,5 +7,5 @@ Signature: ```typescript -type: string; +get type(): string; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.visualizable.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.visualizable.md index dd661ae779c11..9ed689752503a 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.visualizable.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.visualizable.md @@ -7,5 +7,5 @@ Signature: ```typescript -visualizable?: boolean; +get visualizable(): boolean; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index db41936f35cca..c8d45804a3729 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -10,6 +10,7 @@ | --- | --- | | [AggParamType](./kibana-plugin-plugins-data-public.aggparamtype.md) | | | [FieldFormat](./kibana-plugin-plugins-data-public.fieldformat.md) | | +| [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) | | | [FilterManager](./kibana-plugin-plugins-data-public.filtermanager.md) | | | [IndexPattern](./kibana-plugin-plugins-data-public.indexpattern.md) | | | [IndexPatternField](./kibana-plugin-plugins-data-public.indexpatternfield.md) | | @@ -103,7 +104,6 @@ | [extractSearchSourceReferences](./kibana-plugin-plugins-data-public.extractsearchsourcereferences.md) | | | [fieldFormats](./kibana-plugin-plugins-data-public.fieldformats.md) | | | [FilterBar](./kibana-plugin-plugins-data-public.filterbar.md) | | -| [getIndexPatternFieldListCreator](./kibana-plugin-plugins-data-public.getindexpatternfieldlistcreator.md) | | | [getKbnTypeNames](./kibana-plugin-plugins-data-public.getkbntypenames.md) | Get the esTypes known by all kbnFieldTypes {Array} | | [indexPatterns](./kibana-plugin-plugins-data-public.indexpatterns.md) | | | [injectSearchSourceReferences](./kibana-plugin-plugins-data-public.injectsearchsourcereferences.md) | | diff --git a/src/plugins/data/common/index_patterns/fields/__snapshots__/field.test.ts.snap b/src/plugins/data/common/index_patterns/fields/__snapshots__/index_pattern_field.test.ts.snap similarity index 100% rename from src/plugins/data/common/index_patterns/fields/__snapshots__/field.test.ts.snap rename to src/plugins/data/common/index_patterns/fields/__snapshots__/index_pattern_field.test.ts.snap diff --git a/src/plugins/data/common/index_patterns/fields/field.ts b/src/plugins/data/common/index_patterns/fields/field.ts deleted file mode 100644 index 81c7aff8a0faa..0000000000000 --- a/src/plugins/data/common/index_patterns/fields/field.ts +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { i18n } from '@kbn/i18n'; -// @ts-ignore -import { ObjDefine } from './obj_define'; -import { IIndexPattern } from '../../types'; -import { - IFieldType, - getKbnFieldType, - IFieldSubType, - FieldFormat, - shortenDottedString, -} from '../../../common'; -import { - OnNotification, - FieldSpec, - FieldSpecConflictDescriptions, - FieldSpecExportFmt, -} from '../types'; -import { FieldFormatsStartCommon } from '../../field_formats'; - -interface FieldDependencies { - fieldFormats: FieldFormatsStartCommon; - onNotification: OnNotification; -} - -export class Field implements IFieldType { - name: string; - type: string; - script?: string; - lang?: string; - count?: number; - // esTypes might be undefined on old index patterns that have not been refreshed since we added - // this prop. It is also undefined on scripted fields. - esTypes?: string[]; - aggregatable?: boolean; - filterable?: boolean; - searchable?: boolean; - sortable?: boolean; - visualizable?: boolean; - scripted?: boolean; - subType?: IFieldSubType; - displayName?: string; - indexPattern?: IIndexPattern; - readFromDocValues?: boolean; - format: any; - $$spec: FieldSpec; - conflictDescriptions?: FieldSpecConflictDescriptions; - - constructor( - indexPattern: IIndexPattern, - spec: FieldSpecExportFmt | FieldSpec | Field, - shortDotsEnable: boolean, - { fieldFormats, onNotification }: FieldDependencies - ) { - // unwrap old instances of Field - if (spec instanceof Field) spec = spec.$$spec; - - // construct this object using ObjDefine class, which - // extends the Field.prototype but gets it's properties - // defined using the logic below - const obj = new ObjDefine(spec, Field.prototype); - - if (spec.name === '_source') { - spec.type = '_source'; - } - - // find the type for this field, fallback to unknown type - let type = getKbnFieldType(spec.type); - if (spec.type && !type) { - const title = i18n.translate('data.indexPatterns.unknownFieldHeader', { - values: { type: spec.type }, - defaultMessage: 'Unknown field type {type}', - }); - const text = i18n.translate('data.indexPatterns.unknownFieldErrorMessage', { - values: { name: spec.name, title: indexPattern.title }, - defaultMessage: 'Field {name} in indexPattern {title} is using an unknown field type.', - }); - onNotification({ title, text, color: 'danger', iconType: 'alert' }); - } - - if (!type) type = getKbnFieldType('unknown'); - - let format: any = spec.format; - - if (!FieldFormat.isInstanceOfFieldFormat(format)) { - format = - (indexPattern.fieldFormatMap && indexPattern.fieldFormatMap[spec.name]) || - fieldFormats.getDefaultInstance(spec.type, spec.esTypes); - } - - const indexed = !!spec.indexed; - const scripted = !!spec.scripted; - const searchable = !!spec.searchable || scripted; - const aggregatable = !!spec.aggregatable || scripted; - const readFromDocValues = !!spec.readFromDocValues && !scripted; - const sortable = spec.name === '_score' || ((indexed || aggregatable) && type && type.sortable); - const filterable = - spec.name === '_id' || scripted || ((indexed || searchable) && type && type.filterable); - const visualizable = aggregatable; - - this.name = ''; - obj.fact('name'); - this.type = ''; - obj.fact('type'); - obj.fact('esTypes'); - obj.writ('count', spec.count || 0); - - // scripted objs - obj.fact('scripted', scripted); - obj.writ('script', scripted ? spec.script : null); - obj.writ('lang', scripted ? spec.lang || 'painless' : null); - - // stats - obj.fact('searchable', searchable); - obj.fact('aggregatable', aggregatable); - obj.fact('readFromDocValues', readFromDocValues); - - // usage flags, read-only and won't be saved - obj.comp('format', format); - obj.comp('sortable', sortable); - obj.comp('filterable', filterable); - obj.comp('visualizable', visualizable); - - // computed values - obj.comp('indexPattern', indexPattern); - obj.comp('displayName', shortDotsEnable ? shortenDottedString(spec.name) : spec.name); - this.$$spec = spec; - obj.comp('$$spec', spec); - - // conflict info - obj.writ('conflictDescriptions'); - - // multi info - obj.fact('subType'); - - const newObj = obj.create(); - newObj.toSpec = function () { - return { - count: this.count, - script: this.script, - lang: this.lang, - conflictDescriptions: this.conflictDescriptions, - name: this.name, - type: this.type, - esTypes: this.esTypes, - scripted: this.scripted, - searchable: this.searchable, - aggregatable: this.aggregatable, - readFromDocValues: this.readFromDocValues, - subType: this.subType, - format: this.indexPattern?.fieldFormatMap[this.name]?.toJSON() || undefined, - }; - }; - return newObj; - } - // only providing type info as constructor returns new object instead of `this` - toSpec = () => (({} as unknown) as FieldSpecExportFmt); -} diff --git a/src/plugins/data/common/index_patterns/fields/field_list.ts b/src/plugins/data/common/index_patterns/fields/field_list.ts index c1ca5341328ce..207002f42bbce 100644 --- a/src/plugins/data/common/index_patterns/fields/field_list.ts +++ b/src/plugins/data/common/index_patterns/fields/field_list.ts @@ -18,95 +18,110 @@ */ import { findIndex } from 'lodash'; -import { IIndexPattern } from '../../types'; -import { IFieldType } from '../../../common'; -import { Field } from './field'; +import { IFieldType, shortenDottedString } from '../../../common'; +import { IndexPatternField } from './index_pattern_field'; import { OnNotification, FieldSpec } from '../types'; -import { FieldFormatsStartCommon } from '../../field_formats'; +import { IndexPattern } from '../index_patterns'; -type FieldMap = Map; +type FieldMap = Map; -interface FieldListDependencies { - fieldFormats: FieldFormatsStartCommon; - onNotification: OnNotification; -} - -export interface IIndexPatternFieldList extends Array { - getByName(name: Field['name']): Field | undefined; - getByType(type: Field['type']): Field[]; +export interface IIndexPatternFieldList extends Array { add(field: FieldSpec): void; + getByName(name: IndexPatternField['name']): IndexPatternField | undefined; + getByType(type: IndexPatternField['type']): IndexPatternField[]; remove(field: IFieldType): void; + removeAll(): void; + replaceAll(specs: FieldSpec[]): void; update(field: FieldSpec): void; } export type CreateIndexPatternFieldList = ( - indexPattern: IIndexPattern, + indexPattern: IndexPattern, specs?: FieldSpec[], - shortDotsEnable?: boolean + shortDotsEnable?: boolean, + onNotification?: OnNotification ) => IIndexPatternFieldList; -export const getIndexPatternFieldListCreator = ({ - fieldFormats, - onNotification, -}: FieldListDependencies): CreateIndexPatternFieldList => (...fieldListParams) => { - class FieldList extends Array implements IIndexPatternFieldList { - private byName: FieldMap = new Map(); - private groups: Map = new Map(); - private indexPattern: IIndexPattern; - private shortDotsEnable: boolean; - private setByName = (field: Field) => this.byName.set(field.name, field); - private setByGroup = (field: Field) => { - if (typeof this.groups.get(field.type) === 'undefined') { - this.groups.set(field.type, new Map()); - } - this.groups.get(field.type)!.set(field.name, field); - }; - private removeByGroup = (field: IFieldType) => this.groups.get(field.type)!.delete(field.name); +export class FieldList extends Array implements IIndexPatternFieldList { + private byName: FieldMap = new Map(); + private groups: Map = new Map(); + private indexPattern: IndexPattern; + private shortDotsEnable: boolean; + private onNotification: OnNotification; + private setByName = (field: IndexPatternField) => this.byName.set(field.name, field); + private setByGroup = (field: IndexPatternField) => { + if (typeof this.groups.get(field.type) === 'undefined') { + this.groups.set(field.type, new Map()); + } + this.groups.get(field.type)!.set(field.name, field); + }; + private removeByGroup = (field: IFieldType) => this.groups.get(field.type)!.delete(field.name); + private calcDisplayName = (name: string) => + this.shortDotsEnable ? shortenDottedString(name) : name; + constructor( + indexPattern: IndexPattern, + specs: FieldSpec[] = [], + shortDotsEnable = false, + onNotification = () => {} + ) { + super(); + this.indexPattern = indexPattern; + this.shortDotsEnable = shortDotsEnable; + this.onNotification = onNotification; - constructor(indexPattern: IIndexPattern, specs: FieldSpec[] = [], shortDotsEnable = false) { - super(); - this.indexPattern = indexPattern; - this.shortDotsEnable = shortDotsEnable; + specs.map((field) => this.add(field)); + } - specs.map((field) => this.add(field)); - } + public readonly getByName = (name: IndexPatternField['name']) => this.byName.get(name); + public readonly getByType = (type: IndexPatternField['type']) => [ + ...(this.groups.get(type) || new Map()).values(), + ]; + public readonly add = (field: FieldSpec) => { + const newField = new IndexPatternField( + this.indexPattern, + field, + this.calcDisplayName(field.name), + this.onNotification + ); + this.push(newField); + this.setByName(newField); + this.setByGroup(newField); + }; - getByName = (name: Field['name']) => this.byName.get(name); - getByType = (type: Field['type']) => [...(this.groups.get(type) || new Map()).values()]; - add = (field: FieldSpec) => { - const newField = new Field(this.indexPattern, field, this.shortDotsEnable, { - fieldFormats, - onNotification, - }); - this.push(newField); - this.setByName(newField); - this.setByGroup(newField); - }; + public readonly remove = (field: IFieldType) => { + this.removeByGroup(field); + this.byName.delete(field.name); - remove = (field: IFieldType) => { - this.removeByGroup(field); - this.byName.delete(field.name); + const fieldIndex = findIndex(this, { name: field.name }); + this.splice(fieldIndex, 1); + }; - const fieldIndex = findIndex(this, { name: field.name }); - this.splice(fieldIndex, 1); - }; + public readonly update = (field: FieldSpec) => { + const newField = new IndexPatternField( + this.indexPattern, + field, + this.calcDisplayName(field.name), + this.onNotification + ); + const index = this.findIndex((f) => f.name === newField.name); + this.splice(index, 1, newField); + this.setByName(newField); + this.removeByGroup(newField); + this.setByGroup(newField); + }; - update = (field: FieldSpec) => { - const newField = new Field(this.indexPattern, field, this.shortDotsEnable, { - fieldFormats, - onNotification, - }); - const index = this.findIndex((f) => f.name === newField.name); - this.splice(index, 1, newField); - this.setByName(newField); - this.removeByGroup(newField); - this.setByGroup(newField); - }; + public readonly removeAll = () => { + this.length = 0; + this.byName.clear(); + this.groups.clear(); + }; - toSpec = () => { - return [...this.map((field) => field.toSpec())]; - }; - } + public readonly replaceAll = (specs: FieldSpec[]) => { + this.removeAll(); + specs.forEach(this.add); + }; - return new FieldList(...fieldListParams); -}; + public readonly toSpec = () => { + return [...this.map((field) => field.toSpec())]; + }; +} diff --git a/src/plugins/data/common/index_patterns/fields/index.ts b/src/plugins/data/common/index_patterns/fields/index.ts index 1b7c87d556f59..0c3b43181c5b4 100644 --- a/src/plugins/data/common/index_patterns/fields/index.ts +++ b/src/plugins/data/common/index_patterns/fields/index.ts @@ -20,4 +20,4 @@ export * from './types'; export { isFilterable, isNestedField } from './utils'; export * from './field_list'; -export * from './field'; +export * from './index_pattern_field'; diff --git a/src/plugins/data/common/index_patterns/fields/field.test.ts b/src/plugins/data/common/index_patterns/fields/index_pattern_field.test.ts similarity index 64% rename from src/plugins/data/common/index_patterns/fields/field.test.ts rename to src/plugins/data/common/index_patterns/fields/index_pattern_field.test.ts index 910f22088f43a..0cd0fe8324809 100644 --- a/src/plugins/data/common/index_patterns/fields/field.test.ts +++ b/src/plugins/data/common/index_patterns/fields/index_pattern_field.test.ts @@ -17,10 +17,10 @@ * under the License. */ -import { Field } from './field'; +import { IndexPatternField } from './index_pattern_field'; import { IndexPattern } from '../index_patterns'; -import { FieldFormatsStartCommon } from '../..'; -import { KBN_FIELD_TYPES, FieldSpec, FieldSpecExportFmt } from '../../../common'; +import { KBN_FIELD_TYPES } from '../../../common'; +import { FieldSpec } from '../types'; describe('Field', function () { function flatten(obj: Record) { @@ -28,14 +28,11 @@ describe('Field', function () { } function getField(values = {}) { - return new Field( + return new IndexPatternField( fieldValues.indexPattern as IndexPattern, { ...fieldValues, ...values }, - false, - { - fieldFormats: {} as FieldFormatsStartCommon, - onNotification: () => {}, - } + 'displayName', + () => {} ); } @@ -50,6 +47,7 @@ describe('Field', function () { filterable: true, searchable: true, sortable: true, + indexed: true, readFromDocValues: false, visualizable: true, scripted: true, @@ -58,11 +56,9 @@ describe('Field', function () { indexPattern: ({ fieldFormatMap: { name: {}, _source: {}, _score: {}, _id: {} }, } as unknown) as IndexPattern, - format: { name: 'formatName' }, $$spec: ({} as unknown) as FieldSpec, conflictDescriptions: { a: ['b', 'c'], d: ['e'] }, - toSpec: () => (({} as unknown) as FieldSpecExportFmt), - } as Field; + }; it('the correct properties are writable', () => { const field = getField(); @@ -84,72 +80,6 @@ describe('Field', function () { expect(field.conflictDescriptions).toEqual({}); }); - it('the correct properties are not writable', () => { - const field = getField(); - - expect(field.name).toEqual(fieldValues.name); - field.name = 'newName'; - expect(field.name).toEqual(fieldValues.name); - - expect(field.type).toEqual(fieldValues.type); - field.type = 'newType'; - expect(field.type).toEqual(fieldValues.type); - - expect(field.esTypes).toEqual(fieldValues.esTypes); - field.esTypes = ['newType']; - expect(field.esTypes).toEqual(fieldValues.esTypes); - - expect(field.scripted).toEqual(fieldValues.scripted); - field.scripted = false; - expect(field.scripted).toEqual(fieldValues.scripted); - - expect(field.searchable).toEqual(fieldValues.searchable); - field.searchable = false; - expect(field.searchable).toEqual(fieldValues.searchable); - - expect(field.aggregatable).toEqual(fieldValues.aggregatable); - field.aggregatable = false; - expect(field.aggregatable).toEqual(fieldValues.aggregatable); - - expect(field.readFromDocValues).toEqual(fieldValues.readFromDocValues); - field.readFromDocValues = true; - expect(field.readFromDocValues).toEqual(fieldValues.readFromDocValues); - - expect(field.subType).toEqual(fieldValues.subType); - field.subType = {}; - expect(field.subType).toEqual(fieldValues.subType); - - // not writable, not serialized - expect(() => { - field.indexPattern = {} as IndexPattern; - }).toThrow(); - - // computed fields - expect(() => { - field.format = { name: 'newFormatName' }; - }).toThrow(); - - expect(() => { - field.sortable = false; - }).toThrow(); - - expect(() => { - field.filterable = false; - }).toThrow(); - - expect(() => { - field.visualizable = false; - }).toThrow(); - - expect(() => { - field.displayName = 'newDisplayName'; - }).toThrow(); - - expect(() => { - field.$$spec = ({ a: 'b' } as unknown) as FieldSpec; - }).toThrow(); - }); - it('sets type field when _source field', () => { const field = getField({ name: '_source' }); expect(field.type).toEqual('_source'); @@ -214,26 +144,25 @@ describe('Field', function () { }); it('exports the property to JSON', () => { - const field = new Field({ fieldFormatMap: { name: {} } } as IndexPattern, fieldValues, false, { - fieldFormats: {} as FieldFormatsStartCommon, - onNotification: () => {}, - }); + const field = new IndexPatternField( + { fieldFormatMap: { name: {} } } as IndexPattern, + fieldValues, + 'displayName', + () => {} + ); expect(flatten(field)).toMatchSnapshot(); }); it('spec snapshot', () => { - const field = new Field( + const field = new IndexPatternField( { fieldFormatMap: { name: { toJSON: () => ({ id: 'number', params: { pattern: '$0,0.[00]' } }) }, }, } as IndexPattern, fieldValues, - false, - { - fieldFormats: {} as FieldFormatsStartCommon, - onNotification: () => {}, - } + 'displayName', + () => {} ); expect(field.toSpec()).toMatchSnapshot(); }); diff --git a/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts b/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts new file mode 100644 index 0000000000000..4e22332bef141 --- /dev/null +++ b/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts @@ -0,0 +1,188 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { i18n } from '@kbn/i18n'; +import { + IFieldType, + KbnFieldType, + getKbnFieldType, + KBN_FIELD_TYPES, + FieldFormat, +} from '../../../common'; +import { OnNotification, FieldSpec } from '../types'; + +import { IndexPattern } from '../index_patterns'; + +export class IndexPatternField implements IFieldType { + readonly spec: FieldSpec; + // not writable or serialized + readonly indexPattern: IndexPattern; + readonly displayName: string; + private readonly kbnFieldType: KbnFieldType; + + constructor( + indexPattern: IndexPattern, + spec: FieldSpec, + displayName: string, + onNotification: OnNotification + ) { + this.indexPattern = indexPattern; + this.spec = { ...spec, type: spec.name === '_source' ? '_source' : spec.type }; + this.displayName = displayName; + + this.kbnFieldType = getKbnFieldType(spec.type); + if (spec.type && this.kbnFieldType?.name === KBN_FIELD_TYPES.UNKNOWN) { + const title = i18n.translate('data.indexPatterns.unknownFieldHeader', { + values: { type: spec.type }, + defaultMessage: 'Unknown field type {type}', + }); + const text = i18n.translate('data.indexPatterns.unknownFieldErrorMessage', { + values: { name: spec.name, title: indexPattern.title }, + defaultMessage: 'Field {name} in indexPattern {title} is using an unknown field type.', + }); + onNotification({ title, text, color: 'danger', iconType: 'alert' }); + } + } + + // writable attrs + public get count() { + return this.spec.count; + } + + public set count(count) { + this.spec.count = count; + } + + public get script() { + return this.spec.script; + } + + public set script(script) { + this.spec.script = script; + } + + public get lang() { + return this.spec.lang; + } + + public set lang(lang) { + this.spec.lang = lang; + } + + public get conflictDescriptions() { + return this.spec.conflictDescriptions; + } + + public set conflictDescriptions(conflictDescriptions) { + this.spec.conflictDescriptions = conflictDescriptions; + } + + // read only attrs + public get name() { + return this.spec.name; + } + + public get type() { + return this.spec.type; + } + + public get esTypes() { + return this.spec.esTypes; + } + + public get scripted() { + return this.spec.scripted; + } + + public get searchable() { + return !!(this.spec.searchable || this.scripted); + } + + public get aggregatable() { + return !!(this.spec.aggregatable || this.scripted); + } + + public get readFromDocValues() { + return !!(this.spec.readFromDocValues && !this.scripted); + } + + public get subType() { + return this.spec.subType; + } + + // not writable, not serialized + public get sortable() { + return ( + this.name === '_score' || + ((this.spec.indexed || this.aggregatable) && this.kbnFieldType.sortable) + ); + } + + public get filterable() { + return ( + this.name === '_id' || + this.scripted || + ((this.spec.indexed || this.searchable) && this.kbnFieldType.filterable) + ); + } + + public get visualizable() { + return this.aggregatable; + } + + public get format(): FieldFormat { + return this.indexPattern.getFormatterForField(this); + } + + public toJSON() { + return { + count: this.count, + script: this.script, + lang: this.lang, + conflictDescriptions: this.conflictDescriptions, + + name: this.name, + type: this.type, + esTypes: this.esTypes, + scripted: this.scripted, + searchable: this.searchable, + aggregatable: this.aggregatable, + readFromDocValues: this.readFromDocValues, + subType: this.subType, + }; + } + + public toSpec() { + return { + count: this.count, + script: this.script, + lang: this.lang, + conflictDescriptions: this.conflictDescriptions, + name: this.name, + type: this.type, + esTypes: this.esTypes, + scripted: this.scripted, + searchable: this.searchable, + aggregatable: this.aggregatable, + readFromDocValues: this.readFromDocValues, + subType: this.subType, + format: this.indexPattern?.fieldFormatMap[this.name]?.toJSON() || undefined, + }; + } +} diff --git a/src/plugins/data/common/index_patterns/fields/obj_define.js b/src/plugins/data/common/index_patterns/fields/obj_define.js deleted file mode 100644 index 9c9e5c8f3d55f..0000000000000 --- a/src/plugins/data/common/index_patterns/fields/obj_define.js +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import _ from 'lodash'; - -export function ObjDefine(defaults, prototype) { - this.obj; // created by this.create() - - this.descs = {}; - this.defaults = defaults || {}; - this.prototype = prototype || Object.prototype; -} - -ObjDefine.REDEFINE_SUPPORTED = (function () { - const a = Object.create(Object.prototype, { - prop: { - configurable: true, - value: 1, - }, - }); - - Object.defineProperty(a, 'prop', { - configurable: true, - value: 2, - }); - - return a.prop === 2; -})(); - -/** - * normal value, writable and exported in JSON - * - * @param {any} v - value - * @return {object} - property descriptor - */ -ObjDefine.prototype.writ = function (name, val) { - this._define(name, val, true, true); -}; - -/** - * known value, exported in JSON, not changeable - * - * @param {any} v - value - * @return {object} - property descriptor - */ -ObjDefine.prototype.fact = function (name, val) { - this._define(name, val, true); -}; - -/** - * computed fact, not exported or changeable - * - * @param {any} v - value - * @return {object} - property descriptor - */ -ObjDefine.prototype.comp = function (name, val) { - this._define(name, val); -}; - -/** - * Creates an object, decorated by the property descriptors - * created by other ObjDefine methods and inheriting form the - * prototype - * - * # note: - * If a value is writable, but the value is undefined, the property will - * be created by not exported to JSON unless the property is written to - * - * @return {object} - created object - */ -ObjDefine.prototype.create = function () { - const self = this; - self.obj = Object.create(this.prototype, self.descs); - - if (!ObjDefine.REDEFINE_SUPPORTED && !self.prototype.toJSON) { - // since we can't redefine properties as enumerable we will - // clone the object on serialization and choose which properties - // to include or trim manually. This is currently only in use in PhantomJS - // due to https://github.com/ariya/phantomjs/issues/11856 - // TODO: remove this: https://github.com/elastic/kibana/issues/27136 - self.obj.toJSON = function () { - return _.transform( - self.obj, - function (json, val, key) { - const desc = self.descs[key]; - if (desc && desc.enumerable && val == null) return; - json[key] = val; - }, - {} - ); - }; - } - - return self.obj; -}; - -/** - * Private APIS - */ - -ObjDefine.prototype._define = function (name, val, exported, changeable) { - val = val != null ? val : this.defaults[name]; - this.descs[name] = this._describe(name, val, !!exported, !!changeable); -}; - -ObjDefine.prototype._describe = function (name, val, exported, changeable) { - const self = this; - const exists = val != null; - - if (exported && ObjDefine.REDEFINE_SUPPORTED) { - return { - enumerable: exists, - configurable: true, - get: _.constant(val), - set: function (update) { - if (!changeable) return false; - - // change the descriptor, since the value now exists. - self.descs[name] = self._describe(name, update, exported, changeable); - - // apply the updated descriptor - Object.defineProperty(self.obj, name, self.descs[name]); - }, - }; - } - - if (exported && !ObjDefine.REDEFINE_SUPPORTED) { - return { - enumerable: true, - configurable: true, - writable: changeable, - value: val, - }; - } - - return { - enumerable: false, - writable: changeable, - configurable: true, - value: val, - }; -}; diff --git a/src/plugins/data/common/index_patterns/fields/obj_define.test.js b/src/plugins/data/common/index_patterns/fields/obj_define.test.js deleted file mode 100644 index ec9a022253621..0000000000000 --- a/src/plugins/data/common/index_patterns/fields/obj_define.test.js +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import expect from '@kbn/expect'; -import { ObjDefine } from './obj_define'; - -describe('ObjDefine Utility', function () { - function flatten(obj) { - return JSON.parse(JSON.stringify(obj)); - } - - describe('#writ', function () { - it('creates writeable properties', function () { - const def = new ObjDefine(); - def.writ('name', 'foo'); - - const obj = def.create(); - expect(obj).to.have.property('name', 'foo'); - - obj.name = 'bar'; - expect(obj).to.have.property('name', 'bar'); - }); - - it('exports the property to JSON', function () { - const def = new ObjDefine(); - def.writ('name', 'foo'); - expect(flatten(def.create())).to.have.property('name', 'foo'); - }); - - it("does not export property to JSON it it's undefined or null", function () { - const def = new ObjDefine(); - def.writ('name'); - expect(flatten(def.create())).to.not.have.property('name'); - - def.writ('name', null); - expect(flatten(def.create())).to.not.have.property('name'); - }); - - it('switched to exporting if a value is written', function () { - const def = new ObjDefine(); - def.writ('name'); - - const obj = def.create(); - expect(flatten(obj)).to.not.have.property('name'); - - obj.name = null; - expect(flatten(obj)).to.not.have.property('name'); - - obj.name = 'foo'; - expect(flatten(obj)).to.have.property('name', 'foo'); - }); - - it('setting a writ value to null prevents it from exporting', function () { - const def = new ObjDefine(); - def.writ('name', 'foo'); - - const obj = def.create(); - expect(flatten(obj)).to.have.property('name', 'foo'); - - obj.name = null; - expect(flatten(obj)).to.not.have.property('name'); - }); - }); - - describe('#fact', function () { - it('creates an immutable field', function () { - const def = new ObjDefine(); - const val = 'foo'; - const notval = 'bar'; - def.fact('name', val); - const obj = def.create(); - - obj.name = notval; // UPDATE SHOULD BE IGNORED - expect(obj).to.have.property('name', val); - }); - - it('exports the fact to JSON', function () { - const def = new ObjDefine(); - def.fact('name', 'foo'); - expect(flatten(def.create())).to.have.property('name', 'foo'); - }); - }); - - describe('#comp', function () { - it('creates an immutable field', function () { - const def = new ObjDefine(); - const val = 'foo'; - const notval = 'bar'; - def.comp('name', val); - const obj = def.create(); - - expect(function () { - 'use strict'; // eslint-disable-line strict - - obj.name = notval; - }).to.throwException(); - }); - - it('does not export the computed value to JSON', function () { - const def = new ObjDefine(); - def.comp('name', 'foo'); - expect(flatten(def.create())).to.not.have.property('name'); - }); - }); - - describe('#create', function () { - it('creates object that inherits from the prototype', function () { - function SomeClass() {} - - const def = new ObjDefine(null, SomeClass.prototype); - const obj = def.create(); - - expect(obj).to.be.a(SomeClass); - }); - - it('uses the defaults for property values', function () { - const def = new ObjDefine({ name: 'bar' }); - def.fact('name'); - - const obj = def.create(); - - expect(obj).to.have.property('name', 'bar'); - }); - - it('ignores default values that are not defined properties', function () { - const def = new ObjDefine({ name: 'foo', name2: 'bar' }); - const obj = def.create(); - - expect(obj).to.not.have.property('name'); - expect(obj).to.not.have.property('name2'); - }); - }); -}); diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_pattern.test.ts b/src/plugins/data/common/index_patterns/index_patterns/index_pattern.test.ts index ebf873b14c379..e4f297b29c372 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_pattern.test.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_pattern.test.ts @@ -26,7 +26,7 @@ import { DuplicateField } from '../../../../kibana_utils/common'; import mockLogStashFields from '../../../../../fixtures/logstash_fields'; // @ts-ignore import { stubbedSavedObjectIndexPattern } from '../../../../../fixtures/stubbed_saved_object_index_pattern'; -import { Field } from '../fields'; +import { IndexPatternField } from '../fields'; import { fieldFormatsMock } from '../../field_formats/mocks'; @@ -170,8 +170,8 @@ describe('IndexPattern', () => { describe('getScriptedFields', () => { test('should return all scripted fields', () => { const scriptedNames = mockLogStashFields() - .filter((item: Field) => item.scripted === true) - .map((item: Field) => item.name); + .filter((item: IndexPatternField) => item.scripted === true) + .map((item: IndexPatternField) => item.name); const respNames = map(indexPattern.getScriptedFields(), 'name'); expect(respNames).toEqual(scriptedNames); @@ -214,8 +214,8 @@ describe('IndexPattern', () => { describe('getNonScriptedFields', () => { test('should return all non-scripted fields', () => { const notScriptedNames = mockLogStashFields() - .filter((item: Field) => item.scripted === false) - .map((item: Field) => item.name); + .filter((item: IndexPatternField) => item.scripted === false) + .map((item: IndexPatternField) => item.name); const respNames = map(indexPattern.getNonScriptedFields(), 'name'); expect(respNames).toEqual(notScriptedNames); @@ -235,7 +235,7 @@ describe('IndexPattern', () => { const newFields = indexPattern.getNonScriptedFields(); expect(newFields).toHaveLength(2); - expect(newFields.map((f) => f.name)).toEqual(['foo', 'bar']); + expect([...newFields.map((f) => f.name)]).toEqual(['foo', 'bar']); }); test('should preserve the scripted fields', async () => { @@ -249,8 +249,8 @@ describe('IndexPattern', () => { // sinon.assert.calledOnce(indexPattern.getScriptedFields); expect(indexPattern.getScriptedFields().map((f) => f.name)).toEqual( mockLogStashFields() - .filter((f: Field) => f.scripted) - .map((f: Field) => f.name) + .filter((f: IndexPatternField) => f.scripted) + .map((f: IndexPatternField) => f.name) ); }); }); @@ -278,7 +278,7 @@ describe('IndexPattern', () => { const scriptedFields = indexPattern.getScriptedFields(); // expect(saveSpy.callCount).to.equal(1); expect(scriptedFields).toHaveLength(oldCount + 1); - expect((indexPattern.fields.getByName(scriptedField.name) as Field).name).toEqual( + expect((indexPattern.fields.getByName(scriptedField.name) as IndexPatternField).name).toEqual( scriptedField.name ); }); @@ -287,9 +287,9 @@ describe('IndexPattern', () => { // const saveSpy = sinon.spy(indexPattern, 'save'); const scriptedFields = indexPattern.getScriptedFields(); const oldCount = scriptedFields.length; - const scriptedField = last(scriptedFields) as any; + const scriptedField = last(scriptedFields)!; - await indexPattern.removeScriptedField(scriptedField); + await indexPattern.removeScriptedField(scriptedField.name); // expect(saveSpy.callCount).to.equal(1); expect(indexPattern.getScriptedFields().length).toEqual(oldCount - 1); diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts b/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts index 2acb9d5f767ad..211919e8e6b53 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts @@ -22,10 +22,10 @@ import { i18n } from '@kbn/i18n'; import { SavedObjectsClientCommon } from '../..'; import { DuplicateField, SavedObjectNotFound } from '../../../../kibana_utils/common'; -import { ES_FIELD_TYPES, KBN_FIELD_TYPES, IIndexPattern, IFieldType } from '../../../common'; +import { ES_FIELD_TYPES, KBN_FIELD_TYPES, IIndexPattern } from '../../../common'; import { findByTitle } from '../utils'; import { IndexPatternMissingIndices } from '../lib'; -import { Field, IIndexPatternFieldList, getIndexPatternFieldListCreator } from '../fields'; +import { IndexPatternField, IIndexPatternFieldList, FieldList } from '../fields'; import { createFieldsFetcher } from './_fields_fetcher'; import { formatHitProvider } from './format_hit'; import { flattenHitWrapper } from './flatten_hit'; @@ -36,7 +36,7 @@ import { IIndexPatternsApiClient, IndexPatternAttributes, } from '../types'; -import { FieldFormatsStartCommon } from '../../field_formats'; +import { FieldFormatsStartCommon, FieldFormat } from '../../field_formats'; import { PatternCache } from './_pattern_cache'; import { expandShorthand, FieldMappingSpec, MappingObject } from '../../field_mapping'; import { IndexPatternSpec, TypeMeta, FieldSpec, SourceFilter } from '../types'; @@ -138,12 +138,8 @@ export class IndexPattern implements IIndexPattern { this.shortDotsEnable = uiSettingsValues.shortDotsEnable; this.metaFields = uiSettingsValues.metaFields; - this.createFieldList = getIndexPatternFieldListCreator({ - fieldFormats, - onNotification, - }); + this.fields = new FieldList(this, [], this.shortDotsEnable, this.onUnknownType); - this.fields = this.createFieldList(this, [], this.shortDotsEnable); this.apiClient = apiClient; this.fieldsFetcher = createFieldsFetcher(this, apiClient, uiSettingsValues.metaFields); this.flattenHit = flattenHitWrapper(this, uiSettingsValues.metaFields); @@ -161,49 +157,45 @@ export class IndexPattern implements IIndexPattern { } private deserializeFieldFormatMap(mapping: any) { - const FieldFormat = this.fieldFormats.getType(mapping.id); + const FieldFormatter = this.fieldFormats.getType(mapping.id); return ( - FieldFormat && - new FieldFormat( + FieldFormatter && + new FieldFormatter( mapping.params, (key: string) => this.uiSettingsValues[key]?.userValue || this.uiSettingsValues[key]?.value ) ); } - private initFields(input?: any) { - const newValue = input || this.fields; - - this.fields = this.createFieldList(this, newValue, this.shortDotsEnable); - } - - private isFieldRefreshRequired(): boolean { - if (!this.fields) { + private isFieldRefreshRequired(specs?: FieldSpec[]): boolean { + if (!specs) { return true; } - return this.fields.every((field) => { + return specs.every((spec) => { // See https://github.com/elastic/kibana/pull/8421 - const hasFieldCaps = 'aggregatable' in field && 'searchable' in field; + const hasFieldCaps = 'aggregatable' in spec && 'searchable' in spec; // See https://github.com/elastic/kibana/pull/11969 - const hasDocValuesFlag = 'readFromDocValues' in field; + const hasDocValuesFlag = 'readFromDocValues' in spec; return !hasFieldCaps || !hasDocValuesFlag; }); } - private async indexFields(forceFieldRefresh: boolean = false) { + private async indexFields(forceFieldRefresh: boolean = false, specs?: FieldSpec[]) { if (!this.id) { return; } - if (forceFieldRefresh || this.isFieldRefreshRequired()) { + if (forceFieldRefresh || this.isFieldRefreshRequired(specs)) { await this.refreshFields(); + } else { + if (specs) { + this.fields.replaceAll(specs); + } } - - this.initFields(); } public initFromSpec(spec: IndexPatternSpec) { @@ -223,15 +215,13 @@ export class IndexPattern implements IIndexPattern { this.timeFieldName = spec.timeFieldName; this.sourceFilters = spec.sourceFilters; - // ignoring this because the same thing happens elsewhere but via _.assign - // @ts-expect-error - this.fields = spec.fields || []; + this.fields.replaceAll(spec.fields || []); this.typeMeta = spec.typeMeta; + this.fieldFormatMap = _.mapValues(fieldFormatMap, (mapping) => { return this.deserializeFieldFormatMap(mapping); }); - this.initFields(); return this; } @@ -249,14 +239,16 @@ export class IndexPattern implements IIndexPattern { }); // give index pattern all of the values + const fieldList = this.fields; _.assign(this, response); + this.fields = fieldList; if (!this.title && this.id) { this.title = this.id; } this.version = response.version; - return this.indexFields(forceFieldRefresh); + return this.indexFields(forceFieldRefresh, response.fields); } getComputedFields() { @@ -359,32 +351,26 @@ export class IndexPattern implements IIndexPattern { throw new DuplicateField(name); } - this.fields.add( - new Field( - this, - { - name, - script, - fieldType, - scripted: true, - lang, - aggregatable: true, - filterable: true, - searchable: true, - }, - false, - { - fieldFormats: this.fieldFormats, - onNotification: this.onNotification, - } - ) - ); + this.fields.add({ + name, + script, + type: fieldType, + scripted: true, + lang, + aggregatable: true, + searchable: true, + count: 0, + readFromDocValues: false, + }); await this.save(); } - removeScriptedField(field: IFieldType) { - this.fields.remove(field); + removeScriptedField(fieldName: string) { + const field = this.fields.getByName(fieldName); + if (field) { + this.fields.remove(field); + } return this.save(); } @@ -417,11 +403,11 @@ export class IndexPattern implements IIndexPattern { } getNonScriptedFields() { - return _.filter(this.fields, { scripted: false }); + return [...this.fields.filter((field) => !field.scripted)]; } getScriptedFields() { - return _.filter(this.fields, { scripted: true }); + return [...this.fields.filter((field) => field.scripted)]; } isTimeBased(): boolean { @@ -438,12 +424,12 @@ export class IndexPattern implements IIndexPattern { } getTimeField() { - if (!this.timeFieldName || !this.fields || !this.fields.getByName) return; - return this.fields.getByName(this.timeFieldName); + if (!this.timeFieldName || !this.fields || !this.fields.getByName) return undefined; + return this.fields.getByName(this.timeFieldName) || undefined; } - getFieldByName(name: string): Field | void { - if (!this.fields || !this.fields.getByName) return; + getFieldByName(name: string): IndexPatternField | undefined { + if (!this.fields || !this.fields.getByName) return undefined; return this.fields.getByName(name); } @@ -470,6 +456,16 @@ export class IndexPattern implements IIndexPattern { return body; } + getFormatterForField(field: IndexPatternField | IndexPatternField['spec']): FieldFormat { + return ( + this.fieldFormatMap[field.name] || + this.fieldFormats.getDefaultInstance( + field.type as KBN_FIELD_TYPES, + field.esTypes as ES_FIELD_TYPES[] + ) + ); + } + async create(allowOverride: boolean = false) { const _create = async (duplicateId?: string) => { if (duplicateId) { @@ -581,9 +577,8 @@ export class IndexPattern implements IIndexPattern { async _fetchFields() { const fields = await this.fieldsFetcher.fetch(this); - const scripted = this.getScriptedFields(); - const all = fields.concat(scripted); - await this.initFields(all); + const scripted = this.getScriptedFields().map((field) => field.spec); + this.fields.replaceAll([...fields, ...scripted]); } refreshFields() { diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts index a07ffaf92aea5..8874ce5f04b7c 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts @@ -25,14 +25,13 @@ import { createEnsureDefaultIndexPattern, EnsureDefaultIndexPattern, } from './ensure_default_index_pattern'; -import { getIndexPatternFieldListCreator, CreateIndexPatternFieldList, Field } from '../fields'; +import { IndexPatternField } from '../fields'; import { OnNotification, OnError, UiSettingsCommon, IIndexPatternsApiClient, GetFieldsOptions, - FieldSpec, IndexPatternSpec, } from '../types'; import { FieldFormatsStartCommon } from '../../field_formats'; @@ -65,12 +64,6 @@ export class IndexPatternsService { private onNotification: OnNotification; private onError: OnError; ensureDefaultIndexPattern: EnsureDefaultIndexPattern; - createFieldList: CreateIndexPatternFieldList; - createField: ( - indexPattern: IndexPattern, - spec: FieldSpec | Field, - shortDotsEnable: boolean - ) => Field; constructor({ uiSettings, @@ -91,16 +84,15 @@ export class IndexPatternsService { uiSettings, onRedirectNoIndexPattern ); - this.createFieldList = getIndexPatternFieldListCreator({ - fieldFormats, - onNotification, - }); - this.createField = (indexPattern, spec, shortDotsEnable) => { - return new Field(indexPattern, spec, shortDotsEnable, { - fieldFormats, - onNotification, - }); - }; + } + + public createField( + indexPattern: IndexPattern, + spec: IndexPatternField['spec'], + displayName: string, + onNotification: OnNotification + ) { + return new IndexPatternField(indexPattern, spec, displayName, onNotification); } private async refreshSavedObjectsCache() { diff --git a/src/plugins/data/common/index_patterns/types.ts b/src/plugins/data/common/index_patterns/types.ts index 4241df5718243..3a7cf54843dfc 100644 --- a/src/plugins/data/common/index_patterns/types.ts +++ b/src/plugins/data/common/index_patterns/types.ts @@ -149,8 +149,21 @@ export interface FieldSpecExportFmt { } export interface FieldSpec { - [key: string]: any; + count: number; + script?: string; + lang?: string; + conflictDescriptions?: Record; format?: SerializedFieldFormat; + + name: string; + type: string; + esTypes?: string[]; + scripted: boolean; + searchable: boolean; + aggregatable: boolean; + readFromDocValues?: boolean; + subType?: IFieldSubType; + indexed?: boolean; } export interface IndexPatternSpec { diff --git a/src/plugins/data/common/kbn_field_types/kbn_field_types.test.ts b/src/plugins/data/common/kbn_field_types/kbn_field_types.test.ts index a3fe19fa9b2fc..6a2d6edd04692 100644 --- a/src/plugins/data/common/kbn_field_types/kbn_field_types.test.ts +++ b/src/plugins/data/common/kbn_field_types/kbn_field_types.test.ts @@ -55,10 +55,10 @@ describe('utils/kbn_field_types', () => { expect(kbnFieldType).toHaveProperty('name', ES_FIELD_TYPES.STRING); }); - test('returns undefined for invalid name', () => { + test('returns unknown for invalid name', () => { const kbnFieldType = getKbnFieldType('wrongType'); - expect(kbnFieldType).toBeUndefined(); + expect(kbnFieldType).toHaveProperty('name', KBN_FIELD_TYPES.UNKNOWN); }); }); diff --git a/src/plugins/data/common/kbn_field_types/kbn_field_types.ts b/src/plugins/data/common/kbn_field_types/kbn_field_types.ts index ce05dc796bbab..ffeb9c517daf5 100644 --- a/src/plugins/data/common/kbn_field_types/kbn_field_types.ts +++ b/src/plugins/data/common/kbn_field_types/kbn_field_types.ts @@ -17,7 +17,7 @@ * under the License. */ -import { createKbnFieldTypes } from './kbn_field_types_factory'; +import { createKbnFieldTypes, kbnFieldTypeUnknown } from './kbn_field_types_factory'; import { KbnFieldType } from './kbn_field_type'; import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from './types'; @@ -30,8 +30,8 @@ const registeredKbnTypes = createKbnFieldTypes(); * @param {string} typeName * @return {KbnFieldType} */ -export const getKbnFieldType = (typeName: string): KbnFieldType | undefined => - registeredKbnTypes.find((t) => t.name === typeName); +export const getKbnFieldType = (typeName: string): KbnFieldType => + registeredKbnTypes.find((t) => t.name === typeName) || kbnFieldTypeUnknown; /** * Get the esTypes known by all kbnFieldTypes diff --git a/src/plugins/data/common/kbn_field_types/kbn_field_types_factory.ts b/src/plugins/data/common/kbn_field_types/kbn_field_types_factory.ts index cb9357eb9865e..b93ebcbbca9c8 100644 --- a/src/plugins/data/common/kbn_field_types/kbn_field_types_factory.ts +++ b/src/plugins/data/common/kbn_field_types/kbn_field_types_factory.ts @@ -20,6 +20,10 @@ import { KbnFieldType } from './kbn_field_type'; import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from './types'; +export const kbnFieldTypeUnknown = new KbnFieldType({ + name: KBN_FIELD_TYPES.UNKNOWN, +}); + export const createKbnFieldTypes = (): KbnFieldType[] => [ new KbnFieldType({ name: KBN_FIELD_TYPES.STRING, @@ -103,7 +107,5 @@ export const createKbnFieldTypes = (): KbnFieldType[] => [ new KbnFieldType({ name: KBN_FIELD_TYPES.CONFLICT, }), - new KbnFieldType({ - name: KBN_FIELD_TYPES.UNKNOWN, - }), + kbnFieldTypeUnknown, ]; diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index e95150e8f6f73..5a9930d2b6b56 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -249,9 +249,7 @@ export { IndexPatternsContract, IndexPattern, IIndexPatternFieldList, - Field as IndexPatternField, - // TODO: exported only in stub_index_pattern test. Move into data plugin and remove export. - getIndexPatternFieldListCreator, + IndexPatternField, } from './index_patterns'; export { @@ -264,6 +262,7 @@ export { UI_SETTINGS, TypeMeta as IndexPatternTypeMeta, AggregationRestrictions as IndexPatternAggRestrictions, + FieldList, } from '../common'; /* diff --git a/src/plugins/data/public/index_patterns/index.ts b/src/plugins/data/public/index_patterns/index.ts index a6ee71c624f5a..9cd5e5a4736f1 100644 --- a/src/plugins/data/public/index_patterns/index.ts +++ b/src/plugins/data/public/index_patterns/index.ts @@ -28,11 +28,7 @@ export { } from '../../common/index_patterns/lib'; export { flattenHitWrapper, formatHitProvider, onRedirectNoIndexPattern } from './index_patterns'; -export { - getIndexPatternFieldListCreator, - Field, - IIndexPatternFieldList, -} from '../../common/index_patterns'; +export { IndexPatternField, IIndexPatternFieldList } from '../../common/index_patterns'; export { IndexPatternsService, diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 2cfdab80123ed..76f88df4dd6fc 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -576,6 +576,44 @@ export type FieldFormatsContentType = 'html' | 'text'; // @public (undocumented) export type FieldFormatsGetConfigFn = (key: string, defaultOverride?: T) => T; +// Warning: (ae-missing-release-tag) "FieldList" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export class FieldList extends Array implements IIndexPatternFieldList { + // Warning: (ae-forgotten-export) The symbol "FieldSpec" needs to be exported by the entry point index.d.ts + constructor(indexPattern: IndexPattern, specs?: FieldSpec[], shortDotsEnable?: boolean, onNotification?: () => void); + // (undocumented) + readonly add: (field: FieldSpec) => void; + // (undocumented) + readonly getByName: (name: IndexPatternField['name']) => IndexPatternField | undefined; + // (undocumented) + readonly getByType: (type: IndexPatternField['type']) => any[]; + // (undocumented) + readonly remove: (field: IFieldType) => void; + // (undocumented) + readonly removeAll: () => void; + // (undocumented) + readonly replaceAll: (specs: FieldSpec[]) => void; + // (undocumented) + readonly toSpec: () => { + count: number; + script: string | undefined; + lang: string | undefined; + conflictDescriptions: Record | undefined; + name: string; + type: string; + esTypes: string[] | undefined; + scripted: boolean; + searchable: boolean; + aggregatable: boolean; + readFromDocValues: boolean; + subType: import("../types").IFieldSubType | undefined; + format: any; + }[]; + // (undocumented) + readonly update: (field: FieldSpec) => void; +} + // @public (undocumented) export interface FieldMappingSpec { // (undocumented) @@ -658,13 +696,6 @@ export function getDefaultQuery(language?: QueryLanguage): { // @public (undocumented) export function getEsPreference(uiSettings: IUiSettingsClient_2, sessionId?: string): any; -// Warning: (ae-forgotten-export) The symbol "FieldListDependencies" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "CreateIndexPatternFieldList" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "getIndexPatternFieldListCreator" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const getIndexPatternFieldListCreator: ({ fieldFormats, onNotification, }: FieldListDependencies) => CreateIndexPatternFieldList; - // Warning: (ae-missing-release-tag) "getKbnTypeNames" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public @@ -808,8 +839,6 @@ export interface IFieldType { sortable?: boolean; // (undocumented) subType?: IFieldSubType; - // Warning: (ae-forgotten-export) The symbol "FieldSpec" needs to be exported by the entry point index.d.ts - // // (undocumented) toSpec?: () => FieldSpec; // (undocumented) @@ -856,6 +885,10 @@ export interface IIndexPatternFieldList extends Array { // (undocumented) remove(field: IFieldType): void; // (undocumented) + removeAll(): void; + // (undocumented) + replaceAll(specs: FieldSpec[]): void; + // (undocumented) update(field: FieldSpec): void; } @@ -929,7 +962,9 @@ export class IndexPattern implements IIndexPattern { }[]; }; // (undocumented) - getFieldByName(name: string): IndexPatternField | void; + getFieldByName(name: string): IndexPatternField | undefined; + // (undocumented) + getFormatterForField(field: IndexPatternField | IndexPatternField['spec']): FieldFormat; // (undocumented) getNonScriptedFields(): IndexPatternField[]; // (undocumented) @@ -967,7 +1002,7 @@ export class IndexPattern implements IIndexPattern { // (undocumented) refreshFields(): Promise; // (undocumented) - removeScriptedField(field: IFieldType): Promise; + removeScriptedField(fieldName: string): Promise; // (undocumented) save(saveAttempts?: number): Promise; // (undocumented) @@ -1018,55 +1053,85 @@ export interface IndexPatternAttributes { typeMeta: string; } -// Warning: (ae-missing-release-tag) "Field" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "IndexPatternField" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) export class IndexPatternField implements IFieldType { + // Warning: (ae-forgotten-export) The symbol "OnNotification" needs to be exported by the entry point index.d.ts + constructor(indexPattern: IndexPattern, spec: FieldSpec, displayName: string, onNotification: OnNotification); // (undocumented) - $$spec: FieldSpec; - // Warning: (ae-forgotten-export) The symbol "FieldSpecExportFmt" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "FieldDependencies" needs to be exported by the entry point index.d.ts - constructor(indexPattern: IIndexPattern, spec: FieldSpecExportFmt | FieldSpec | IndexPatternField, shortDotsEnable: boolean, { fieldFormats, onNotification }: FieldDependencies); + get aggregatable(): boolean; // (undocumented) - aggregatable?: boolean; - // Warning: (ae-forgotten-export) The symbol "FieldSpecConflictDescriptions" needs to be exported by the entry point index.d.ts - // + get conflictDescriptions(): Record | undefined; + set conflictDescriptions(conflictDescriptions: Record | undefined); // (undocumented) - conflictDescriptions?: FieldSpecConflictDescriptions; + get count(): number; + set count(count: number); // (undocumented) - count?: number; + readonly displayName: string; // (undocumented) - displayName?: string; + get esTypes(): string[] | undefined; // (undocumented) - esTypes?: string[]; + get filterable(): boolean; // (undocumented) - filterable?: boolean; + get format(): FieldFormat; // (undocumented) - format: any; + readonly indexPattern: IndexPattern; // (undocumented) - indexPattern?: IIndexPattern; + get lang(): string | undefined; + set lang(lang: string | undefined); // (undocumented) - lang?: string; + get name(): string; // (undocumented) - name: string; + get readFromDocValues(): boolean; // (undocumented) - readFromDocValues?: boolean; + get script(): string | undefined; + set script(script: string | undefined); // (undocumented) - script?: string; + get scripted(): boolean; // (undocumented) - scripted?: boolean; + get searchable(): boolean; // (undocumented) - searchable?: boolean; + get sortable(): boolean; // (undocumented) - sortable?: boolean; + readonly spec: FieldSpec; // (undocumented) - subType?: IFieldSubType; + get subType(): import("../types").IFieldSubType | undefined; + // (undocumented) + toJSON(): { + count: number; + script: string | undefined; + lang: string | undefined; + conflictDescriptions: Record | undefined; + name: string; + type: string; + esTypes: string[] | undefined; + scripted: boolean; + searchable: boolean; + aggregatable: boolean; + readFromDocValues: boolean; + subType: import("../types").IFieldSubType | undefined; + }; // (undocumented) - toSpec: () => FieldSpecExportFmt; + toSpec(): { + count: number; + script: string | undefined; + lang: string | undefined; + conflictDescriptions: Record | undefined; + name: string; + type: string; + esTypes: string[] | undefined; + scripted: boolean; + searchable: boolean; + aggregatable: boolean; + readFromDocValues: boolean; + subType: import("../types").IFieldSubType | undefined; + format: any; + }; // (undocumented) - type: string; + get type(): string; // (undocumented) - visualizable?: boolean; + get visualizable(): boolean; } // Warning: (ae-missing-release-tag) "indexPatterns" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -1899,21 +1964,21 @@ export const UI_SETTINGS: { // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:373:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:374:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:385:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:386:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:391:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:395:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:372:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:373:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:382:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:385:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:397:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:45:5 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:54:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:55:5 - (ae-forgotten-export) The symbol "createFiltersFromRangeSelectAction" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/search/aggs/agg_configs.test.ts b/src/plugins/data/public/search/aggs/agg_configs.test.ts index df4a5420ae0db..ff0cc3341929e 100644 --- a/src/plugins/data/public/search/aggs/agg_configs.test.ts +++ b/src/plugins/data/public/search/aggs/agg_configs.test.ts @@ -22,7 +22,7 @@ import { AggConfig } from './agg_config'; import { AggConfigs } from './agg_configs'; import { AggTypesRegistryStart } from './agg_types_registry'; import { mockAggTypesRegistry } from './test_helpers'; -import { Field as IndexPatternField, IndexPattern } from '../../index_patterns'; +import { IndexPatternField, IndexPattern } from '../../index_patterns'; import { stubIndexPattern, stubIndexPatternWithFields } from '../../../public/stubs'; describe('AggConfigs', () => { diff --git a/src/plugins/data/public/search/aggs/param_types/field.ts b/src/plugins/data/public/search/aggs/param_types/field.ts index cb3617b02e882..7c00bc668a39f 100644 --- a/src/plugins/data/public/search/aggs/param_types/field.ts +++ b/src/plugins/data/public/search/aggs/param_types/field.ts @@ -23,7 +23,7 @@ import { SavedObjectNotFound } from '../../../../../../plugins/kibana_utils/comm import { BaseParamType } from './base'; import { propFilter } from '../utils'; import { isNestedField, KBN_FIELD_TYPES } from '../../../../common'; -import { Field as IndexPatternField } from '../../../index_patterns'; +import { IndexPatternField } from '../../../index_patterns'; const filterByType = propFilter('type'); diff --git a/src/plugins/discover/public/application/angular/doc_table/components/row_headers.test.js b/src/plugins/discover/public/application/angular/doc_table/components/row_headers.test.js index b30b13b1f0b6e..d85ca6a072890 100644 --- a/src/plugins/discover/public/application/angular/doc_table/components/row_headers.test.js +++ b/src/plugins/discover/public/application/angular/doc_table/components/row_headers.test.js @@ -23,7 +23,7 @@ import 'angular-sanitize'; import 'angular-route'; import _ from 'lodash'; import sinon from 'sinon'; -import { getFakeRow, getFakeRowVals } from 'fixtures/fake_row'; +import { getFakeRow } from 'fixtures/fake_row'; import $ from 'jquery'; import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; import { setScopedHistory, setServices, setDocViewsRegistry } from '../../../../kibana_services'; @@ -33,6 +33,13 @@ import { navigationPluginMock } from '../../../../../../navigation/public/mocks' import { getInnerAngularModule } from '../../../../get_inner_angular'; import { createBrowserHistory } from 'history'; +const fakeRowVals = { + time: 'time_formatted', + bytes: 'bytes_formatted', + '@timestamp': '@timestamp_formatted', + request_body: 'request_body_formatted', +}; + describe('Doc Table', () => { const core = coreMock.createStart(); const dataMock = dataPluginMock.createStartContract(); @@ -45,8 +52,6 @@ describe('Doc Table', () => { // Stub out a minimal mapping of 4 fields let mapping; - let fakeRowVals; - let stubFieldFormatConverter; beforeAll(() => setScopedHistory(createBrowserHistory())); beforeEach(() => { angular.element.prototype.slice = jest.fn(function (index) { @@ -97,21 +102,15 @@ describe('Doc Table', () => { mapping = $parentScope.indexPattern.fields; // Stub `getConverterFor` for a field in the indexPattern to return mock data. - // Returns `val` if provided, otherwise generates fake data for the field. - fakeRowVals = getFakeRowVals('formatted', 0, mapping); - stubFieldFormatConverter = function ($root, field, val) { - const convertFn = (value, type, options) => { - if (val) { - return val; - } - const fieldName = _.get(options, 'field.name', null); - - return fakeRowVals[fieldName] || ''; - }; - - $root.indexPattern.fields.getByName(field).format.convert = convertFn; - $root.indexPattern.fields.getByName(field).format.getConverterFor = () => convertFn; + + const convertFn = (value, type, options) => { + const fieldName = _.get(options, 'field.name', null); + return fakeRowVals[fieldName] || ''; }; + $parentScope.indexPattern.getFormatterForField = () => ({ + convert: convertFn, + getConverterFor: () => convertFn, + }); }) ); @@ -148,9 +147,6 @@ describe('Doc Table', () => { test('should be able to add and remove columns', () => { let childElems; - stubFieldFormatConverter($parentScope, 'bytes'); - stubFieldFormatConverter($parentScope, 'request_body'); - // Should include a column for toggling and the time column by default $parentScope.columns = ['bytes']; $elementScope.$digest(); @@ -302,9 +298,6 @@ describe('Doc Table', () => { $root.mapping = mapping; $root.indexPattern = Private(FixturesStubbedLogstashIndexPatternProvider); - // Stub field format converters for every field in the indexPattern - $root.indexPattern.fields.forEach((f) => stubFieldFormatConverter($root, f.name)); - $row = $('').attr({ 'kbn-table-row': 'row', columns: 'columns', @@ -417,7 +410,8 @@ describe('Doc Table', () => { }); test('handles two columns with the same content', () => { - stubFieldFormatConverter($root, 'request_body', fakeRowVals.bytes); + const tempVal = fakeRowVals.request_body; + fakeRowVals.request_body = 'bytes_formatted'; $root.columns.length = 0; $root.columns.push('bytes'); @@ -428,6 +422,7 @@ describe('Doc Table', () => { expect($after).toHaveLength(4); expect($after.eq(2).text().trim()).toMatch(/^bytes_formatted/); expect($after.eq(3).text().trim()).toMatch(/^bytes_formatted/); + fakeRowVals.request_body = tempVal; }); test('handles two columns swapping position', () => { diff --git a/src/plugins/discover/public/application/components/sidebar/discover_field.test.tsx b/src/plugins/discover/public/application/components/sidebar/discover_field.test.tsx index 099ec2e5b1ffc..3f12a8c0fa769 100644 --- a/src/plugins/discover/public/application/components/sidebar/discover_field.test.tsx +++ b/src/plugins/discover/public/application/components/sidebar/discover_field.test.tsx @@ -28,7 +28,6 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { DiscoverField } from './discover_field'; import { coreMock } from '../../../../../../core/public/mocks'; import { IndexPatternField } from '../../../../../data/public'; -import { FieldSpecExportFmt } from '../../../../../data/common'; jest.mock('../../../kibana_services', () => ({ getServices: () => ({ @@ -63,20 +62,21 @@ function getComponent(selected = false, showDetails = false, useShortDots = fals coreMock.createStart() ); - const field = { - name: 'bytes', - type: 'number', - esTypes: ['long'], - count: 10, - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - format: null, - routes: {}, - $$spec: {}, - toSpec: () => (({} as unknown) as FieldSpecExportFmt), - } as IndexPatternField; + const field = new IndexPatternField( + indexPattern, + { + name: 'bytes', + type: 'number', + esTypes: ['long'], + count: 10, + scripted: false, + searchable: true, + aggregatable: true, + readFromDocValues: true, + }, + 'bytes', + () => {} + ); const props = { indexPattern, diff --git a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx index e8ed8b80da3bb..58b468762c501 100644 --- a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx +++ b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx @@ -29,12 +29,7 @@ import { IndexPatternAttributes } from '../../../../../data/common'; import { SavedObject } from '../../../../../../core/types'; import { FIELDS_LIMIT_SETTING } from '../../../../common'; import { groupFields } from './lib/group_fields'; -import { - IIndexPatternFieldList, - IndexPatternField, - IndexPattern, - UI_SETTINGS, -} from '../../../../../data/public'; +import { IndexPatternField, IndexPattern, UI_SETTINGS } from '../../../../../data/public'; import { AppState } from '../../angular/discover_state'; import { getDetails } from './lib/get_details'; import { getDefaultFieldFilter, setFieldFilterProp } from './lib/field_filter'; @@ -99,12 +94,12 @@ export function DiscoverSidebar({ }: DiscoverSidebarProps) { const [openFieldMap, setOpenFieldMap] = useState(new Map()); const [showFields, setShowFields] = useState(false); - const [fields, setFields] = useState(null); + const [fields, setFields] = useState(null); const [fieldFilterState, setFieldFilterState] = useState(getDefaultFieldFilter()); const services = useMemo(() => getServices(), []); useEffect(() => { - const newFields = getIndexPatternFieldList(selectedIndexPattern, fieldCounts, services); + const newFields = getIndexPatternFieldList(selectedIndexPattern, fieldCounts); setFields(newFields); }, [selectedIndexPattern, fieldCounts, hits, services]); diff --git a/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts b/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts index 0fcbe925e0798..751a59d982153 100644 --- a/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts +++ b/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts @@ -18,25 +18,23 @@ */ import { difference, map } from 'lodash'; import { IndexPattern, IndexPatternField } from 'src/plugins/data/public'; -import { DiscoverServices } from '../../../../build_services'; export function getIndexPatternFieldList( indexPattern: IndexPattern, - fieldCounts: Record, - { data }: DiscoverServices + fieldCounts: Record ) { - if (!indexPattern || !fieldCounts) return data.indexPatterns.createFieldList(indexPattern); + if (!indexPattern || !fieldCounts) return []; - const fieldSpecs = indexPattern.fields.slice(0); const fieldNamesInDocs = Object.keys(fieldCounts); const fieldNamesInIndexPattern = map(indexPattern.fields, 'name'); + const unknownTypes: IndexPatternField[] = []; difference(fieldNamesInDocs, fieldNamesInIndexPattern).forEach((unknownFieldName) => { - fieldSpecs.push({ + unknownTypes.push({ name: String(unknownFieldName), type: 'unknown', } as IndexPatternField); }); - return data.indexPatterns.createFieldList(indexPattern, fieldSpecs); + return [...indexPattern.fields, ...unknownTypes]; } diff --git a/src/plugins/discover/public/application/components/sidebar/lib/group_fields.tsx b/src/plugins/discover/public/application/components/sidebar/lib/group_fields.tsx index fab4637d87ca7..c6a06618900fd 100644 --- a/src/plugins/discover/public/application/components/sidebar/lib/group_fields.tsx +++ b/src/plugins/discover/public/application/components/sidebar/lib/group_fields.tsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { IIndexPatternFieldList, IndexPatternField } from 'src/plugins/data/public'; +import { IndexPatternField } from 'src/plugins/data/public'; import { FieldFilterState, isFieldFiltered } from './field_filter'; interface GroupedFields { @@ -29,7 +29,7 @@ interface GroupedFields { * group the fields into selected, popular and unpopular, filter by fieldFilterState */ export function groupFields( - fields: IIndexPatternFieldList | null, + fields: IndexPatternField[] | null, columns: string[], popularLimit: number, fieldCounts: Record, diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx index f7b982ef1659e..22bc78ee0538e 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx @@ -21,7 +21,7 @@ import { withRouter, RouteComponentProps } from 'react-router-dom'; import { EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { IndexPattern } from '../../../../../../plugins/data/public'; +import { IndexPattern, IndexPatternField } from '../../../../../../plugins/data/public'; import { useKibana } from '../../../../../../plugins/kibana_react/public'; import { IndexPatternManagmentContext } from '../../../types'; import { IndexHeader } from '../index_header'; @@ -44,24 +44,21 @@ const newFieldPlaceholder = i18n.translate( export const CreateEditField = withRouter( ({ indexPattern, mode, fieldName, history }: CreateEditFieldProps) => { - const { data, uiSettings, chrome, notifications } = useKibana< + const { uiSettings, chrome, notifications } = useKibana< IndexPatternManagmentContext >().services; - const field = + const spec = mode === 'edit' && fieldName - ? indexPattern.fields.getByName(fieldName) - : data.indexPatterns.createField( - indexPattern, - { - scripted: true, - type: 'number', - }, - false - ); + ? indexPattern.fields.getByName(fieldName)?.spec + : (({ + scripted: true, + type: 'number', + name: undefined, + } as unknown) as IndexPatternField); const url = `/patterns/${indexPattern.id}`; - if (mode === 'edit' && !field) { + if (mode === 'edit' && !spec) { const message = i18n.translate( 'indexPatternManagement.editIndexPattern.scripted.noFieldLabel', { @@ -74,17 +71,17 @@ export const CreateEditField = withRouter( history.push(url); } - const docFieldName = field?.name || newFieldPlaceholder; + const docFieldName = spec?.name || newFieldPlaceholder; chrome.docTitle.change([docFieldName, indexPattern.title]); const redirectAway = () => { history.push( - `${url}#/?_a=(tab:${field?.scripted ? TAB_SCRIPTED_FIELDS : TAB_INDEXED_FIELDS})` + `${url}#/?_a=(tab:${spec?.scripted ? TAB_SCRIPTED_FIELDS : TAB_INDEXED_FIELDS})` ); }; - if (field) { + if (spec) { return ( @@ -97,7 +94,7 @@ export const CreateEditField = withRouter( ({ @@ -41,6 +41,19 @@ const helpers = { getFieldInfo: () => [], }; +const indexPattern = ({ + getNonScriptedFields: () => fields, +} as unknown) as IIndexPattern; + +const mockFieldToIndexPatternField = (spec: Record) => { + return new IndexPatternField( + indexPattern as IndexPattern, + (spec as unknown) as IndexPatternField['spec'], + spec.displayName as string, + () => {} + ); +}; + const fields = [ { name: 'Elastic', @@ -50,11 +63,7 @@ const fields = [ }, { name: 'timestamp', displayName: 'timestamp', type: 'date' }, { name: 'conflictingField', displayName: 'conflictingField', type: 'conflict' }, -] as IndexPatternField[]; - -const indexPattern = ({ - getNonScriptedFields: () => fields, -} as unknown) as IIndexPattern; +].map(mockFieldToIndexPatternField); describe('IndexedFieldsTable', () => { test('should render normally', async () => { diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx index 3344c46c35ac6..90f81a88b3da0 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx @@ -75,7 +75,7 @@ export class IndexedFieldsTable extends Component< (fields && fields.map((field) => { return { - ...field, + ...field.spec, displayName: field.displayName, indexPattern: field.indexPattern, format: getFieldFormat(indexPattern, field.name), diff --git a/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap b/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap index 7a7545580d82a..c22160bc4036d 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap @@ -30,6 +30,7 @@ exports[`FieldEditor should render create new scripted field correctly 1`] = ` "name": "foobar", }, ], + "getFormatterForField": [Function], } } isVisible={false} @@ -273,6 +274,7 @@ exports[`FieldEditor should render edit scripted field correctly 1`] = ` "type": "number", }, ], + "getFormatterForField": [Function], } } isVisible={false} @@ -523,6 +525,7 @@ exports[`FieldEditor should show conflict field warning 1`] = ` "type": "number", }, ], + "getFormatterForField": [Function], } } isVisible={false} @@ -802,6 +805,7 @@ exports[`FieldEditor should show deprecated lang warning 1`] = ` "type": "number", }, ], + "getFormatterForField": [Function], } } isVisible={false} @@ -1133,6 +1137,7 @@ exports[`FieldEditor should show multiple type field warning with a table contai "type": "number", }, ], + "getFormatterForField": [Function], } } isVisible={false} diff --git a/src/plugins/index_pattern_management/public/components/field_editor/components/field_format_editor/editors/string/string.tsx b/src/plugins/index_pattern_management/public/components/field_editor/components/field_format_editor/editors/string/string.tsx index 7a3bb6f5cd398..cdc29e129c457 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/components/field_format_editor/editors/string/string.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/components/field_format_editor/editors/string/string.tsx @@ -68,7 +68,7 @@ export class StringFormatEditor extends DefaultFormatEditor { + options={(format.type.transformOptions || []).map((option: TransformOptions) => { return { value: option.kind, text: option.text, diff --git a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx index e0e053d8b606b..ba1f2ff4b665d 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx @@ -26,7 +26,7 @@ import { jest.mock('brace/mode/groovy', () => ({})); -import { FieldEditor } from './field_editor'; +import { FieldEditor, FieldEdiorProps } from './field_editor'; import { mockManagementPlugin } from '../../mocks'; import { createComponentWithContext } from '../test_utils'; @@ -113,15 +113,16 @@ describe('FieldEditor', () => { beforeEach(() => { indexPattern = ({ fields: fields as IIndexPatternFieldList, + getFormatterForField: () => ({ params: () => ({}) }), } as unknown) as IndexPattern; }); it('should render create new scripted field correctly', async () => { - const component = createComponentWithContext( + const component = createComponentWithContext( FieldEditor, { indexPattern, - field: (field as unknown) as IndexPatternField, + spec: (field as unknown) as IndexPatternField, services: { redirectAway: () => {} }, }, mockContext @@ -146,11 +147,11 @@ describe('FieldEditor', () => { return flds[name] as IndexPatternField; }; - const component = createComponentWithContext( + const component = createComponentWithContext( FieldEditor, { indexPattern, - field: (testField as unknown) as IndexPatternField, + spec: (testField as unknown) as IndexPatternField, services: { redirectAway: () => {} }, }, mockContext @@ -176,11 +177,11 @@ describe('FieldEditor', () => { return flds[name] as IndexPatternField; }; - const component = createComponentWithContext( + const component = createComponentWithContext( FieldEditor, { indexPattern, - field: (testField as unknown) as IndexPatternField, + spec: (testField as unknown) as IndexPatternField, services: { redirectAway: () => {} }, }, mockContext @@ -193,11 +194,11 @@ describe('FieldEditor', () => { it('should show conflict field warning', async () => { const testField = { ...field }; - const component = createComponentWithContext( + const component = createComponentWithContext( FieldEditor, { indexPattern, - field: (testField as unknown) as IndexPatternField, + spec: (testField as unknown) as IndexPatternField, services: { redirectAway: () => {} }, }, mockContext @@ -218,11 +219,11 @@ describe('FieldEditor', () => { text: ['index_name_3'], }, }; - const component = createComponentWithContext( + const component = createComponentWithContext( FieldEditor, { indexPattern, - field: (testField as unknown) as IndexPatternField, + spec: (testField as unknown) as IndexPatternField, services: { redirectAway: () => {} }, }, mockContext diff --git a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx index 99ef83604239a..d78e1e1014581 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx @@ -76,7 +76,7 @@ import { executeScript, isScriptValid } from './lib'; import 'brace/mode/groovy'; const getFieldTypeFormatsList = ( - field: IFieldType, + field: IndexPatternField['spec'], defaultFieldFormat: FieldFormatInstanceType, fieldFormats: DataPublicPluginStart['fieldFormats'] ) => { @@ -108,10 +108,6 @@ interface InitialFieldTypeFormat extends FieldTypeFormat { defaultFieldFormat: FieldFormatInstanceType; } -interface FieldClone extends IndexPatternField { - format: any; -} - export interface FieldEditorState { isReady: boolean; isCreating: boolean; @@ -120,7 +116,6 @@ export interface FieldEditorState { fieldTypes: string[]; fieldTypeFormats: FieldTypeFormat[]; existingFieldNames: string[]; - field: FieldClone; fieldFormatId?: string; fieldFormatParams: { [key: string]: unknown }; showScriptingHelp: boolean; @@ -129,11 +124,13 @@ export interface FieldEditorState { hasScriptError: boolean; isSaving: boolean; errors?: string[]; + format: any; + spec: IndexPatternField['spec']; } export interface FieldEdiorProps { indexPattern: IndexPattern; - field: IndexPatternField; + spec: IndexPatternField['spec']; services: { redirectAway: () => void; }; @@ -149,7 +146,7 @@ export class FieldEditor extends PureComponent f.name), - field: { ...field, format: field.format }, fieldFormatId: undefined, fieldFormatParams: {}, showScriptingHelp: false, @@ -167,6 +163,8 @@ export class FieldEditor extends PureComponent f.name === field.name), - isDeprecatedLang: this.deprecatedLangs.includes(field.lang || ''), + isCreating: !indexPattern.fields.find((f) => f.name === spec.name), + isDeprecatedLang: this.deprecatedLangs.includes(spec.lang || ''), errors: [], scriptingLangs, fieldTypes, fieldTypeFormats: getFieldTypeFormatsList( - field, + spec, DefaultFieldFormat as FieldFormatInstanceType, data.fieldFormats ), - fieldFormatId: get(indexPattern, ['fieldFormatMap', field.name, 'type', 'id']), - fieldFormatParams: field.format.params(), + fieldFormatId: get(indexPattern, ['fieldFormatMap', spec.name, 'type', 'id']), + fieldFormatParams: format.params(), }); } onFieldChange = (fieldName: string, value: string | number) => { - const { field } = this.state; - (field as any)[fieldName] = value; + const { spec } = this.state; + (spec as any)[fieldName] = value; this.forceUpdate(); }; onTypeChange = (type: KBN_FIELD_TYPES) => { const { uiSettings, data } = this.context.services; - const { field } = this.state; + const { spec, format } = this.state; const DefaultFieldFormat = data.fieldFormats.getDefaultType(type) as FieldFormatInstanceType; - field.type = type; + spec.type = type; - field.format = new DefaultFieldFormat(null, (key) => uiSettings.get(key)); + spec.format = new DefaultFieldFormat(null, (key) => uiSettings.get(key)); this.setState({ - fieldTypeFormats: getFieldTypeFormatsList(field, DefaultFieldFormat, data.fieldFormats), + fieldTypeFormats: getFieldTypeFormatsList(spec, DefaultFieldFormat, data.fieldFormats), fieldFormatId: DefaultFieldFormat.id, - fieldFormatParams: field.format.params(), + fieldFormatParams: format.params(), }); }; onLangChange = (lang: string) => { - const { field } = this.state; + const { spec } = this.state; const fieldTypes = get(FIELD_TYPES_BY_LANG, lang, DEFAULT_FIELD_TYPES); - field.lang = lang; - field.type = fieldTypes.includes(field.type) ? field.type : fieldTypes[0]; + spec.lang = lang; + spec.type = fieldTypes.includes(spec.type) ? spec.type : fieldTypes[0]; this.setState({ fieldTypes, @@ -244,18 +246,20 @@ export class FieldEditor extends PureComponent { - const { field, fieldTypeFormats } = this.state; + const { spec, fieldTypeFormats } = this.state; const { uiSettings, data } = this.context.services; const FieldFormat = data.fieldFormats.getType( formatId || (fieldTypeFormats[0] as InitialFieldTypeFormat).defaultFieldFormat.id ) as FieldFormatInstanceType; - field.format = new FieldFormat(params, (key) => uiSettings.get(key)); + const newFormat = new FieldFormat(params, (key) => uiSettings.get(key)); + spec.format = newFormat; this.setState({ fieldFormatId: FieldFormat.id, - fieldFormatParams: field.format.params(), + fieldFormatParams: newFormat.params(), + format: newFormat, }); }; @@ -271,13 +275,13 @@ export class FieldEditor extends PureComponent ), - fieldName: {field.name}, + fieldName: {spec.name}, }} /> @@ -316,7 +320,7 @@ export class FieldEditor extends PureComponent {field.lang}, + language: {spec.lang}, painlessLink: ( { return { value: lang, text: lang }; })} @@ -388,15 +392,15 @@ export class FieldEditor extends PureComponent { return { value: type, text: type }; })} @@ -414,8 +418,8 @@ export class FieldEditor extends PureComponent ({ + const items = Object.entries(spec.conflictDescriptions).map(([type, indices]) => ({ type, indices: Array.isArray(indices) ? indices.join(', ') : 'Index names unavailable', })); @@ -466,7 +470,7 @@ export class FieldEditor extends PureComponent { - return { value: format.id || '', text: format.title }; + options={fieldTypeFormats.map((fmt) => { + return { value: fmt.id || '', text: fmt.title }; })} data-test-subj="editorSelectedFormatId" onChange={(e) => { @@ -507,8 +511,8 @@ export class FieldEditor extends PureComponent {fieldFormatId ? ( { this.onFieldChange('count', e.target.value ? Number(e.target.value) : ''); @@ -550,8 +554,8 @@ export class FieldEditor extends PureComponent ); - return field.scripted ? ( + return spec.scripted ? ( { - const { field } = this.state; + const { spec } = this.state; return this.state.showDeleteModal ? ( { @@ -674,7 +678,7 @@ export class FieldEditor extends PureComponent - {!isCreating && field.scripted ? ( + {!isCreating && spec.scripted ? ( @@ -729,9 +733,9 @@ export class FieldEditor extends PureComponent { - const { scriptingLangs, field, showScriptingHelp } = this.state; + const { scriptingLangs, spec, showScriptingHelp } = this.state; - if (!field.scripted) { + if (!spec.scripted) { return; } @@ -743,9 +747,9 @@ export class FieldEditor extends PureComponent @@ -755,14 +759,14 @@ export class FieldEditor extends PureComponent { const { redirectAway } = this.props.services; const { indexPattern } = this.props; - const { field } = this.state; - const remove = indexPattern.removeScriptedField(field); + const { spec } = this.state; + const remove = indexPattern.removeScriptedField(spec.name); if (remove) { remove.then(() => { const message = i18n.translate('indexPatternManagement.deleteField.deletedHeader', { defaultMessage: "Deleted '{fieldName}'", - values: { fieldName: field.name }, + values: { fieldName: spec.name }, }); this.context.services.notifications.toasts.addSuccess(message); redirectAway(); @@ -773,7 +777,7 @@ export class FieldEditor extends PureComponent { - const field = this.state.field; + const field = this.state.spec; const { indexPattern } = this.props; const { fieldFormatId } = this.state; @@ -802,10 +806,10 @@ export class FieldEditor extends PureComponent f.name === field.name); - let oldField: IFieldType | undefined; + let oldField: IndexPatternField['spec']; if (index > -1) { - oldField = indexPattern.fields.getByName(field.name); + oldField = indexPattern.fields.getByName(field.name)!.spec; indexPattern.fields.update(field); } else { indexPattern.fields.add(field); @@ -837,14 +841,14 @@ export class FieldEditor extends PureComponent @@ -868,7 +872,7 @@ export class FieldEditor extends PureComponent )} diff --git a/src/plugins/index_pattern_management/public/components/test_utils.tsx b/src/plugins/index_pattern_management/public/components/test_utils.tsx index 938547cca04ab..6aa71785d779c 100644 --- a/src/plugins/index_pattern_management/public/components/test_utils.tsx +++ b/src/plugins/index_pattern_management/public/components/test_utils.tsx @@ -23,9 +23,9 @@ import { shallow } from 'enzyme'; // since the 'shallow' from 'enzyme' doesn't support context API for React 16 and above (https://github.com/facebook/react/pull/14329) // we use this workaround where define legacy contextTypes for react class component -export function createComponentWithContext( +export function createComponentWithContext>( MyComponent: React.ComponentClass, - props: Record, + props: Props, mockedContext: Record ) { MyComponent.contextTypes = { diff --git a/src/test_utils/public/stub_index_pattern.js b/src/test_utils/public/stub_index_pattern.js index 5a81139157cef..f7b65930b683d 100644 --- a/src/test_utils/public/stub_index_pattern.js +++ b/src/test_utils/public/stub_index_pattern.js @@ -22,12 +22,7 @@ import sinon from 'sinon'; // because it is one of the few places that we need to access the IndexPattern class itself, rather // than just the type. Doing this as a temporary measure; it will be left behind when migrating to NP. -import { - IndexPattern, - indexPatterns, - KBN_FIELD_TYPES, - getIndexPatternFieldListCreator, -} from '../../plugins/data/public'; +import { IndexPattern, indexPatterns, KBN_FIELD_TYPES, FieldList } from '../../plugins/data/public'; import { setFieldFormats } from '../../plugins/data/public/services'; @@ -42,16 +37,6 @@ import { getFieldFormatsRegistry } from './stub_field_formats'; export default function StubIndexPattern(pattern, getConfig, timeField, fields, core) { const registeredFieldFormats = getFieldFormatsRegistry(core); - const createFieldList = getIndexPatternFieldListCreator({ - fieldFormats: { - getDefaultInstance: () => ({ - convert: (val) => String(val), - }), - }, - toastNotifications: { - addDanger: () => {}, - }, - }); this.id = pattern; this.title = pattern; @@ -74,9 +59,12 @@ export default function StubIndexPattern(pattern, getConfig, timeField, fields, ); this.fieldsFetcher = { apiClient: { baseUrl: '' } }; this.formatField = this.formatHit.formatField; + this.getFormatterForField = () => ({ + convert: () => '', + }); this._reindexFields = function () { - this.fields = createFieldList(this, this.fields || fields, false); + this.fields = new FieldList(this, this.fields || fields, false); }; this.stubSetFieldFormat = function (fieldName, id, params) { diff --git a/test/functional/apps/management/_index_pattern_popularity.js b/test/functional/apps/management/_index_pattern_popularity.js index 530b8e1111a0c..e2fcf50ef2c12 100644 --- a/test/functional/apps/management/_index_pattern_popularity.js +++ b/test/functional/apps/management/_index_pattern_popularity.js @@ -60,7 +60,7 @@ export default function ({ getService, getPageObjects }) { // check that it is 0 (previous increase was cancelled const popularity = await PageObjects.settings.getPopularity(); log.debug('popularity = ' + popularity); - expect(popularity).to.be('0'); + expect(popularity).to.be(''); }); it('can be saved', async function () { diff --git a/test/functional/apps/management/_scripted_fields.js b/test/functional/apps/management/_scripted_fields.js index 2727313ab2336..116d1eac90cea 100644 --- a/test/functional/apps/management/_scripted_fields.js +++ b/test/functional/apps/management/_scripted_fields.js @@ -36,6 +36,7 @@ import expect from '@kbn/expect'; export default function ({ getService, getPageObjects }) { + const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); const log = getService('log'); const browser = getService('browser'); @@ -57,9 +58,9 @@ export default function ({ getService, getPageObjects }) { before(async function () { await browser.setWindowSize(1200, 800); + await esArchiver.load('discover'); // delete .kibana index and then wait for Kibana to re-create it await kibanaServer.uiSettings.replace({}); - await PageObjects.settings.createIndexPattern(); await kibanaServer.uiSettings.update({}); }); diff --git a/test/functional/apps/management/_scripted_fields_filter.js b/test/functional/apps/management/_scripted_fields_filter.js index 2eb53508c2846..2d59d2ba57d5b 100644 --- a/test/functional/apps/management/_scripted_fields_filter.js +++ b/test/functional/apps/management/_scripted_fields_filter.js @@ -27,7 +27,9 @@ export default function ({ getService, getPageObjects }) { const esArchiver = getService('esArchiver'); const PageObjects = getPageObjects(['settings']); - describe('filter scripted fields', function describeIndexTests() { + // this functionality is no longer functional as of 7.0 but still needs cleanup + // https://github.com/elastic/kibana/issues/74118 + describe.skip('filter scripted fields', function describeIndexTests() { before(async function () { // delete .kibana index and then wait for Kibana to re-create it await browser.setWindowSize(1200, 800); From 244ed04b249a3c0559cf0274ac07481596dc9bb5 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 10 Aug 2020 15:02:35 +0200 Subject: [PATCH 017/113] [Uptime] Fix full reloads while navigating to alert/ml (#73796) Co-authored-by: Elastic Machine --- .../plugins/uptime/public/apps/uptime_app.tsx | 15 ++- .../__tests__/link_events.test.ts | 102 ++++++++++++++++++ .../__tests__/link_for_eui.test.tsx | 77 +++++++++++++ .../common/react_router_helpers/index.ts | 12 +++ .../react_router_helpers/link_events.ts | 31 ++++++ .../react_router_helpers/link_for_eui.tsx | 74 +++++++++++++ .../ml_integerations.test.tsx.snap | 5 +- .../__snapshots__/ml_manage_job.test.tsx.snap | 5 +- .../components/monitor/ml/manage_ml_job.tsx | 8 +- .../components/monitor/ml/translations.tsx | 8 ++ .../uptime/public/lib/__mocks__/index.ts | 7 ++ .../__mocks__/react_router_history.mock.ts | 25 +++++ .../uptime/public/pages/certificates.tsx | 8 +- .../uptime/public/pages/page_header.tsx | 9 +- .../plugins/uptime/public/pages/settings.tsx | 10 +- .../__test__/get_histogram_interval.test.ts | 4 +- 16 files changed, 371 insertions(+), 29 deletions(-) create mode 100644 x-pack/plugins/uptime/public/components/common/react_router_helpers/__tests__/link_events.test.ts create mode 100644 x-pack/plugins/uptime/public/components/common/react_router_helpers/__tests__/link_for_eui.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/common/react_router_helpers/index.ts create mode 100644 x-pack/plugins/uptime/public/components/common/react_router_helpers/link_events.ts create mode 100644 x-pack/plugins/uptime/public/components/common/react_router_helpers/link_for_eui.tsx create mode 100644 x-pack/plugins/uptime/public/lib/__mocks__/index.ts create mode 100644 x-pack/plugins/uptime/public/lib/__mocks__/react_router_history.mock.ts diff --git a/x-pack/plugins/uptime/public/apps/uptime_app.tsx b/x-pack/plugins/uptime/public/apps/uptime_app.tsx index 41370f9fff492..1dc34b44b7c64 100644 --- a/x-pack/plugins/uptime/public/apps/uptime_app.tsx +++ b/x-pack/plugins/uptime/public/apps/uptime_app.tsx @@ -10,7 +10,10 @@ import React, { useEffect } from 'react'; import { Provider as ReduxProvider } from 'react-redux'; import { BrowserRouter as Router } from 'react-router-dom'; import { I18nStart, ChromeBreadcrumb, CoreStart } from 'kibana/public'; -import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import { + KibanaContextProvider, + RedirectAppLinks, +} from '../../../../../src/plugins/kibana_react/public'; import { ClientPluginsSetup, ClientPluginsStart } from './plugin'; import { UMUpdateBadge } from '../lib/lib'; import { @@ -103,10 +106,12 @@ const Application = (props: UptimeAppProps) => { -
- - -
+ +
+ + +
+
diff --git a/x-pack/plugins/uptime/public/components/common/react_router_helpers/__tests__/link_events.test.ts b/x-pack/plugins/uptime/public/components/common/react_router_helpers/__tests__/link_events.test.ts new file mode 100644 index 0000000000000..3e857c7c20904 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/common/react_router_helpers/__tests__/link_events.test.ts @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { letBrowserHandleEvent } from '../index'; + +describe('letBrowserHandleEvent', () => { + const event = { + defaultPrevented: false, + metaKey: false, + altKey: false, + ctrlKey: false, + shiftKey: false, + button: 0, + target: { + getAttribute: () => '_self', + }, + } as any; + + describe('the browser should handle the link when', () => { + it('default is prevented', () => { + expect(letBrowserHandleEvent({ ...event, defaultPrevented: true })).toBe(true); + }); + + it('is modified with metaKey', () => { + expect(letBrowserHandleEvent({ ...event, metaKey: true })).toBe(true); + }); + + it('is modified with altKey', () => { + expect(letBrowserHandleEvent({ ...event, altKey: true })).toBe(true); + }); + + it('is modified with ctrlKey', () => { + expect(letBrowserHandleEvent({ ...event, ctrlKey: true })).toBe(true); + }); + + it('is modified with shiftKey', () => { + expect(letBrowserHandleEvent({ ...event, shiftKey: true })).toBe(true); + }); + + it('it is not a left click event', () => { + expect(letBrowserHandleEvent({ ...event, button: 2 })).toBe(true); + }); + + it('the target is anything value other than _self', () => { + expect( + letBrowserHandleEvent({ + ...event, + target: targetValue('_blank'), + }) + ).toBe(true); + }); + }); + + describe('the browser should NOT handle the link when', () => { + it('default is not prevented', () => { + expect(letBrowserHandleEvent({ ...event, defaultPrevented: false })).toBe(false); + }); + + it('is not modified', () => { + expect( + letBrowserHandleEvent({ + ...event, + metaKey: false, + altKey: false, + ctrlKey: false, + shiftKey: false, + }) + ).toBe(false); + }); + + it('it is a left click event', () => { + expect(letBrowserHandleEvent({ ...event, button: 0 })).toBe(false); + }); + + it('the target is a value of _self', () => { + expect( + letBrowserHandleEvent({ + ...event, + target: targetValue('_self'), + }) + ).toBe(false); + }); + + it('the target has no value', () => { + expect( + letBrowserHandleEvent({ + ...event, + target: targetValue(null), + }) + ).toBe(false); + }); + }); +}); + +const targetValue = (value: string | null) => { + return { + getAttribute: () => value, + }; +}; diff --git a/x-pack/plugins/uptime/public/components/common/react_router_helpers/__tests__/link_for_eui.test.tsx b/x-pack/plugins/uptime/public/components/common/react_router_helpers/__tests__/link_for_eui.test.tsx new file mode 100644 index 0000000000000..4a681f6fa60bf --- /dev/null +++ b/x-pack/plugins/uptime/public/components/common/react_router_helpers/__tests__/link_for_eui.test.tsx @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow, mount } from 'enzyme'; +import { EuiLink, EuiButton } from '@elastic/eui'; + +import '../../../../lib/__mocks__/react_router_history.mock'; + +import { ReactRouterEuiLink, ReactRouterEuiButton } from '../link_for_eui'; +import { mockHistory } from '../../../../lib/__mocks__'; + +describe('EUI & React Router Component Helpers', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('renders', () => { + const wrapper = shallow(); + + expect(wrapper.find(EuiLink)).toHaveLength(1); + }); + + it('renders an EuiButton', () => { + const wrapper = shallow(); + + expect(wrapper.find(EuiButton)).toHaveLength(1); + }); + + it('passes down all ...rest props', () => { + const wrapper = shallow(); + const link = wrapper.find(EuiLink); + + expect(link.prop('external')).toEqual(true); + expect(link.prop('data-test-subj')).toEqual('foo'); + }); + + it('renders with the correct href and onClick props', () => { + const wrapper = mount(); + const link = wrapper.find(EuiLink); + + expect(link.prop('onClick')).toBeInstanceOf(Function); + expect(link.prop('href')).toEqual('/enterprise_search/foo/bar'); + expect(mockHistory.createHref).toHaveBeenCalled(); + }); + + describe('onClick', () => { + it('prevents default navigation and uses React Router history', () => { + const wrapper = mount(); + + const simulatedEvent = { + button: 0, + target: { getAttribute: () => '_self' }, + preventDefault: jest.fn(), + }; + wrapper.find(EuiLink).simulate('click', simulatedEvent); + + expect(simulatedEvent.preventDefault).toHaveBeenCalled(); + expect(mockHistory.push).toHaveBeenCalled(); + }); + + it('does not prevent default browser behavior on new tab/window clicks', () => { + const wrapper = mount(); + + const simulatedEvent = { + shiftKey: true, + target: { getAttribute: () => '_blank' }, + }; + wrapper.find(EuiLink).simulate('click', simulatedEvent); + + expect(mockHistory.push).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/common/react_router_helpers/index.ts b/x-pack/plugins/uptime/public/components/common/react_router_helpers/index.ts new file mode 100644 index 0000000000000..a1885eaee4cbe --- /dev/null +++ b/x-pack/plugins/uptime/public/components/common/react_router_helpers/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { letBrowserHandleEvent } from './link_events'; +export { + ReactRouterEuiLink, + ReactRouterEuiButton, + ReactRouterEuiButtonEmpty, +} from './link_for_eui'; diff --git a/x-pack/plugins/uptime/public/components/common/react_router_helpers/link_events.ts b/x-pack/plugins/uptime/public/components/common/react_router_helpers/link_events.ts new file mode 100644 index 0000000000000..93da2ab71d952 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/common/react_router_helpers/link_events.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { MouseEvent } from 'react'; + +/** + * Helper functions for determining which events we should + * let browsers handle natively, e.g. new tabs/windows + */ + +type THandleEvent = (event: MouseEvent) => boolean; + +export const letBrowserHandleEvent: THandleEvent = (event) => + event.defaultPrevented || + isModifiedEvent(event) || + !isLeftClickEvent(event) || + isTargetBlank(event); + +const isModifiedEvent: THandleEvent = (event) => + !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey); + +const isLeftClickEvent: THandleEvent = (event) => event.button === 0; + +const isTargetBlank: THandleEvent = (event) => { + const element = event.target as HTMLElement; + const target = element.getAttribute('target'); + return !!target && target !== '_self'; +}; diff --git a/x-pack/plugins/uptime/public/components/common/react_router_helpers/link_for_eui.tsx b/x-pack/plugins/uptime/public/components/common/react_router_helpers/link_for_eui.tsx new file mode 100644 index 0000000000000..7adc8be4533bc --- /dev/null +++ b/x-pack/plugins/uptime/public/components/common/react_router_helpers/link_for_eui.tsx @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { useHistory } from 'react-router-dom'; +import { + EuiLink, + EuiButton, + EuiButtonProps, + EuiButtonEmptyProps, + EuiLinkAnchorProps, + EuiButtonEmpty, +} from '@elastic/eui'; + +import { letBrowserHandleEvent } from './link_events'; + +/** + * Generates either an EuiLink or EuiButton with a React-Router-ified link + * + * Based off of EUI's recommendations for handling React Router: + * https://github.com/elastic/eui/blob/master/wiki/react-router.md#react-router-51 + */ + +interface IEuiReactRouterProps { + to: string; +} + +export const ReactRouterHelperForEui: React.FC = ({ to, children }) => { + const history = useHistory(); + + const onClick = (event: React.MouseEvent) => { + if (letBrowserHandleEvent(event)) return; + + // Prevent regular link behavior, which causes a browser refresh. + event.preventDefault(); + + // Push the route to the history. + history.push(to); + }; + + // Generate the correct link href (with basename etc. accounted for) + const href = history.createHref({ pathname: to }); + + const reactRouterProps = { href, onClick }; + return React.cloneElement(children as React.ReactElement, reactRouterProps); +}; + +type TEuiReactRouterLinkProps = EuiLinkAnchorProps & IEuiReactRouterProps; +type TEuiReactRouterButtonProps = EuiButtonProps & IEuiReactRouterProps; +type TEuiReactRouterButtonEmptyProps = EuiButtonEmptyProps & IEuiReactRouterProps; + +export const ReactRouterEuiLink: React.FC = ({ to, ...rest }) => ( + + + +); + +export const ReactRouterEuiButton: React.FC = ({ to, ...rest }) => ( + + + +); + +export const ReactRouterEuiButtonEmpty: React.FC = ({ + to, + ...rest +}) => ( + + + +); diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap index 15f5c03512bf1..e7ad86f72dab6 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap @@ -8,6 +8,7 @@ exports[`ML Integrations renders without errors 1`] = ` class="euiPopover__anchor" >
diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap index fabe94763e07d..cc3417e09987e 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap @@ -8,6 +8,7 @@ exports[`Manage ML Job renders without errors 1`] = ` class="euiPopover__anchor" > diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx index 7a2899558891d..f4382b37b3d30 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx @@ -54,6 +54,10 @@ export const ManageMLJobComponent = ({ hasMLJob, onEnableJob, onJobDelete }: Pro const deleteAnomalyAlert = () => dispatch(deleteAlertAction.get({ alertId: anomalyAlert?.id as string })); + const showLoading = isMLJobCreating || isMLJobLoading; + + const btnText = hasMLJob ? labels.ANOMALY_DETECTION : labels.ENABLE_ANOMALY_DETECTION; + const button = ( - {hasMLJob ? labels.ANOMALY_DETECTION : labels.ENABLE_ANOMALY_DETECTION} + {showLoading ? '' : btnText} ); @@ -79,7 +84,6 @@ export const ManageMLJobComponent = ({ hasMLJob, onEnableJob, onJobDelete }: Pro monitorId, dateRange: { from: dateRangeStart, to: dateRangeEnd }, }), - target: '_blank', }, { name: anomalyAlert ? labels.DISABLE_ANOMALY_ALERT : labels.ENABLE_ANOMALY_ALERT, diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/translations.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/translations.tsx index 90ebdf10a73f5..dfc912e6be9ee 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ml/translations.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ml/translations.tsx @@ -162,3 +162,11 @@ export const START_TRAIL_DESC = i18n.translate( 'In order to access duration anomaly detection, you have to be subscribed to an Elastic Platinum license.', } ); + +export const ENABLE_MANAGE_JOB = i18n.translate( + 'xpack.uptime.ml.enableAnomalyDetectionPanel.enable_or_manage_job', + { + defaultMessage: + 'You can enable anomaly detection job or if job is already there you can manage the job or alert.', + } +); diff --git a/x-pack/plugins/uptime/public/lib/__mocks__/index.ts b/x-pack/plugins/uptime/public/lib/__mocks__/index.ts new file mode 100644 index 0000000000000..45ef5787927e1 --- /dev/null +++ b/x-pack/plugins/uptime/public/lib/__mocks__/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { mockHistory } from './react_router_history.mock'; diff --git a/x-pack/plugins/uptime/public/lib/__mocks__/react_router_history.mock.ts b/x-pack/plugins/uptime/public/lib/__mocks__/react_router_history.mock.ts new file mode 100644 index 0000000000000..fd422465d87f1 --- /dev/null +++ b/x-pack/plugins/uptime/public/lib/__mocks__/react_router_history.mock.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +/** + * NOTE: This variable name MUST start with 'mock*' in order for + * Jest to accept its use within a jest.mock() + */ +export const mockHistory = { + createHref: jest.fn(({ pathname }) => `/enterprise_search${pathname}`), + push: jest.fn(), + location: { + pathname: '/current-path', + }, +}; + +jest.mock('react-router-dom', () => ({ + useHistory: jest.fn(() => mockHistory), +})); + +/** + * For example usage, @see public/applications/shared/react_router_helpers/eui_link.test.tsx + */ diff --git a/x-pack/plugins/uptime/public/pages/certificates.tsx b/x-pack/plugins/uptime/public/pages/certificates.tsx index e46d228c6d21f..a524ce6ba9b71 100644 --- a/x-pack/plugins/uptime/public/pages/certificates.tsx +++ b/x-pack/plugins/uptime/public/pages/certificates.tsx @@ -29,6 +29,7 @@ import { certificatesSelector, getCertificatesAction } from '../state/certificat import { CertificateList, CertificateSearch, CertSort } from '../components/certificates'; import { ToggleAlertFlyoutButton } from '../components/overview/alerts/alerts_containers'; import { CLIENT_ALERT_TYPES } from '../../common/constants/alerts'; +import { ReactRouterEuiButtonEmpty } from '../components/common/react_router_helpers'; const DEFAULT_PAGE_SIZE = 10; const LOCAL_STORAGE_KEY = 'xpack.uptime.certList.pageSize'; @@ -79,15 +80,16 @@ export const CertificatesPage: React.FC = () => { <> - {labels.RETURN_TO_OVERVIEW} - + diff --git a/x-pack/plugins/uptime/public/pages/page_header.tsx b/x-pack/plugins/uptime/public/pages/page_header.tsx index 16279a63b5f40..325d82696d47c 100644 --- a/x-pack/plugins/uptime/public/pages/page_header.tsx +++ b/x-pack/plugins/uptime/public/pages/page_header.tsx @@ -7,12 +7,12 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiTitle, EuiSpacer, EuiButtonEmpty } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { useHistory } from 'react-router-dom'; import styled from 'styled-components'; import { UptimeDatePicker } from '../components/common/uptime_date_picker'; import { SETTINGS_ROUTE } from '../../common/constants'; import { ToggleAlertFlyoutButton } from '../components/overview/alerts/alerts_containers'; import { useKibana } from '../../../../../src/plugins/kibana_react/public'; +import { ReactRouterEuiButtonEmpty } from '../components/common/react_router_helpers'; interface PageHeaderProps { headingText: string | JSX.Element; @@ -58,7 +58,6 @@ export const PageHeader = React.memo( ) : null; const kibana = useKibana(); - const history = useHistory(); const extraLinkComponents = !extraLinks ? null : ( @@ -66,13 +65,13 @@ export const PageHeader = React.memo( - {SETTINGS_LINK_TEXT} - + { ); - const history = useHistory(); - return ( <> - {Translations.settings.returnToOverviewLinkLabel} - + diff --git a/x-pack/plugins/uptime/server/lib/helper/__test__/get_histogram_interval.test.ts b/x-pack/plugins/uptime/server/lib/helper/__test__/get_histogram_interval.test.ts index bddca1b863ce4..09b857f37e1df 100644 --- a/x-pack/plugins/uptime/server/lib/helper/__test__/get_histogram_interval.test.ts +++ b/x-pack/plugins/uptime/server/lib/helper/__test__/get_histogram_interval.test.ts @@ -10,11 +10,11 @@ import { assertCloseTo } from '../assert_close_to'; describe('getHistogramInterval', () => { it('specifies the interval necessary to divide a given timespan into equal buckets, rounded to the nearest integer, expressed in ms', () => { const interval = getHistogramInterval('now-15m', 'now', 10); - assertCloseTo(interval, 90000, 10); + assertCloseTo(interval, 90000, 20); }); it('will supply a default constant value for bucketCount when none is provided', () => { const interval = getHistogramInterval('now-15m', 'now'); - assertCloseTo(interval, 36000, 10); + assertCloseTo(interval, 36000, 20); }); }); From c1b55d57399ded6dbca4415db9077dda7cfccbc9 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 10 Aug 2020 15:06:58 +0200 Subject: [PATCH 018/113] [Lens] Clear out all attribute properties before updating (#74483) --- .../persistence/saved_object_store.test.ts | 47 +++++++++++++------ .../public/persistence/saved_object_store.ts | 44 +++++++++-------- 2 files changed, 58 insertions(+), 33 deletions(-) diff --git a/x-pack/plugins/lens/public/persistence/saved_object_store.test.ts b/x-pack/plugins/lens/public/persistence/saved_object_store.test.ts index f7caac6549389..f8f8d889233a7 100644 --- a/x-pack/plugins/lens/public/persistence/saved_object_store.test.ts +++ b/x-pack/plugins/lens/public/persistence/saved_object_store.test.ts @@ -4,19 +4,22 @@ * you may not use this file except in compliance with the Elastic License. */ +import { SavedObjectsClientContract, SavedObjectsBulkUpdateObject } from 'kibana/public'; import { SavedObjectIndexStore } from './saved_object_store'; describe('LensStore', () => { function testStore(testId?: string) { const client = { create: jest.fn(() => Promise.resolve({ id: testId || 'testid' })), - update: jest.fn((_type: string, id: string) => Promise.resolve({ id })), + bulkUpdate: jest.fn(([{ id }]: SavedObjectsBulkUpdateObject[]) => + Promise.resolve({ savedObjects: [{ id }, { id }] }) + ), get: jest.fn(), }; return { client, - store: new SavedObjectIndexStore(client), + store: new SavedObjectIndexStore((client as unknown) as SavedObjectsClientContract), }; } @@ -108,19 +111,35 @@ describe('LensStore', () => { }, }); - expect(client.update).toHaveBeenCalledTimes(1); - expect(client.update).toHaveBeenCalledWith('lens', 'Gandalf', { - title: 'Even the very wise cannot see all ends.', - visualizationType: 'line', - expression: '', - state: { - datasourceMetaData: { filterableIndexPatterns: [] }, - datasourceStates: { indexpattern: { type: 'index_pattern', indexPattern: 'lotr' } }, - visualization: { gear: ['staff', 'pointy hat'] }, - query: { query: '', language: 'lucene' }, - filters: [], + expect(client.bulkUpdate).toHaveBeenCalledTimes(1); + expect(client.bulkUpdate).toHaveBeenCalledWith([ + { + type: 'lens', + id: 'Gandalf', + attributes: { + title: null, + visualizationType: null, + expression: null, + state: null, + }, }, - }); + { + type: 'lens', + id: 'Gandalf', + attributes: { + title: 'Even the very wise cannot see all ends.', + visualizationType: 'line', + expression: '', + state: { + datasourceMetaData: { filterableIndexPatterns: [] }, + datasourceStates: { indexpattern: { type: 'index_pattern', indexPattern: 'lotr' } }, + visualization: { gear: ['staff', 'pointy hat'] }, + query: { query: '', language: 'lucene' }, + filters: [], + }, + }, + }, + ]); }); }); diff --git a/x-pack/plugins/lens/public/persistence/saved_object_store.ts b/x-pack/plugins/lens/public/persistence/saved_object_store.ts index af90634874fb1..59ead53956a8d 100644 --- a/x-pack/plugins/lens/public/persistence/saved_object_store.ts +++ b/x-pack/plugins/lens/public/persistence/saved_object_store.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { SavedObjectAttributes } from 'kibana/server'; +import { SavedObjectAttributes, SavedObjectsClientContract } from 'kibana/public'; import { Query, Filter } from '../../../../../src/plugins/data/public'; export interface Document { @@ -27,20 +27,6 @@ export interface Document { export const DOC_TYPE = 'lens'; -interface SavedObjectClient { - create: (type: string, object: SavedObjectAttributes) => Promise<{ id: string }>; - update: (type: string, id: string, object: SavedObjectAttributes) => Promise<{ id: string }>; - get: ( - type: string, - id: string - ) => Promise<{ - id: string; - type: string; - attributes: SavedObjectAttributes; - error?: { statusCode: number; message: string }; - }>; -} - export interface DocumentSaver { save: (vis: Document) => Promise<{ id: string }>; } @@ -52,9 +38,9 @@ export interface DocumentLoader { export type SavedObjectStore = DocumentLoader & DocumentSaver; export class SavedObjectIndexStore implements SavedObjectStore { - private client: SavedObjectClient; + private client: SavedObjectsClientContract; - constructor(client: SavedObjectClient) { + constructor(client: SavedObjectsClientContract) { this.client = client; } @@ -63,13 +49,33 @@ export class SavedObjectIndexStore implements SavedObjectStore { // TODO: SavedObjectAttributes should support this kind of object, // remove this workaround when SavedObjectAttributes is updated. const attributes = (rest as unknown) as SavedObjectAttributes; + const result = await (id - ? this.client.update(DOC_TYPE, id, attributes) + ? this.safeUpdate(id, attributes) : this.client.create(DOC_TYPE, attributes)); return { ...vis, id: result.id }; } + // As Lens is using an object to store its attributes, using the update API + // will merge the new attribute object with the old one, not overwriting deleted + // keys. As Lens is using objects as maps in various places, this is a problem because + // deleted subtrees make it back into the object after a load. + // This function fixes this by doing two updates - one to empty out the document setting + // every key to null, and a second one to load the new content. + private async safeUpdate(id: string, attributes: SavedObjectAttributes) { + const resetAttributes: SavedObjectAttributes = {}; + Object.keys(attributes).forEach((key) => { + resetAttributes[key] = null; + }); + return ( + await this.client.bulkUpdate([ + { type: DOC_TYPE, id, attributes: resetAttributes }, + { type: DOC_TYPE, id, attributes }, + ]) + ).savedObjects[1]; + } + async load(id: string): Promise { const { type, attributes, error } = await this.client.get(DOC_TYPE, id); @@ -78,7 +84,7 @@ export class SavedObjectIndexStore implements SavedObjectStore { } return { - ...attributes, + ...(attributes as SavedObjectAttributes), id, type, } as Document; From 23adb256bb4799f61e8ae9914e2ee8231e7b7598 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Mon, 10 Aug 2020 16:29:29 +0300 Subject: [PATCH 019/113] [i18n] revert reverted changes (#74633) Co-authored-by: Elastic Machine --- src/dev/i18n/integrate_locale_files.test.ts | 3 ++- src/dev/i18n/integrate_locale_files.ts | 21 +++++++++++++++++++- src/dev/i18n/tasks/check_compatibility.ts | 4 +++- src/dev/i18n/utils.js | 22 +++++++++++++++++++++ src/dev/run_i18n_check.ts | 5 ++++- src/dev/run_i18n_integrate.ts | 7 ++++--- 6 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/dev/i18n/integrate_locale_files.test.ts b/src/dev/i18n/integrate_locale_files.test.ts index 7ff1d87f1bc55..3bd3dc61c044f 100644 --- a/src/dev/i18n/integrate_locale_files.test.ts +++ b/src/dev/i18n/integrate_locale_files.test.ts @@ -21,7 +21,7 @@ import { mockMakeDirAsync, mockWriteFileAsync } from './integrate_locale_files.t import path from 'path'; import { integrateLocaleFiles, verifyMessages } from './integrate_locale_files'; -// @ts-ignore +// @ts-expect-error import { normalizePath } from './utils'; const localePath = path.resolve(__dirname, '__fixtures__', 'integrate_locale_files', 'fr.json'); @@ -36,6 +36,7 @@ const defaultIntegrateOptions = { sourceFileName: localePath, dryRun: false, ignoreIncompatible: false, + ignoreMalformed: false, ignoreMissing: false, ignoreUnused: false, config: { diff --git a/src/dev/i18n/integrate_locale_files.ts b/src/dev/i18n/integrate_locale_files.ts index d8ccccca15559..f9cd6dd1971c7 100644 --- a/src/dev/i18n/integrate_locale_files.ts +++ b/src/dev/i18n/integrate_locale_files.ts @@ -31,7 +31,8 @@ import { normalizePath, readFileAsync, writeFileAsync, - // @ts-ignore + verifyICUMessage, + // @ts-expect-error } from './utils'; import { I18nConfig } from './config'; @@ -41,6 +42,7 @@ export interface IntegrateOptions { sourceFileName: string; targetFileName?: string; dryRun: boolean; + ignoreMalformed: boolean; ignoreIncompatible: boolean; ignoreUnused: boolean; ignoreMissing: boolean; @@ -105,6 +107,23 @@ export function verifyMessages( } } + for (const messageId of localizedMessagesIds) { + const defaultMessage = defaultMessagesMap.get(messageId); + if (defaultMessage) { + try { + const message = localizedMessagesMap.get(messageId)!; + verifyICUMessage(message); + } catch (err) { + if (options.ignoreMalformed) { + localizedMessagesMap.delete(messageId); + options.log.warning(`Malformed translation ignored (${messageId}): ${err}`); + } else { + errorMessage += `\nMalformed translation (${messageId}): ${err}\n`; + } + } + } + } + if (errorMessage) { throw createFailError(errorMessage); } diff --git a/src/dev/i18n/tasks/check_compatibility.ts b/src/dev/i18n/tasks/check_compatibility.ts index 5900bf5aff252..afaf3cd875a8a 100644 --- a/src/dev/i18n/tasks/check_compatibility.ts +++ b/src/dev/i18n/tasks/check_compatibility.ts @@ -22,13 +22,14 @@ import { integrateLocaleFiles, I18nConfig } from '..'; export interface I18nFlags { fix: boolean; + ignoreMalformed: boolean; ignoreIncompatible: boolean; ignoreUnused: boolean; ignoreMissing: boolean; } export function checkCompatibility(config: I18nConfig, flags: I18nFlags, log: ToolingLog) { - const { fix, ignoreIncompatible, ignoreUnused, ignoreMissing } = flags; + const { fix, ignoreIncompatible, ignoreUnused, ignoreMalformed, ignoreMissing } = flags; return config.translations.map((translationsPath) => ({ task: async ({ messages }: { messages: Map }) => { // If `fix` is set we should try apply all possible fixes and override translations file. @@ -37,6 +38,7 @@ export function checkCompatibility(config: I18nConfig, flags: I18nFlags, log: To ignoreIncompatible: fix || ignoreIncompatible, ignoreUnused: fix || ignoreUnused, ignoreMissing: fix || ignoreMissing, + ignoreMalformed: fix || ignoreMalformed, sourceFileName: translationsPath, targetFileName: fix ? translationsPath : undefined, config, diff --git a/src/dev/i18n/utils.js b/src/dev/i18n/utils.js index 1d1c3118e0852..11a002fdbf4a8 100644 --- a/src/dev/i18n/utils.js +++ b/src/dev/i18n/utils.js @@ -208,6 +208,28 @@ export function checkValuesProperty(prefixedValuesKeys, defaultMessage, messageI } } +/** + * Verifies valid ICU message. + * @param message ICU message. + * @param messageId ICU message id + * @returns {undefined} + */ +export function verifyICUMessage(message) { + try { + parser.parse(message); + } catch (error) { + if (error.name === 'SyntaxError') { + const errorWithContext = createParserErrorMessage(message, { + loc: { + line: error.location.start.line, + column: error.location.start.column - 1, + }, + message: error.message, + }); + throw errorWithContext; + } + } +} /** * Extracts value references from the ICU message. * @param message ICU message. diff --git a/src/dev/run_i18n_check.ts b/src/dev/run_i18n_check.ts index 97ea988b1de3a..70eeedac2b8b6 100644 --- a/src/dev/run_i18n_check.ts +++ b/src/dev/run_i18n_check.ts @@ -36,6 +36,7 @@ run( async ({ flags: { 'ignore-incompatible': ignoreIncompatible, + 'ignore-malformed': ignoreMalformed, 'ignore-missing': ignoreMissing, 'ignore-unused': ignoreUnused, 'include-config': includeConfig, @@ -48,12 +49,13 @@ run( fix && (ignoreIncompatible !== undefined || ignoreUnused !== undefined || + ignoreMalformed !== undefined || ignoreMissing !== undefined) ) { throw createFailError( `${chalk.white.bgRed( ' I18N ERROR ' - )} none of the --ignore-incompatible, --ignore-unused or --ignore-missing is allowed when --fix is set.` + )} none of the --ignore-incompatible, --ignore-malformed, --ignore-unused or --ignore-missing is allowed when --fix is set.` ); } @@ -99,6 +101,7 @@ run( checkCompatibility( config, { + ignoreMalformed: !!ignoreMalformed, ignoreIncompatible: !!ignoreIncompatible, ignoreUnused: !!ignoreUnused, ignoreMissing: !!ignoreMissing, diff --git a/src/dev/run_i18n_integrate.ts b/src/dev/run_i18n_integrate.ts index ac1e957adfc99..25c3ea32783aa 100644 --- a/src/dev/run_i18n_integrate.ts +++ b/src/dev/run_i18n_integrate.ts @@ -31,6 +31,7 @@ run( 'ignore-incompatible': ignoreIncompatible = false, 'ignore-missing': ignoreMissing = false, 'ignore-unused': ignoreUnused = false, + 'ignore-malformed': ignoreMalformed = false, 'include-config': includeConfig, path, source, @@ -66,12 +67,13 @@ run( typeof ignoreIncompatible !== 'boolean' || typeof ignoreUnused !== 'boolean' || typeof ignoreMissing !== 'boolean' || + typeof ignoreMalformed !== 'boolean' || typeof dryRun !== 'boolean' ) { throw createFailError( `${chalk.white.bgRed( ' I18N ERROR ' - )} --ignore-incompatible, --ignore-unused, --ignore-missing, and --dry-run can't have values` + )} --ignore-incompatible, --ignore-unused, --ignore-malformed, --ignore-missing, and --dry-run can't have values` ); } @@ -97,6 +99,7 @@ run( ignoreIncompatible, ignoreUnused, ignoreMissing, + ignoreMalformed, config, log, }); @@ -108,7 +111,6 @@ run( const reporter = new ErrorReporter(); const messages: Map = new Map(); await list.run({ messages, reporter }); - process.exitCode = 0; } catch (error) { process.exitCode = 1; if (error instanceof ErrorReporter) { @@ -118,7 +120,6 @@ run( log.error(error); } } - process.exit(); }, { flags: { From 708ba4ce4c5862f7be474cd61abc878caa3ef2ab Mon Sep 17 00:00:00 2001 From: Luke Elmers Date: Mon, 10 Aug 2020 08:17:04 -0600 Subject: [PATCH 020/113] [App Arch]: remove legacy karma tests (#74599) --- .../public/storage/__tests__/storage.js | 124 ------------------ .../public/storage/storage.test.ts | 109 +++++++++++++++ ...gauge_objs.js => vis_update_state.stub.js} | 0 .../public/legacy/vis_update_state.test.js | 2 +- 4 files changed, 110 insertions(+), 125 deletions(-) delete mode 100644 src/plugins/kibana_utils/public/storage/__tests__/storage.js create mode 100644 src/plugins/kibana_utils/public/storage/storage.test.ts rename src/plugins/visualizations/public/legacy/{__tests__/vis_update_objs/gauge_objs.js => vis_update_state.stub.js} (100%) diff --git a/src/plugins/kibana_utils/public/storage/__tests__/storage.js b/src/plugins/kibana_utils/public/storage/__tests__/storage.js deleted file mode 100644 index 073ed275b9aac..0000000000000 --- a/src/plugins/kibana_utils/public/storage/__tests__/storage.js +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import sinon from 'sinon'; -import expect from '@kbn/expect'; -import ngMock from 'ng_mock'; -import '..'; - -let storage; -let $window; -const payload = { first: 'john', last: 'smith' }; - -function init() { - ngMock.module('kibana/storage', function ($provide) { - // mock $window.localStorage for storage - $provide.value('$window', { - localStorage: { - getItem: sinon.stub(), - setItem: sinon.spy(), - removeItem: sinon.spy(), - clear: sinon.spy(), - }, - }); - }); - - ngMock.inject(function ($injector) { - storage = $injector.get('localStorage'); - $window = $injector.get('$window'); - }); -} - -describe('StorageService', function () { - beforeEach(function () { - init(); - }); - - describe('expected API', function () { - it('should have expected methods', function () { - expect(storage.get).to.be.a('function'); - expect(storage.set).to.be.a('function'); - expect(storage.remove).to.be.a('function'); - expect(storage.clear).to.be.a('function'); - }); - }); - - describe('call behavior', function () { - it('should call getItem on the store', function () { - storage.get('name'); - - expect($window.localStorage.getItem.callCount).to.equal(1); - }); - - it('should call setItem on the store', function () { - storage.set('name', 'john smith'); - - expect($window.localStorage.setItem.callCount).to.equal(1); - }); - - it('should call removeItem on the store', function () { - storage.remove('name'); - - expect($window.localStorage.removeItem.callCount).to.equal(1); - }); - - it('should call clear on the store', function () { - storage.clear(); - - expect($window.localStorage.clear.callCount).to.equal(1); - }); - }); - - describe('json data', function () { - it('should parse JSON when reading from the store', function () { - const getItem = $window.localStorage.getItem; - getItem.returns(JSON.stringify(payload)); - - const data = storage.get('name'); - expect(data).to.eql(payload); - }); - - it('should write JSON string to the store', function () { - const setItem = $window.localStorage.setItem; - const key = 'name'; - const value = payload; - - storage.set(key, value); - - const call = setItem.getCall(0); - expect(call.args[0]).to.equal(key); - expect(call.args[1]).to.equal(JSON.stringify(value)); - }); - }); - - describe('expected responses', function () { - it('should return null when not exists', function () { - const data = storage.get('notexists'); - expect(data).to.equal(null); - }); - - it('should return null when invalid JSON', function () { - const getItem = $window.localStorage.getItem; - getItem.returns('not: json'); - - const data = storage.get('name'); - expect(data).to.equal(null); - }); - }); -}); diff --git a/src/plugins/kibana_utils/public/storage/storage.test.ts b/src/plugins/kibana_utils/public/storage/storage.test.ts new file mode 100644 index 0000000000000..8c5d3d11a21fe --- /dev/null +++ b/src/plugins/kibana_utils/public/storage/storage.test.ts @@ -0,0 +1,109 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Storage } from './storage'; +import { IStorage, IStorageWrapper } from './types'; + +const payload = { first: 'john', last: 'smith' }; +const createMockStore = (): MockedKeys => { + let store: Record = {}; + return { + getItem: jest.fn().mockImplementation((key) => store[key]), + setItem: jest.fn().mockImplementation((key, value) => (store[key] = value)), + removeItem: jest.fn().mockImplementation((key: string) => delete store[key]), + clear: jest.fn().mockImplementation(() => (store = {})), + }; +}; + +describe('StorageService', () => { + let storage: IStorageWrapper; + let mockStore: MockedKeys; + + beforeEach(() => { + jest.resetAllMocks(); + mockStore = createMockStore(); + storage = new Storage(mockStore); + }); + + describe('expected API', () => { + test('should have expected methods', () => { + expect(typeof storage.get).toBe('function'); + expect(typeof storage.set).toBe('function'); + expect(typeof storage.remove).toBe('function'); + expect(typeof storage.clear).toBe('function'); + }); + }); + + describe('call behavior', () => { + test('should call getItem on the store', () => { + storage.get('name'); + + expect(mockStore.getItem).toHaveBeenCalledTimes(1); + }); + + test('should call setItem on the store', () => { + storage.set('name', 'john smith'); + + expect(mockStore.setItem).toHaveBeenCalledTimes(1); + }); + + test('should call removeItem on the store', () => { + storage.remove('name'); + + expect(mockStore.removeItem).toHaveBeenCalledTimes(1); + }); + + test('should call clear on the store', () => { + storage.clear(); + + expect(mockStore.clear).toHaveBeenCalledTimes(1); + }); + }); + + describe('json data', () => { + test('should parse JSON when reading from the store', () => { + mockStore.getItem = jest.fn().mockImplementationOnce(() => JSON.stringify(payload)); + + const data = storage.get('name'); + expect(data).toEqual(payload); + }); + + test('should write JSON string to the store', () => { + const key = 'name'; + const value = payload; + + storage.set(key, value); + expect(mockStore.setItem).toHaveBeenCalledWith(key, JSON.stringify(value)); + }); + }); + + describe('expected responses', () => { + test('should return null when not exists', () => { + const data = storage.get('notexists'); + expect(data).toBe(null); + }); + + test('should return null when invalid JSON', () => { + mockStore.getItem = jest.fn().mockImplementationOnce(() => 'not: json'); + + const data = storage.get('name'); + expect(data).toBe(null); + }); + }); +}); diff --git a/src/plugins/visualizations/public/legacy/__tests__/vis_update_objs/gauge_objs.js b/src/plugins/visualizations/public/legacy/vis_update_state.stub.js similarity index 100% rename from src/plugins/visualizations/public/legacy/__tests__/vis_update_objs/gauge_objs.js rename to src/plugins/visualizations/public/legacy/vis_update_state.stub.js diff --git a/src/plugins/visualizations/public/legacy/vis_update_state.test.js b/src/plugins/visualizations/public/legacy/vis_update_state.test.js index 7ddf0cc6e33e1..d0a735fbacdc2 100644 --- a/src/plugins/visualizations/public/legacy/vis_update_state.test.js +++ b/src/plugins/visualizations/public/legacy/vis_update_state.test.js @@ -21,7 +21,7 @@ import _ from 'lodash'; import { updateOldState } from './vis_update_state'; // eslint-disable-next-line camelcase -import { pre_6_1, since_6_1 } from './__tests__/vis_update_objs/gauge_objs'; +import { pre_6_1, since_6_1 } from './vis_update_state.stub'; function watchForChanges(obj) { const originalObject = _.cloneDeep(obj); From b4b6428c1ca095f8e1388bcec29d8d508ec08a22 Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Mon, 10 Aug 2020 11:18:30 -0400 Subject: [PATCH 021/113] [Ingest Manager] Allow prerelease in package version (#74452) * Allow prerelease in version * Adding integration test for prerelease version of a package * Tests for invalid package key * Removing inter-test dependency --- src/dev/precommit_hook/casing_check_config.js | 2 + .../server/routes/epm/handlers.ts | 5 ++- .../server/services/epm/packages/install.ts | 2 +- .../server/services/epm/packages/remove.ts | 3 +- .../services/epm/registry/index.test.ts | 34 ++++++++++++++- .../server/services/epm/registry/index.ts | 21 ++++++++++ .../apis/epm/get.ts | 33 +++++++++++++++ .../apis/epm/index.js | 2 + .../apis/epm/install_overrides.ts | 6 +-- .../apis/epm/install_prerelease.ts | 41 +++++++++++++++++++ .../dataset/test/fields/fields.yml | 16 ++++++++ .../0.1.0-dev.0+abc/dataset/test/manifest.yml | 3 ++ .../prerelease/0.1.0-dev.0+abc/docs/README.md | 3 ++ .../img/logo_prerelease_64_color.svg | 7 ++++ .../prerelease/0.1.0-dev.0+abc/manifest.yml | 20 +++++++++ 15 files changed, 190 insertions(+), 8 deletions(-) create mode 100644 x-pack/test/ingest_manager_api_integration/apis/epm/get.ts create mode 100644 x-pack/test/ingest_manager_api_integration/apis/epm/install_prerelease.ts create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/fields/fields.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/manifest.yml create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/docs/README.md create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/img/logo_prerelease_64_color.svg create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/manifest.yml diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index 36d0ff8f51d88..bdbd600e9aa74 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -71,6 +71,8 @@ export const IGNORE_FILE_GLOBS = [ 'x-pack/plugins/apm/e2e/**/*', 'x-pack/plugins/maps/server/fonts/**/*', + // packages for the ingest manager's api integration tests could be valid semver which has dashes + 'x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/**/*', ]; /** diff --git a/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts index f8f39f6294260..bbd91b97a86c9 100644 --- a/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts @@ -33,6 +33,7 @@ import { getInstallationObject, } from '../../services/epm/packages'; import { IngestManagerError, getHTTPResponseCode } from '../../errors'; +import { splitPkgKey } from '../../services/epm/registry'; export const getCategoriesHandler: RequestHandler< undefined, @@ -131,7 +132,7 @@ export const getInfoHandler: RequestHandler { // TODO: change epm API to /packageName/version so we don't need to do this - const [pkgName, pkgVersion] = pkgkey.split('-'); + const { pkgName, pkgVersion } = Registry.splitPkgKey(pkgkey); // TODO: calls to getInstallationObject, Registry.fetchInfo, and Registry.fetchFindLatestPackge // and be replaced by getPackageInfo after adjusting for it to not group/use archive assets const latestPackage = await Registry.fetchFindLatestPackage(pkgName); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts index 1acf2131dcb01..1e50c67d63c42 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts @@ -13,6 +13,7 @@ import { getInstallation, savedObjectTypes } from './index'; import { deletePipeline } from '../elasticsearch/ingest_pipeline/'; import { installIndexPatterns } from '../kibana/index_pattern/install'; import { packageConfigService, appContextService } from '../..'; +import { splitPkgKey } from '../registry'; export async function removeInstallation(options: { savedObjectsClient: SavedObjectsClientContract; @@ -21,7 +22,7 @@ export async function removeInstallation(options: { }): Promise { const { savedObjectsClient, pkgkey, callCluster } = options; // TODO: the epm api should change to /name/version so we don't need to do this - const [pkgName] = pkgkey.split('-'); + const { pkgName } = splitPkgKey(pkgkey); const installation = await getInstallation({ savedObjectsClient, pkgName }); if (!installation) throw Boom.badRequest(`${pkgName} is not installed`); if (installation.removable === false) diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts index eae84275a49b9..085dc990fa376 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts @@ -5,7 +5,7 @@ */ import { AssetParts } from '../../../types'; -import { pathParts } from './index'; +import { pathParts, splitPkgKey } from './index'; const testPaths = [ { @@ -48,3 +48,35 @@ test('testPathParts', () => { expect(pathParts(value.path)).toStrictEqual(value.assetParts as AssetParts); } }); + +describe('splitPkgKey tests', () => { + it('throws an error if the delimiter is not found', () => { + expect(() => { + splitPkgKey('awesome_package'); + }).toThrow(); + }); + + it('throws an error if there is nothing before the delimiter', () => { + expect(() => { + splitPkgKey('-0.0.1-dev1'); + }).toThrow(); + }); + + it('throws an error if the version is not a semver', () => { + expect(() => { + splitPkgKey('awesome-laskdfj'); + }).toThrow(); + }); + + it('returns the name and version if the delimiter is found once', () => { + const { pkgName, pkgVersion } = splitPkgKey('awesome-0.1.0'); + expect(pkgName).toBe('awesome'); + expect(pkgVersion).toBe('0.1.0'); + }); + + it('returns the name and version if the delimiter is found multiple times', () => { + const { pkgName, pkgVersion } = splitPkgKey('endpoint-0.13.0-alpha.1+abcd'); + expect(pkgName).toBe('endpoint'); + expect(pkgVersion).toBe('0.13.0-alpha.1+abcd'); + }); +}); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts index c701762e50b50..b635378960468 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import semver from 'semver'; import { Response } from 'node-fetch'; import { URL } from 'url'; import { @@ -35,6 +36,26 @@ export interface CategoriesParams { experimental?: boolean; } +/** + * Extract the package name and package version from a string. + * + * @param pkgkey a string containing the package name delimited by the package version + */ +export function splitPkgKey(pkgkey: string): { pkgName: string; pkgVersion: string } { + // this will return an empty string if `indexOf` returns -1 + const pkgName = pkgkey.substr(0, pkgkey.indexOf('-')); + if (pkgName === '') { + throw new Error('Package key parsing failed: package name was empty'); + } + + // this will return the entire string if `indexOf` return -1 + const pkgVersion = pkgkey.substr(pkgkey.indexOf('-') + 1); + if (!semver.valid(pkgVersion)) { + throw new Error('Package key parsing failed: package version was not a valid semver'); + } + return { pkgName, pkgVersion }; +} + export const pkgToPkgKey = ({ name, version }: { name: string; version: string }) => `${name}-${version}`; diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/get.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/get.ts new file mode 100644 index 0000000000000..382bd6beb2e2f --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/get.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; +import { warnAndSkipTest } from '../../helpers'; + +export default function ({ getService }: FtrProviderContext) { + const log = getService('log'); + const supertest = getService('supertest'); + const dockerServers = getService('dockerServers'); + const server = dockerServers.get('registry'); + + describe('EPM - get', () => { + it('returns a 500 for a package key without a proper name', async function () { + if (server.enabled) { + await supertest.get('/api/ingest_manager/epm/packages/-0.1.0').expect(500); + } else { + warnAndSkipTest(this, log); + } + }); + + it('returns a 500 for a package key without a proper semver version', async function () { + if (server.enabled) { + await supertest.get('/api/ingest_manager/epm/packages/endpoint-0.1.0.1.2.3').expect(500); + } else { + warnAndSkipTest(this, log); + } + }); + }); +} diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/index.js b/x-pack/test/ingest_manager_api_integration/apis/epm/index.js index 0f32d2b4ae703..0a259cb96bf59 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/index.js +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/index.js @@ -7,10 +7,12 @@ export default function loadTests({ loadTestFile }) { describe('EPM Endpoints', () => { loadTestFile(require.resolve('./list')); + loadTestFile(require.resolve('./get')); loadTestFile(require.resolve('./file')); //loadTestFile(require.resolve('./template')); loadTestFile(require.resolve('./ilm')); loadTestFile(require.resolve('./install_overrides')); + loadTestFile(require.resolve('./install_prerelease')); loadTestFile(require.resolve('./install_remove_assets')); loadTestFile(require.resolve('./install_update')); loadTestFile(require.resolve('./update_assets')); diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/install_overrides.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/install_overrides.ts index f73ba56c172c4..c75c51f6a5000 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/install_overrides.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/install_overrides.ts @@ -14,13 +14,13 @@ export default function ({ getService }: FtrProviderContext) { const dockerServers = getService('dockerServers'); const log = getService('log'); + const mappingsPackage = 'overrides-0.1.0'; + const server = dockerServers.get('registry'); + const deletePackage = async (pkgkey: string) => { await supertest.delete(`/api/ingest_manager/epm/packages/${pkgkey}`).set('kbn-xsrf', 'xxxx'); }; - const mappingsPackage = 'overrides-0.1.0'; - const server = dockerServers.get('registry'); - describe('installs packages that include settings and mappings overrides', async () => { after(async () => { if (server.enabled) { diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/install_prerelease.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/install_prerelease.ts new file mode 100644 index 0000000000000..a641a105c66e0 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/install_prerelease.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; +import { warnAndSkipTest } from '../../helpers'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const dockerServers = getService('dockerServers'); + const log = getService('log'); + + const testPackage = 'prerelease-0.1.0-dev.0+abc'; + const server = dockerServers.get('registry'); + + const deletePackage = async (pkgkey: string) => { + await supertest.delete(`/api/ingest_manager/epm/packages/${pkgkey}`).set('kbn-xsrf', 'xxxx'); + }; + + describe('installs package that has a prerelease version', async () => { + after(async () => { + if (server.enabled) { + // remove the package just in case it being installed will affect other tests + await deletePackage(testPackage); + } + }); + + it('should install the package correctly', async function () { + if (server.enabled) { + await supertest + .post(`/api/ingest_manager/epm/packages/${testPackage}`) + .set('kbn-xsrf', 'xxxx') + .expect(200); + } else { + warnAndSkipTest(this, log); + } + }); + }); +} diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/fields/fields.yml new file mode 100644 index 0000000000000..6e003ed0ad147 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/fields/fields.yml @@ -0,0 +1,16 @@ +- name: data_stream.type + type: constant_keyword + description: > + Data stream type. +- name: data_stream.dataset + type: constant_keyword + description: > + Data stream dataset. +- name: data_stream.namespace + type: constant_keyword + description: > + Data stream namespace. +- name: '@timestamp' + type: date + description: > + Event timestamp. diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/manifest.yml new file mode 100644 index 0000000000000..17c33c745ce74 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/dataset/test/manifest.yml @@ -0,0 +1,3 @@ +title: Test Dataset + +type: logs diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/docs/README.md b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/docs/README.md new file mode 100644 index 0000000000000..0002afd9cdfc0 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/docs/README.md @@ -0,0 +1,3 @@ +# Test package + +For testing a prerelease package diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/img/logo_prerelease_64_color.svg b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/img/logo_prerelease_64_color.svg new file mode 100644 index 0000000000000..b03007a76ffcc --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/img/logo_prerelease_64_color.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/manifest.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/manifest.yml new file mode 100644 index 0000000000000..a0adb184cfc59 --- /dev/null +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/prerelease/0.1.0-dev.0+abc/manifest.yml @@ -0,0 +1,20 @@ +format_version: 1.0.0 +name: prerelease +title: Prerelease package +description: This is a test package for testing that parsing a prerelease version works +version: 0.1.0-dev.0+abc +categories: ['security'] +release: beta +type: integration +license: basic + +requirement: + elasticsearch: + versions: '>7.7.0' + kibana: + versions: '>7.7.0' + +icons: + - src: '/img/logo_prerelease_64_color.svg' + size: '16x16' + type: 'image/svg+xml' From a6615c61411728f3485a52d8160073c675b9a9db Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Mon, 10 Aug 2020 11:50:18 -0400 Subject: [PATCH 022/113] add memoryStatus to df analytics page and analytics table in management (#74570) --- .../components/analytics_list/common.ts | 6 ++++++ .../components/analytics_list/use_columns.tsx | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/common.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/common.ts index cc52138d7c7b7..39489836773b3 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/common.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/common.ts @@ -35,6 +35,11 @@ interface ProgressSection { export interface DataFrameAnalyticsStats { assignment_explanation?: string; id: DataFrameAnalyticsId; + memory_usage?: { + timestamp?: string; + peak_usage_bytes: number; + status: string; + }; node?: { attributes: Record; ephemeral_id: string; @@ -121,6 +126,7 @@ export enum DataFrameAnalyticsListColumn { configCreateTime = 'config.create_time', description = 'config.description', id = 'id', + memoryStatus = 'stats.memory_usage.status', } export type ItemIdToExpandedRowMap = Record; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_columns.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_columns.tsx index 1b115496c2091..9ed87ff9f8312 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_columns.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_columns.tsx @@ -213,6 +213,14 @@ export const useColumns = ( truncateText: true, 'data-test-subj': 'mlAnalyticsTableColumnJobDescription', }, + { + field: DataFrameAnalyticsListColumn.memoryStatus, + name: i18n.translate('xpack.ml.dataframe.analyticsList.memoryStatus', { + defaultMessage: 'Memory status', + }), + truncateText: true, + 'data-test-subj': 'mlAnalyticsTableColumnJobMemoryStatus', + }, { field: DataFrameAnalyticsListColumn.configSourceIndex, name: i18n.translate('xpack.ml.dataframe.analyticsList.sourceIndex', { From 7fd2c2bed224c634b25933f009fa2eb094475561 Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Mon, 10 Aug 2020 11:54:22 -0400 Subject: [PATCH 023/113] [Security Solution] Resolver children pagination (#74603) * Handle info and change events for children * Adding sequence * Fixing children pagination * Fixing tests * Adding docs --- .../common/endpoint/generate_data.test.ts | 7 + .../common/endpoint/generate_data.ts | 3 + .../common/endpoint/models/event.ts | 14 ++ .../common/endpoint/types.ts | 3 + .../routes/resolver/queries/children.test.ts | 10 +- .../routes/resolver/queries/children.ts | 9 +- .../routes/resolver/utils/children_helper.ts | 4 +- .../resolver/utils/children_pagination.ts | 129 ++++++++++++++++++ .../utils/children_start_query_handler.ts | 11 +- .../routes/resolver/utils/pagination.ts | 92 +++++++++---- .../apis/resolver/children.ts | 83 ++++++++++- .../apis/resolver/tree.ts | 26 ++-- 12 files changed, 337 insertions(+), 54 deletions(-) create mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_pagination.ts diff --git a/x-pack/plugins/security_solution/common/endpoint/generate_data.test.ts b/x-pack/plugins/security_solution/common/endpoint/generate_data.test.ts index debe4a3da6a6f..46fc002e76e7f 100644 --- a/x-pack/plugins/security_solution/common/endpoint/generate_data.test.ts +++ b/x-pack/plugins/security_solution/common/endpoint/generate_data.test.ts @@ -26,6 +26,13 @@ describe('data generator', () => { generator = new EndpointDocGenerator('seed'); }); + it('creates events with a numerically increasing sequence value', () => { + const event1 = generator.generateEvent(); + const event2 = generator.generateEvent(); + + expect(event2.event.sequence).toBe(event1.event.sequence + 1); + }); + it('creates the same documents with same random seed', () => { const generator1 = new EndpointDocGenerator('seed'); const generator2 = new EndpointDocGenerator('seed'); diff --git a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts index aa3f0bf287fca..09f25fc074eff 100644 --- a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts +++ b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts @@ -333,6 +333,7 @@ export function getTreeOptionsWithDef(options?: TreeOptions): TreeOptionDefaults export class EndpointDocGenerator { commonInfo: HostInfo; random: seedrandom.prng; + sequence: number = 0; constructor(seed: string | seedrandom.prng = Math.random().toString()) { if (typeof seed === 'string') { this.random = seedrandom(seed); @@ -440,6 +441,7 @@ export class EndpointDocGenerator { dataset: 'endpoint', module: 'endpoint', type: 'creation', + sequence: this.sequence++, }, file: { owner: 'SYSTEM', @@ -586,6 +588,7 @@ export class EndpointDocGenerator { kind: 'event', type: options.eventType ? options.eventType : ['start'], id: this.seededUUIDv4(), + sequence: this.sequence++, }, host: this.commonInfo.host, process: { diff --git a/x-pack/plugins/security_solution/common/endpoint/models/event.ts b/x-pack/plugins/security_solution/common/endpoint/models/event.ts index b1a8524a9f9e7..30e11819c0272 100644 --- a/x-pack/plugins/security_solution/common/endpoint/models/event.ts +++ b/x-pack/plugins/security_solution/common/endpoint/models/event.ts @@ -86,6 +86,20 @@ export function eventId(event: ResolverEvent): number | undefined | string { return event.event.id; } +export function eventSequence(event: ResolverEvent): number | undefined { + if (isLegacyEvent(event)) { + return firstNonNullValue(event.endgame.serial_event_id); + } + return firstNonNullValue(event.event?.sequence); +} + +export function eventSequenceSafeVersion(event: SafeResolverEvent): number | undefined { + if (isLegacyEventSafeVersion(event)) { + return firstNonNullValue(event.endgame.serial_event_id); + } + return firstNonNullValue(event.event?.sequence); +} + export function eventIDSafeVersion(event: SafeResolverEvent): number | undefined | string { return firstNonNullValue( isLegacyEventSafeVersion(event) ? event.endgame?.serial_event_id : event.event?.id diff --git a/x-pack/plugins/security_solution/common/endpoint/types.ts b/x-pack/plugins/security_solution/common/endpoint/types.ts index ffde47825b501..2a1c95caff3a3 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types.ts @@ -320,6 +320,7 @@ export interface AlertEvent { dataset: string; module: string; type: string; + sequence: number; }; Endpoint: { policy: { @@ -524,6 +525,7 @@ export interface EndpointEvent { type: string | string[]; id: string; kind: string; + sequence: number; }; host: Host; network?: { @@ -600,6 +602,7 @@ export type SafeEndpointEvent = Partial<{ type: ECSField; id: ECSField; kind: ECSField; + sequence: ECSField; }>; host: Partial<{ id: ECSField; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.test.ts index 8175764b3a0a2..4e210e0237fcd 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.test.ts @@ -4,12 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ import { ChildrenQuery } from './children'; -import { PaginationBuilder } from '../utils/pagination'; +import { ChildrenPaginationBuilder } from '../utils/children_pagination'; import { legacyEventIndexPattern } from './legacy_event_index_pattern'; describe('Children query', () => { it('constructs a legacy multi search query', () => { - const query = new ChildrenQuery(new PaginationBuilder(1), 'index-pattern', 'endpointID'); + const query = new ChildrenQuery( + new ChildrenPaginationBuilder(1), + 'index-pattern', + 'endpointID' + ); // using any here because otherwise ts complains that it doesn't know what bool and filter are // eslint-disable-next-line @typescript-eslint/no-explicit-any const msearch: any = query.buildMSearch('1234'); @@ -20,7 +24,7 @@ describe('Children query', () => { }); it('constructs a non-legacy multi search query', () => { - const query = new ChildrenQuery(new PaginationBuilder(1), 'index-pattern'); + const query = new ChildrenQuery(new ChildrenPaginationBuilder(1), 'index-pattern'); // using any here because otherwise ts complains that it doesn't know what bool and filter are // eslint-disable-next-line @typescript-eslint/no-explicit-any const msearch: any = query.buildMSearch(['1234', '5678']); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts index 902d287a09e42..6fb38a32f9581 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts @@ -6,7 +6,7 @@ import { SearchResponse } from 'elasticsearch'; import { ResolverEvent } from '../../../../../common/endpoint/types'; import { ResolverQuery } from './base'; -import { PaginationBuilder } from '../utils/pagination'; +import { ChildrenPaginationBuilder } from '../utils/children_pagination'; import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/common'; /** @@ -14,7 +14,7 @@ import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/com */ export class ChildrenQuery extends ResolverQuery { constructor( - private readonly pagination: PaginationBuilder, + private readonly pagination: ChildrenPaginationBuilder, indexPattern: string | string[], endpointID?: string ) { @@ -32,6 +32,7 @@ export class ChildrenQuery extends ResolverQuery { query: { bool: { filter: [ + ...paginationFields.filters, { terms: { 'endgame.unique_ppid': uniquePIDs }, }, @@ -63,7 +64,7 @@ export class ChildrenQuery extends ResolverQuery { } protected query(entityIDs: string[]): JsonObject { - const paginationFields = this.pagination.buildQueryFieldsAsInterface('event.id'); + const paginationFields = this.pagination.buildQueryFields('event.id'); return { /** * Using collapse here will only return a single event per occurrence of a process.entity_id. The events are sorted @@ -80,12 +81,12 @@ export class ChildrenQuery extends ResolverQuery { collapse: { field: 'process.entity_id', }, - // do not set the search_after field because collapse does not work with it size: paginationFields.size, sort: paginationFields.sort, query: { bool: { filter: [ + ...paginationFields.filters, { bool: { should: [ diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.ts index ef487897e3b4e..b82b972b887b5 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.ts @@ -16,7 +16,7 @@ import { ResolverChildren, } from '../../../../../common/endpoint/types'; import { createChild } from './node'; -import { PaginationBuilder } from './pagination'; +import { ChildrenPaginationBuilder } from './children_pagination'; /** * This class helps construct the children structure when building a resolver tree. @@ -162,7 +162,7 @@ export class ChildrenNodesHelper { for (const nodeEntityID of nodes.values()) { const cachedNode = this.entityToNodeCache.get(nodeEntityID); if (cachedNode) { - cachedNode.nextChild = PaginationBuilder.buildCursor(startEvents); + cachedNode.nextChild = ChildrenPaginationBuilder.buildCursor(startEvents); } } } diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_pagination.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_pagination.ts new file mode 100644 index 0000000000000..1e154caf70c48 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_pagination.ts @@ -0,0 +1,129 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ResolverEvent } from '../../../../../common/endpoint/types'; +import { eventSequence } from '../../../../../common/endpoint/models/event'; +import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/common'; +import { urlEncodeCursor, SortFields, urlDecodeCursor } from './pagination'; + +/** + * Pagination information for the children class. + */ +export interface ChildrenPaginationCursor { + timestamp: number; + sequence: number; +} + +/** + * Interface for defining the returned pagination information. + */ +export interface ChildrenPaginationFields { + sort: SortFields; + size: number; + filters: JsonObject[]; +} + +/** + * This class handles constructing pagination cursors that resolver can use to return additional events in subsequent + * queries. + */ +export class ChildrenPaginationBuilder { + constructor( + /** + * upper limit of how many results should be returned by the parent query. + */ + private readonly size: number, + /** + * timestamp that will be used in the search_after section + */ + private readonly timestamp?: number, + /** + * unique sequence number for the event + */ + private readonly sequence?: number + ) {} + + /** + * This function validates that the parsed cursor is a ChildrenPaginationCursor. + * + * @param parsed an object parsed from an encoded cursor. + */ + static decode( + parsed: ChildrenPaginationCursor | undefined + ): ChildrenPaginationCursor | undefined { + if (parsed && parsed.timestamp && parsed.sequence) { + const { timestamp, sequence } = parsed; + return { timestamp, sequence }; + } + } + + /** + * Construct a cursor to use in subsequent queries. + * + * @param results the events that were returned by the ES query + */ + static buildCursor(results: ResolverEvent[]): string | null { + const lastResult = results[results.length - 1]; + const sequence = eventSequence(lastResult); + const cursor = { + timestamp: lastResult['@timestamp'], + sequence: sequence === undefined ? 0 : sequence, + }; + return urlEncodeCursor(cursor); + } + + /** + * Creates a PaginationBuilder with an upper bound limit of results and a specific cursor to use to retrieve the next + * set of results. + * + * @param limit upper bound for the number of results to return within this query + * @param after a cursor to retrieve the next set of results + */ + static createBuilder(limit: number, after?: string): ChildrenPaginationBuilder { + if (after) { + try { + const cursor = urlDecodeCursor(after, ChildrenPaginationBuilder.decode); + if (cursor && cursor.timestamp && cursor.sequence) { + return new ChildrenPaginationBuilder(limit, cursor.timestamp, cursor.sequence); + } + } catch (err) { + /* tslint:disable:no-empty */ + } // ignore invalid cursor values + } + return new ChildrenPaginationBuilder(limit); + } + + /** + * Helper for creates an object for adding the pagination fields to a query + * + * @param tiebreaker a unique field to use as the tiebreaker for the search_after + * @returns an object containing the pagination information + */ + buildQueryFields(tiebreaker: string): ChildrenPaginationFields { + const sort: SortFields = [{ '@timestamp': 'asc' }, { [tiebreaker]: 'asc' }]; + const filters: JsonObject[] = []; + if (this.timestamp && this.sequence) { + filters.push( + { + range: { + '@timestamp': { + gte: this.timestamp, + }, + }, + }, + { + range: { + 'event.sequence': { + gt: this.sequence, + }, + }, + } + ); + } + + return { sort, size: this.size, filters }; + } +} diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_start_query_handler.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_start_query_handler.ts index 1c74184720793..30d46d12afbe5 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_start_query_handler.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_start_query_handler.ts @@ -11,7 +11,7 @@ import { ChildrenQuery } from '../queries/children'; import { QueryInfo } from '../queries/multi_searcher'; import { QueryHandler } from './fetch'; import { ChildrenNodesHelper } from './children_helper'; -import { PaginationBuilder } from './pagination'; +import { ChildrenPaginationBuilder } from './children_pagination'; /** * Retrieve the start lifecycle events for the children of a resolver tree. @@ -32,7 +32,7 @@ export class ChildrenStartQueryHandler implements QueryHandler = (parsed: T | undefined) => T | undefined; + /** * Interface for defining the returned pagination information. */ @@ -31,10 +41,42 @@ export interface PaginationFields { searchAfter?: SearchAfterFields; } +/** + * A function to encode a cursor from a pagination object. + * + * @param data Transforms a pagination cursor into a base64 encoded string + */ +export function urlEncodeCursor(data: PaginationCursor | ChildrenPaginationCursor): string { + const value = JSON.stringify(data); + return Buffer.from(value, 'utf8') + .toString('base64') + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=+$/g, ''); +} + +/** + * A function to decode a cursor. + * + * @param cursor a cursor encoded by the `urlEncodeCursor` function + * @param decode a function to transform the parsed data into an actual type + */ +export function urlDecodeCursor(cursor: string, decode: Decoder): T | undefined { + const fixedCursor = cursor.replace(/\-/g, '+').replace(/_/g, '/'); + const data = Buffer.from(fixedCursor, 'base64').toString('utf8'); + let parsed: T; + try { + parsed = JSON.parse(data); + } catch (e) { + return; + } + + return decode(parsed); +} + /** * This class handles constructing pagination cursors that resolver can use to return additional events in subsequent - * queries. It also constructs an aggregation query to determine the totals for other queries. This class should be used - * with a query to build cursors for paginated results. + * queries. */ export class PaginationBuilder { constructor( @@ -52,22 +94,16 @@ export class PaginationBuilder { private readonly eventID?: string ) {} - private static urlEncodeCursor(data: PaginationCursor): string { - const value = JSON.stringify(data); - return Buffer.from(value, 'utf8') - .toString('base64') - .replace(/\+/g, '-') - .replace(/\//g, '_') - .replace(/=+$/g, ''); - } - - private static urlDecodeCursor(cursor: string): PaginationCursor { - const fixedCursor = cursor.replace(/\-/g, '+').replace(/_/g, '/'); - const data = Buffer.from(fixedCursor, 'base64').toString('utf8'); - const { timestamp, eventID } = JSON.parse(data); - // take some extra care to only grab the things we want - // convert the timestamp string to date object - return { timestamp, eventID }; + /** + * Validates that the parsed object is actually a PaginationCursor. + * + * @param parsed an object parsed from an encoded cursor. + */ + static decode(parsed: PaginationCursor | undefined): PaginationCursor | undefined { + if (parsed && parsed.timestamp && parsed.eventID) { + const { timestamp, eventID } = parsed; + return { timestamp, eventID }; + } } /** @@ -81,7 +117,7 @@ export class PaginationBuilder { timestamp: lastResult['@timestamp'], eventID: eventId(lastResult) === undefined ? '' : String(eventId(lastResult)), }; - return PaginationBuilder.urlEncodeCursor(cursor); + return urlEncodeCursor(cursor); } /** @@ -107,8 +143,8 @@ export class PaginationBuilder { static createBuilder(limit: number, after?: string): PaginationBuilder { if (after) { try { - const cursor = PaginationBuilder.urlDecodeCursor(after); - if (cursor.timestamp && cursor.eventID) { + const cursor = urlDecodeCursor(after, PaginationBuilder.decode); + if (cursor && cursor.timestamp && cursor.eventID) { return new PaginationBuilder(limit, cursor.timestamp, cursor.eventID); } } catch (err) { diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/children.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/children.ts index cde1a3616b620..2dec3c755a93b 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/children.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/children.ts @@ -7,11 +7,12 @@ import expect from '@kbn/expect'; import { SearchResponse } from 'elasticsearch'; import { entityId } from '../../../../plugins/security_solution/common/endpoint/models/event'; import { eventsIndexPattern } from '../../../../plugins/security_solution/common/endpoint/constants'; -import { PaginationBuilder } from '../../../../plugins/security_solution/server/endpoint/routes/resolver/utils/pagination'; +import { ChildrenPaginationBuilder } from '../../../../plugins/security_solution/server/endpoint/routes/resolver/utils/children_pagination'; import { ChildrenQuery } from '../../../../plugins/security_solution/server/endpoint/routes/resolver/queries/children'; import { ResolverTree, ResolverEvent, + ResolverChildren, } from '../../../../plugins/security_solution/common/endpoint/types'; import { FtrProviderContext } from '../../ftr_provider_context'; import { @@ -112,7 +113,7 @@ export default function resolverAPIIntegrationTests({ getService }: FtrProviderC it('only retrieves the start event for the child node', async () => { const childrenQuery = new ChildrenQuery( - PaginationBuilder.createBuilder(100), + ChildrenPaginationBuilder.createBuilder(100), eventsIndexPattern ); // [1] here gets the body portion of the array @@ -125,5 +126,83 @@ export default function resolverAPIIntegrationTests({ getService }: FtrProviderC expect(event.event?.type).to.eql(['start']); }); }); + + describe('children api returns same node multiple times', () => { + let origin: Event; + let startEvent: Event; + let infoEvent: Event; + let execEvent: Event; + let genData: InsertedEvents; + + before(async () => { + // Construct the following tree: + // Origin -> (infoEvent, startEvent, execEvent are all for the same node) + origin = generator.generateEvent(); + startEvent = generator.generateEvent({ + parentEntityID: origin.process.entity_id, + ancestry: [origin.process.entity_id], + eventType: ['start'], + }); + + infoEvent = generator.generateEvent({ + timestamp: startEvent['@timestamp'] + 100, + parentEntityID: origin.process.entity_id, + ancestry: [origin.process.entity_id], + entityID: startEvent.process.entity_id, + eventType: ['info'], + }); + + execEvent = generator.generateEvent({ + timestamp: infoEvent['@timestamp'] + 100, + parentEntityID: origin.process.entity_id, + ancestry: [origin.process.entity_id], + eventType: ['change'], + entityID: startEvent.process.entity_id, + }); + genData = await resolver.insertEvents([origin, infoEvent, startEvent, execEvent]); + }); + + after(async () => { + await resolver.deleteData(genData); + }); + + it('retrieves the same node three times', async () => { + let { body }: { body: ResolverChildren } = await supertest + .get(`/api/endpoint/resolver/${origin.process.entity_id}/children?children=1`) + .expect(200); + expect(body.childNodes.length).to.be(1); + expect(body.nextChild).to.not.be(null); + expect(body.childNodes[0].entityID).to.be(startEvent.process.entity_id); + expect(body.childNodes[0].lifecycle[0].event?.type).to.eql(startEvent.event.type); + + ({ body } = await supertest + .get( + `/api/endpoint/resolver/${origin.process.entity_id}/children?children=1&afterChild=${body.nextChild}` + ) + .expect(200)); + expect(body.childNodes.length).to.be(1); + expect(body.nextChild).to.not.be(null); + expect(body.childNodes[0].entityID).to.be(infoEvent.process.entity_id); + expect(body.childNodes[0].lifecycle[1].event?.type).to.eql(infoEvent.event.type); + + ({ body } = await supertest + .get( + `/api/endpoint/resolver/${origin.process.entity_id}/children?children=1&afterChild=${body.nextChild}` + ) + .expect(200)); + expect(body.childNodes.length).to.be(1); + expect(body.nextChild).to.not.be(null); + expect(body.childNodes[0].entityID).to.be(infoEvent.process.entity_id); + expect(body.childNodes[0].lifecycle[2].event?.type).to.eql(execEvent.event.type); + + ({ body } = await supertest + .get( + `/api/endpoint/resolver/${origin.process.entity_id}/children?children=1&afterChild=${body.nextChild}` + ) + .expect(200)); + expect(body.childNodes.length).to.be(0); + expect(body.nextChild).to.be(null); + }); + }); }); } diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts index 7b511c3be74b5..f4836379ca273 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts @@ -537,7 +537,6 @@ export default function ({ getService }: FtrProviderContext) { describe('legacy events', () => { const endpointID = '5a0c957f-b8e7-4538-965e-57e8bb86ad3a'; const entityID = '94041'; - const cursor = 'eyJ0aW1lc3RhbXAiOjE1ODE0NTYyNTUwMDAsImV2ZW50SUQiOiI5NDA0MiJ9'; it('returns child process lifecycle events', async () => { const { body }: { body: ResolverChildren } = await supertest @@ -566,20 +565,25 @@ export default function ({ getService }: FtrProviderContext) { ).to.eql(93932); }); - // The children api does not support pagination currently - it.skip('returns no values when there is no more data', async () => { - const { body } = await supertest - // after is set to the document id of the last event so there shouldn't be any more after it + it('returns no values when there is no more data', async () => { + let { body }: { body: ResolverChildren } = await supertest .get( - `/api/endpoint/resolver/${entityID}/children?legacyEndpointID=${endpointID}&afterChild=${cursor}` + // there should only be a single child for this node + `/api/endpoint/resolver/94041/children?legacyEndpointID=${endpointID}&children=1` ) .expect(200); + expect(body.nextChild).to.not.be(null); + + ({ body } = await supertest + .get( + `/api/endpoint/resolver/94041/children?legacyEndpointID=${endpointID}&afterChild=${body.nextChild}` + ) + .expect(200)); expect(body.childNodes).be.empty(); expect(body.nextChild).to.eql(null); }); - // The children api does not support pagination currently - it.skip('returns the first page of information when the cursor is invalid', async () => { + it('returns the first page of information when the cursor is invalid', async () => { const { body }: { body: ResolverChildren } = await supertest .get( `/api/endpoint/resolver/${entityID}/children?legacyEndpointID=${endpointID}&afterChild=blah` @@ -641,8 +645,7 @@ export default function ({ getService }: FtrProviderContext) { expect(body.nextChild).to.not.eql(null); }); - // children api does not support pagination currently - it.skip('paginates the children', async () => { + it('paginates the children', async () => { // this gets a node should have 3 children which were created in succession so that the timestamps // are ordered correctly to be retrieved in a single call const distantChildEntityID = Array.from(tree.childrenLevels[0].values())[0].id; @@ -671,8 +674,7 @@ export default function ({ getService }: FtrProviderContext) { expect(body.nextChild).to.be(null); }); - // children api does not support pagination currently - it.skip('gets all children in two queries', async () => { + it('gets all children in two queries', async () => { // should get all the children of the origin let { body }: { body: ResolverChildren } = await supertest .get(`/api/endpoint/resolver/${tree.origin.id}/children?children=3`) From 415a32c86f8274bd0329319fa527a50427af4ccb Mon Sep 17 00:00:00 2001 From: Vignesh Shanmugam Date: Mon, 10 Aug 2020 18:06:20 +0200 Subject: [PATCH 024/113] fix: update apm agents to catch abort requests (#74658) --- package.json | 4 ++-- x-pack/package.json | 2 +- yarn.lock | 46 ++++++++++++++++++++++----------------------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index fc3af14ecae09..1f51e8b3c6e26 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "@babel/core": "^7.11.1", "@babel/plugin-transform-modules-commonjs": "^7.10.4", "@babel/register": "^7.10.5", - "@elastic/apm-rum": "^5.2.0", + "@elastic/apm-rum": "^5.4.0", "@elastic/charts": "19.8.1", "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "7.9.0-rc.2", @@ -173,7 +173,7 @@ "deep-freeze-strict": "^1.1.1", "deepmerge": "^4.2.2", "del": "^5.1.0", - "elastic-apm-node": "^3.6.0", + "elastic-apm-node": "^3.7.0", "elasticsearch": "^16.7.0", "elasticsearch-browser": "^16.7.0", "execa": "^4.0.2", diff --git a/x-pack/package.json b/x-pack/package.json index 8fbb94c97c143..83eb0910add11 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -202,7 +202,7 @@ "@babel/core": "^7.11.1", "@babel/register": "^7.10.5", "@babel/runtime": "^7.11.2", - "@elastic/apm-rum-react": "^1.1.2", + "@elastic/apm-rum-react": "^1.2.2", "@elastic/datemath": "5.0.3", "@elastic/ems-client": "7.9.3", "@elastic/eui": "26.3.1", diff --git a/yarn.lock b/yarn.lock index 33083667a3c5e..49345184eb3dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1976,29 +1976,29 @@ enabled "2.0.x" kuler "^2.0.0" -"@elastic/apm-rum-core@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@elastic/apm-rum-core/-/apm-rum-core-5.3.0.tgz#3ae5e84eba5b5287b92458a49755f6e39e7bba5b" - integrity sha512-b/qAnPqi3km808BhSYo+ROpTINm3eVBQ6hNcxOELwKitS3O/HikkwRn5aPkVIhQXOVrbPSufMl1A991nrE3daA== +"@elastic/apm-rum-core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@elastic/apm-rum-core/-/apm-rum-core-5.5.0.tgz#e05ffd87b95420c788ed3be7cfbbbce1ff54bcf5" + integrity sha512-fPx65oZD495WdHQ3YA8TnzqmjqlvSxoXm0tZqXQKzKVv7CMsNkolnEPSAXFl0W5pmAVRvw6T+vMmxcVIGsCD4Q== dependencies: error-stack-parser "^1.3.5" opentracing "^0.14.3" promise-polyfill "^8.1.3" -"@elastic/apm-rum-react@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@elastic/apm-rum-react/-/apm-rum-react-1.1.2.tgz#274cc414074d05e33e8f0afcad25ef9a30d99452" - integrity sha512-2/wEaPF4EQaVzU8Qj5aYucDc+VFr7438AieON31fx8wsbvnxh9iG+iV7xky2YtT/mf53BbFgZm35L5y/pxCKwA== +"@elastic/apm-rum-react@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@elastic/apm-rum-react/-/apm-rum-react-1.2.2.tgz#b92f1491bae62de0b4296264afe73171f17af022" + integrity sha512-KXM2qxG4p1GeDoud9jpmUA19uuQxW4M+CgtrNIXuNwITMIw46qRLyl5zOIvy9dqHodvLIvZ7RWsFtSZH4kZnAQ== dependencies: - "@elastic/apm-rum" "^5.2.0" + "@elastic/apm-rum" "^5.4.0" hoist-non-react-statics "^3.3.0" -"@elastic/apm-rum@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@elastic/apm-rum/-/apm-rum-5.2.0.tgz#b0cfd6e5771b1e765fda2715a38c87746f49f1aa" - integrity sha512-l8/Ji1GMuahMCN5DsALIf+fioKi1QeY4pU0izfVI37se2/fxsMNEDpw52WxJknHdfBE0Imh3FPg4T56J5MO+IQ== +"@elastic/apm-rum@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@elastic/apm-rum/-/apm-rum-5.4.0.tgz#2d87d5ca19f7f4a021c03f075d9d767894e88b3c" + integrity sha512-X4uaJlM28pyDOsD06serggspbTyz7Za0zFr+OWUntI6tQKu++Tn8yGsr6L2WuXhKNGhyJmrAfh13pmy9ZGyFcg== dependencies: - "@elastic/apm-rum-core" "^5.3.0" + "@elastic/apm-rum-core" "^5.5.0" "@elastic/charts@19.8.1": version "19.8.1" @@ -12395,10 +12395,10 @@ ejs@^3.0.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.0.2.tgz#745b01cdcfe38c1c6a2da3bbb2d9957060a31226" integrity sha512-IncmUpn1yN84hy2shb0POJ80FWrfGNY0cxO9f4v+/sG7qcBvAtVWUA1IdzY/8EYUmOVhoKJVdJjNd3AZcnxOjA== -elastic-apm-http-client@^9.3.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/elastic-apm-http-client/-/elastic-apm-http-client-9.3.0.tgz#fcbb3b4f2af209dc304ac496438d381ef19b9b44" - integrity sha512-vxySk7S1oPN7uPcjv0+GLs3Y1cmN7WDVTEHBJixEDg+L6DJMysgxIGst+32Nc0ZmeU5NIjV/Ds9b+6S/yXRdIQ== +elastic-apm-http-client@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/elastic-apm-http-client/-/elastic-apm-http-client-9.4.0.tgz#1c985923369f0c511b94d5c20f6d13aef588cb55" + integrity sha512-/jOZDyfzLNwHrNkPAI+AspLg0TXYXODWT+I1eoAWRCB7gP1vKvzUQAsP5iChodVqCbAj1eUNXB0KrvM6b07Thw== dependencies: breadth-filter "^2.0.0" container-info "^1.0.1" @@ -12410,10 +12410,10 @@ elastic-apm-http-client@^9.3.0: stream-chopper "^3.0.1" unicode-byte-truncate "^1.0.0" -elastic-apm-node@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/elastic-apm-node/-/elastic-apm-node-3.6.0.tgz#675980951fbf2fc5606d5a95a8d0b097609ac6eb" - integrity sha512-T1BlWlQ3kYPIjcGaGIszaVYbsiP9aMr8V5gFxzkI7LjY9XelahOnC3u8Mmd6TWLh/QyakDcdt8J6VL3bMuR3WA== +elastic-apm-node@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/elastic-apm-node/-/elastic-apm-node-3.7.0.tgz#168f0cfce8d93b5ebc82f387b158fa0924de9d7a" + integrity sha512-ZH3Xru6eLbUyfuNe+EnTOcKlm0B+MKduu1lCXXwEM8CDfDceW1Ks9FtmTaTeZHZW4nMacieGZMpxETrceoVk/A== dependencies: after-all-results "^2.0.0" async-value-promise "^1.1.1" @@ -12421,7 +12421,7 @@ elastic-apm-node@^3.6.0: console-log-level "^1.4.1" cookie "^0.4.0" core-util-is "^1.0.2" - elastic-apm-http-client "^9.3.0" + elastic-apm-http-client "^9.4.0" end-of-stream "^1.4.4" error-stack-parser "^2.0.6" fast-safe-stringify "^2.0.7" From 8819644f138b16d1271e4c00d774b05330747d5a Mon Sep 17 00:00:00 2001 From: Dmitry Lemeshko Date: Mon, 10 Aug 2020 18:15:28 +0200 Subject: [PATCH 025/113] bump geckodriver binary to 0.27 (#74638) --- package.json | 2 +- yarn.lock | 84 +++++++++++++++++++++------------------------------- 2 files changed, 34 insertions(+), 52 deletions(-) diff --git a/package.json b/package.json index 1f51e8b3c6e26..0b5a6822e6afa 100644 --- a/package.json +++ b/package.json @@ -438,7 +438,7 @@ "exit-hook": "^2.2.0", "faker": "1.1.0", "fetch-mock": "^7.3.9", - "geckodriver": "^1.19.0", + "geckodriver": "^1.20.0", "getopts": "^2.2.4", "grunt": "1.0.4", "grunt-available-tasks": "^0.6.3", diff --git a/yarn.lock b/yarn.lock index 49345184eb3dd..7c397c33ad8a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6284,10 +6284,10 @@ adjust-sourcemap-loader@2.0.0: object-path "0.11.4" regex-parser "2.2.10" -adm-zip@0.4.11: - version "0.4.11" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.11.tgz#2aa54c84c4b01a9d0fb89bb11982a51f13e3d62a" - integrity sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA== +adm-zip@0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== after-all-results@^2.0.0: version "2.0.0" @@ -8295,11 +8295,6 @@ bluebird-retry@^0.11.0: resolved "https://registry.yarnpkg.com/bluebird-retry/-/bluebird-retry-0.11.0.tgz#1289ab22cbbc3a02587baad35595351dd0c1c047" integrity sha1-EomrIsu8OgJYe6rTVZU1HdDBwEc= -bluebird@3.4.6: - version "3.4.6" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" - integrity sha1-AdqNgh2HgT0ViWfnQ9X+bGLPjA8= - bluebird@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" @@ -14900,16 +14895,16 @@ gaze@^1.0.0, gaze@^1.1.0: dependencies: globule "^1.0.0" -geckodriver@^1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/geckodriver/-/geckodriver-1.19.0.tgz#b2b07e343c2e409ce645e65fe88132bd34fa400a" - integrity sha512-Zq98rXKjvB+NCfzKlJGkQkFAO8zvmUSNqYEIxUwlF1qxmv4taRwwBbEfDa6Dj7Auf7C0p+ZZZmIA8KmlL1cfsw== +geckodriver@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/geckodriver/-/geckodriver-1.20.0.tgz#cd16edb177b88e31affcb54b18a238cae88950a7" + integrity sha512-5nVF4ixR+ZGhVsc4udnVihA9RmSlO6guPV1d2HqxYsgAOUNh0HfzxbzG7E49w4ilXq/CSu87x9yWvrsOstrADQ== dependencies: - adm-zip "0.4.11" - bluebird "3.4.6" + adm-zip "0.4.16" + bluebird "3.7.2" got "5.6.0" - https-proxy-agent "2.2.1" - tar "4.4.2" + https-proxy-agent "5.0.0" + tar "6.0.2" generate-function@^2.0.0: version "2.3.1" @@ -16816,7 +16811,15 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@2.2.1, https-proxy-agent@^2.2.1: +https-proxy-agent@5.0.0, https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +https-proxy-agent@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== @@ -16840,14 +16843,6 @@ https-proxy-agent@^4.0.0: agent-base "5" debug "4" -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -21315,7 +21310,7 @@ minipass-pipeline@^1.2.2: dependencies: minipass "^3.0.0" -minipass@^2.2.1, minipass@^2.2.4, minipass@^2.8.6, minipass@^2.9.0: +minipass@^2.2.1, minipass@^2.8.6, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== @@ -21330,7 +21325,7 @@ minipass@^3.0.0, minipass@^3.1.1: dependencies: yallist "^4.0.0" -minizlib@^1.1.0, minizlib@^1.2.1: +minizlib@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== @@ -29180,29 +29175,7 @@ tar@4.4.13, tar@^4: safe-buffer "^5.1.2" yallist "^3.0.3" -tar@4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.2.tgz#60685211ba46b38847b1ae7ee1a24d744a2cd462" - integrity sha512-BfkE9CciGGgDsATqkikUHrQrraBCO+ke/1f6SFAEMnxyyfN9lxC+nW1NFWMpqH865DhHIy9vQi682gk1X7friw== - dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.2.4" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" - -tar@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" - integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== - dependencies: - block-stream "*" - fstream "^1.0.12" - inherits "2" - -tar@^6.0.1, tar@^6.0.2: +tar@6.0.2, tar@^6.0.1, tar@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.2.tgz#5df17813468a6264ff14f766886c622b84ae2f39" integrity sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg== @@ -29214,6 +29187,15 @@ tar@^6.0.1, tar@^6.0.2: mkdirp "^1.0.3" yallist "^4.0.0" +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + tcomb-validation@^3.3.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tcomb-validation/-/tcomb-validation-3.4.1.tgz#a7696ec176ce56a081d9e019f8b732a5a8894b65" From ed34d6fe30c4692f98f8a68ab3144ff512e047e5 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 10 Aug 2020 10:46:11 -0600 Subject: [PATCH 026/113] [maps] convert vector style properties to TS (#74553) * [maps] convert vector style properties to TS * more conversionts * tslint cleanup * final tslint fixes * update snapshots for bug fix * review feedback Co-authored-by: Elastic Machine --- .../public/classes/styles/color_palettes.ts | 2 +- .../components/legend/breaked_legend.tsx | 4 +- .../vector/components/legend/category.tsx | 4 +- ...p => dynamic_color_property.test.tsx.snap} | 34 +++++- .../vector/properties/__tests__/test_util.ts | 15 --- ...est.js => dynamic_color_property.test.tsx} | 107 ++++++++++++++---- ...property.js => dynamic_color_property.tsx} | 67 ++++++----- .../properties/dynamic_size_property.test.tsx | 58 +++++++--- ..._property.js => dynamic_size_property.tsx} | 56 ++++++--- .../properties/dynamic_style_property.tsx | 2 +- ...t_property.js => dynamic_text_property.ts} | 6 +- ...perty.js => label_border_size_property.ts} | 22 +++- ...r_property.js => static_color_property.ts} | 20 ++-- ...on_property.js => static_icon_property.ts} | 7 +- ...erty.js => static_orientation_property.ts} | 9 +- ...ze_property.js => static_size_property.ts} | 20 ++-- ...e_property.js => static_style_property.ts} | 2 +- ...xt_property.js => static_text_property.ts} | 6 +- ...s_property.js => symbolize_as_property.ts} | 7 +- 19 files changed, 302 insertions(+), 146 deletions(-) rename x-pack/plugins/maps/public/classes/styles/vector/properties/__snapshots__/{dynamic_color_property.test.js.snap => dynamic_color_property.test.tsx.snap} (93%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{dynamic_color_property.test.js => dynamic_color_property.test.tsx} (82%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{dynamic_color_property.js => dynamic_color_property.tsx} (79%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{dynamic_size_property.js => dynamic_size_property.tsx} (72%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{dynamic_text_property.js => dynamic_text_property.ts} (80%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{label_border_size_property.js => label_border_size_property.ts} (68%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{static_color_property.js => static_color_property.ts} (63%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{static_icon_property.js => static_icon_property.ts} (67%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{static_orientation_property.js => static_orientation_property.ts} (62%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{static_size_property.js => static_size_property.ts} (65%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{static_style_property.js => static_style_property.ts} (84%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{static_text_property.js => static_text_property.ts} (69%) rename x-pack/plugins/maps/public/classes/styles/vector/properties/{symbolize_as_property.js => symbolize_as_property.ts} (74%) diff --git a/x-pack/plugins/maps/public/classes/styles/color_palettes.ts b/x-pack/plugins/maps/public/classes/styles/color_palettes.ts index e7574b4e7b3e4..51aadd98c1177 100644 --- a/x-pack/plugins/maps/public/classes/styles/color_palettes.ts +++ b/x-pack/plugins/maps/public/classes/styles/color_palettes.ts @@ -129,7 +129,7 @@ export function getColorRampCenterColor(colorPaletteId: string): string | null { // Returns an array of color stops // [ stop_input_1: number, stop_output_1: color, stop_input_n: number, stop_output_n: color ] export function getOrdinalMbColorRampStops( - colorPaletteId: string, + colorPaletteId: string | null, min: number, max: number ): Array | null { diff --git a/x-pack/plugins/maps/public/classes/styles/vector/components/legend/breaked_legend.tsx b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/breaked_legend.tsx index 9d5bf85005ae1..8eca89e31cf7a 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/components/legend/breaked_legend.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/breaked_legend.tsx @@ -14,8 +14,8 @@ const EMPTY_VALUE = ''; interface Break { color: string; - label: ReactElement | string; - symbolId: string; + label: ReactElement | string | number; + symbolId?: string; } interface Props { diff --git a/x-pack/plugins/maps/public/classes/styles/vector/components/legend/category.tsx b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/category.tsx index 02ca4645dd8cd..4a71eb982d4d7 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/components/legend/category.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/category.tsx @@ -11,11 +11,11 @@ import { VectorIcon } from './vector_icon'; interface Props { styleName: VECTOR_STYLES; - label: ReactElement | string; + label: ReactElement | string | number; color: string; isLinesOnly: boolean; isPointsOnly: boolean; - symbolId: string; + symbolId?: string; } export function Category({ styleName, label, color, isLinesOnly, isPointsOnly, symbolId }: Props) { diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/__snapshots__/dynamic_color_property.test.js.snap b/x-pack/plugins/maps/public/classes/styles/vector/properties/__snapshots__/dynamic_color_property.test.tsx.snap similarity index 93% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/__snapshots__/dynamic_color_property.test.js.snap rename to x-pack/plugins/maps/public/classes/styles/vector/properties/__snapshots__/dynamic_color_property.test.tsx.snap index 402eab355406b..c722e86512e52 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/__snapshots__/dynamic_color_property.test.js.snap +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/__snapshots__/dynamic_color_property.test.tsx.snap @@ -121,6 +121,17 @@ exports[`ordinal Should render custom ordinal legend with breaks 1`] = ` > + + + + + + ({ import React from 'react'; import { shallow } from 'enzyme'; +import { Feature, Point } from 'geojson'; import { DynamicColorProperty } from './dynamic_color_property'; import { COLOR_MAP_TYPE, VECTOR_STYLES } from '../../../../../common/constants'; import { mockField, MockLayer, MockStyle } from './__tests__/test_util'; +import { ColorDynamicOptions } from '../../../../../common/descriptor_types'; +import { IVectorLayer } from '../../../layers/vector_layer/vector_layer'; +import { IField } from '../../../fields/field'; -const makeProperty = (options, mockStyle, field = mockField) => { +const makeProperty = (options: ColorDynamicOptions, style?: MockStyle, field?: IField) => { return new DynamicColorProperty( options, VECTOR_STYLES.LINE_COLOR, - field, - new MockLayer(mockStyle), + field ? field : mockField, + (new MockLayer(style ? style : new MockStyle()) as unknown) as IVectorLayer, () => { - return (x) => x + '_format'; + return (value: string | number | undefined) => value + '_format'; } ); }; @@ -35,11 +39,14 @@ const defaultLegendParams = { isLinesOnly: false, }; +const fieldMetaOptions = { isEnabled: true }; + describe('ordinal', () => { test('Should render ordinal legend as bands', async () => { const colorStyle = makeProperty({ color: 'Blues', type: undefined, + fieldMetaOptions, }); const legendRow = colorStyle.renderLegendDetailRow(defaultLegendParams); @@ -59,6 +66,7 @@ describe('ordinal', () => { { color: 'Blues', type: undefined, + fieldMetaOptions, }, new MockStyle({ min: 100, max: 100 }) ); @@ -89,6 +97,7 @@ describe('ordinal', () => { color: '#00FF00', }, ], + fieldMetaOptions, }); const legendRow = colorStyle.renderLegendDetailRow(defaultLegendParams); @@ -110,6 +119,7 @@ describe('categorical', () => { type: COLOR_MAP_TYPE.CATEGORICAL, useCustomColorPalette: false, colorCategory: 'palette_0', + fieldMetaOptions, }); const legendRow = colorStyle.renderLegendDetailRow(defaultLegendParams); @@ -130,7 +140,7 @@ describe('categorical', () => { useCustomColorPalette: true, customColorPalette: [ { - stop: null, //should include the default stop + stop: null, // should include the default stop color: '#FFFF00', }, { @@ -142,6 +152,7 @@ describe('categorical', () => { color: '#00FF00', }, ], + fieldMetaOptions, }); const legendRow = colorStyle.renderLegendDetailRow(defaultLegendParams); @@ -152,14 +163,18 @@ describe('categorical', () => { }); }); -function makeFeatures(foobarPropValues) { - return foobarPropValues.map((value) => { +function makeFeatures(foobarPropValues: string[]) { + return foobarPropValues.map((value: string) => { return { type: 'Feature', + geometry: { + type: 'Point', + coordinates: [-10, 0], + } as Point, properties: { foobar: value, }, - }; + } as Feature; }); } @@ -167,6 +182,7 @@ test('Should pluck the categorical style-meta', async () => { const colorStyle = makeProperty({ type: COLOR_MAP_TYPE.CATEGORICAL, colorCategory: 'palette_0', + fieldMetaOptions, }); const features = makeFeatures(['CN', 'CN', 'US', 'CN', 'US', 'IN']); @@ -185,6 +201,7 @@ test('Should pluck the categorical style-meta from fieldmeta', async () => { const colorStyle = makeProperty({ type: COLOR_MAP_TYPE.CATEGORICAL, colorCategory: 'palette_0', + fieldMetaOptions, }); const meta = colorStyle._pluckCategoricalStyleMetaFromFieldMetaData({ @@ -210,25 +227,27 @@ test('Should pluck the categorical style-meta from fieldmeta', async () => { }); describe('supportsFieldMeta', () => { - test('should support it when field does for ordinals', () => { + test('should support fieldMeta when ordinal field supports fieldMeta', () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.ORDINAL, + fieldMetaOptions, }; const styleProp = makeProperty(dynamicStyleOptions); expect(styleProp.supportsFieldMeta()).toEqual(true); }); - test('should support it when field does for categories', () => { + test('should support fieldMeta when categorical field supports fieldMeta', () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.CATEGORICAL, + fieldMetaOptions, }; const styleProp = makeProperty(dynamicStyleOptions); expect(styleProp.supportsFieldMeta()).toEqual(true); }); - test('should not support it when field does not', () => { + test('should not support fieldMeta when field does not support fieldMeta', () => { const field = Object.create(mockField); field.supportsFieldMeta = function () { return false; @@ -236,37 +255,50 @@ describe('supportsFieldMeta', () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.ORDINAL, + fieldMetaOptions, }; const styleProp = makeProperty(dynamicStyleOptions, undefined, field); expect(styleProp.supportsFieldMeta()).toEqual(false); }); - test('should not support it when field config not complete', () => { + test('should not support fieldMeta when field is not provided', () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.ORDINAL, + fieldMetaOptions, }; - const styleProp = makeProperty(dynamicStyleOptions, undefined, null); + + const styleProp = new DynamicColorProperty( + dynamicStyleOptions, + VECTOR_STYLES.LINE_COLOR, + null, + (new MockLayer(new MockStyle()) as unknown) as IVectorLayer, + () => { + return (value: string | number | undefined) => value + '_format'; + } + ); expect(styleProp.supportsFieldMeta()).toEqual(false); }); - test('should not support it when using custom ramp for ordinals', () => { + test('should not support fieldMeta when using custom ramp for ordinal field', () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.ORDINAL, useCustomColorRamp: true, customColorRamp: [], + fieldMetaOptions, }; const styleProp = makeProperty(dynamicStyleOptions); expect(styleProp.supportsFieldMeta()).toEqual(false); }); - test('should not support it when using custom palette for categories', () => { + test('should not support fieldMeta when using custom palette for categorical field', () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.CATEGORICAL, useCustomColorPalette: true, customColorPalette: [], + fieldMetaOptions, }; const styleProp = makeProperty(dynamicStyleOptions); @@ -279,6 +311,7 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { test('should return null when field is not provided', async () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.ORDINAL, + fieldMetaOptions, }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toBeNull(); @@ -288,7 +321,9 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.ORDINAL, field: {}, + fieldMetaOptions, }; + // @ts-expect-error - test is verifing behavior when field is invalid. const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toBeNull(); }); @@ -297,6 +332,7 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { test('should return null when color ramp is not provided', async () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.ORDINAL, + fieldMetaOptions, }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toBeNull(); @@ -305,6 +341,7 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.ORDINAL, color: 'Blues', + fieldMetaOptions, }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toEqual([ @@ -343,19 +380,11 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { }); describe('custom color ramp', () => { - const dynamicStyleOptions = { - type: COLOR_MAP_TYPE.ORDINAL, - useCustomColorRamp: true, - customColorRamp: [ - { stop: 10, color: '#f7faff' }, - { stop: 100, color: '#072f6b' }, - ], - }; - test('should return null when customColorRamp is not provided', async () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.ORDINAL, useCustomColorRamp: true, + fieldMetaOptions, }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toBeNull(); @@ -366,12 +395,22 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { type: COLOR_MAP_TYPE.ORDINAL, useCustomColorRamp: true, customColorRamp: [], + fieldMetaOptions, }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toBeNull(); }); test('should use `feature-state` by default', async () => { + const dynamicStyleOptions = { + type: COLOR_MAP_TYPE.ORDINAL, + useCustomColorRamp: true, + customColorRamp: [ + { stop: 10, color: '#f7faff' }, + { stop: 100, color: '#072f6b' }, + ], + fieldMetaOptions, + }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toEqual([ 'step', @@ -389,6 +428,15 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { field.canReadFromGeoJson = function () { return false; }; + const dynamicStyleOptions = { + type: COLOR_MAP_TYPE.ORDINAL, + useCustomColorRamp: true, + customColorRamp: [ + { stop: 10, color: '#f7faff' }, + { stop: 100, color: '#072f6b' }, + ], + fieldMetaOptions, + }; const colorProperty = makeProperty(dynamicStyleOptions, undefined, field); expect(colorProperty._getMbColor()).toEqual([ 'step', @@ -407,6 +455,7 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { test('should return null when field is not provided', async () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.CATEGORICAL, + fieldMetaOptions, }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toBeNull(); @@ -416,7 +465,9 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.CATEGORICAL, field: {}, + fieldMetaOptions, }; + // @ts-expect-error - test is verifing behavior when field is invalid. const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toBeNull(); }); @@ -425,6 +476,7 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { test('should return null when color palette is not provided', async () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.CATEGORICAL, + fieldMetaOptions, }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toBeNull(); @@ -434,6 +486,7 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.CATEGORICAL, colorCategory: 'palette_0', + fieldMetaOptions, }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toEqual([ @@ -453,6 +506,7 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { const dynamicStyleOptions = { type: COLOR_MAP_TYPE.CATEGORICAL, useCustomColorPalette: true, + fieldMetaOptions, }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toBeNull(); @@ -463,6 +517,7 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { type: COLOR_MAP_TYPE.CATEGORICAL, useCustomColorPalette: true, customColorPalette: [], + fieldMetaOptions, }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toBeNull(); @@ -476,6 +531,7 @@ describe('get mapbox color expression (via internal _getMbColor)', () => { { stop: null, color: '#f7faff' }, { stop: 'MX', color: '#072f6b' }, ], + fieldMetaOptions, }; const colorProperty = makeProperty(dynamicStyleOptions); expect(colorProperty._getMbColor()).toEqual([ @@ -494,6 +550,7 @@ test('isCategorical should return true when type is categorical', async () => { const categoricalColorStyle = makeProperty({ type: COLOR_MAP_TYPE.CATEGORICAL, colorCategory: 'palette_0', + fieldMetaOptions, }); expect(categoricalColorStyle.isOrdinal()).toEqual(false); @@ -504,6 +561,7 @@ test('isOrdinal should return true when type is ordinal', async () => { const ordinalColorStyle = makeProperty({ type: undefined, color: 'Blues', + fieldMetaOptions, }); expect(ordinalColorStyle.isOrdinal()).toEqual(true); @@ -514,6 +572,7 @@ test('Should read out ordinal type correctly', async () => { const ordinalColorStyle2 = makeProperty({ type: COLOR_MAP_TYPE.ORDINAL, colorCategory: 'palette_0', + fieldMetaOptions, }); expect(ordinalColorStyle2.isOrdinal()).toEqual(true); diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.tsx similarity index 79% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.tsx index e643abcaf8d54..faecf51d4ced5 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.tsx @@ -4,69 +4,73 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Map as MbMap } from 'mapbox-gl'; +import React from 'react'; +import { EuiTextColor } from '@elastic/eui'; import { DynamicStyleProperty } from './dynamic_style_property'; import { makeMbClampedNumberExpression, dynamicRound } from '../style_util'; import { getOrdinalMbColorRampStops, getColorPalette } from '../../color_palettes'; -import React from 'react'; import { COLOR_MAP_TYPE } from '../../../../../common/constants'; import { isCategoricalStopsInvalid, getOtherCategoryLabel, + // @ts-expect-error } from '../components/color/color_stops_utils'; import { BreakedLegend } from '../components/legend/breaked_legend'; -import { EuiTextColor } from '@elastic/eui'; +import { ColorDynamicOptions, OrdinalColorStop } from '../../../../../common/descriptor_types'; +import { LegendProps } from './style_property'; const EMPTY_STOPS = { stops: [], defaultColor: null }; const RGBA_0000 = 'rgba(0,0,0,0)'; -export class DynamicColorProperty extends DynamicStyleProperty { - syncCircleColorWithMb(mbLayerId, mbMap, alpha) { +export class DynamicColorProperty extends DynamicStyleProperty { + syncCircleColorWithMb(mbLayerId: string, mbMap: MbMap, alpha: number) { const color = this._getMbColor(); mbMap.setPaintProperty(mbLayerId, 'circle-color', color); mbMap.setPaintProperty(mbLayerId, 'circle-opacity', alpha); } - syncIconColorWithMb(mbLayerId, mbMap) { + syncIconColorWithMb(mbLayerId: string, mbMap: MbMap) { const color = this._getMbColor(); mbMap.setPaintProperty(mbLayerId, 'icon-color', color); } - syncHaloBorderColorWithMb(mbLayerId, mbMap) { + syncHaloBorderColorWithMb(mbLayerId: string, mbMap: MbMap) { const color = this._getMbColor(); mbMap.setPaintProperty(mbLayerId, 'icon-halo-color', color); } - syncCircleStrokeWithMb(pointLayerId, mbMap, alpha) { + syncCircleStrokeWithMb(pointLayerId: string, mbMap: MbMap, alpha: number) { const color = this._getMbColor(); mbMap.setPaintProperty(pointLayerId, 'circle-stroke-color', color); mbMap.setPaintProperty(pointLayerId, 'circle-stroke-opacity', alpha); } - syncFillColorWithMb(mbLayerId, mbMap, alpha) { + syncFillColorWithMb(mbLayerId: string, mbMap: MbMap, alpha: number) { const color = this._getMbColor(); mbMap.setPaintProperty(mbLayerId, 'fill-color', color); mbMap.setPaintProperty(mbLayerId, 'fill-opacity', alpha); } - syncLineColorWithMb(mbLayerId, mbMap, alpha) { + syncLineColorWithMb(mbLayerId: string, mbMap: MbMap, alpha: number) { const color = this._getMbColor(); mbMap.setPaintProperty(mbLayerId, 'line-color', color); mbMap.setPaintProperty(mbLayerId, 'line-opacity', alpha); } - syncLabelColorWithMb(mbLayerId, mbMap, alpha) { + syncLabelColorWithMb(mbLayerId: string, mbMap: MbMap, alpha: number) { const color = this._getMbColor(); mbMap.setPaintProperty(mbLayerId, 'text-color', color); mbMap.setPaintProperty(mbLayerId, 'text-opacity', alpha); } - syncLabelBorderColorWithMb(mbLayerId, mbMap) { + syncLabelBorderColorWithMb(mbLayerId: string, mbMap: MbMap) { const color = this._getMbColor(); mbMap.setPaintProperty(mbLayerId, 'text-halo-color', color); } supportsFieldMeta() { - if (!this.isComplete() || !this._field.supportsFieldMeta()) { + if (!this.isComplete() || !this._field || !this._field.supportsFieldMeta()) { return false; } @@ -87,12 +91,16 @@ export class DynamicColorProperty extends DynamicStyleProperty { } getNumberOfCategories() { + if (!this._options.colorCategory) { + return 0; + } + const colors = getColorPalette(this._options.colorCategory); return colors ? colors.length : 0; } _getMbColor() { - if (!this._field || !this._field.getName()) { + if (!this.getFieldName()) { return null; } @@ -102,17 +110,20 @@ export class DynamicColorProperty extends DynamicStyleProperty { } _getOrdinalColorMbExpression() { - const targetName = this._field.getName(); + const targetName = this.getFieldName(); if (this._options.useCustomColorRamp) { if (!this._options.customColorRamp || !this._options.customColorRamp.length) { // custom color ramp config is not complete return null; } - const colorStops = this._options.customColorRamp.reduce((accumulatedStops, nextStop) => { - return [...accumulatedStops, nextStop.stop, nextStop.color]; - }, []); - const firstStopValue = colorStops[0]; + const colorStops: Array = this._options.customColorRamp.reduce( + (accumulatedStops: Array, nextStop: OrdinalColorStop) => { + return [...accumulatedStops, nextStop.stop, nextStop.color]; + }, + [] + ); + const firstStopValue = colorStops[0] as number; const lessThanFirstStopValue = firstStopValue - 1; return [ 'step', @@ -127,7 +138,7 @@ export class DynamicColorProperty extends DynamicStyleProperty { } const colorStops = getOrdinalMbColorRampStops( - this._options.color, + this._options.color ? this._options.color : null, rangeFieldMeta.min, rangeFieldMeta.max ); @@ -179,7 +190,9 @@ export class DynamicColorProperty extends DynamicStyleProperty { return EMPTY_STOPS; } - const colors = getColorPalette(this._options.colorCategory); + const colors = this._options.colorCategory + ? getColorPalette(this._options.colorCategory) + : null; if (!colors) { return EMPTY_STOPS; } @@ -209,7 +222,7 @@ export class DynamicColorProperty extends DynamicStyleProperty { const { stops, defaultColor } = this._getColorPaletteStops(); if (stops.length < 1) { - //occurs when no data + // occurs when no data return null; } @@ -225,8 +238,8 @@ export class DynamicColorProperty extends DynamicStyleProperty { mbStops.push(stop.color); } - mbStops.push(defaultColor); //last color is default color - return ['match', ['to-string', ['get', this._field.getName()]], ...mbStops]; + mbStops.push(defaultColor); // last color is default color + return ['match', ['to-string', ['get', this.getFieldName()]], ...mbStops]; } _getColorRampStops() { @@ -246,7 +259,7 @@ export class DynamicColorProperty extends DynamicStyleProperty { const colors = getColorPalette(this._options.color); if (rangeFieldMeta.delta === 0) { - //map to last color. + // map to last color. return [ { color: colors[colors.length - 1], @@ -277,11 +290,11 @@ export class DynamicColorProperty extends DynamicStyleProperty { } } - renderLegendDetailRow({ isPointsOnly, isLinesOnly, symbolId }) { + renderLegendDetailRow({ isPointsOnly, isLinesOnly, symbolId }: LegendProps) { const { stops, defaultColor } = this._getColorStops(); const breaks = []; - stops.forEach(({ stop, color }) => { - if (stop) { + stops.forEach(({ stop, color }: { stop: string | number | null; color: string }) => { + if (stop !== null) { breaks.push({ color, symbolId, diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.test.tsx b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.test.tsx index c60547f3606c5..db44ae0da562d 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.test.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.test.tsx @@ -18,31 +18,52 @@ import { shallow } from 'enzyme'; import { DynamicSizeProperty } from './dynamic_size_property'; import { VECTOR_STYLES } from '../../../../../common/constants'; import { IField } from '../../../fields/field'; -import { MockMbMap } from './__tests__/test_util'; - +import { Map as MbMap } from 'mapbox-gl'; +import { SizeDynamicOptions } from '../../../../../common/descriptor_types'; import { mockField, MockLayer, MockStyle } from './__tests__/test_util'; +import { IVectorLayer } from '../../../layers/vector_layer/vector_layer'; + +export class MockMbMap { + _paintPropertyCalls: unknown[]; + + constructor() { + this._paintPropertyCalls = []; + } + setPaintProperty(...args: unknown[]) { + this._paintPropertyCalls.push([...args]); + } -const makeProperty = (options: object, mockStyle: MockStyle, field: IField = mockField) => { + getPaintPropertyCalls(): unknown[] { + return this._paintPropertyCalls; + } +} + +const makeProperty = ( + options: SizeDynamicOptions, + mockStyle: MockStyle, + field: IField = mockField +) => { return new DynamicSizeProperty( options, VECTOR_STYLES.ICON_SIZE, field, - new MockLayer(mockStyle), + (new MockLayer(mockStyle) as unknown) as IVectorLayer, () => { - return (x: string) => x + '_format'; - } + return (value: string | number | undefined) => value + '_format'; + }, + false ); }; -const defaultLegendParams = { - isPointsOnly: true, - isLinesOnly: false, -}; +const fieldMetaOptions = { isEnabled: true }; describe('renderLegendDetailRow', () => { test('Should render as range', async () => { - const sizeProp = makeProperty({}, new MockStyle({ min: 0, max: 100 })); - const legendRow = sizeProp.renderLegendDetailRow(defaultLegendParams); + const sizeProp = makeProperty( + { minSize: 0, maxSize: 10, fieldMetaOptions }, + new MockStyle({ min: 0, max: 100 }) + ); + const legendRow = sizeProp.renderLegendDetailRow(); const component = shallow(legendRow); // Ensure all promises resolve @@ -55,11 +76,15 @@ describe('renderLegendDetailRow', () => { describe('syncSize', () => { test('Should sync with circle-radius prop', async () => { - const sizeProp = makeProperty({ minSize: 8, maxSize: 32 }, new MockStyle({ min: 0, max: 100 })); - const mockMbMap = new MockMbMap(); + const sizeProp = makeProperty( + { minSize: 8, maxSize: 32, fieldMetaOptions }, + new MockStyle({ min: 0, max: 100 }) + ); + const mockMbMap = (new MockMbMap() as unknown) as MbMap; sizeProp.syncCircleRadiusWithMb('foobar', mockMbMap); + // @ts-expect-error expect(mockMbMap.getPaintPropertyCalls()).toEqual([ [ 'foobar', @@ -88,13 +113,14 @@ describe('syncSize', () => { test('Should truncate interpolate expression to max when no delta', async () => { const sizeProp = makeProperty( - { minSize: 8, maxSize: 32 }, + { minSize: 8, maxSize: 32, fieldMetaOptions }, new MockStyle({ min: 100, max: 100 }) ); - const mockMbMap = new MockMbMap(); + const mockMbMap = (new MockMbMap() as unknown) as MbMap; sizeProp.syncCircleRadiusWithMb('foobar', mockMbMap); + // @ts-expect-error expect(mockMbMap.getPaintPropertyCalls()).toEqual([ [ 'foobar', diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.tsx similarity index 72% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.tsx index 83bd4b70ba5c3..35c830f3cb5e3 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.tsx @@ -4,20 +4,34 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DynamicStyleProperty } from './dynamic_style_property'; +import _ from 'lodash'; +import React from 'react'; +import { Map as MbMap } from 'mapbox-gl'; +import { DynamicStyleProperty, FieldFormatter } from './dynamic_style_property'; import { OrdinalLegend } from '../components/legend/ordinal_legend'; import { makeMbClampedNumberExpression } from '../style_util'; import { HALF_LARGE_MAKI_ICON_SIZE, LARGE_MAKI_ICON_SIZE, SMALL_MAKI_ICON_SIZE, + // @ts-expect-error } from '../symbol_utils'; import { MB_LOOKUP_FUNCTION, VECTOR_STYLES } from '../../../../../common/constants'; -import _ from 'lodash'; -import React from 'react'; - -export class DynamicSizeProperty extends DynamicStyleProperty { - constructor(options, styleName, field, vectorLayer, getFieldFormatter, isSymbolizedAsIcon) { +import { SizeDynamicOptions } from '../../../../../common/descriptor_types'; +import { IField } from '../../../fields/field'; +import { IVectorLayer } from '../../../layers/vector_layer/vector_layer'; + +export class DynamicSizeProperty extends DynamicStyleProperty { + private readonly _isSymbolizedAsIcon: boolean; + + constructor( + options: SizeDynamicOptions, + styleName: VECTOR_STYLES, + field: IField | null, + vectorLayer: IVectorLayer, + getFieldFormatter: (fieldName: string) => null | FieldFormatter, + isSymbolizedAsIcon: boolean + ) { super(options, styleName, field, vectorLayer, getFieldFormatter); this._isSymbolizedAsIcon = isSymbolizedAsIcon; } @@ -36,7 +50,7 @@ export class DynamicSizeProperty extends DynamicStyleProperty { return super.supportsMbFeatureState(); } - syncHaloWidthWithMb(mbLayerId, mbMap) { + syncHaloWidthWithMb(mbLayerId: string, mbMap: MbMap) { const haloWidth = this.getMbSizeExpression(); mbMap.setPaintProperty(mbLayerId, 'icon-halo-width', haloWidth); } @@ -47,9 +61,9 @@ export class DynamicSizeProperty extends DynamicStyleProperty { : SMALL_MAKI_ICON_SIZE; } - syncIconSizeWithMb(symbolLayerId, mbMap) { + syncIconSizeWithMb(symbolLayerId: string, mbMap: MbMap) { const rangeFieldMeta = this.getRangeFieldMeta(); - if (this._isSizeDynamicConfigComplete(this._options) && rangeFieldMeta) { + if (this._isSizeDynamicConfigComplete() && rangeFieldMeta) { const halfIconPixels = this.getIconPixelSize() / 2; const targetName = this.getFieldName(); // Using property state instead of feature-state because layout properties do not support feature-state @@ -73,29 +87,29 @@ export class DynamicSizeProperty extends DynamicStyleProperty { } } - syncCircleStrokeWidthWithMb(mbLayerId, mbMap) { + syncCircleStrokeWidthWithMb(mbLayerId: string, mbMap: MbMap) { const lineWidth = this.getMbSizeExpression(); mbMap.setPaintProperty(mbLayerId, 'circle-stroke-width', lineWidth); } - syncCircleRadiusWithMb(mbLayerId, mbMap) { + syncCircleRadiusWithMb(mbLayerId: string, mbMap: MbMap) { const circleRadius = this.getMbSizeExpression(); mbMap.setPaintProperty(mbLayerId, 'circle-radius', circleRadius); } - syncLineWidthWithMb(mbLayerId, mbMap) { + syncLineWidthWithMb(mbLayerId: string, mbMap: MbMap) { const lineWidth = this.getMbSizeExpression(); mbMap.setPaintProperty(mbLayerId, 'line-width', lineWidth); } - syncLabelSizeWithMb(mbLayerId, mbMap) { + syncLabelSizeWithMb(mbLayerId: string, mbMap: MbMap) { const lineWidth = this.getMbSizeExpression(); mbMap.setLayoutProperty(mbLayerId, 'text-size', lineWidth); } getMbSizeExpression() { const rangeFieldMeta = this.getRangeFieldMeta(); - if (!this._isSizeDynamicConfigComplete(this._options) || !rangeFieldMeta) { + if (!this._isSizeDynamicConfigComplete() || !rangeFieldMeta) { return null; } @@ -108,7 +122,19 @@ export class DynamicSizeProperty extends DynamicStyleProperty { }); } - _getMbDataDrivenSize({ targetName, minSize, maxSize, minValue, maxValue }) { + _getMbDataDrivenSize({ + targetName, + minSize, + maxSize, + minValue, + maxValue, + }: { + targetName: string; + minSize: number; + maxSize: number; + minValue: number; + maxValue: number; + }) { const stops = minValue === maxValue ? [maxValue, maxSize] : [minValue, minSize, maxValue, maxSize]; return [ diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_style_property.tsx b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_style_property.tsx index 39ceb580e92b9..47659e055936e 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_style_property.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_style_property.tsx @@ -47,7 +47,7 @@ export interface IDynamicStyleProperty extends IStyleProperty { getValueSuggestions(query: string): Promise; } -type FieldFormatter = (value: string | number | undefined) => string | number; +export type FieldFormatter = (value: string | number | undefined) => string | number; export class DynamicStyleProperty extends AbstractStyleProperty implements IDynamicStyleProperty { diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.ts similarity index 80% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.ts index a7a3130875a95..d55a6e1cfb444 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.ts @@ -4,11 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Map as MbMap } from 'mapbox-gl'; import { DynamicStyleProperty } from './dynamic_style_property'; import { getComputedFieldName } from '../style_util'; +import { LabelDynamicOptions } from '../../../../../common/descriptor_types'; -export class DynamicTextProperty extends DynamicStyleProperty { - syncTextFieldWithMb(mbLayerId, mbMap) { +export class DynamicTextProperty extends DynamicStyleProperty { + syncTextFieldWithMb(mbLayerId: string, mbMap: MbMap) { if (this._field && this._field.isValid()) { // Fields that support auto-domain are normalized with a field-formatter and stored into a computed-field // Otherwise, the raw value is just carried over and no computed field is created. diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/label_border_size_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/label_border_size_property.ts similarity index 68% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/label_border_size_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/label_border_size_property.ts index 3016b15d0a05c..bda7a4584370f 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/label_border_size_property.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/label_border_size_property.ts @@ -5,15 +5,20 @@ */ import _ from 'lodash'; +import { Map as MbMap } from 'mapbox-gl'; import { AbstractStyleProperty } from './style_property'; import { DEFAULT_LABEL_SIZE } from '../vector_style_defaults'; import { LABEL_BORDER_SIZES } from '../../../../../common/constants'; +import { LabelBorderSizeOptions } from '../../../../../common/descriptor_types'; +import { VECTOR_STYLES } from '../../../../../common/constants'; +import { StaticSizeProperty } from './static_size_property'; +import { DynamicSizeProperty } from './dynamic_size_property'; const SMALL_SIZE = 1 / 16; const MEDIUM_SIZE = 1 / 8; const LARGE_SIZE = 1 / 5; // halo of 1/4 is just a square. Use smaller ratio to preserve contour on letters -function getWidthRatio(size) { +function getWidthRatio(size: LABEL_BORDER_SIZES) { switch (size) { case LABEL_BORDER_SIZES.LARGE: return LARGE_SIZE; @@ -24,13 +29,19 @@ function getWidthRatio(size) { } } -export class LabelBorderSizeProperty extends AbstractStyleProperty { - constructor(options, styleName, labelSizeProperty) { +export class LabelBorderSizeProperty extends AbstractStyleProperty { + private readonly _labelSizeProperty: StaticSizeProperty | DynamicSizeProperty; + + constructor( + options: LabelBorderSizeOptions, + styleName: VECTOR_STYLES, + labelSizeProperty: StaticSizeProperty | DynamicSizeProperty + ) { super(options, styleName); this._labelSizeProperty = labelSizeProperty; } - syncLabelBorderSizeWithMb(mbLayerId, mbMap) { + syncLabelBorderSizeWithMb(mbLayerId: string, mbMap: MbMap) { if (this.getOptions().size === LABEL_BORDER_SIZES.NONE) { mbMap.setPaintProperty(mbLayerId, 'text-halo-width', 0); return; @@ -39,7 +50,8 @@ export class LabelBorderSizeProperty extends AbstractStyleProperty { const widthRatio = getWidthRatio(this.getOptions().size); if (this._labelSizeProperty.isDynamic() && this._labelSizeProperty.isComplete()) { - const labelSizeExpression = this._labelSizeProperty.getMbSizeExpression(); + const labelSizeExpression = (this + ._labelSizeProperty as DynamicSizeProperty).getMbSizeExpression(); if (labelSizeExpression) { mbMap.setPaintProperty(mbLayerId, 'text-halo-width', [ 'max', diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_color_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_color_property.ts similarity index 63% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/static_color_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_color_property.ts index ebe2a322711fc..45d25565b6f23 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_color_property.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_color_property.ts @@ -4,43 +4,45 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Map as MbMap } from 'mapbox-gl'; import { StaticStyleProperty } from './static_style_property'; +import { ColorStaticOptions } from '../../../../../common/descriptor_types'; -export class StaticColorProperty extends StaticStyleProperty { - syncCircleColorWithMb(mbLayerId, mbMap, alpha) { +export class StaticColorProperty extends StaticStyleProperty { + syncCircleColorWithMb(mbLayerId: string, mbMap: MbMap, alpha: number) { mbMap.setPaintProperty(mbLayerId, 'circle-color', this._options.color); mbMap.setPaintProperty(mbLayerId, 'circle-opacity', alpha); } - syncFillColorWithMb(mbLayerId, mbMap, alpha) { + syncFillColorWithMb(mbLayerId: string, mbMap: MbMap, alpha: number) { mbMap.setPaintProperty(mbLayerId, 'fill-color', this._options.color); mbMap.setPaintProperty(mbLayerId, 'fill-opacity', alpha); } - syncIconColorWithMb(mbLayerId, mbMap) { + syncIconColorWithMb(mbLayerId: string, mbMap: MbMap) { mbMap.setPaintProperty(mbLayerId, 'icon-color', this._options.color); } - syncHaloBorderColorWithMb(mbLayerId, mbMap) { + syncHaloBorderColorWithMb(mbLayerId: string, mbMap: MbMap) { mbMap.setPaintProperty(mbLayerId, 'icon-halo-color', this._options.color); } - syncLineColorWithMb(mbLayerId, mbMap, alpha) { + syncLineColorWithMb(mbLayerId: string, mbMap: MbMap, alpha: number) { mbMap.setPaintProperty(mbLayerId, 'line-color', this._options.color); mbMap.setPaintProperty(mbLayerId, 'line-opacity', alpha); } - syncCircleStrokeWithMb(mbLayerId, mbMap, alpha) { + syncCircleStrokeWithMb(mbLayerId: string, mbMap: MbMap, alpha: number) { mbMap.setPaintProperty(mbLayerId, 'circle-stroke-color', this._options.color); mbMap.setPaintProperty(mbLayerId, 'circle-stroke-opacity', alpha); } - syncLabelColorWithMb(mbLayerId, mbMap, alpha) { + syncLabelColorWithMb(mbLayerId: string, mbMap: MbMap, alpha: number) { mbMap.setPaintProperty(mbLayerId, 'text-color', this._options.color); mbMap.setPaintProperty(mbLayerId, 'text-opacity', alpha); } - syncLabelBorderColorWithMb(mbLayerId, mbMap) { + syncLabelBorderColorWithMb(mbLayerId: string, mbMap: MbMap) { mbMap.setPaintProperty(mbLayerId, 'text-halo-color', this._options.color); } } diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_icon_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_icon_property.ts similarity index 67% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/static_icon_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_icon_property.ts index 3b5be083dd3c9..58c569e8132d6 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_icon_property.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_icon_property.ts @@ -4,11 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Map as MbMap } from 'mapbox-gl'; import { StaticStyleProperty } from './static_style_property'; +// @ts-expect-error import { getMakiSymbolAnchor, getMakiIconId } from '../symbol_utils'; +import { IconStaticOptions } from '../../../../../common/descriptor_types'; -export class StaticIconProperty extends StaticStyleProperty { - syncIconWithMb(symbolLayerId, mbMap, iconPixelSize) { +export class StaticIconProperty extends StaticStyleProperty { + syncIconWithMb(symbolLayerId: string, mbMap: MbMap, iconPixelSize: number) { const symbolId = this._options.value; mbMap.setLayoutProperty(symbolLayerId, 'icon-anchor', getMakiSymbolAnchor(symbolId)); mbMap.setLayoutProperty(symbolLayerId, 'icon-image', getMakiIconId(symbolId, iconPixelSize)); diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_orientation_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_orientation_property.ts similarity index 62% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/static_orientation_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_orientation_property.ts index 0c8cae10d6189..388cfbd645468 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_orientation_property.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_orientation_property.ts @@ -4,10 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Map as MbMap } from 'mapbox-gl'; import { StaticStyleProperty } from './static_style_property'; +import { VECTOR_STYLES } from '../../../../../common/constants'; +import { OrientationStaticOptions } from '../../../../../common/descriptor_types'; -export class StaticOrientationProperty extends StaticStyleProperty { - constructor(options, styleName) { +export class StaticOrientationProperty extends StaticStyleProperty { + constructor(options: OrientationStaticOptions, styleName: VECTOR_STYLES) { if (typeof options.orientation !== 'number') { super({ orientation: 0 }, styleName); } else { @@ -15,7 +18,7 @@ export class StaticOrientationProperty extends StaticStyleProperty { } } - syncIconRotationWithMb(symbolLayerId, mbMap) { + syncIconRotationWithMb(symbolLayerId: string, mbMap: MbMap) { mbMap.setLayoutProperty(symbolLayerId, 'icon-rotate', this._options.orientation); } } diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_size_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_size_property.ts similarity index 65% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/static_size_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_size_property.ts index d86556c6218cf..c9ee64ca56647 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_size_property.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_size_property.ts @@ -4,15 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Map as MbMap } from 'mapbox-gl'; import { StaticStyleProperty } from './static_style_property'; +import { VECTOR_STYLES } from '../../../../../common/constants'; import { HALF_LARGE_MAKI_ICON_SIZE, LARGE_MAKI_ICON_SIZE, SMALL_MAKI_ICON_SIZE, + // @ts-expect-error } from '../symbol_utils'; +import { SizeStaticOptions } from '../../../../../common/descriptor_types'; -export class StaticSizeProperty extends StaticStyleProperty { - constructor(options, styleName) { +export class StaticSizeProperty extends StaticStyleProperty { + constructor(options: SizeStaticOptions, styleName: VECTOR_STYLES) { if (typeof options.size !== 'number') { super({ size: 1 }, styleName); } else { @@ -20,7 +24,7 @@ export class StaticSizeProperty extends StaticStyleProperty { } } - syncHaloWidthWithMb(mbLayerId, mbMap) { + syncHaloWidthWithMb(mbLayerId: string, mbMap: MbMap) { mbMap.setPaintProperty(mbLayerId, 'icon-halo-width', this._options.size); } @@ -30,12 +34,12 @@ export class StaticSizeProperty extends StaticStyleProperty { : SMALL_MAKI_ICON_SIZE; } - syncIconSizeWithMb(symbolLayerId, mbMap) { + syncIconSizeWithMb(symbolLayerId: string, mbMap: MbMap) { const halfIconPixels = this.getIconPixelSize() / 2; mbMap.setLayoutProperty(symbolLayerId, 'icon-size', this._options.size / halfIconPixels); } - syncCircleStrokeWidthWithMb(mbLayerId, mbMap, hasNoRadius) { + syncCircleStrokeWidthWithMb(mbLayerId: string, mbMap: MbMap, hasNoRadius: boolean) { if (hasNoRadius) { mbMap.setPaintProperty(mbLayerId, 'circle-stroke-width', 0); } else { @@ -43,15 +47,15 @@ export class StaticSizeProperty extends StaticStyleProperty { } } - syncCircleRadiusWithMb(mbLayerId, mbMap) { + syncCircleRadiusWithMb(mbLayerId: string, mbMap: MbMap) { mbMap.setPaintProperty(mbLayerId, 'circle-radius', this._options.size); } - syncLineWidthWithMb(mbLayerId, mbMap) { + syncLineWidthWithMb(mbLayerId: string, mbMap: MbMap) { mbMap.setPaintProperty(mbLayerId, 'line-width', this._options.size); } - syncLabelSizeWithMb(mbLayerId, mbMap) { + syncLabelSizeWithMb(mbLayerId: string, mbMap: MbMap) { mbMap.setLayoutProperty(mbLayerId, 'text-size', this._options.size); } } diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_style_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_style_property.ts similarity index 84% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/static_style_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_style_property.ts index a02aa15e28b28..ea39f4fa06a78 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_style_property.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_style_property.ts @@ -7,6 +7,6 @@ import { AbstractStyleProperty } from './style_property'; import { STYLE_TYPE } from '../../../../../common/constants'; -export class StaticStyleProperty extends AbstractStyleProperty { +export class StaticStyleProperty extends AbstractStyleProperty { static type = STYLE_TYPE.STATIC; } diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_text_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_text_property.ts similarity index 69% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/static_text_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_text_property.ts index 7a4a4672152c0..e24e7553d0b38 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/static_text_property.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_text_property.ts @@ -4,14 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Map as MbMap } from 'mapbox-gl'; import { StaticStyleProperty } from './static_style_property'; +import { LabelStaticOptions } from '../../../../../common/descriptor_types'; -export class StaticTextProperty extends StaticStyleProperty { +export class StaticTextProperty extends StaticStyleProperty { isComplete() { return this.getOptions().value.length > 0; } - syncTextFieldWithMb(mbLayerId, mbMap) { + syncTextFieldWithMb(mbLayerId: string, mbMap: MbMap) { if (this.getOptions().value.length) { mbMap.setLayoutProperty(mbLayerId, 'text-field', this.getOptions().value); } else { diff --git a/x-pack/plugins/maps/public/classes/styles/vector/properties/symbolize_as_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/symbolize_as_property.ts similarity index 74% rename from x-pack/plugins/maps/public/classes/styles/vector/properties/symbolize_as_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/symbolize_as_property.ts index 9ae1ef5054e30..8bfc06a1c7fa9 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/properties/symbolize_as_property.js +++ b/x-pack/plugins/maps/public/classes/styles/vector/properties/symbolize_as_property.ts @@ -6,12 +6,9 @@ import { AbstractStyleProperty } from './style_property'; import { SYMBOLIZE_AS_TYPES } from '../../../../../common/constants'; +import { SymbolizeAsOptions } from '../../../../../common/descriptor_types'; -export class SymbolizeAsProperty extends AbstractStyleProperty { - constructor(options, styleName) { - super(options, styleName); - } - +export class SymbolizeAsProperty extends AbstractStyleProperty { isSymbolizedAsIcon = () => { return this.getOptions().value === SYMBOLIZE_AS_TYPES.ICON; }; From 7e55da56deee6ee4339b13ff8eda060f0802a2ef Mon Sep 17 00:00:00 2001 From: Fabien Baligand Date: Mon, 10 Aug 2020 19:24:28 +0200 Subject: [PATCH 027/113] [visualizations] Add i18n translation for 'No results found' (#74619) --- src/plugins/vis_type_vislib/public/vislib/errors.ts | 7 ++++++- .../public/components/visualization_noresults.tsx | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/plugins/vis_type_vislib/public/vislib/errors.ts b/src/plugins/vis_type_vislib/public/vislib/errors.ts index c2965e8165759..b047d0900cd48 100644 --- a/src/plugins/vis_type_vislib/public/vislib/errors.ts +++ b/src/plugins/vis_type_vislib/public/vislib/errors.ts @@ -19,6 +19,7 @@ /* eslint-disable max-classes-per-file */ +import { i18n } from '@kbn/i18n'; import { KbnError } from '../../../kibana_utils/public'; export class VislibError extends KbnError { @@ -51,6 +52,10 @@ export class PieContainsAllZeros extends VislibError { export class NoResults extends VislibError { constructor() { - super('No results found'); + super( + i18n.translate('visTypeVislib.vislib.errors.noResultsFoundTitle', { + defaultMessage: 'No results found', + }) + ); } } diff --git a/src/plugins/visualizations/public/components/visualization_noresults.tsx b/src/plugins/visualizations/public/components/visualization_noresults.tsx index 1b45463f1d2ef..c77ef4490a4b3 100644 --- a/src/plugins/visualizations/public/components/visualization_noresults.tsx +++ b/src/plugins/visualizations/public/components/visualization_noresults.tsx @@ -18,6 +18,7 @@ */ import { EuiIcon, EuiSpacer, EuiText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import React from 'react'; interface VisualizationNoResultsProps { @@ -37,7 +38,11 @@ export class VisualizationNoResults extends React.Component -

No results found

+

+ {i18n.translate('visualizations.noResultsFoundTitle', { + defaultMessage: 'No results found', + })} +

From 697cd6412e40a69ce72080c048d557430694f11b Mon Sep 17 00:00:00 2001 From: Constance Date: Mon, 10 Aug 2020 10:37:12 -0700 Subject: [PATCH 028/113] [Enterprise Search] Update the browser/document title on plugin navigation (#74392) * Rename kibana_breadcrumbs to kibana_chrome - in anticipation of upcoming refactor where SetPageChrome now handles document title as well as Kibana breadcrumbs + cleanup exports * Add generate_title helpers - will be used by new set_chrome helper * Add setDocTitle context + behavior to set_chrome + refactor set_chrome.test.tsx: - add title tests - add SetWorkplaceSearchChrome test to increase coverage - clean up inner/outer call in favor of simpler mocks/imports - simplify isRoot tests * Update plugins to set product titles - on mount but before render * Copy feedback - change pipe separator to hyphen - to match ' - Elastic' * Add functional tests confirming that document titles updated --- test/functional/services/common/browser.ts | 8 ++ .../__mocks__/kibana_context.mock.ts | 1 + .../components/empty_states/empty_state.tsx | 4 +- .../components/empty_states/error_state.tsx | 4 +- .../components/empty_states/loading_state.tsx | 4 +- .../engine_overview/engine_overview.tsx | 4 +- .../setup_guide/setup_guide.test.tsx | 4 +- .../components/setup_guide/setup_guide.tsx | 4 +- .../public/applications/index.tsx | 2 + .../set_breadcrumbs.test.tsx | 63 -------------- .../generate_breadcrumbs.test.ts | 8 +- .../generate_breadcrumbs.ts | 0 .../kibana_chrome/generate_title.test.ts | 60 +++++++++++++ .../shared/kibana_chrome/generate_title.ts | 38 +++++++++ .../index.ts | 7 +- .../shared/kibana_chrome/set_chrome.test.tsx | 84 +++++++++++++++++++ .../set_chrome.tsx} | 15 ++-- .../components/error_state/error_state.tsx | 4 +- .../components/overview/overview.tsx | 4 +- .../setup_guide/setup_guide.test.tsx | 4 +- .../components/setup_guide/setup_guide.tsx | 4 +- .../enterprise_search/public/plugin.ts | 4 + .../app_search/engines.ts | 3 + .../app_search/setup_guide.ts | 3 + .../workplace_search/setup_guide.ts | 3 + 25 files changed, 243 insertions(+), 96 deletions(-) delete mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/set_breadcrumbs.test.tsx rename x-pack/plugins/enterprise_search/public/applications/shared/{kibana_breadcrumbs => kibana_chrome}/generate_breadcrumbs.test.ts (97%) rename x-pack/plugins/enterprise_search/public/applications/shared/{kibana_breadcrumbs => kibana_chrome}/generate_breadcrumbs.ts (100%) create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts rename x-pack/plugins/enterprise_search/public/applications/shared/{kibana_breadcrumbs => kibana_chrome}/index.ts (52%) create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.test.tsx rename x-pack/plugins/enterprise_search/public/applications/shared/{kibana_breadcrumbs/set_breadcrumbs.tsx => kibana_chrome/set_chrome.tsx} (66%) diff --git a/test/functional/services/common/browser.ts b/test/functional/services/common/browser.ts index c38ac771e4162..b0eec5e24f635 100644 --- a/test/functional/services/common/browser.ts +++ b/test/functional/services/common/browser.ts @@ -163,6 +163,14 @@ export async function BrowserProvider({ getService }: FtrProviderContext) { return currentWithoutTime; } + /** + * Gets the page/document title of the focused window/frame. + * https://www.selenium.dev/selenium/docs/api/javascript/module/selenium-webdriver/chrome_exports_Driver.html#getTitle + */ + public async getTitle() { + return await driver.getTitle(); + } + /** * Navigates the focused window/frame to a new URL. * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/chrome_exports_Driver.html#get diff --git a/x-pack/plugins/enterprise_search/public/applications/__mocks__/kibana_context.mock.ts b/x-pack/plugins/enterprise_search/public/applications/__mocks__/kibana_context.mock.ts index fcfa1b0a21f13..b1d7341d51a4c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/__mocks__/kibana_context.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/__mocks__/kibana_context.mock.ts @@ -13,5 +13,6 @@ import { httpServiceMock } from 'src/core/public/mocks'; export const mockKibanaContext = { http: httpServiceMock.createSetupContract(), setBreadcrumbs: jest.fn(), + setDocTitle: jest.fn(), enterpriseSearchUrl: 'http://localhost:3002', }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/empty_state.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/empty_state.tsx index 9bb5cd3bffdf5..d6c38629d8143 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/empty_state.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/empty_state.tsx @@ -9,7 +9,7 @@ import { EuiPage, EuiPageBody, EuiPageContent, EuiEmptyPrompt, EuiButton } from import { FormattedMessage } from '@kbn/i18n/react'; import { sendTelemetry } from '../../../shared/telemetry'; -import { SetAppSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; +import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { KibanaContext, IKibanaContext } from '../../../index'; import { EngineOverviewHeader } from '../engine_overview_header'; @@ -33,7 +33,7 @@ export const EmptyState: React.FC = () => { return ( - + diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx index 346e70d32f7b1..3753ad5433e8f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { EuiPage, EuiPageBody, EuiPageContent } from '@elastic/eui'; import { ErrorStatePrompt } from '../../../shared/error_state'; -import { SetAppSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; +import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SendAppSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; import { EngineOverviewHeader } from '../engine_overview_header'; @@ -17,7 +17,7 @@ import './empty_states.scss'; export const ErrorState: React.FC = () => { return ( - + diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/loading_state.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/loading_state.tsx index 2be917c8df096..533dca7d0ab79 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/loading_state.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/loading_state.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { EuiPage, EuiPageBody, EuiPageContent, EuiSpacer, EuiLoadingContent } from '@elastic/eui'; -import { SetAppSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; +import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { EngineOverviewHeader } from '../engine_overview_header'; import './empty_states.scss'; @@ -15,7 +15,7 @@ import './empty_states.scss'; export const LoadingState: React.FC = () => { return ( - + diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.tsx index 13d092a657d11..286c32b2a443b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.tsx @@ -16,7 +16,7 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { SetAppSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; +import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SendAppSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; import { LicenseContext, ILicenseContext, hasPlatinumLicense } from '../../../shared/licensing'; import { KibanaContext, IKibanaContext } from '../../../index'; @@ -93,7 +93,7 @@ export const EngineOverview: React.FC = () => { return ( - + diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.test.tsx index 82cc344d49632..5936b8f2d4283 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { SetAppSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; +import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SetupGuide as SetupGuideLayout } from '../../../shared/setup_guide'; import { SetupGuide } from './'; @@ -16,6 +16,6 @@ describe('SetupGuide', () => { const wrapper = shallow(); expect(wrapper.find(SetupGuideLayout)).toHaveLength(1); - expect(wrapper.find(SetBreadcrumbs)).toHaveLength(1); + expect(wrapper.find(SetPageChrome)).toHaveLength(1); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx index f899423319afc..fa55289e73e0b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx @@ -11,7 +11,7 @@ import { i18n } from '@kbn/i18n'; import { APP_SEARCH_PLUGIN } from '../../../../../common/constants'; import { SetupGuide as SetupGuideLayout } from '../../../shared/setup_guide'; -import { SetAppSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; +import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SendAppSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; import GettingStarted from '../../assets/getting_started.png'; @@ -22,7 +22,7 @@ export const SetupGuide: React.FC = () => ( standardAuthLink="https://swiftype.com/documentation/app-search/self-managed/security#standard" elasticsearchNativeAuthLink="https://swiftype.com/documentation/app-search/self-managed/security#elasticsearch-native-realm" > - diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/set_breadcrumbs.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/set_breadcrumbs.test.tsx deleted file mode 100644 index 974ca54277c51..0000000000000 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/set_breadcrumbs.test.tsx +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; - -import '../../__mocks__/react_router_history.mock'; -import { mountWithKibanaContext } from '../../__mocks__'; - -jest.mock('./generate_breadcrumbs', () => ({ appSearchBreadcrumbs: jest.fn() })); -import { appSearchBreadcrumbs, SetAppSearchBreadcrumbs } from './'; - -describe('SetAppSearchBreadcrumbs', () => { - const setBreadcrumbs = jest.fn(); - const builtBreadcrumbs = [] as any; - const appSearchBreadCrumbsInnerCall = jest.fn().mockReturnValue(builtBreadcrumbs); - const appSearchBreadCrumbsOuterCall = jest.fn().mockReturnValue(appSearchBreadCrumbsInnerCall); - (appSearchBreadcrumbs as jest.Mock).mockImplementation(appSearchBreadCrumbsOuterCall); - - afterEach(() => { - jest.clearAllMocks(); - }); - - const mountSetAppSearchBreadcrumbs = (props: any) => { - return mountWithKibanaContext(, { - http: {}, - enterpriseSearchUrl: 'http://localhost:3002', - setBreadcrumbs, - }); - }; - - describe('when isRoot is false', () => { - const subject = () => mountSetAppSearchBreadcrumbs({ text: 'Page 1', isRoot: false }); - - it('calls appSearchBreadcrumbs to build breadcrumbs, then registers them with Kibana', () => { - subject(); - - // calls appSearchBreadcrumbs to build breadcrumbs with the target page and current location - expect(appSearchBreadCrumbsInnerCall).toHaveBeenCalledWith([ - { text: 'Page 1', path: '/current-path' }, - ]); - - // then registers them with Kibana - expect(setBreadcrumbs).toHaveBeenCalledWith(builtBreadcrumbs); - }); - }); - - describe('when isRoot is true', () => { - const subject = () => mountSetAppSearchBreadcrumbs({ text: 'Page 1', isRoot: true }); - - it('calls appSearchBreadcrumbs to build breadcrumbs with an empty breadcrumb, then registers them with Kibana', () => { - subject(); - - // uses an empty bredcrumb - expect(appSearchBreadCrumbsInnerCall).toHaveBeenCalledWith([]); - - // then registers them with Kibana - expect(setBreadcrumbs).toHaveBeenCalledWith(builtBreadcrumbs); - }); - }); -}); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/generate_breadcrumbs.test.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.test.ts similarity index 97% rename from x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/generate_breadcrumbs.test.ts rename to x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.test.ts index 70aa723d62601..0f34bbb6b65bc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/generate_breadcrumbs.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.test.ts @@ -4,8 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { generateBreadcrumb } from './generate_breadcrumbs'; -import { appSearchBreadcrumbs, enterpriseSearchBreadcrumbs, workplaceSearchBreadcrumbs } from './'; +import { + generateBreadcrumb, + appSearchBreadcrumbs, + enterpriseSearchBreadcrumbs, + workplaceSearchBreadcrumbs, +} from './generate_breadcrumbs'; import { mockHistory as mockHistoryUntyped } from '../../__mocks__'; const mockHistory = mockHistoryUntyped as any; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/generate_breadcrumbs.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.ts similarity index 100% rename from x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/generate_breadcrumbs.ts rename to x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.ts diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts new file mode 100644 index 0000000000000..0c1c18b98e33e --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + generateTitle, + enterpriseSearchTitle, + appSearchTitle, + workplaceSearchTitle, +} from './generate_title'; + +describe('generateTitle', () => { + it('creates a hyphen separated string from an array of page titles', () => { + const title = generateTitle(['Curations', 'some Engine', 'App Search']); + expect(title).toEqual('Curations - some Engine - App Search'); + }); +}); + +describe('enterpriseSearchTitle', () => { + it('automatically appends the Enterprise Search product onto the pages array', () => { + const title = enterpriseSearchTitle(['Setup Guide']); + expect(title).toEqual('Setup Guide - Enterprise Search'); + }); + + it('can be mixed and matched', () => { + const title = enterpriseSearchTitle([appSearchTitle(['Some Page'])]); + expect(title).toEqual('Some Page - App Search - Enterprise Search'); + }); + + it('falls back to product name', () => { + const title = enterpriseSearchTitle(); + expect(title).toEqual('Enterprise Search'); + }); +}); + +describe('appSearchTitle', () => { + it('automatically appends the App Search product onto the pages array', () => { + const title = appSearchTitle(['Engines']); + expect(title).toEqual('Engines - App Search'); + }); + + it('falls back to product name', () => { + const title = appSearchTitle(); + expect(title).toEqual('App Search'); + }); +}); + +describe('workplaceSearchTitle', () => { + it('automatically appends the Workplace Search product onto the pages array', () => { + const title = workplaceSearchTitle(['Sources']); + expect(title).toEqual('Sources - Workplace Search'); + }); + + it('falls back to product name', () => { + const title = workplaceSearchTitle(); + expect(title).toEqual('Workplace Search'); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts new file mode 100644 index 0000000000000..706baefc00cc2 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + ENTERPRISE_SEARCH_PLUGIN, + APP_SEARCH_PLUGIN, + WORKPLACE_SEARCH_PLUGIN, +} from '../../../../common/constants'; + +/** + * Generate a document title that generally follows our breadcrumb trails + * https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.chromedoctitle.md + */ + +export type TTitle = string[]; + +/** + * Given an array of page titles, return a final formatted document title + * @param pages - e.g., ['Curations', 'some Engine', 'App Search'] + * @returns - e.g., 'Curations | some Engine | App Search' + */ +export const generateTitle = (pages: TTitle) => pages.join(' - '); + +/** + * Product-specific helpers + */ + +export const enterpriseSearchTitle = (page: TTitle = []) => + generateTitle([...page, ENTERPRISE_SEARCH_PLUGIN.NAME]); + +export const appSearchTitle = (page: TTitle = []) => + generateTitle([...page, APP_SEARCH_PLUGIN.NAME]); + +export const workplaceSearchTitle = (page: TTitle = []) => + generateTitle([...page, WORKPLACE_SEARCH_PLUGIN.NAME]); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/index.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/index.ts similarity index 52% rename from x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/index.ts rename to x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/index.ts index c4ef68704b7e0..4468d11ba94c9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/index.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/index.ts @@ -4,9 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { - enterpriseSearchBreadcrumbs, - appSearchBreadcrumbs, - workplaceSearchBreadcrumbs, -} from './generate_breadcrumbs'; -export { SetAppSearchBreadcrumbs, SetWorkplaceSearchBreadcrumbs } from './set_breadcrumbs'; +export { SetAppSearchChrome, SetWorkplaceSearchChrome } from './set_chrome'; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.test.tsx new file mode 100644 index 0000000000000..aba0b250e56c0 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.test.tsx @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import '../../__mocks__/react_router_history.mock'; +import { mockKibanaContext, mountWithKibanaContext } from '../../__mocks__'; + +jest.mock('./generate_breadcrumbs', () => ({ + appSearchBreadcrumbs: jest.fn(() => (crumbs: any) => crumbs), + workplaceSearchBreadcrumbs: jest.fn(() => (crumbs: any) => crumbs), +})); +import { appSearchBreadcrumbs, workplaceSearchBreadcrumbs } from './generate_breadcrumbs'; + +jest.mock('./generate_title', () => ({ + appSearchTitle: jest.fn((title: any) => title), + workplaceSearchTitle: jest.fn((title: any) => title), +})); +import { appSearchTitle, workplaceSearchTitle } from './generate_title'; + +import { SetAppSearchChrome, SetWorkplaceSearchChrome } from './'; + +describe('SetAppSearchChrome', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + afterEach(() => { + expect(appSearchBreadcrumbs).toHaveBeenCalled(); + expect(appSearchTitle).toHaveBeenCalled(); + }); + + it('sets breadcrumbs and document title', () => { + mountWithKibanaContext(); + + expect(mockKibanaContext.setBreadcrumbs).toHaveBeenCalledWith([ + { + text: 'Engines', + path: '/current-path', + }, + ]); + expect(mockKibanaContext.setDocTitle).toHaveBeenCalledWith(['Engines']); + }); + + it('sets empty breadcrumbs and document title when isRoot is true', () => { + mountWithKibanaContext(); + + expect(mockKibanaContext.setBreadcrumbs).toHaveBeenCalledWith([]); + expect(mockKibanaContext.setDocTitle).toHaveBeenCalledWith([]); + }); +}); + +describe('SetWorkplaceSearchChrome', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + afterEach(() => { + expect(workplaceSearchBreadcrumbs).toHaveBeenCalled(); + expect(workplaceSearchTitle).toHaveBeenCalled(); + }); + + it('sets breadcrumbs and document title', () => { + mountWithKibanaContext(); + + expect(mockKibanaContext.setBreadcrumbs).toHaveBeenCalledWith([ + { + text: 'Sources', + path: '/current-path', + }, + ]); + expect(mockKibanaContext.setDocTitle).toHaveBeenCalledWith(['Sources']); + }); + + it('sets empty breadcrumbs and document title when isRoot is true', () => { + mountWithKibanaContext(); + + expect(mockKibanaContext.setBreadcrumbs).toHaveBeenCalledWith([]); + expect(mockKibanaContext.setDocTitle).toHaveBeenCalledWith([]); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/set_breadcrumbs.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx similarity index 66% rename from x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/set_breadcrumbs.tsx rename to x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx index e54f1a12b73cb..59e83a2cb13c2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_breadcrumbs/set_breadcrumbs.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx @@ -13,9 +13,10 @@ import { workplaceSearchBreadcrumbs, TBreadcrumbs, } from './generate_breadcrumbs'; +import { appSearchTitle, workplaceSearchTitle, TTitle } from './generate_title'; /** - * Small on-mount helper for setting Kibana's chrome breadcrumbs on any App Search view + * Helpers for setting Kibana chrome (breadcrumbs, doc titles) on React view mount * @see https://github.com/elastic/kibana/blob/master/src/core/public/chrome/chrome_service.tsx */ @@ -31,27 +32,31 @@ interface IRootBreadcrumbsProps { } type TBreadcrumbsProps = IBreadcrumbsProps | IRootBreadcrumbsProps; -export const SetAppSearchBreadcrumbs: React.FC = ({ text, isRoot }) => { +export const SetAppSearchChrome: React.FC = ({ text, isRoot }) => { const history = useHistory(); - const { setBreadcrumbs } = useContext(KibanaContext) as IKibanaContext; + const { setBreadcrumbs, setDocTitle } = useContext(KibanaContext) as IKibanaContext; const crumb = isRoot ? [] : [{ text, path: history.location.pathname }]; + const title = isRoot ? [] : [text]; useEffect(() => { setBreadcrumbs(appSearchBreadcrumbs(history)(crumb as TBreadcrumbs | [])); + setDocTitle(appSearchTitle(title as TTitle | [])); }, []); return null; }; -export const SetWorkplaceSearchBreadcrumbs: React.FC = ({ text, isRoot }) => { +export const SetWorkplaceSearchChrome: React.FC = ({ text, isRoot }) => { const history = useHistory(); - const { setBreadcrumbs } = useContext(KibanaContext) as IKibanaContext; + const { setBreadcrumbs, setDocTitle } = useContext(KibanaContext) as IKibanaContext; const crumb = isRoot ? [] : [{ text, path: history.location.pathname }]; + const title = isRoot ? [] : [text]; useEffect(() => { setBreadcrumbs(workplaceSearchBreadcrumbs(history)(crumb as TBreadcrumbs | [])); + setDocTitle(workplaceSearchTitle(title as TTitle | [])); }, []); return null; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/error_state/error_state.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/error_state/error_state.tsx index a1bc17e05dc05..e1114986d2244 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/error_state/error_state.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/error_state/error_state.tsx @@ -9,14 +9,14 @@ import { EuiPage, EuiPageBody, EuiPageContent } from '@elastic/eui'; import { WORKPLACE_SEARCH_PLUGIN } from '../../../../../common/constants'; import { ErrorStatePrompt } from '../../../shared/error_state'; -import { SetWorkplaceSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; +import { SetWorkplaceSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SendWorkplaceSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; import { ViewContentHeader } from '../shared/view_content_header'; export const ErrorState: React.FC = () => { return ( - + diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.tsx index b75a2841dad9b..2c3e78b404d42 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.tsx @@ -9,7 +9,7 @@ import { EuiPage, EuiPageBody, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { useActions, useValues } from 'kea'; -import { SetWorkplaceSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; +import { SetWorkplaceSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SendWorkplaceSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; import { KibanaContext, IKibanaContext } from '../../../index'; @@ -72,7 +72,7 @@ export const Overview: React.FC = () => { return ( - + diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.test.tsx index b87c35d5a5942..73cf4b419f944 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { SetWorkplaceSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; +import { SetWorkplaceSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SetupGuide as SetupGuideLayout } from '../../../shared/setup_guide'; import { SetupGuide } from './'; @@ -16,6 +16,6 @@ describe('SetupGuide', () => { const wrapper = shallow(); expect(wrapper.find(SetupGuideLayout)).toHaveLength(1); - expect(wrapper.find(SetBreadcrumbs)).toHaveLength(1); + expect(wrapper.find(SetPageChrome)).toHaveLength(1); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.tsx index e96d114c67c5d..f9b00bdf29642 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.tsx @@ -11,7 +11,7 @@ import { i18n } from '@kbn/i18n'; import { WORKPLACE_SEARCH_PLUGIN } from '../../../../../common/constants'; import { SetupGuide as SetupGuideLayout } from '../../../shared/setup_guide'; -import { SetWorkplaceSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; +import { SetWorkplaceSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SendWorkplaceSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; import GettingStarted from '../../assets/getting_started.png'; @@ -26,7 +26,7 @@ export const SetupGuide: React.FC = () => { standardAuthLink="https://www.elastic.co/guide/en/workplace-search/current/workplace-search-security.html#standard" elasticsearchNativeAuthLink="https://www.elastic.co/guide/en/workplace-search/current/workplace-search-security.html#elasticsearch-native-realm" > - { const [coreStart] = await core.getStartServices(); + const { chrome } = coreStart; + chrome.docTitle.change(APP_SEARCH_PLUGIN.NAME); await this.setPublicUrl(config, coreStart.http); @@ -68,6 +70,8 @@ export class EnterpriseSearchPlugin implements Plugin { category: DEFAULT_APP_CATEGORIES.enterpriseSearch, mount: async (params: AppMountParameters) => { const [coreStart] = await core.getStartServices(); + const { chrome } = coreStart; + chrome.docTitle.change(WORKPLACE_SEARCH_PLUGIN.NAME); const { renderApp } = await import('./applications'); const { WorkplaceSearch } = await import('./applications/workplace_search'); diff --git a/x-pack/test/functional_enterprise_search/apps/enterprise_search/with_host_configured/app_search/engines.ts b/x-pack/test/functional_enterprise_search/apps/enterprise_search/with_host_configured/app_search/engines.ts index 1742ed443984b..85ae4d77b828f 100644 --- a/x-pack/test/functional_enterprise_search/apps/enterprise_search/with_host_configured/app_search/engines.ts +++ b/x-pack/test/functional_enterprise_search/apps/enterprise_search/with_host_configured/app_search/engines.ts @@ -52,6 +52,9 @@ export default function enterpriseSearchSetupEnginesTests({ await retry.try(async function () { const currentUrl = await browser.getCurrentUrl(); expect(currentUrl).to.contain('/app_search'); + + const documentTitle = await browser.getTitle(); + expect(documentTitle).to.contain('App Search - Elastic'); }); }); diff --git a/x-pack/test/functional_enterprise_search/apps/enterprise_search/without_host_configured/app_search/setup_guide.ts b/x-pack/test/functional_enterprise_search/apps/enterprise_search/without_host_configured/app_search/setup_guide.ts index 76a47cc4a7e10..86c35db504eab 100644 --- a/x-pack/test/functional_enterprise_search/apps/enterprise_search/without_host_configured/app_search/setup_guide.ts +++ b/x-pack/test/functional_enterprise_search/apps/enterprise_search/without_host_configured/app_search/setup_guide.ts @@ -29,6 +29,9 @@ export default function enterpriseSearchSetupGuideTests({ await retry.try(async function () { const currentUrl = await browser.getCurrentUrl(); expect(currentUrl).to.contain('/app_search/setup_guide'); + + const documentTitle = await browser.getTitle(); + expect(documentTitle).to.contain('Setup Guide - App Search - Elastic'); }); }); }); diff --git a/x-pack/test/functional_enterprise_search/apps/enterprise_search/without_host_configured/workplace_search/setup_guide.ts b/x-pack/test/functional_enterprise_search/apps/enterprise_search/without_host_configured/workplace_search/setup_guide.ts index 20145306b21c8..81d600952cd43 100644 --- a/x-pack/test/functional_enterprise_search/apps/enterprise_search/without_host_configured/workplace_search/setup_guide.ts +++ b/x-pack/test/functional_enterprise_search/apps/enterprise_search/without_host_configured/workplace_search/setup_guide.ts @@ -29,6 +29,9 @@ export default function enterpriseSearchSetupGuideTests({ await retry.try(async function () { const currentUrl = await browser.getCurrentUrl(); expect(currentUrl).to.contain('/workplace_search/setup_guide'); + + const documentTitle = await browser.getTitle(); + expect(documentTitle).to.contain('Setup Guide - Workplace Search - Elastic'); }); }); }); From 543109b6019421fb4bea9f7a3c44d5779387bca2 Mon Sep 17 00:00:00 2001 From: Sandra Gonzales Date: Mon, 10 Aug 2020 13:52:30 -0500 Subject: [PATCH 029/113] [Ingest Manager] stop creating events-* index pattern and placeholder index (#74683) * stop creating events-* index pattern and indices * add integration test to check for placeholder indices --- .../epm/kibana/index_pattern/install.ts | 7 +------ .../apis/epm/install_remove_assets.ts | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts index 69cd35f3050cd..7fe3713e186ee 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts @@ -72,7 +72,6 @@ export interface IndexPatternField { export enum IndexPatternType { logs = 'logs', metrics = 'metrics', - events = 'events', } // TODO: use a function overload and make pkgName and pkgVersion required for install/update // and not for an update removal. or separate out the functions @@ -111,11 +110,7 @@ export async function installIndexPatterns( const installedPackagesInfo = await Promise.all(installedPackagesFetchInfoPromise); // for each index pattern type, create an index pattern - const indexPatternTypes = [ - IndexPatternType.logs, - IndexPatternType.metrics, - IndexPatternType.events, - ]; + const indexPatternTypes = [IndexPatternType.logs, IndexPatternType.metrics]; indexPatternTypes.forEach(async (indexPatternType) => { // if this is an update because a package is being unisntalled (no pkgkey argument passed) and no other packages are installed, remove the index pattern if (!pkgName && installedPackages.length === 0) { diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts index 03d0b6abb4802..7fb8b0a2b1708 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts @@ -85,11 +85,6 @@ export default function (providerContext: FtrProviderContext) { id: 'metrics-*', }); expect(resIndexPatternMetrics.id).equal('metrics-*'); - const resIndexPatternEvents = await kibanaServer.savedObjects.get({ - type: 'index-pattern', - id: 'events-*', - }); - expect(resIndexPatternEvents.id).equal('events-*'); const resDashboard = await kibanaServer.savedObjects.get({ type: 'dashboard', id: 'sample_dashboard', @@ -111,6 +106,18 @@ export default function (providerContext: FtrProviderContext) { }); expect(resSearch.id).equal('sample_search'); }); + it('should have installed placeholder indices', async function () { + const resLogsIndexPatternPlaceholder = await es.transport.request({ + method: 'GET', + path: `/logs-index_pattern_placeholder`, + }); + expect(resLogsIndexPatternPlaceholder.statusCode).equal(200); + const resMetricsIndexPatternPlaceholder = await es.transport.request({ + method: 'GET', + path: `/metrics-index_pattern_placeholder`, + }); + expect(resMetricsIndexPatternPlaceholder.statusCode).equal(200); + }); it('should have created the correct saved object', async function () { const res = await kibanaServer.savedObjects.get({ type: 'epm-packages', From 680516154c38d9f59aeb48ced9ce5dbb53c2c4ab Mon Sep 17 00:00:00 2001 From: Thomas Neirynck Date: Mon, 10 Aug 2020 15:10:03 -0400 Subject: [PATCH 030/113] Remove karma tests from legacy maps (#74668) --- .../public/__tests__/map/kibana_map.js | 329 --- .../public/__tests__/aftercolorchange.png | Bin 125255 -> 0 bytes .../public/__tests__/afterdatachange.png | Bin 125103 -> 0 bytes .../__tests__/afterdatachangeandresize.png | Bin 26010 -> 0 bytes .../public/__tests__/afterresize.png | Bin 18316 -> 0 bytes .../public/__tests__/changestartup.png | Bin 56334 -> 0 bytes .../region_map/public/__tests__/initial.png | Bin 126352 -> 0 bytes .../__tests__/region_map_visualization.js | 417 ---- .../region_map/public/__tests__/toiso3.png | Bin 122129 -> 0 bytes .../region_map/public/__tests__/world.json | 1 - .../tile_map/public/__tests__/blues.png | Bin 14095 -> 0 bytes .../coordinate_maps_visualization.js | 356 ---- .../public/__tests__/dummy_es_response.json | 1810 ----------------- .../public/__tests__/geohash_layer.js | 160 -- .../tile_map/public/__tests__/heatmap.png | Bin 87025 -> 0 bytes .../tile_map/public/__tests__/heatmap_raw.png | Bin 16071 -> 0 bytes .../tile_map/public/__tests__/initial.png | Bin 14011 -> 0 bytes .../__tests__/scaled_circle_markers.png | Bin 26698 -> 0 bytes .../__tests__/shaded_circle_markers.png | Bin 44077 -> 0 bytes .../public/__tests__/shaded_geohash_grid.png | Bin 10196 -> 0 bytes 20 files changed, 3073 deletions(-) delete mode 100644 src/plugins/maps_legacy/public/__tests__/map/kibana_map.js delete mode 100644 src/plugins/region_map/public/__tests__/aftercolorchange.png delete mode 100644 src/plugins/region_map/public/__tests__/afterdatachange.png delete mode 100644 src/plugins/region_map/public/__tests__/afterdatachangeandresize.png delete mode 100644 src/plugins/region_map/public/__tests__/afterresize.png delete mode 100644 src/plugins/region_map/public/__tests__/changestartup.png delete mode 100644 src/plugins/region_map/public/__tests__/initial.png delete mode 100644 src/plugins/region_map/public/__tests__/region_map_visualization.js delete mode 100644 src/plugins/region_map/public/__tests__/toiso3.png delete mode 100644 src/plugins/region_map/public/__tests__/world.json delete mode 100644 src/plugins/tile_map/public/__tests__/blues.png delete mode 100644 src/plugins/tile_map/public/__tests__/coordinate_maps_visualization.js delete mode 100644 src/plugins/tile_map/public/__tests__/dummy_es_response.json delete mode 100644 src/plugins/tile_map/public/__tests__/geohash_layer.js delete mode 100644 src/plugins/tile_map/public/__tests__/heatmap.png delete mode 100644 src/plugins/tile_map/public/__tests__/heatmap_raw.png delete mode 100644 src/plugins/tile_map/public/__tests__/initial.png delete mode 100644 src/plugins/tile_map/public/__tests__/scaled_circle_markers.png delete mode 100644 src/plugins/tile_map/public/__tests__/shaded_circle_markers.png delete mode 100644 src/plugins/tile_map/public/__tests__/shaded_geohash_grid.png diff --git a/src/plugins/maps_legacy/public/__tests__/map/kibana_map.js b/src/plugins/maps_legacy/public/__tests__/map/kibana_map.js deleted file mode 100644 index ae6d3144335cf..0000000000000 --- a/src/plugins/maps_legacy/public/__tests__/map/kibana_map.js +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import expect from '@kbn/expect'; -import { KibanaMap } from '../../map/kibana_map'; -import { KibanaMapLayer } from '../../map/kibana_map_layer'; - -describe('kibana_map tests', function () { - let domNode; - let kibanaMap; - - function createDiv(width, height) { - const div = document.createElement('div'); - div.style.top = '0'; - div.style.left = '0'; - div.style.width = width; - div.style.height = height; - div.style.position = 'fixed'; - div.style['pointer-events'] = 'none'; - return div; - } - - function setupDOM(width, height) { - domNode = createDiv(width, height); - document.body.appendChild(domNode); - } - - function teardownDOM() { - domNode.innerHTML = ''; - document.body.removeChild(domNode); - } - - describe('KibanaMap - basics', function () { - beforeEach(async function () { - setupDOM('512px', '512px'); - kibanaMap = new KibanaMap(domNode, { - minZoom: 1, - maxZoom: 10, - center: [0, 0], - zoom: 0, - }); - }); - - afterEach(function () { - kibanaMap.destroy(); - teardownDOM(); - }); - - it('should instantiate at zoom level 2', function () { - const bounds = kibanaMap.getBounds(); - expect(bounds.bottom_right.lon).to.equal(90); - expect(bounds.top_left.lon).to.equal(-90); - expect(kibanaMap.getCenter().lon).to.equal(0); - expect(kibanaMap.getCenter().lat).to.equal(0); - expect(kibanaMap.getZoomLevel()).to.equal(2); - }); - - it('should resize to fit container', function () { - kibanaMap.setZoomLevel(2); - expect(kibanaMap.getCenter().lon).to.equal(0); - expect(kibanaMap.getCenter().lat).to.equal(0); - - domNode.style.width = '1024px'; - domNode.style.height = '1024px'; - kibanaMap.resize(); - - expect(kibanaMap.getCenter().lon).to.equal(0); - expect(kibanaMap.getCenter().lat).to.equal(0); - }); - }); - - describe('getBounds', function () { - afterEach(function () { - kibanaMap.destroy(); - teardownDOM(); - }); - - describe('extended bounds', function () { - beforeEach(async function () { - setupDOM('1600px', '1024px'); - kibanaMap = new KibanaMap(domNode, { - minZoom: 1, - maxZoom: 10, - center: [0, 0], - zoom: 2, - }); - }); - - it('should get untrimmed map bounds', function () { - const bounds = kibanaMap.getBounds(); - expect(bounds.bottom_right.lon.toFixed(2)).to.equal('281.25'); - expect(bounds.top_left.lon.toFixed(2)).to.equal('-281.25'); - }); - }); - - describe('no map height (should default to size of 1px for height)', function () { - beforeEach(async function () { - setupDOM('386px', '256px'); - const noHeightNode = createDiv('386px', '0px'); - domNode.appendChild(noHeightNode); - kibanaMap = new KibanaMap(noHeightNode, { - minZoom: 1, - maxZoom: 10, - center: [0, 0], - zoom: 10, - }); - }); - - it('should calculate map dimensions based on enforcement of single pixel min-width CSS-rule', function () { - const bounds = kibanaMap.getBounds(); - expect(bounds).to.have.property('bottom_right'); - expect(round(bounds.bottom_right.lon, 2)).to.equal(0.27); - expect(round(bounds.bottom_right.lat, 2)).to.equal(0); - expect(bounds).to.have.property('top_left'); - expect(round(bounds.top_left.lon, 2)).to.equal(-0.27); - expect(round(bounds.top_left.lat, 2)).to.equal(0); - }); - - function round(num, dig) { - return Math.round(num * Math.pow(10, dig)) / Math.pow(10, dig); - } - }); - - describe('no map width (should default to size of 1px for width)', function () { - beforeEach(async function () { - setupDOM('386px', '256px'); - const noWidthNode = createDiv('0px', '256px'); - domNode.appendChild(noWidthNode); - kibanaMap = new KibanaMap(noWidthNode, { - minZoom: 1, - maxZoom: 10, - center: [0, 0], - zoom: 10, - }); - }); - - it('should calculate map dimensions based on enforcement of single pixel min-width CSS-rule', function () { - const bounds = kibanaMap.getBounds(); - expect(bounds).to.have.property('bottom_right'); - expect(Math.round(bounds.bottom_right.lon)).to.equal(0); - expect(bounds.bottom_right.lat.toFixed(2)).to.equal('-0.18'); - expect(bounds).to.have.property('top_left'); - expect(Math.round(bounds.top_left.lon)).to.equal(0); - expect(bounds.top_left.lat.toFixed(2)).to.equal('0.18'); - }); - }); - - describe('wrapping', function () { - beforeEach(async function () { - setupDOM('1600px', '1024px'); - kibanaMap = new KibanaMap(domNode, { - minZoom: 1, - maxZoom: 10, - center: [0, -800], //swing the map over two earth-rotations west - zoom: 2, - }); - }); - - it('coordinates should be corrected to center the -180,180 range', function () { - const bounds = kibanaMap.getBounds(); - expect(bounds.bottom_right.lon.toFixed(2)).to.equal('201.09'); - expect(bounds.top_left.lon.toFixed(2)).to.equal('-361.41'); - }); - }); - - describe('wrapping - zoomed in', function () { - beforeEach(async function () { - setupDOM('1600px', '1024px'); - kibanaMap = new KibanaMap(domNode, { - minZoom: 1, - maxZoom: 10, - center: [0, -800], //swing the map over two earth-rotations west - zoom: 8, - }); - }); - - it('coordinates should be corrected to fall within the -180,180 range', function () { - const bounds = kibanaMap.getBounds(); - expect(bounds.bottom_right.lon.toFixed(2)).to.equal('-75.61'); - expect(bounds.top_left.lon.toFixed(2)).to.equal('-84.40'); - }); - }); - }); - - describe('KibanaMap - attributions', function () { - beforeEach(async function () { - setupDOM('512px', '512px'); - kibanaMap = new KibanaMap(domNode, { - minZoom: 1, - maxZoom: 10, - center: [0, 0], - zoom: 0, - }); - }); - - afterEach(function () { - kibanaMap.destroy(); - teardownDOM(); - }); - - function makeMockLayer(attribution) { - const layer = new KibanaMapLayer(); - layer._attribution = attribution; - // eslint-disable-next-line no-undef - layer._leafletLayer = L.geoJson(null); - return layer; - } - - it('should update attributions correctly', function () { - kibanaMap.addLayer(makeMockLayer('foo|bar')); - expect(domNode.querySelectorAll('.leaflet-control-attribution')[0].innerHTML).to.equal( - 'foo, bar' - ); - - kibanaMap.addLayer(makeMockLayer('bar')); - expect(domNode.querySelectorAll('.leaflet-control-attribution')[0].innerHTML).to.equal( - 'foo, bar' - ); - - const layer = makeMockLayer('bar,stool'); - kibanaMap.addLayer(layer); - expect(domNode.querySelectorAll('.leaflet-control-attribution')[0].innerHTML).to.equal( - 'foo, bar, stool' - ); - - kibanaMap.removeLayer(layer); - expect(domNode.querySelectorAll('.leaflet-control-attribution')[0].innerHTML).to.equal( - 'foo, bar' - ); - }); - }); - - describe('KibanaMap - baseLayer', function () { - beforeEach(async function () { - setupDOM('512px', '512px'); - kibanaMap = new KibanaMap(domNode, { - minZoom: 1, - maxZoom: 10, - center: [0, 0], - zoom: 0, - }); - }); - - afterEach(function () { - kibanaMap.destroy(); - teardownDOM(); - }); - - it('TMS', async function () { - const options = { - url: - 'https://tiles-stage.elastic.co/v2/default/{z}/{x}/{y}.png?elastic_tile_service_tos=agree&my_app_name=kibana', - minZoom: 0, - maxZoom: 12, - attribution: '© [Elastic Maps Service](https://www.elastic.co/elastic-maps-service)', - }; - - return new Promise(function (resolve) { - kibanaMap.on('baseLayer:loaded', () => { - resolve(); - }); - kibanaMap.setBaseLayer({ - baseLayerType: 'tms', - options: options, - }); - }); - }); - - it('WMS - should handle empty settings', async function () { - const invalidOptions = { - url: undefined, - version: undefined, - layers: undefined, - format: 'image/png', - transparent: true, - attribution: undefined, - styles: '', - minZoom: 1, - maxZoom: 18, - }; - - kibanaMap.setBaseLayer({ - baseLayerType: 'wms', - options: invalidOptions, - }); - - expect(kibanaMap.getLeafletBaseLayer()).to.eql(null); - }); - - it('WMS - should clean attribution', async function () { - const options = { - url: 'https://basemap.nationalmap.gov/arcgis/services/USGSTopo/MapServer/WMSServer', - version: '1.1.0', - layers: '0', - format: 'image/png', - transparent: true, - attribution: '
foobar
', - styles: '', - minZoom: 1, - maxZoom: 18, - }; - - kibanaMap.setBaseLayer({ - baseLayerType: 'wms', - options: options, - }); - - expect(domNode.querySelectorAll('.leaflet-control-attribution')[0].innerHTML).to.equal( - '<div>foobar</div>' - ); - }); - }); -}); diff --git a/src/plugins/region_map/public/__tests__/aftercolorchange.png b/src/plugins/region_map/public/__tests__/aftercolorchange.png deleted file mode 100644 index d5a5316e2e99c6a83967e3d28f5e5ff5ec21cfb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125255 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 pB)v)weze}&%Z!D95STpz{~s0Lkou{+Z%6No%Z diff --git a/src/plugins/region_map/public/__tests__/afterdatachange.png b/src/plugins/region_map/public/__tests__/afterdatachange.png deleted file mode 100644 index ba388f18d7f3580af64e550d4a390ef1350c84ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125103 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

kBXP)9w^>KKPT+&g0DtRtqsA7~x8X|bbO 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 M07*qoM6N<$f|YRVLjV8( diff --git a/src/plugins/region_map/public/__tests__/afterdatachangeandresize.png b/src/plugins/region_map/public/__tests__/afterdatachangeandresize.png deleted file mode 100644 index 7da57511c583112e72160ca970ce803cb92b4710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26010 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%0AQ&Y} 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

H}@nUBfjOvK~hFq&7#dSJ4gM0m&zI}gnB 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 diff --git a/src/plugins/region_map/public/__tests__/changestartup.png b/src/plugins/region_map/public/__tests__/changestartup.png deleted file mode 100644 index a94affddbd941fa3a219a4ddf93d858aafd93510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56334 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
SBogIF@MQ3C{Ebf$f=_kzLSYTA`7{swP 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 diff --git a/src/plugins/region_map/public/__tests__/initial.png b/src/plugins/region_map/public/__tests__/initial.png deleted file mode 100644 index 9ec48af9fe1e29157aeef3c5ad7a8ae3c2a4ce0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126352 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 FV1miqJEs5u diff --git a/src/plugins/region_map/public/__tests__/region_map_visualization.js b/src/plugins/region_map/public/__tests__/region_map_visualization.js deleted file mode 100644 index 648193e8e2490..0000000000000 --- a/src/plugins/region_map/public/__tests__/region_map_visualization.js +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import expect from '@kbn/expect'; -import ngMock from 'ng_mock'; -import _ from 'lodash'; - -import ChoroplethLayer from '../choropleth_layer'; -import { ImageComparator } from 'test_utils/image_comparator'; -import worldJson from './world.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_CATALOGUE from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_manifest.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_FILES from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_files.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_TILES from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_tiles.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_STYLE_ROAD_MAP_BRIGHT from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_style_bright'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_STYLE_ROAD_MAP_DESATURATED from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_style_desaturated'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_STYLE_DARK_MAP from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_style_dark'; - -import initialPng from './initial.png'; -import toiso3Png from './toiso3.png'; -import afterresizePng from './afterresize.png'; -import afterdatachangePng from './afterdatachange.png'; -import afterdatachangeandresizePng from './afterdatachangeandresize.png'; -import aftercolorchangePng from './aftercolorchange.png'; -import changestartupPng from './changestartup.png'; - -import { createRegionMapVisualization } from '../region_map_visualization'; -import { createRegionMapTypeDefinition } from '../region_map_type'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ExprVis } from '../../../visualizations/public/expressions/vis'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { BaseVisType } from '../../../visualizations/public/vis_types/base_vis_type'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ServiceSettings } from '../../../maps_legacy/public/map/service_settings'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { BaseMapsVisualizationProvider } from '../../../maps_legacy/public/map/base_maps_visualization'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { KibanaMap } from '../../../maps_legacy/public/map/kibana_map'; - -const THRESHOLD = 0.45; -const PIXEL_DIFF = 96; - -describe('RegionMapsVisualizationTests', function () { - let domNode; - let RegionMapsVisualization; - let vis; - let regionMapVisType; - let dependencies; - - let imageComparator; - - const _makeJsonAjaxCallOld = ChoroplethLayer.prototype._makeJsonAjaxCall; - - const dummyTableGroup = { - columns: [ - { - id: 'col-0', - aggConfig: { - id: '2', - enabled: true, - type: 'terms', - schema: 'segment', - params: { field: 'geo.dest', size: 5, order: 'desc', orderBy: '1' }, - }, - title: 'geo.dest: Descending', - }, - { - id: 'col-1', - aggConfig: { id: '1', enabled: true, type: 'count', schema: 'metric', params: {} }, - title: 'Count', - }, - ], - rows: [ - { 'col-0': 'CN', 'col-1': 26 }, - { 'col-0': 'IN', 'col-1': 17 }, - { 'col-0': 'US', 'col-1': 6 }, - { 'col-0': 'DE', 'col-1': 4 }, - { 'col-0': 'BR', 'col-1': 3 }, - ], - }; - - beforeEach(ngMock.module('kibana')); - - let getManifestStub; - beforeEach( - ngMock.inject(() => { - const mapConfig = { - emsFileApiUrl: '', - emsTileApiUrl: '', - emsLandingPageUrl: '', - }; - const tilemapsConfig = { - options: { - attribution: '123', - }, - }; - const serviceSettings = new ServiceSettings(mapConfig, tilemapsConfig); - const regionmapsConfig = { - includeElasticMapsService: true, - layers: [], - }; - const coreSetupMock = { - notifications: { - toasts: {}, - }, - uiSettings: { - get: () => {}, - }, - injectedMetadata: { - getInjectedVar: () => {}, - }, - }; - const BaseMapsVisualization = new BaseMapsVisualizationProvider( - (...args) => new KibanaMap(...args), - serviceSettings - ); - - dependencies = { - serviceSettings, - regionmapsConfig, - uiSettings: coreSetupMock.uiSettings, - BaseMapsVisualization, - }; - - regionMapVisType = new BaseVisType(createRegionMapTypeDefinition(dependencies)); - RegionMapsVisualization = createRegionMapVisualization(dependencies); - - ChoroplethLayer.prototype._makeJsonAjaxCall = async function () { - //simulate network call - return new Promise((resolve) => { - setTimeout(() => { - resolve(worldJson); - }, 10); - }); - }; - - getManifestStub = serviceSettings.__debugStubManifestCalls(async (url) => { - //simulate network calls - if (url.startsWith('https://foobar')) { - return EMS_CATALOGUE; - } else if (url.startsWith('https://tiles.foobar')) { - return EMS_TILES; - } else if (url.startsWith('https://files.foobar')) { - return EMS_FILES; - } else if (url.startsWith('https://raster-style.foobar')) { - if (url.includes('osm-bright-desaturated')) { - return EMS_STYLE_ROAD_MAP_DESATURATED; - } else if (url.includes('osm-bright')) { - return EMS_STYLE_ROAD_MAP_BRIGHT; - } else if (url.includes('dark-matter')) { - return EMS_STYLE_DARK_MAP; - } - } - }); - }) - ); - - afterEach(function () { - ChoroplethLayer.prototype._makeJsonAjaxCall = _makeJsonAjaxCallOld; - getManifestStub.removeStub(); - }); - - describe('RegionMapVisualization - basics', function () { - beforeEach(async function () { - setupDOM('512px', '512px'); - - imageComparator = new ImageComparator(); - - vis = new ExprVis({ - type: regionMapVisType, - }); - - vis.params.bucket = { - accessor: 0, - }; - vis.params.metric = { - accessor: 1, - }; - - vis.params.selectedJoinField = { name: 'iso2', description: 'Two letter abbreviation' }; - vis.params.selectedLayer = { - attribution: - ' ', - name: 'World Countries', - format: 'geojson', - url: - 'https://vector-staging.maps.elastic.co/blob/5715999101812736?elastic_tile_service_tos=agree&my_app_version=7.0.0-alpha1', - fields: [ - { name: 'iso2', description: 'Two letter abbreviation' }, - { - name: 'iso3', - description: 'Three letter abbreviation', - }, - { name: 'name', description: 'Country name' }, - ], - created_at: '2017-07-31T16:00:19.996450', - id: 5715999101812736, - layerId: 'elastic_maps_service.World Countries', - }; - }); - - afterEach(function () { - teardownDOM(); - imageComparator.destroy(); - }); - - it('should instantiate at zoom level 2 (may fail in dev env)', async function () { - const regionMapsVisualization = new RegionMapsVisualization(domNode, vis); - await regionMapsVisualization.render(dummyTableGroup, vis.params, { - resize: false, - params: true, - aggs: true, - data: true, - uiState: false, - }); - const mismatchedPixels = await compareImage(initialPng); - regionMapsVisualization.destroy(); - expect(mismatchedPixels).to.be.lessThan(PIXEL_DIFF); - }); - - it('should update after resetting join field', async function () { - const regionMapsVisualization = new RegionMapsVisualization(domNode, vis); - await regionMapsVisualization.render(dummyTableGroup, vis.params, { - resize: false, - params: true, - aggs: true, - data: true, - uiState: false, - }); - - //this will actually create an empty image - vis.params.selectedJoinField = { name: 'iso3', description: 'Three letter abbreviation' }; - vis.params.isDisplayWarning = false; //so we don't get notifications - await regionMapsVisualization.render(dummyTableGroup, vis.params, { - resize: false, - params: true, - aggs: false, - data: false, - uiState: false, - }); - - const mismatchedPixels = await compareImage(toiso3Png); - regionMapsVisualization.destroy(); - expect(mismatchedPixels).to.be.lessThan(PIXEL_DIFF); - }); - - it('should resize (may fail in dev env)', async function () { - const regionMapsVisualization = new RegionMapsVisualization(domNode, vis); - await regionMapsVisualization.render(dummyTableGroup, vis.params, { - resize: false, - params: true, - aggs: true, - data: true, - uiState: false, - }); - - domNode.style.width = '256px'; - domNode.style.height = '128px'; - await regionMapsVisualization.render(dummyTableGroup, vis.params, { - resize: true, - params: false, - aggs: false, - data: false, - uiState: false, - }); - const mismatchedPixelsAfterFirstResize = await compareImage(afterresizePng); - - domNode.style.width = '512px'; - domNode.style.height = '512px'; - await regionMapsVisualization.render(dummyTableGroup, vis.params, { - resize: true, - params: false, - aggs: false, - data: false, - uiState: false, - }); - const mismatchedPixelsAfterSecondResize = await compareImage(initialPng); - - regionMapsVisualization.destroy(); - expect(mismatchedPixelsAfterFirstResize).to.be.lessThan(PIXEL_DIFF); - expect(mismatchedPixelsAfterSecondResize).to.be.lessThan(PIXEL_DIFF); - }); - - it('should redo data (may fail in dev env)', async function () { - const regionMapsVisualization = new RegionMapsVisualization(domNode, vis); - await regionMapsVisualization.render(dummyTableGroup, vis.params, { - resize: false, - params: true, - aggs: true, - data: true, - uiState: false, - }); - - const newTableGroup = _.cloneDeep(dummyTableGroup); - - newTableGroup.rows.pop(); //remove one shape - - await regionMapsVisualization.render(newTableGroup, vis.params, { - resize: false, - params: false, - aggs: false, - data: true, - uiState: false, - }); - - const mismatchedPixelsAfterDataChange = await compareImage(afterdatachangePng); - const anotherTableGroup = _.cloneDeep(newTableGroup); - - anotherTableGroup.rows.pop(); //remove one shape - domNode.style.width = '412px'; - domNode.style.height = '112px'; - await regionMapsVisualization.render(anotherTableGroup, vis.params, { - resize: true, - params: false, - aggs: false, - data: true, - uiState: false, - }); - const mismatchedPixelsAfterDataChangeAndResize = await compareImage( - afterdatachangeandresizePng - ); - - regionMapsVisualization.destroy(); - expect(mismatchedPixelsAfterDataChange).to.be.lessThan(PIXEL_DIFF); - expect(mismatchedPixelsAfterDataChangeAndResize).to.be.lessThan(PIXEL_DIFF); - }); - - it('should redo data and color ramp (may fail in dev env)', async function () { - const regionMapsVisualization = new RegionMapsVisualization(domNode, vis); - await regionMapsVisualization.render(dummyTableGroup, vis.params, { - resize: false, - params: true, - aggs: true, - data: true, - uiState: false, - }); - - const newTableGroup = _.cloneDeep(dummyTableGroup); - newTableGroup.rows.pop(); //remove one shape - vis.params.colorSchema = 'Blues'; - await regionMapsVisualization.render(newTableGroup, vis.params, { - resize: false, - params: true, - aggs: false, - data: true, - uiState: false, - }); - const mismatchedPixelsAfterDataAndColorChange = await compareImage(aftercolorchangePng); - - regionMapsVisualization.destroy(); - expect(mismatchedPixelsAfterDataAndColorChange).to.be.lessThan(PIXEL_DIFF); - }); - - it('should zoom and center elsewhere', async function () { - vis.params.mapZoom = 4; - vis.params.mapCenter = [36, -85]; - const regionMapsVisualization = new RegionMapsVisualization(domNode, vis); - await regionMapsVisualization.render(dummyTableGroup, vis.params, { - resize: false, - params: true, - aggs: true, - data: true, - uiState: false, - }); - - const mismatchedPixels = await compareImage(changestartupPng); - regionMapsVisualization.destroy(); - - expect(mismatchedPixels).to.be.lessThan(PIXEL_DIFF); - }); - }); - - async function compareImage(expectedImageSource) { - const elementList = domNode.querySelectorAll('canvas'); - expect(elementList.length).to.equal(1); - const firstCanvasOnMap = elementList[0]; - return imageComparator.compareImage(firstCanvasOnMap, expectedImageSource, THRESHOLD); - } - - function setupDOM(width, height) { - domNode = document.createElement('div'); - domNode.style.top = '0'; - domNode.style.left = '0'; - domNode.style.width = width; - domNode.style.height = height; - domNode.style.position = 'fixed'; - domNode.style.border = '1px solid blue'; - domNode.style['pointer-events'] = 'none'; - document.body.appendChild(domNode); - } - - function teardownDOM() { - domNode.innerHTML = ''; - document.body.removeChild(domNode); - } -}); diff --git a/src/plugins/region_map/public/__tests__/toiso3.png b/src/plugins/region_map/public/__tests__/toiso3.png deleted file mode 100644 index eebae19ae4364ba5abc15efb9430e66e2637b9dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122129 zcmXtaOTSjk0==UN^`_U48XVM0BE;D612TtcXNey|YAbiC#kVE~3R- ziy->%`OI&=X8gl2v(Izi=UnHyUMF5pM}wS%kpu?^hy1xF6pn*~=kUL8VnX02U0{WF z92_>B=TH^HH&*|JK77w?bavZTQ_h2CkA4PKCQdBX)YE+LYjg$@VM~nqf}_7+nPw@4 z`z)*WOC9Hj2vWAhh)Rxn#z?KXit$?F=x1qMd>`;)yGI>b_gC%%t}b5QWfor?qW92$ zuRBAAeP=2zUJD*|22Uu&LDSE_t5Jr&nJRj|7Qnpo&#r6JgOpalbfCV{L-f?A%=beHE5U^@;pM8&{ZBx=g4AaUJ9iJQ)`Q z(v7qI7si)4JP}wRiJ7iaMGCQh&4K=<6)&-zQwS^=^AXrCL|qY!Pdrk!=ovMGY}q3A z6J=#(X?MI^Iz+jbnrikA53R&#H{Glo+#};%a52+cw)9q0KYpCP*|;I;x~P%}$4u)+ zgXq3gU#qux**=!oKmPc@&Ft<-6{#zFx@Ixg@$@S6?&k9R*HA|IbLi1S_W7oRHNSuW zCB#=nQ+uWD*24!?4j+tJNHZC8;lCx=ziw6U-&IVDCejN2esk1u(HXN=qJ{qRVedx? zrIFl1XJ;o=>O+SiEHHmlI{Y;BzC!xx;je$4_u?bV&b?R{CJ>+oGEJ%(%>F!UUe214f+uSDrv30hTfXEe_Ci#Uc#$Y z1`$}#B5HmIu4X>VO&-I}20x*SH%JUU8kmZjZ-2<1;%Rvi4cjdJm1f(a%EsO)rJmwK zAFKNuGC|&VT%VVhr$lWvQc1M*p=)g?aFr;x3ASlI8791!cG=mL?PylRlQBfZ$M6h- zl`GJ;rN48ksA>wrPMv(wZ?SmI`cJgU-J1NUwWh}70C-A``>g{%Z+h>mr%R5m2SiT= zfpZ$;J-~+n)h(nU$LA0p+!$Z9*<#b}zMWOrbT<6uQ}(aVRgrE*D6^_FA?S2I_D&Am z;k0z_4*Yj(C-vx>UwtJg*;I7+Q+-w)=~<{RgZQVTz|~Y+rOoBUCLiNH$ldx;=Mk$e z^n)hkXbur>MjYvK=wUJU(IZz3Iws(=y#^f8>hp@m2^aIv?vY;}u!R1dJd2BsO=)t! z{$;1{ygB%4S9(0A%1H(@ZLEq+ZL7Xsg4vTst@E;fJx$r9PEKR*jX4|jTPaD-Akp|s zFj60coo$E#RfwF9z=toh9B=dA`!EKKB6n%#{KBnWE%<*QaXqeQBW^{@?6n?p&CqK= zBsGZZDnJEuek+u3Mott9VxVpc!g(psMK~;wlf&*ChtpPn`jCSTjjBbC7PocHdfF`% zw!jd(F$^CbLhS2mLOdD-_A6m>kEI=XaaKHjmz(42{Vb#Y z)1ow?B)LG$wqi*gs0spP(6t;ZY-bMSty=)N9Z>kPC)0Q@? z-WMvBU|G9Jok9rj?(LZgkamFiJ~~A<{I>|1QUzAgeWBiQ!q?C5ARn72 zglR7`%z{DA{G3)_d3t)T=F0eZXZAO7-02Jw(TR^oJs>p(UJBWqUux;B$ewQyC1lH~ zdOr`o$GmnCt^+-8N=>Fs_mvF=gKr5Z3stquFn3XG(j{G8_b3^kZMGWA#%K8!9K-fg z5!NqCemsY8`9E|+WchuoG;4qb9ig?hks@SIIXOO{K%Eu$f2pr2duwCsrmHi-Rf!I8x*bh?w=nBU5WC2;*8U15$oD|A_a}+FbLEst!ENvoUZ&vs^_?@WqnG8y4P2x7i<&V_*yzPAc{GUV zP2NReZy+Bgg{>f5J}r9?H#TR%MfUi;fkf^q+f zQJ9$e9dT47hfV0l7VweT$@-Z1F}RyMz#Z*E{R!`GK{0kdH)9csHeG8vIO0tBb$zD= z*$PxeHh{480{q!p+~N9F4^i;!mg-=emQ8J5x^DyzmzpS(HNLKQWRqg-LZH#2q)we8 z>6*kzOv2pYP`F!13Fs%+oL_)2vzqM3Ja&wH9D0tMLw;T{1@a)a(to_l*W#Bic#?FK zEbeBfdfzHVRK07V>GoAXz=dCx#9ySIS70TrtOC;bPrScah}JxHA^`(OOpK zzgiaYC#Jc{{f`<1AXV42yreD(IDx`Em%fi_sWhp5sbFs0p#m^zSLcW8ei!RP$ z=y#K1ZyzgRES^+3Cdm-uv#(tUXTz;51V&xpzHd`DZ^{f1PbJZ(mN;#?)k+@mEq_faYQ4pm)UZSZ(Nrg-@zG&Jc@?pH1j5682fJ>hhxj*xC8{p%6ws61|oN*O@}>aHhbA17jddi2kXB0mgxS zapXG;yo|F@lu*U<1$}IVCL~+*6q~mb+TG&v?J{Zh{b-vfMJ*DsKQdxOLYFe6{Gb!) z@MxgJ(^RBuxal11Hwucd2gNpuf800UK^VQZe{9DBMOo3JnUcBVnA+81Eds7WL0OnfM_7{ z+}4t3|Fs^Pd`~rt zsGdd~v0Bn4%7}+YA&c4W$3|<+v(CK5(CztCSaI|yLUYd$pK$=Me{=~wZC6cOjw5YN z|3dUwY1_qY*1B=Fd*UOFuF7R+coWFZe5tAHFFfXPZL&YL?F7$D9 zlny`Q0}K^!-RvHD@+xw5byZN0>ysAuh!et&$(LHtawBkcq)Ox{_^`zpV`OZ$ z1?3Ihp%fLKd-%k$f~;~D}PhK)caJ~Ow`fi+p_b(GcTB#l{gFeGZUQs&1!e=h z7)8!#X>PJU`{1A;WumBTX8k@({V?)4bJ)YzV(V1z+!JE&Juc_t+$aiWZ0W1HFi`Ao z!IaHqgWoI=OeYkIv(>2#t(AFm^t#m0@JD6v>R|~W>l|?LUn~F}ZeusB<&s8L(%zkP z?V^h_`b}FJYs37PkTvUZv_QYPlS@DoQK~7n-RWC(4Dvn5uH(IU(>v53H_dD+{mK89 zO_#hYtF7yY#hOT^5pJO#y1EkvShD)sSJD|n7VOb)XrcAC^qo|RNn3Q@PIqdyB$F4n z!c>zIbAG}?0q)D5PKRYp9Mqu?R6OKupy#lbuSF+{ zu6$A(r4gO$Ep|<%=ZyA#7NVa^%0TTlHa6?X@$vCTua*>vQl6^*E~YPNTc&WU+!o83 zlbkpd^&Ax(X%$%f_rCPV1RV&Ik);E1h@UEq-sp2II&*ALX`CuH*32~F2;k%}jMNj> zc_o<_&0p!gKWBPD%E8Zt$=#A3H_Pm|ovO0FkQb&rfyBu5#Uk7~T=_Du$T?hW=@S4+ zmSD)3SzUvYop#XHGd!MhsqDz?pXTc_@g0m}n@6L03K7+_DjHvdMsJXgW+gGUZ@g_K zDB7r;R-dNGBv|vb25uc&bsk-4LX@_p$7g0zz?m8IOwjch z92$%M9rf6A1V=)Uy`%F7mptJN`qL&v?CJsByUVx}onkrQ94gZ)7SY?5nu zYZxepmm8+is7&S~Uk<8<&vpJHFqS4TJ z7fz>D^3235x;R)w`ba~eY4bq7s6kgoI#wZ!y za$ylFAitgd9ITp4w}3-g4Z?G+IPEte`C*eko615BA{0Nh77<>%I7)-FoDB2V2;@n* zFRILQ%^*zmPw}NwbdU*7ggSI0=3Ec%&YQUc>JcBkL*}J~8 zc;tAOf}(ogQNhDlH7wnle2}k$L;8M{>u6w2V1B0T92x&pxqxAw-ew=3NTsO zL0ahXxS{W05>cp%P_~>GAoLM{z#)`PkhT(#U5ogq@_8{4zNdymn~x53YuTTZ-4ScUmo_bNsp`^z^4chS^+>J@koI|c zTfm<~9@xlFlZ~_JQkaDtrgPvI*vHCWsPVR!O3|zcw59HZjrw?|gX|Q=CkA{rTMzeQ zd=mbJMuV0fvj6dRsFLuoQ6+smWXxzCEZ|Q1RnX=$!5U9NxLeg4Tfu}|RVpO5nXrW~ z;d{So;XJ6c<}h%z=4H!Uu$*$^_SeUa9Q#Lf(I9Io)#bz1LrcOGl<@cc-Q6!(W(Cbi zZ58sFJ!zfJwKTtxw&RFsShhe z^AhX?Q!gtXO$uvpI=cElDr%lQ;qH1AM#{ zIa~XP`}o~APO(2MGHQc=u(W$k>7($Z3`IP8(J@Z^;`b}3@}2}+A0V7ckw{vm+l3u- z*M#>(;M?K)N}qQ_zmlsYn&K6+koY2s6K^D2<5QH?zEp{u9*fvy^o{ZgsS(;6K)9yf z575Xu?)hFZ!C|$t))G0tMvK#aGrh&&2I`s9@EBsFu&?C{{g@<-Ew zC3cpTMzwu-l+rvaM$(^%BgeX|{E@u@>~SIX&VVm7sOcb$rpw&u*`OGD)W7uRC3mgkm6OSca9->sbIc@|l{@-_8FT$wriPgrVk;bZ9o`%C#`$R!c zQl4Ji-$*sNKdCft)s?pEkGvNIcZ`kpkxGeQ$3uT6zmiJiz0nXHv8$5QXzeYOo0{#& zVHfRqa8!)?V`(TRm-5!-j0n*f$f#XH1};|Lefu*0-Lpr8)nsH3*kp)!7{qm{RBb+L z6SIc_6JIFiuoV9L)l!pg>ap_y@dA;cQKnik3XgRtpkm{){QOL;^3o>(WBoJKFgQ0} zI+O-n!y7_sl?5nF%7v!nIG*Rwdwz?`W4)|LG&TN;$;@<uH`2u-uWPnZA=ac zfjCGjeYm#XPx=q%Y<%a%=-6#5*=j?4zn8ZNgL%-7X67;}24e0nYu9;Ns;@)sOF&ZJ zB-Q!ljK)Ixuilq4i;;;DM}1;K5PsLgfiCNbKizs#b+)%<6;`_sI7;?DEz6Wmi!Uoo z_$?b*BJ44WBexVcIs2{U>52tDp=%l_POfO2_*G6%mgM4jiK;VZ4pm>u8FYlxm&=dunBm_0=TYODqe zICHQS_t{II##ucB*Ow%6A9Xx9Fv|?oi1nXeV>8g7Q1H9_gS6XwITI{!46m|4KW#V` zmEA&ZAb(__O6Bau;!jy=n63?jF3H=%CZ@{_CUO-+Wpm%XtD2=+4`TWGPX<<&IHq%& zt9~u!@Fk9fT}NYgZaqf%oJh~r%KxEoAnJ%{ywWJJgly=i;%A%P{e5$}4`V^lU(X@> zSqE-aT`r9ZYd;VM8X5yL_K(Y6{k@y<32Uq%%zh6BPvFND?p8aRvDOQaeqQYQreslU z_Ymj)#m}Dyok#bYu)vR-(tVZlXGs;II{W50V11|6Pe=*z8Z~Gdw^|m?hr9<+6d-8` zRy7JKs6gPU7fgT{%64C3=S_ZpiAOE9<=w(#P&VyY_;}AX^u_%eaVC5ua;eaZAEP|j z4!IK*mzqv>sq)z0+Y1aS+LvPMBp( znSUBjJQWk_9#=^bH(JChMXmaZw!|5^#wKkK^(7SlWSVS1OMv^AS&1up{xjA3Q@c69 zz0J;KNq|2I^rYg@KZb=Gp2{J0+ge*+$IPt>Xg6qapGposWB6~(Z?v8G9X!o4N78N9 ze)03M4udLjzMU8boXQQ7*1pku*TUKCK zv(O&87&zsuSk`&n<^&#cT>RAH)o5Cj#1Rc&&YH-PNe=Q*(rz-%_bq~WTBTMxO8tS2 zU;Ep6txj^m4Pws~|KS8B%I-@TMBhvLM}6f}bfBXX;n!cT)EN)im4jNBuZYb3eSM#( zzwBGk{7ogH#m#hz^paKac#r^baLt*;QRv<7X*w9_6@ijGrqX@G&H7r-!B5&@5~82S zaBnH#Zu}xzpghlE+r9j`8}z@c{~6yfU6_SB2RBY9g?PqJ;97-mm}J)n%AWybF6SFg zUN0GvzE46MTOG|zqHX`#Sx}T@DrKoZ2@~FATgG6mXnvE$TnHrOs34xh;va86<9}C; zZi#bttvZT!s+bMZa4`j*7>%kxCOm9cS{!&Y3ikbEHX)}~p0|lcIl?TE-fhCiVw%jWn}Mt1 zGqm4l?1O(?#Kb;fmd!CQ+|?mI`Cu2_c4lGEk!#>LT<=-0zbN26>fN%OeR5y%;BL<6 zR2;3vN2V5S>XD#fnXp3qwxLDSts@!<>g}3H%bQ$$g2XY{jI5G7v^G%~qX-J><1jJsj673smNyDffl4t0-vw4%Ra zP)lxA)_>%WB3=?YzP@X!-jBk|FE2(#iCi#38|%`S%~I;xYadDT+n90}xJQ=Z{OhDz zBe^pD;<@o!v+yDN>ljsB-}WNZ1>l(%)Ke3_Nj+AQd{N0A4Z|I2)tp+Ue+ zJmMP70G9PM#G))xj;?V?bfaF;n&t_P^rpCEh>(RFXnUy}QGO+m-A&hE@#;zCiH>+h zDxz{h$0;rJZCe*=%aQ&iY(%gbimF=SMm`{mJkNvvZJoWcfo!pqwrfA35_WD_2q{`? za=&S6nY|+6P?bISGFXTAm_*#81F$M@Uw9d*1f?LuocKi6h{m;u>$rc7Y017816$7g zCoxOV@{Fs*R+=tVML!2cr8AfXei16Z!&0SmR&>WEmN(`!u@|v*o$dO_8Wo2rag{3a3*j#@B$dh2~;M(KNK|_skZ_G zlfWt!D9=wh6yPzt#hS`o^=L?WdnSwfGyl0&MULU75j7hCv&&SyfWWUyVjC{Gl>Q^a z?_HnvTQ$B$))xO4W+Km1s~;kOBukD(^tz08Ww{Zk;H=6}H{+mgBS1e>V0@2G?#KgH z?mYc5s4h+J3{HwC)sA5Y_WKRWhNUXd2|Q~}=t}G^WArRjL{}<0_4yO3;27I4$soM7 zkKsVt!mEYbBg$*i^WU{1O0CJ(3AzMw@7OzN_hv!?91JQ|l8QWIwhnxEGow-)LvFVHd*(@BIHWM320 zxFT8XE2J~Aqs^1{fH~;l>3JNB@HO=sgBw{Vr<8==&70$xYB|O7^-%$?W4wz}w{Q{a z&Hc#%!;^v`RpJ|pL)n`n_|3{``=gN%102@*&&L5yvw1sXi7NVvIhs$ZUzKDqhSPp- zx0{v!PLKPy%M{k~9xdm#5JHne;HF*3WTwf~3fSBVpn`tEABXwh@yKNyz~jnp9mS4j zZM0e21Hw)m8gfiON7~7fY*iIw(4TZLaL}dDLRxjB`}MMg5Ycb)|F&6PeeIKqxM7&@ zU=t9=;4)b3>5=mf65N3k+2twoz`r8M}Ir!gf?yhCI1F+jmR^GeyMp%yDzOu zk@dO96BjIY?gU;x-K-PWVd%dQck1l%Td~a{Z`WcArdG9>B%#nYOc2C`@UxtWWwzRU zvUV_=Wo>P1Yk)!4X_P|}66)UW`+fOfyLmDdxAE+%8ue!q)~>nfsB_>Yw2|NZ=L@S{~0?{6;^yQt4&t%0L>I-o%tR?ZiWR`xwtk}7SbfX-NUGUgE@R9|n1h4bM*e|K zF!pNX8?)F=)ncXL#wDS1DB-$LF^Sj~;6w8F-nz`l%>GJa5N3oOxlw@!j$Vp0*4juEm1)x{kPWZo zhNEY%S^@XJnYgo>Jc5sg zFAKIb`zPQ1kg^Z7b>WF%WhM4#!<|Rpi_y^P|rT>ow zs1)Vi{i-q_ZzyF$JGv~4A#k2&%yRsQ9@$b%^J1fQED3w}RIt4NTU+|o z*ElEUJ)&>llAX5|K>z$Z^y}>?8{$0=K4blB-$HKI>1iU8 zk;MP%B{@`=zCg90(+M(w(AI-p`bBs#Rq3hTeMC=m6D{g-Dl1OwzcFo8#0!idsHeWHceC>1#tnB*z zWhysEY*hX|qiizIGG@XN)oi?Z0cmp1od+BO`&Ye zzyDdhkaj-GoGMNh0~h1TC3n_38MQ&;-o9QsxAG)2*Yk9!?=xP5Ak}%T}I29dW0opd2SVcJw3} zs-`+ef`Gu{kNzU(-7ccRfwwd9v~jjX@^_lTpFvJ0N^4AWEx>7cCY1eFfV8~(b%5oCP}0o&!*MKr=tvN4j&aVZW-6Bz zY;9Lua?0NQ!usO_JNfuDfhgoz(7*G@AqzJJb6EV?T-J9(YSo)E#!>e=etyiM({|#> z2^XQtu`+#Z$#Y0JZ#0hm^#WUvKeIDE9PeNRa5WT?a+iF-AqBJ)!@mW7EEg684A>mJ zcBl1l5G<6KIc?(v=^x5(=H?fiXGFaDdvUR5IC^OWi?qELS0#4vQ$8UW)HZ6Q={yQ2 zsb!k;n~3{sTrpHVV>cJ?{c4q6{L&pIrDQC``dC*^b%te{RJv=52oE#oxw<)?7bpYj zRZxcoHlqHV^zzB!P+(Bmw8kmukNpr;aGhnIG3t&R~Ke8ks);A_PJ)YE@#K5R*tY8Gns+l@F3`#vYh3 z_00hLzV^mM5Z;7|wdm-hV=u%$xxxhg3*WZPTICO=K6VO>0C}?^J+2LwzP`O!>#78D zcs$O+2Pa!XnjHqch{@a8XtQi&`17*1s!JVO`ptGyZsx$i1 z+gQCCpV?I}@FwKi8EyA*Aca2Y6QM>D3z^n_mP^;X;U()!*ev&bp`R2XL(1N5&_wVa zWHTJ0VzWJFo-T_g)hO_SE;v6E-kp{o@zX3~+T80V^Ki)JX4Su6y>GZMfZX6L6v)Z( zGV1AWZ*MPvp)M+0A5Y68x+|aPS}uuT*`Fer%m->U$L%}`z!P;)O#XEr)CcoW^!c(Ij zo_vllQ~P}Tkoou#r(~?^^Bx2P{%Bh`;EfK#_7Q^9G%BD`r|mONqQ&o@aGoOn8(HjU zVKX|y3DbvNYPBIC93ZjqYIs5zfv*~9S@f45?cy< zi~7hTSmzCGOd@qdTRcyl3dY!?EXkkgA@=c$P^HV)aXWz}#;su>f)3R*E>v z{QUwDxp;1mq8pY2y5?oLIq*wI$WH{GQ=8QZRA{)}K6Jqr9G6YeYy7#e17#u}*CS;g zLM9O9J>)8v{gX0YI%6-lmzS30M(PEMgwyNC={h@rVk<|@^p-u~fjY&$&4Ls2@t*$h z0&>RVGd8TMuy7N5c=%ecjI3E|OouB`>Q1ibGCr5(S96~TncxV5HkO^a;pQ+A{i$AH zzsy0bh4|hb?#oJiiRacmdfBBWVMtu3C|&^+R=16@WXcW@-RAWjZfwHOGjAGsC*~az zc0JK(v7d5aNQD!wc)nFB366BdtEJ9XdaFuiCmz^GD*eycJVqnMXFiE0-hfl06~kMF z`qO~e?>=p}o({f_VpE2#KU#k-E^no4T#=@CB&qSc-IOteZdaD0KpH;Bn0jk`Dv&x5 zSXF9I5rrdNEl)u$A)MuS;M#q4JK7E;Z-#ES*j{qlP7^4KtnXNKq`s3XcB8ong>?A! ztZxLjC3(}UbiY+Dvp(3`daVR79kZ*a6 zZiNqzHO`japkt@Gf5|k?P5{)M-`d3mFxW5dzJoy`u-4v|bguI2Ke|;Z%E=;l?-8$D zyh=1+@o_h9>RrM-m=IC4R@SdpeHiZG9i5Y65>f~F1DttcfiQXT`}X5aAo_VKNT!Cv zu9Eh~f<9I*J3+(~$)HKcDI(|JO?*HJP?m=LVBT#EYB3q9%y=oP znJXgxcmK*_ZtT%vN;B;OaSX?%r{hB1{@ku^7;&Ratd*Tlh;Z^BLXH~` zm#Pb)?X+i!UGaQ770r=Ase288FJb>WnwtZ}2T`~NBq2GMP8Loau3R$3DEL41PomP& zU+e`JOI1K2-@J0o`OPGVqaLF#NwXX+<=kc~wJ@6>Zi6d5@nW7;h@Y~SY?Pg3NUnd&<1#v!UgqN=#2>S5+MxgVb$3p-~bG0z#)3)K7o~$d5#vLzA)&?hOy@I;izwW zw`ki)K(>55fBhs3`8%mG$I8ffMRGSgIq9`OiWUcF4maB+>d1av4FIUKr~ZC^p%eqC z7xwJV)mST_vFaoC-~P0<0JI`cfmS|9Mg(y2q_fw(WT$~B`4IIAP#9Ur@AvWFatTLq zdFbx4h8#NSV%f`yb~IW78kUAj_{n7KrKoPJw(Hs*54>VyPaDE>C)czB zJDL__W0w~^@|#J?cwM+Te&>GqNJ1Cx0#aqtcMBEx`t5`QP4X&N3Q$&FXV%34#@dH@ zk$nzi#{2|DFBZZ!dSgBTC}&*t{-HGdf`>RtmzW&{4k-qwyJx8Ek@g)|0lK#t=ITrP zAuio-#HcrkhW~dt;U`CG+RmZT{V2w-Ub$}zwRt)N!LM5kXB?`UbW45!$Wj<9)oAtp zwyheLx0(7a(Pby4hV{!TR$eVj_205ca{82U);Zbj^An7q$fz3a(!+=c_Xr4=3!fF0 z>P?GjHDh9hqZx?w0S>iR7f#`Jg#yfSTv}>az;Ewp5s?I)sBT2qh1e654v5;T z50JL$yG&G(Eq~Yv%$_|>V=Q)*ZoO7Uw$pSsI3C_wea3!A;7eTPq5hCN_3JRWMkE1# zaoGT2)f);$7dR{p0GDZJqzs)P!_0Q>ANY; z^_9n4`v*0f`YIsi%rU1=KwSJr46SwdsDaOS&@OXj|7F!t2E3Csc0)};K|y!pA96Pn z9T1(dBTXTt!nFj5I3?hBsTOn38XdppK>p%2Iv%`|3SRkdp@DAByAGg`sxT-d0fa-< zAIEN{5=$6+A;>v*ehz?(hZPv>2B8odw~r82yt8-6gd`Gv`eb#n!BJAC!HK#ar8U2m z8+ton3Tbd~46oWuP7$`ysOy|5aAy|&Ebhxh2VmaJ`T}q5JN2EHnnE4vV~GT<+W)1s z`0T`6YxECfJI^4Cv>E6X?aM; zJR3{czYSL)nkCzvkHmYD2~(I&pbX;92vl)P&ZcACsEEWw{z$xEOThd&TNL@Iqqchu zUuwD#FkVdgCX;f2WA6{7O|z=VD(ox(&$9A0o0SGw9Gv#A;yH;E$7Gx(InXmV1S5B8 ztIp_(Q2QdM8v6P4x^z8}>;(gl2XGH1*HCc17ncR>Wp^rdN4%wyX<_9Af7EAW;1&R| zk`2TBc>v>F=q3}!KpX#SHRL<95uD@mRjw61`2AZI!;{;9LQTQAGbC+&$FBUOpi42J zBTWddbBjC)Aur}LuIvv#%U4BpWg673T!wLUDUT7ECzAZ?>m<)IM>VO1zA=#YiV(!; zX(wF+*?ow#8NzM1@X&&O895=EF?53??cx+$rLvpct=%TsgNGV&_?#NMBF%SR{E$5i zy!CNxfV0wgs$YJ(Pg%oY=)H3j(HGYDJnRIuk32a35d2XyO#V_$YV+G$kjhptd*>;n z_EZbuEi>!A`5o6F*7NlZ{<#SF@u9TNbKKS4Hw`~Gxx9xW77wj-mYP^u7#XALaev`C=iB)Lc$oF^x6A|%8YYiIF^!pJ zqS6gbNHbs?_9C8bgsv%pe@i2$0p=JXlfaEJR6Hd(V=knJXQ)|@Sr|{-N3i4bf>@Jw zfVAu3S*^4CaKnUylYF#NbaoY`yu;$0y|RrByX-Rqi`DfF5BIgl*XJIbR=DScb^G1FCjVJsuCBGheN^DEQv-3-vR;|z=Pa+v-GN^Ax11+WBJ#5wI}p2O{21DTcN55$_Zl#n z4n&l}sY>hjUsoP;h@BSw_3xLRsfIJ6(7&}CpYaB1$YuVyHo4z_VK!37FvXR#bHHR$ zGKd~ClHt(T+#^#z?F0rG{>JYz$w(EZW#`XKoNy4!jV9GnDl$YGM?r6{UR5XJ9Mo6cLVEc>$T|HAOQd-PWl7pe|}hxS>448)$jDXxoxz z>gJ#I?nR>>78Ta^DD&YnhpQ56W-b4erjR~fbjJhWIs(H&NOwk8T+rUywU$C z!5bflI%~!NfuAZTD|?p>L@>$@#d*mn`0qAexZSn^zYOO$tvmqY$$+zvJ#Pmt!LG|| zs?SeAvFruA0Wv8*x{|3-5Wx;GrQ}KhiRJfjvSygPHMX?&>vgh}kuAMW20RL7VkAC3 zDPIht&>zDl4skP3{WBr?QK7#*)O4_4zwqBVwphJ_VIm=9R3x?%1=jM@8|d!t-qhqb z`jba`-E$a+^ylHIl`iCal*t|Ft|1LZxampT0JL72MuUrR_S>2rLiFzJYrXo^@i|ZNPT>B{aB+EFmZ9el`y+^wE zxmXq?BqA;PgeACj7+@W8a&kLrHp_Yu%AJm7paP=y7o#_MlVcTu&U45P_1_koNvzJA z!JnE0+)nsw+UviNhdqWQHd}RpjZx@u)_|1J3+iX`5nk;?3f9zQqNiO*Vre0$b|mE1 zNTGow3g>9vJN*iA6>qu`zsoY<1)Fl1o^r+xC|>Or{;#z328nzDU>3`^A?^?BO!|!s z+V;maw~fa*uR4=ycd%Z0!uG+`%C_Pm)^hcy;aU9L0#y#4x)@C(fn_Zn=cIV?~vAy&(Hy{0=#@*Pb#@35D> zQSc|gV3Ov{9$8U`4p8@97%%B|3_viSRo|)37Hg@@Wq%JZ!oiUxgaXVu>%dy1Hdn#^ zrqRh3waM?t`%vkL+H3sg_u0Fu_$*cLy%UDydt75v{^-&QTeX*VOukw*P@W%~!!MO; zr0Z5PdPh~X5AWlPmp*zdGdiQweNws=;_R<4z^c*(Vkw0ls@i1Wy2V^ zs!xwpaW)AE?{?Vor<3@f_ObU#qu|}o^La7VnwEt=Wl?{2f)#F-=voQ zoky*#rbQkx?})e^BEH2a;a=guIePzkNj0KRT%a_NTJPtR4UBZR3 zuPt?TDWgaaj7uJ{eQXSq>Ft)i77Rq>LTBDAJ+CE8jaG|Q+?*7QZb36xh)ZS?e4w2E zHhQ!FvUfQh=Z)=Nt?e@wf&SP3UEl3sP!%dyWeieJ<cG!tgILdKNj#0s{xv-sg5QM1-*yl>tuePBXQp;#o4 zPxB?5BYnQTt&J(DoxIse+JTVg*HY7gBx7Agfa+E`6>IQ+bw+?SpySU>)R??KOor-J96JCOP-H7h_Oj_6y{K);#nxNDF#%E zy8UPh{{Yg*n~w*mjMUx#W|GPl?Ky1iJoo8uM`kSNR;m_HnG}SAhO}E5TMIS$N7YHp zVVA-#)!M*Y?*VFF^^gPAO~7V(WZ!eQTXP5(&JfL>VgJmp#kcMW56B*X40T@P&&2Qj z1$%k{jfIEZUEM8KZTnhLGpG4f{)lOe-asJ~yT6N*PZREam=Pi`&_VP(N0|grXyVX19LE8Rv416y2m!Qy2 z8jW`v1k=5Ffv>6e?7x2}bu<+m%tLjlah<@jD+}9{AG5P*F0)iNyjltHHxhgeHf>Wj zy^^R2dRPHPzjXS(5nu+KoqnC;PPHpcZN8kf2?`DlXcpM_b?OvL*UU9H9Zp^YpbWQZh(%@8+xQKna z_+8dC&q$lAM9LWV@riZx}4WHJW zlIvC`<`FouNJ3wV^-HZmE-<*%X54XmO@g#yrc})sV(BVjOet#kJOD^@F2>Q~CA+~Z z$Z!1MGFo*XG8G}sdTZh6XjI>!lvw{sP&N475n9&oH~L43E^ETJ{?PWOU+1RlGC}NW z9mkhM|72C9IakpXPq_VW4jZ;lZY0J!*XCd;%WMd zsVgS)^T>^r=zp&a0lm{XLG8H+HmUEwx_yaySdKPmv7g%e+YD?@gY@|!T$->W zioRpW|6gcUkNQkAhk_U2ff+vt17z8?Az!9G?6E4;dJ0j9aQ+T#VggupUGlh>!~~I? zKi~=`8@7f@>`ZkUp9-t{F|MYhngT-WL^?nu&rwMH1 zL(A3_=7lgCSeFxkaFw^RpLcY7<*urG)vB}p+k&~N%6?R&U89*et!)_v_8!im1UzJB z5tM3RV8>Hk!J%cWRk(14vh#&1G4VuAqT5?lf+m6=IN$>S@6dlRPG3*W*+iIhelxIt zmR1k_wti7E73*_GYCqI(4PkM4t%OnUc|-Ps;W?IQQG)byd3{9%X;8RN5sHp(7!1K2*1KQl93CDP z8yYh?Kbdee6{dX(psc`p^es>1SC(>A$UVl*(zhCyO%aub=y3|qXRt2mY z>g6R;ax$EFy!$^E08DP0h1JGle!mAE$zr{Li1+w9`w8R9T(I(PFOzi4qlepDh&ZDyc`~hhT z*rjrKxYCe;5A?*Z5z`+y-p9sqB*@QuWCH#W|V@ zJ2fn1{|^F!o0!a9yubXRN<8@T4Uq4s2YJ0Dd_6j-+mnA)lWrd*^pimi_N2FiozHl% zmAw6drWTKO&R;Lc)=+wpk)VH-Z{_m=?m9XAHTpLLMW`Mi;-rYjhw-0@FLrS{!goLO zVWhYUT1J;``%l{)&5p)%B=@%`Sy-!`6S&9m%Y?+&5J@_iMK3hA)_Dg~{m1{_&UWmbRdkFvR`xuhL*iu1$l=J0>=3e! z>>P43vW`t;6&Yo7?Cdf#N+=^Mx$nNe`@8?#|N5umoX>c_p0DTg@q9bg41@+R&3Ap= zz7O-yxIWwvq!vKOtna6t~$9 zuct!>2*oL0`}6aYlC}M=AQLh~BaV`+SAJ(UE+W8H+qZ=u00AyNePovd>kvF+ql9+l{$ou;0(GpJ|oNjovsE-oBvvf_B-4Zzzsm+(G7D3n{T zGvM^>toDGLzQfiNCC~u%ZqtQr`urA6(nNv zS@&n6R_upS23{Tbh-;NygGaC^i`~6x)ki#Pf`#&qGgAuar7(iNzNWe^(ks`nmD$Z8CE#Yk$J{l+ClK|v}(H$en2x>$o#!V|vTOB~l8 zJaE{cf~F!4_zo8W7LWMATBZlQ83$>y-Kx|uxacJ`bS(}!!0uHgMLP|f zR?&8A^{Stwe>OC2LKP-H?j~obMj0Rw`TUZiu1g<>BCP0+JbFEhM!;4_mV{AWper^( zn~&dWfKb6W<_2VbndgnUn9!_itnz+bpM41-5l)uDZdE1SWL=CAO7>UQ7q7_=saz~Y zs+4dEx)bgLaE6<&zyD=AgVI%nt7|?00nqMhZq80k^z)8`(1UC<-$>W90G{4=RVD`% z_I^Mz>7&qtTDqObY&Dl8NAZfdzDkWOZm=Eq@3Gpto@^a!0QI}VxW+zcaptTjZk2Bm zb$=wL;c2*pXn$_ zKu5oL<&tb!xQajRhm=(DQYn9mZ%ZeH_f&r^GY((fyME+mVm;;7o2oQY6mbVmo{eQ1 zH*~Ye@KYcET!jqD!=BPHdQ>&E4JsI_N2})PM0}Baz_Q|^2bPD)J=NHcBr%jjO&TxX z{Yzkg%$XI)ElK@$57nZq9RwL6dbg5D*WhtlqR`v#&5hUIAgRf+D}W2gNHwblA*5F_ zF%O>V9E>A}Q`Wm%9pHSL{Mz}$|K`B$+^R0DXpRbY&$uZClJ2h$R=o3k_;6Qz@Qv^X z#`vu}W(d5%fU<(Zv9Gi9hTLfHp$bF2BFH^)VG#T2l+q6ORcps@{Tku)CKw z{Ka4&r8-%LUAq!47e85J66LMe)<>uVxu|EmXDQ+zlhSRb$&I%$jXHNTYNKWB%Ej?r zf@g3O8*+*#&^0{ak1WTBcnOmK_E*3AxbE~;DRN|Z&bWf6X;UQ_JIiRYQvhdw_2fW_DY zBQRC6@V=a*4VWp`!Za0NL>MCiAjWs#KI(Q`D(4ItcG z(b95eOayQ$hP3)iR08z8-$bn!k5Y%d8m1WXpEHkfFC7pB_fGYQvc**Y{8}v3OPxCP z$#C+hXrQ>iGeAiA{+3-wwAEyg!@Cmda*^xJB%ssIJTtMJupDsrT`-f3od}*#VhKW8 zHxX1KJHw^V%%Fa0kd=|@EvAXmm(`;TDplxT#~hV*kXwf4_?17etXc_5cxPr}T$5wyQ3Xn(yw$A9iyr`1+6 z;}|3SVD+&J4Q(-r;n!Y%M%GLAx?O2r7IjwfF;66- z!U+RFtr24!tL?}l!ldaVEY5Y+eh{l@E(F-lxQ#=+DBq)yvs^yfMIN_P{JT=83i4HEyd=JfUK^HmAt zA&a`p)NSh10B$3*|3j$YolBiPF}kxU{v^YmIgZk^&7#<%vzTr;SmJB9Cge{7&K#%& zySkHAwz1-A{Y9BU!M)ywRi_Tyr1NZ<_H3C(^qf11x45qm{g(Y^V5H^<%nXwD@SPGNIZ=GbKCr_79eE$LZxk_E&$et9&I$eV z6E%#`u2-QOo_=(@$<4)FMH=D$H%HPvS@ri! zIao%CC?}DgCj8SYqU$@NeEO(&1;@#)+=^s0NxdaFw!LZn<2&xUR8?IQH4}@;pJ7J% zzm{2VfTf|@SxHz{ixg>ww-Jq5i)=cTBDVq?EPdr9Wy*$fQW8w+ID znMOnAgK{sOCK|i7?b-?8Kc`^WZb4r^%kDJh)?k*5a?ZvvM%Vx}k`wrm9u^^?aHp)P zop&3#>1LKrtO~E$KV{iIoU^y8Db$K>J+d_Pc9sW!;~n83RYD6_e`d*h(V_-AxPBxO7 zH7$#tmX-j;x_)@?CDC_<^W#8UtydpJ^T+q^%|>pCqCH<|S$i1V=YPMM6_@gh9BS16 z+=DKmpMANFQ{+fat@TwpH-@eSc=N?k&gj-p8~K6TMt+_%UX~LVM9&zikyeWv`5E{_ zAL`e%?2)AfPivTp$85U7U+7Se+9hhEy|OySwaoW^bMd?(WxN?+6R>5qtDCPKv!8Fn zO=Xo;fDM`APu07}xkw3ulwE}2$GMl9bN~CA>pG~HQz9l86z)%(Gq=5-hQ^nO(dc*Q zGo=i!?NF!^%S1A}Zlh%kvNk8srBc9rQRWb+Ak(C3pA3G%JP3aj(RFfBs&*zVaVPYW zj;#aQ{`-O#kMn|FYa9Z)xuq#gBRJrE)Af>&Uu){-w4TCtY^kJ7`=z-Tsn5NnpV427 zvNSPB^S-ivBllF6v2?J0Du8*cQ;X6>Hka!rV{mYAQwCC=b<{4i;JUMhInIf;Ap6I)z9{D$P6g+0P?wrf;*FwacB7ef%|uu4AVWD9%ER zn_JTz6=L@U?mCqsZjBN1&d~rFy^IluE`(w>Gb7TsEyW6majR?{@6+|3qz|Z zYm2ZzrBmkQ?|$!thb;Qoup^P%X7Ql!+x62=gz!W5Be==Za~M^TVhuVZN{v9&_| z;@5nzEds5rt!{ITbPlWYuKCp(uMlMw#*|Azwzv7ukc-pDM_5eWZcxh9=|?StDkS1I za2J(u%Al9dMm;@fDvj7ON9l3ihK6xI&rP>dCRee`s|14mNV~va)bEhrS{b zWrz9SyC8G7Ls4?jqesU!*#Mq&ZGm7T{T*ZES5z%$b&i(Cfj#~`ZA#*k*FISS)V9}G zl&$t%*S0u@o0J9ChX|x_-`A@OXT80ZSS2_mae?hMXW1&816E8w;_JolruHgXDJddn zLb7AM>$|thVo^KWI}I9?KSQq;Bm$}F(#*b43BjGE)xmTFUeCvvgY|vcZ zDIt~5`zEklx|y*-!LbLbEbgH2dL8{T`QVY(2>QOZ(yASyG9mBCaFoGu9g5-E?TezR(w)&1y)o&sGyR&J%&|IqE30*_tLRHda8m43xL_UZ=b|+or;IenI~jupxX@ z>@jaAZql{6z5RvoM%+ZK_@$!UYPjT!z4#+OvJb|DKMp1~wj&Lpi@j)npK4Z5u1I)HZ4v)>jV_JffJi z?~(S1gDj)}K&E2${XLx#CSwK4TZJDF+N-p@%CXI{7&Q`zQc+wc=brkKbFd}iBw*U_ zVYTDp<1ll?7d^PL)V^Hx)@8GY>Q#ZcWBO6Nu`q+f1ZIoN=)do=Oyr~&k9aPncKOF! z@?Q^)8M<@*#bA25nkfR`DfPz_oSCmIaCtIHsg=&FMIZC@aZ4Ij|C{ z21ooP%u;4m%fA%g%HvWU)ZvS(zM-y9bh^R2u5O-++dvl(avt z*QO5qD%Qw>L|vu|`RA*WKa`&hNY{~7#Z5hyOCc^nmi4-Ff*_4*J+S9oLT>Ph6twX4 zYML~Cp%%Aa*g|>CtI;ynmOfRqg{J}U9mP#rAJGNv2Z^@hv?wjN1{OauOdeqF$P^d| zzqwFg%=xN7U)1R8nuh?gw%41hXRX<|00H{N*SV{)T?is$Cm?PL#fCO01KNvDKJ+0H6ZL z*8TqhyZ(WC0G^~Sj`B1kKn~^3T*hE>R|k3#_{;EM;pMaGLX^YGe%z*nK-UD}57o$i z2kDGgWG6^Azm`%$i&h%bRq*tFplDbIG4uydJM8=eg>qE?{Op_n8{F$4MRnV&ApNVL z+gGJ+pLsTpUA6}?+u8>Zw%+q7&x@ubP*zI0Xw}f%BwDgn;iI0 z>?ye{S}H1j-#@kdL(MI`mG7aXRa@D2KpSa(W@1&gU+p4Xx&?hTZ563=b!3d<2P7-oU?Bz7 zERQoV>-xYMOY3seJ{1wfLp`^yg6(FD4 z(gwhe=qK$A!v^_nqJsYLgEfG<@m#)|^K`dDv5A*t@x)yPYlM6p|*MWuq*MeQ;FFqKaK;I{$=0SKxCQGAN@ zmss2-Ja%7V@RU?xh}yrjgwYu37OGWGS}BJ>uLqKojlpb2HL%YQKJa9o^up`$kb)N& z+lXVC^=}HpHKS73E@L)jthN>z$8Kt278|L_V?GQI-CrjK1`#)W@J!!s4`*cSk&iYKASrc*( z-|(c?>~A$vTcbV^cae+0Yq0J|ppnJuAhawpoU3})jaD0tPW^!X{bi@ZBchR9?Lmb1 zS_&&Y-}9?ln1FlJRhE|+lb%hT0+Q!*$cpjE{?4_da1Ii^O*mUsjcocIe&c&a25d!h zv692Ci9Q22fp4c&hpghTRSTmoEhDADmsBD{*g3f;*sSTc9e(Ck8TCH?vpVMWE`|5Q zKRpEd-S%3xg+kYDF0v0-2???cqK2=%ctpy*sv6^|ym`iT;^10@mvR-t9T!oVA-ri) zsaxBbCnzn=n_ks;os7YAajA1wVcU@E329`Ota^qa5;{2C%sPJC=8=v?Rm|>i2w#3tr9s``|$K=E1ZV zsQ_tjqsO#_1uyCG>)Y`50G^TuvbxadfpH-m=bm=nK2g)`6C|QfMin5-oWcIaCnqOo z8jKb{{#;fOoW3|*%hh;8cKxT`%+drw=vzAN}9Lf=sN2I9~CrZ=IF=1EMg?LR9z0u-d1bDbr_j1hEA-RE640*}O%JG;}9 zO=-J%u9ToM9H$gN^;12IKPF^w5?q^~vqi#Fe#&Zqt%ew-T%{y=W}VUHYqLs(EH6mVze*;`hzjX2<(|7nLsdf1BS3EBTh&);e@x;Hi4&a$xb6*`#WKvfps< z!gSF5{6Zr)3%7<=1(t-@B9%x`g&L&4<~*a&PGh+hzi}aH4j`5LyN~@cf#5dC&N_`hT1I zMv~NReb38e)dK#B?-F2V_g`f9JMKK(xJtyH3|qg03jbZpt!{{bCc>7!ot_+go7k-~ zBX_pT;3jcfQ5b%a2xBOCK7MqbhM{!mZMue^(<&S@p{u3%+%&&~2aa+yeQqg^u~mlP*K18%@Dq`UB(0h1351PBEKluyu%u0?dbjF+IE1 zAE{u{_O<7umq|;XQ~LALb+SOU*aIggJMLR&^rC#d}jJn2X&G3Fk-O?8~ zng9au#kiTb9sP3`DE_WE+tCYTuI-)tLep5<_`T2zGm|^aW3z~|^7Pf;3u?mYh|tdH_ zP8%EQeOVA6(&L?7Qh?Aq)1pWx`e~Hn{avJhM<)3i-mC&mdi5r_PrX63_#Q)ovWm)| zey|1G5|7w0)WY!Mu_LVU-O=DRBb3T3UdjQTs2Kd~{}j8Y$L*wCxo~g0-bDyy8SCyd z?WgaE-F}eK@W&C|<2Q>5GFI{0X=ulD<7(3!i4l_I<1S7aDbZnek?}XYJ0Q z8ISbfyJKw>!Pj~QDO2FF7#kd%ducK?smWdbj2Y_Gj-(#N6kTQ06CV|z@om*cSCBQ? zufL`g$h&x($DB%EA$g*RH~B^iV~Y{W8rpgK-2m`alVJ`+)hxqwPl<|3I0Z#bwLieL zDW2m30R1O?FG!%P<)f6!lLrqrYjvuB{rvee9Lu!&p3_*SNaj`G3YD#Mj-R0z3$^o$ zx;i0Vju-(^d1Z<}9**0Srym96dw_0t&nnTZX!e))ZLoupqV3dfndJ2N{aJX+o9&ff z0hUSS@!4%zVX9pYfi6ydBZ`Yxkd^C#Pnp9UT1zcXTy-{KIi|hkh0o{|S`avcJOLqKGM@J{- zqts{AT)m6)P`2WJdt&wc(fJUjltr!%%dMAc*z|3*vDlZ}#=7v_Rh zhF=uwP4zQ!OZM>r@GI2!Z1a+jk;?FzEIFHKGY<`Toq)PyLQpJh{ija$u^F#)w)W>| z-it>JA_Z4-#6J;V2+F+LRv2ani_~(xkh(_0Byd4k*t^sCHfWm(8}EgHJ&%{TOOgM* zO}%m|6yq3kL-?Q4xhxo}XT&yeIl6H1p!mi)%cRB3t=L`!U-#lu+ zIJewiA0o|bS~klaj{3vQ_@Oo=Z^5%=IZi1geD`dcdF;$+7M-A&uW~*|__Rv*#1ow( zF){nUUVucmIT)KPpwm|;3yw28kygo3nrl99iNX-Y1xj8?hFE%Zadw{eP6*Vw4B~P( zau%uPE&C_}=_Sn&=jF^kS5U&>vaD$)Z=Mr~w^f4I8#gJkfr+ovo9AcPd9U9WrufF& z${L+J**Xsa*Q|t*iid~C-O}1SFz}eD*V~A-q1-R)+;#R6Jr4Uw5=DEkPyetR{9mI& zAnezZ+3ygkvzyaDwKxFDK_%e4sH6EQ`6c`*Fm|{gVRxKi$w(DG1(s1&rQMj0EWdyG zjY8JDy?4qvjR&C@qJod%(8I%i|FElDx5cF_B}OOdX9J_wvRb{o`Y@X|0L!#gIu2zb z5-zw6*umY2ZJz+Q2ONhbq4;W7f1C7P@Ik*jwiZrvnYraY&BetFvYb*f?VNLkWhT@& z+2Xl*NzX$UFNl%v;0HuV$2je&1Xg7q+Uz%RJxQ~{Wa7u*E=vQ$W%AI1o4+=N=FU6h zz}3MQlIm@YA?Ahjoa+--VRV5_{v{F(Q;VcI{#+on})<%DvF z*+bH$zVOL%iqlD}R|5F=#m1kzffoHWR_!2vH8aRXLaR?_%402C@NbdNyr#u`-=Cr1 z(I{(iwvih>V52p1e<J;2HzlNpXPPo`!sqfLRAij82^wJY<@2`XhceqZVDRw{`l4 z4e-bkaDd&yTcjn7eS7Iv{cYAU?Y0IYIDR8&qfyEBQOLh5A<;TdjQ5S_9rGk7bdeZ9 z!_8I=C|UlkybWV#B=&lLL#Ca0lo4-2#V$XYm55D$#)F}>$_bwJp%8YLmuc67H;Lgp zjGM}D!au@4i9~65cl_G!nKkg6zjL@BsV#~BQwr0e7NFLmG#Xx7r0KI|N?iqf@@Euo^C)O3v^1f0(d5n97I2zXwsT0f4)^(Aw-ZoQfe;`?Jj z`3vk+{oNdMT|*=J6>d=y_wFcp3H`qhddTwM2i>1poq%*FyhkE#r4uc$Umv+p7kx1Z zV8HqGKLM0syssbA`QlR&gL%c)!?i#_dA#Nef`^Q&QZfY`Uc-6*UNSP;zm`Ig1MQrs zT>gT~0`OFvZWZm2oi$EfvGGjYsF*uApl-4bJSC$s8fpoYv!;l$NGsKe<>loZJa*Bw z$M}s`?4ioYnNzDD==ZqBc&-mUjCdUCcJBGBe34!2M?_x>#DPm@aWlwv1uN(F>FZk{ zqFLl^@x1BJu1=^1fY)_4PO2k6!BVHB0eUIepcBk$o%KF5YB@0O>S3=pyr zGpn5O26|C9Kc$+T`SFW_$d1vDIs`na{-cE9HZ*r&<2X0)&2do1r> zSvmJXT7aye#|5-*Xki!yn`=KqwOJ~SuDP?uEKkQ#l1p7cw8GPVzDAVA796@%Ehjv+ z{#EW!t00;G{=vb()pKT=de4YzpFUw!^P4}?$8BL4KxB?Gk9&X$QLyqJ0IdlTm|TbT z3oBm2-~jRWLu3XU$AzUp*HlmDYVk|$;s%O4pQ`oVN$vB2k_N%5cpG5*F9B1g#+<0j z-7b=)DbjX!#`8D4!;QOVcbLX}6@C(E-_?pF!uG9#48ev*djIy2nb>I?!?zkqjgM3> zhP3E^JFX|ik^ zBbD8Zx2u{`KrwsYp9}bX>Z}26;Eq5b-Vw`;L|lu22$J2!oR=;=yp^TJ1~!riL{OOW zCy~lJ(jPNo_CId)@XTOjV(9KfZ4lNTIdh;I*|gppBZ6#&(=?Up%g{IcCE+gmVuQaq zH$8ReO%LebY!G>=XG2Zc79H=VR^0rsa@}#P;O0X~w)is|fyNYM?p^(f8#{rw+Pg^N z$X6`$DtM&h(@s;6-<5x5sKZ)+819*%|DxsEU={gq9|BYByRkPXR?bBYPvRjf%*PM9 zSkK5O6l71qT^ljQCHaGyD9437KnBK^tnSuDstZpEJvlQ`n?5$fS*Z@@ceFM|sjzSNX6R>KKYksj<}=Iz8~(77qb4Ww#11?T6pBD41H6~NRJAny2$Ozi zJ`poTA;Krqj{fkc)adUGnTtzb-)do^_3D7+qVk2lU{+z{)xoWQPX|95-z@EzYew#| zD8cJ!Rq8l?%HN&MR<}&2yx$l$wX8dD<*088ik^YM6mIuUk@0s+$&*%VaeJuK&cmDM z4wXKd4btPMlTt4mlC1|pbE#o74$csAI4Ac z)sTDn8N{Mi49r5;Z^pCXX`)FG8}qs4;;)R|w*Q%|y52NQDL?IR;dzL*o6;rq{h=@{ zR~4SrGW56qad9rWMvQv`af(e|vlI|1CgSRV-NX~U5P^Z zY@*n-3=4knX< zrlqG}uvxCre2TZD{I%nnR5kUu8p}j7&`NZ62lU1mi)NnaDDc=!NP1_n|A*a^GHnA6a8Vd^C}s6X^k&Iag*}>nI^za``;) zaTr(ryU#x$xR#YAhF0G?>uP7z?aP3O`)k|@oubu7705iYzkXk331GR_@Gnw#Adpm%VcIBEjNIqt*ico!N1?mW!vkVaiGjl>ktN zNKH+EY;1uaT%Pt*XLBnky8G{9;cd{ER&-Rbwtn`6rkpq{bk^^aD{JID`{86y<{i0@ z_doS;o*T?G8ZVMs% zE+X`Gs^67R@CFE#YWiw<|;+pU_Sp-ZG4uMA7V_RJRO9Yz6IRK#z;kM zbcJ~yO91cxJlE$?5uSd1PY8rNy3hu*apG;*-E-rDFEZm4t9VYAyArB;4HjB`TUE@# z!WO+1W3k6=$rw^uiC0eRba9&-RCGG$TUiGWUXd?h5|WZYz0f^2@4!jKi7snOj(^_| zou8EOT(P(p+Z5}uS{Un!emTot*Xw~TV7TPGtzhO8ajOC#Y87v%YG;gWw5tLaPkcyZ`UUZ4~WIaH$d@A6-;(dLcXT`wJnO z>~AE-AGNLv=u}h!&k$uuTuZ2N`#qX~OC_{Cx^UTE4xeQ}b_*J+6i^hd)sSJUxl)`5 zpvWz~i7;L8$PpTd!@A)qvv4xQ|LW$fN-V^+Mi{+_RLnc9p3?kKO?MgC`}IR(F~N!4LG#~r9?0U>T)(1}@~OEPbhv1)AYMq+6WjDkrY!eZBb%9r>`!O>eH z=Rp78yI~U%TeA+S$QhAw0(@m8xTJ|L5Z_XhydJVM*qH`BAN=m29f~ODh+A*a9GVQ^Y4ir^~P~bFUW=CwWkiFYEAtK9sV}of);GH z-+%Qg2K@_H3+%u!3lpS1#>fspW4ysv+X(==#&QoHw#{<*cx4Y%`{&+~p8C|J!5Zrh zMV`SAf!p4}r|E$$IBhgl)5uTsT^rg4vflsd8bE z@Qm~!nC@%0+oHSxO=r46sk*x@BnkK7`rqdpL3pe)(7t^KNTy)N>7b&5@k@L#15zz% zHJj*1x?d0f__;EO`MPxOp%a2iHiDc3TtmHkC#^=|Bx>Ot_OI)U)Q}ES|9->Rl`4EQ~V8-~0wbb3cQN2|ynsUu&V8@5Y zxeZ3al@Tr<0^NC>_T)cJZV{(OQ>@tCeTHpzU^_Paoo0l>% zGJ=Bev?sWJM;+nsv_Q~lgC79paW$IqI5*IfYfbPTfI`iIgH8!p2eET20EknZ&l_lO zG6(93`czBj(Rrt4I`9zV*NnSGasyXh%b*Fz0L?Slmf-s1kuqq3kY)6Uz``E*h=;Ih?g-1!!`UR9}9206-Wk%qvj56u~$rKMm-&e}{>v1D)#j2V9{nzR(w8$lD z()%1wn39ATd1s%c{32WE?f;b4MdB}1hex^svht0Y&0$pI_oFwpfxp15S#Mlxp#prk zf8g0WAZZnB8+te?Nhv__tb0WgbbCp?8X4K%+ES((2`qHwor-%5v|kh9Wl~VY5)$;j^rn@ zo4L%7Y+zI!9lB?8OJV|(yWQ8%|E`Vgn-Hq!=x{vxE zbh%vFTrOT!d5EJ>btLlo&rEP0s*8JoM}FTrJQZ#i`6rWG{`)0pg^6q(PWIN!r_1fF z-Ut3FE-Wm(+Vc&h@fJPX&wtPO1ypKY&_}jZw+wO^&O@(lzwXXhtnCI)6694N+s!%D z1`^Y|)gQD)ls&JGBR8u9a%xx#(sP7Bvw!kOWb6Lx`YC6iP1L#F1inJs#iNnu$jdzh zhH$hFf~s|3D3fz8{i@D6wQe2UZn@brZrCB=2=p6fD&w)6?Kq_CMd?HNtRZk-(JCu) z)oy0uo^a(sO+kYjc+}0@vfbrd+Odz4kks4@|4IK+5p0>V^p^LyLA92e;3)^A1n4HZ z636TEn>@k9E*Iljm61Va8;N88B!=7VBSF!+(lDrLz;~|}tPxafD7{T@lvtp$&BmRW zEQlArQNWttd4Ko>Ln9fx^$C+ae*!7_;*wlAWAra5^tZ5zB@GDcDR zS)fje2wvTjaO_ew(!a642r3gulV=JMWoawf)(yT+*{kJ;V^)!cv~M2r?Fjej)@`Km zys)sBwzeNobbQOfA1Ka3?KL1TQoyYg5f5@*GQg(xE`bZRU_SJ1+$wC6qs|fd(1tx* zZyC9O5=n0&VVQj};Y`NqQTbJbKKJwMA(@IeA(H{y)<6bMfiBJTrAMD%MQbfTpwVde z2Y>a=aAoOfDcgwY^M_gtf+VlZAWxnkmA@&dt5*@Cz8Yd!O}nTbhrH z)M_|HOo>Z@zRbQW;0Qkt+*dI4lcJowi+k5^04KzRadk2msX!N<7Dhx=NZ-n>uk3RP z)@o+X>HCi{a1Xu0f#5KoW`~M*pOV|I(u<`W(toQ`U96XNy+^73w4z8D+&wWcD8^+&`8SmHcG~stA2K^gu60HPFi1=Vsb= z7b6O&@hoo#mpDWu{{4njH62+0KEdEd?t|A2f9oMDSv{HR`p_d5EpU%-h|+UvG;H|F z#L&vWnY0}JFvv8PPxv#`1%iS{(rKGy2xQl4@Vq{tSZcQis zg?Pz(j1P@t-K@w}!qFMg#s3wa#3GeJv%EeShY61!({D?o(i;CTHOYKVb9FRLW^%GF%Ou zRmO?bcD!_tkn0f;3x+ka9sma-aAT;x`y>2uc#)$nX;q=rN_;y{M7wU%5~8;-xmV)n zSMDc0BWsEBqnV+ciGUwaK$w}wT5uC3$ynFVdBf@b#x#QMdgeI}jqrSOD|4nm}{da)eZE*FMTk9Es ziprsNL|Mn`#oSnbCL|>M7$ES;_0TeoX%j+Pkl$AxuZsN7Gx|OGltL_R@iUDJtT2Pg;!YiCO` za>Pj@3|M;>-&I?iPbK2;Q>QwD&FW=so@?cai?yKWS`R!$LWdnLnP(}yi&+ieeTj2P z^z9SWcBvv2)aw4UXxtqghD6BsxL?u`m$7?kShAZ9W?U~WKWol4odv%yuP0UWXp}YX zhhu6Y|JK3Q3y}lhnp&8w`owGV;G^R$R<@d#@#khXLRSi6!3!t|I62fw{b`d70UkLD zNgbPX(=g#0s31s2!A_gbNFG#u7`tJgpa>Zu-W1h%02V^+sR(>{`(tq9yaDVvoqI0e zg_s45Oq%s;xJdYgLWaR994I48_tDqC?w=f44Of|myTtBMFnTZpF6ig5Zy#Tg=9^lW;ktTAFd=p^Dn=Jqv7X=w%9-|ctX{`dS8Ko&L** zD!bo*)nKdOJVXnLm|~cW*Fz>OJAt-j&l^QhkAhfiO~UIvC1Twx1Cnkt(Ca~s{hFzVsU%c3j_WOk1s7 zc-eDyq!$y73vfgOH2M99@avdO;%UE#^IJftDrduVoFNg?J?{MYKcGhFxZ}l3zrNuc zJ)ddpRj%>!^jiL&K_yGfgPmC(|F2nu+G`NOgrW%agpgee#(aMproJLh6a=({VQix( zuHv!xIoKE_lGJ>)Ft^3y)lXj(-0I1EHKl)KZS~Aj3u8%0FuD60;=r3SrZW~)b=V58 zhZa~*3V!ldYqWC1BrR@&u^@4#$F@)gv#ADf2xEPu9rziU2B{hsiY-6~VnC>~0h@DBg@nR@v)Q{Z~V?n^{Bjl?M0D4iWS?h%qj- zXI+5F<|H9s3XJas;S?dZF9MVv6*gR7t_K#RThL_L9+f49;le2*KPV#p*9(A7%9b)R61S>#=q><*-Ua(UR*Xy!x{L`Wefdg@ za>>SS`iBnH*J>ZpFnIZ!l9Ef~cVod+=`czLwo+A4HRE`jf73Cz#j`yD;S}xTcg&ifW`7o>k@kEcf%FI$BwIg$splA;^#F29R|Y|L0UQ2 zT&Vaf%T$I)EUc;#4)IhJ!Ta1|`Z|6yI?^WkU0m2xW5<-kWr_`_reT ze$5K;8W59gVxx{834hY(fZKhJw9V;v%xH8d1_wv5gW8E?X<1d!2TgdvVXchWF98rx zE3g5$&CYmwiEE{HcC(S+)2b?k6dN1==c6K!*rc`v1NlgztPHmK8tIQu5Q~w;cE{Q}eeYSOx>)ty1 z>i}KDC9++uKf71*G0=>y@(SK5r@#jDKuABO@|TUvk*bH#>%9B8TX4Pj$lFBZ@=T1@ z(6y85Er$skSIjd`)H(vX+>wv@$_pB{OP-#${Ne%E4tXr$^66cHuFn{o_uP_?3f)AL zjVxx%?%dxPAuzmP_HnH;_B&zmUvopwH5vz3yPSg^@Z?JO6D77}8#z6VlUDQJ#^F;= zrb@IGnZ}64`mI%`T6sRlb%{!|uZXC_%vphgU~qDH5)w2An!7!m6HWrJ<~;#hq;FdJ zM8mHcBA(gg<>*^1BA?#`1KJNEf~5$jc&sFixT);sy#SNT_%ZK*Ov!C#e*d>ZM+DWi@Z*|_s#cUK+%N67S{n)M%2T8Lx*uo1$~Bf!~rNRvzrRHE|9RnjUp_bgbJr`N+_idbzci&6jKBFL~fHi<{ zVfc8xa6)qaS2Gk8D8hfpc6^P3IGYPC1MAN|*f70SD!2~vYib2f2q;l{T4Rh=N89H+ zKoDt%^+fe#4ylfa;jf5U%jpj4lr$!EeB&2Iuan}j`V}`jj95nJ=YyX@9B80xceqS5 z!ew;eO9xi=Id5#mR()UmU$co@6(e~V^x4xJ)Sitlf>I@XlizMzUw@Gm`7u(bOk!oB z8YruC?Lb-Gqo$@=d}!*&zw`cXEgz;I$2r+@$xyZl1rA0b3-mLFGjnF6(_}yAH+%#7 z>P7KMxM$PO;CSoZ_g&dBYyNsNHgZOcN7|%=ze&x>%Q3LlS(+10?;uwt_Y+1$_mFuj zyl4WLgl%^Sw7k8SgP)6-lYXA|>hl^|zR8fHLbUhbZIjWMHFE%HAA`x*Ot42Y895E7jz< z+~ij5)jcCew*g#b#@AQhb9!I?Z0UB+-}{v`Abaen5T@dz*U(s?0^=O^QJKzEa6~CP zQm$R5`dJ7=M`QOMBFc7`Qyv+z|5z#EN~#>oGIFy)+=1d9^xw!T>5hjz0+V@_}#-AQOBhVF#s#j(=0Xmg7OK&nUO&)0cW>kc! zDYH{q@Y84!_SmuQei*oj+&M6%PU&v8XK+9tUL|lxC86;IEK|E@CAo21Er%eDHQ?D4 z_Qzt`4rd!QLw-{W1r+o)ts}_M>4bjMF z_CmD}y+`s*zy|T0!s{eBb_hYY+xXpWdKzlcdN`VZc&50bll89b>_gh+Y%L;<(t)IU zx*pDMVqx_mT{bP!=HDWh6_IbbqwNg4{Ml{=cxy*(20v-zRMp*w@@?&S=}3hXTlB=x z{Nn*7+fB%+dd=<1uQB4=@&mkg5F;jYi-L}k zahWMwH8-rrNbq+CHx}A!{kCKl-}&BhxE@4YB!K_Blv8qyh== zwLm)IbF;-|F4Ke2Fi6`j7O*N^2R!e|;s>%cN%xBNP+FB>v7+o^`;e?SLwg-v!5~iP z1dKX7Rp8`fzbdmSfh4g~rA65aZ~^M{h6`bw$}?jjXxbh_C1eVv48vGh^4jJZZqqF9 z%1p}tFnl(AEcTYq`_Oam*8rOTBL;@s;H2t!ILe=49E^eVm_hb*^IMB|oaFe=VjtI1JJIi%^-fO%&EuCqGKTP~XAneS}_2n~gXZVvlf_cPt7Y_e4QUf4d95d^WvcZ!o+ZlZo; z%q^Hiy&tnC053cz&R-FqwB3&xi(^EmpDp>8QCV?R=Xu_DEbR>NIHYVKJ;dI_E>G-) z$)y49UrbxpMl{O_$e(pK??Sk=Ay~rtE&UT)5O*Lab`2TmE55aeVDMsdWZMubJ5xwW zg^W;BFM^Hy2lz&L-VoBchO*#||C760Tcs_ zf+YA2-sZf9UK&j5r}w!7$2!B(2;y3BI7M^Kk6W_yCBRKp8#=}G>$$q_2wv41zftlA z)7S@A;h}>Z5yPG6>bfT=Bwuq%cFjx^>9|+<{!F(GVE7hSo&mphjRZbW&U(`>zxzqG z*$b>Mx>guLuvo?}OHn2?-dTJOf9;_e?4droc<3~YH3g1XgAh`$OJ}RC-pU3b+`%#7 zr0UUHj{5r!)Zr%dw6q)#N$8W@DK#&{?$id|q4hqKY-Toyeo*}T5<&QCJ0Sph!?pi&UCE;X zUz#eu1cwrIf)~Vk)ZrgQ<3dPq@yLYDx6Gt+?;Ti8ei3nf+b{}xH19F_%9>Ze367*C zAz)Uo^0F-JgY{A+tBeU!0z6|4DFkxAVmDq{MX8@N@fd0zqX*V_T3)!h0(s5MBH4KV z5Fuhvyu`E+`~El8&ER;n>_)xV&&c{iTE#v549BG2uBqBgd!u{e2^@-qVb+ zOfYLfQ=@EQa`Hq*u$L!uxEw(5qo`%5s=;iGVix*a78b3jsQ69%pk^}qKZ#c)?t}nE z?z7qBkVur@>ajafYvO;oNry_Rr!`;wlta+cgQO}2r#u{}{#N53)3cG5@s)x+O&yvi z@=2s#=?+?qo3jY}*lkSG6*Zj=*_woaK2_OKFEB;LL<}ru#+E)M*27f$=-Ia#*g_)y z7V3+CqktHQ`zl7OYu4KcIwT}x_JFYH7>xR*68ZMhM1uoHY_J6KN@j43QZR zzJ84tM7}2m)Pu+!t65KR{iM9w95q;dQ~6@jkY?5*+`dH}{#Nd3Vt>!>2Px2?%Hwb# z7Ka&s*QEX%Z60*UM+q1MRFH3$C-^MepxWmRKWqTBh?#B`e35&csp;NyoxK)4a2LQAs@GmE49ts2ja!!69a;kpvEWD{ywIF2XTUDKCaWS(<*;$|2_(0=7`c#?ymc{4+ z+1*IE?nMzcmw^d%)EB*5m>PEuFQck(ZRkty$Es2X*6=1caq-&qmY zQ+tCS5qoCuNOD05JYUbv#7T40Krepq>dDZJAai%^!42;-y=seZJs2{`|)^3>hGU<9|j7M$hi%>M)&_p^Gk(EBPi z@Sm{vq@}yE_<>P-5hsngA;>M1RGs&VcpyBg9#t!cLRjEMvukWz@6iyn@*un7WMX2% zZZtpgVIiMatGcgF7wracT(kbGESfR$UfSeoyWxi#j72Kw)4P{q7$h38rv z)^mGmB1UTM%zL}Lmk0kD`E+Ysv{?C1Ocq=ZufU*>xf@*xoz}cPCEz7YJ=#49!5A8) zXs*I|QZTv8MA*fvO3qvUIfSW?UqDOYDa@q)xJ%3U;6Y=|QB)SQ9d0d>jmVahqpg1k zS6F`BR4~R>VA(llJ{h^(KBV|zQ_G;>H)xu_a&nrQT|e;xi4Lwmp4o)AkSFF_q1m61?0lU)b2MsOL(n%zgSPt)ZrHP`ssb(@8 z5fI*2Hr^WddWjl2{IRfgtO2vu2)R7MOuKy~x5d`GUTA8W(0gvjdA5b-6TN~7%5vbGBmb|1c**G`c5h^arMF|Sid>N4Ku zUSvLX`q9xPBGe<;@wR(+ao|$5&YTLcxxvGF0nX>9qbD-&COy6ti@785{DQHJYmVhU zu^H`&5a-P}$H`kX0i5%lS=IM6WPBrx;wX(9KEH7I8(+P9N<2J0)i=l6b2rU5J8^~e z19r{KAw-TIIPgt01hpEDU(oZ@N83%g^=p~(fUBGnj>y{TsHNw8u*qq zPIvzaWvE7t=-U&~Q@@TTPDZWD_L7o~Z?%`un769I7Qu_;kV39wfBTZT``-(I zGVor0yL~^^g#T$5B6p*Umw;<7P8t-q9)K1Cj^Ul#MD

Q7nSGY~*+K%?pzgzb-(m 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 bds`l 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�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 diff --git a/src/plugins/region_map/public/__tests__/world.json b/src/plugins/region_map/public/__tests__/world.json deleted file mode 100644 index 162e1f456e183..0000000000000 --- a/src/plugins/region_map/public/__tests__/world.json +++ /dev/null @@ -1 +0,0 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"name":"Antigua and Barbuda","iso2":"AG","iso3":"ATG"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-61.686668,17.024441000000152],[-61.887222,17.105274],[-61.794449,17.1633300000001],[-61.686668,17.024441000000152]]],[[[-61.72917199999989,17.608608],[-61.853058,17.583054000000104],[-61.873062,17.703888],[-61.72917199999989,17.608608]]]]}},{"type":"Feature","properties":{"name":"Algeria","iso2":"DZ","iso3":"DZA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[2.96361,36.802216],[4.785832,36.894722],[5.328055,36.640274],[6.398333,37.086388],[8.62203,36.941368],[8.183611,36.524162],[8.251665,34.64444],[7.492499000000123,33.887497],[8.34861,32.533333],[9.055277,32.099998],[9.537113,30.23439],[9.303888,30.122498],[9.766388,29.427776],[9.948332,27.824444],[9.871666,26.514164],[9.398333,26.153332],[10.252222,24.605831],[11.558887,24.302498],[11.986475,23.522305],[7.450807,20.852863],[5.812499,19.44611],[4.245277,19.146664],[3.331944,18.976387],[3.233055,19.820274],[1.795833,20.308331],[1.1675,20.741108],[1.169662,21.102543],[-4.806111,25.000275],[-6.662778,26.129166],[-8.66679,27.290459],[-8.666668,27.666664],[-8.667223,28.709442],[-7.123889,29.636944],[-5.538334,29.902496],[-4.920556,30.508053],[-3.626667,30.970554],[-3.818334,31.695553],[-2.853889,32.088333],[-1.180556,32.11055],[-1.010278,32.508331],[-1.668056,33.261108],[-1.747222,34.747215],[-2.209445,35.085831],[0.95,36.450272],[2.96361,36.802216]]]]}},{"type":"Feature","properties":{"name":"Azerbaijan","iso2":"AZ","iso3":"AZE"},"geometry":{"type":"MultiPolygon","coordinates":[[[[45.083322525024414,39.76804542541504],[45.81998634338379,39.54972267150879],[46.17824745178223,38.84115028381348],[45.00443458557129,39.41638374328613],[44.81304359436035,39.630815505981445],[44.77886390686035,39.70638465881348],[45.083322525024414,39.76804542541504]]],[[[45.513051986694336,40.607221603393555],[45.51749229431152,40.66554069519043],[45.57305335998535,40.632490158081055],[45.513051986694336,40.607221603393555]]],[[[45.24527168273926,40.97694206237793],[45.22916221618652,40.96915245056152],[45.19582176208496,40.99777030944824],[45.24527168273926,40.97694206237793]]],[[[45.045270919799805,41.0352725982666],[45.009992599487305,41.03305244445801],[45.00111198425293,41.08888053894043],[45.045270919799805,41.0352725982666]]],[[[46.57138252258301,41.87193489074707],[47.76693153381348,41.19609260559082],[48.58395576477051,41.835771560668945],[49.52804756164551,40.66276741027832],[50.3749942779541,40.262216567993164],[49.488046646118164,40.15053749084473],[48.88828468322754,38.44240760803223],[48.020822525024414,38.83554267883301],[48.35978889465332,39.38521766662598],[47.97666358947754,39.7192325592041],[46.54037666320801,38.87558937072754],[46.54138374328613,39.56443977355957],[45.5958194732666,39.978044509887695],[46.00193977355957,40.22554969787598],[45.15387153625488,41.1986026763916],[45.0229434967041,41.29705238342285],[45.33665657043457,41.46249580383301],[46.520822525024414,41.04998970031738],[46.69387245178223,41.312204360961914],[46.19442939758301,41.68582344055176],[46.45175361633301,41.89705848693848],[46.57138252258301,41.87193489074707]]]]}},{"type":"Feature","properties":{"name":"Albania","iso2":"AL","iso3":"ALB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[19.436214,41.021065],[19.600555,41.796661],[19.367771,41.848999],[19.645832,42.61805],[20.071423,42.560913],[20.589642,41.882187],[20.492775,41.331108],[20.82111,40.908882],[20.98349,40.855888],[20.671944,40.09805300000012],[20.010029,39.6912],[19.863052,40.039719],[19.288609,40.417496],[19.478611,40.350273],[19.436214,41.021065]]]]}},{"type":"Feature","properties":{"name":"Armenia","iso2":"AM","iso3":"ARM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[45.15387153625488,41.1986026763916],[46.00193977355957,40.22554969787598],[45.5958194732666,39.978044509887695],[46.54138374328613,39.56443977355957],[46.54037666320801,38.87558937072754],[46.17824745178223,38.84115028381348],[45.81998634338379,39.54972267150879],[45.083322525024414,39.76804542541504],[44.77886390686035,39.70638465881348],[44.34721565246582,40.02388954162598],[43.65749549865723,40.108598709106445],[43.75193977355957,40.739999771118164],[43.460771560668945,41.11296272277832],[45.0229434967041,41.29705238342285],[45.15387153625488,41.1986026763916]],[[45.009992599487305,41.03305244445801],[45.045270919799805,41.0352725982666],[45.00111198425293,41.08888053894043],[45.009992599487305,41.03305244445801]],[[45.19582176208496,40.99777030944824],[45.22916221618652,40.96915245056152],[45.24527168273926,40.97694206237793],[45.19582176208496,40.99777030944824]],[[45.57305335998535,40.632490158081055],[45.51749229431152,40.66554069519043],[45.513051986694336,40.607221603393555],[45.57305335998535,40.632490158081055]]]]}},{"type":"Feature","properties":{"name":"Angola","iso2":"AO","iso3":"AGO"},"geometry":{"type":"MultiPolygon","coordinates":[[[[11.750833511352539,-16.755279541015625],[11.693609237670898,-16.53555679321289],[11.774999618530273,-16.804725646972656],[11.750833511352539,-16.755279541015625]]],[[[13.997499465942383,-5.848611831665039],[16.579721450805664,-5.900833129882813],[16.941667556762695,-7.198610305786133],[17.62416648864746,-8.09805679321289],[19.373056411743164,-7.996110916137695],[19.538949966430664,-6.996614456176758],[20.62974739074707,-6.913881301879883],[20.548715591430664,-7.283615112304688],[21.782960891723633,-7.280841827392578],[21.790555953979492,-9.405555725097656],[22.312223434448242,-10.364444732666016],[22.253889083862305,-11.209722518920898],[23.986207962036133,-10.870460510253906],[24.02055549621582,-13.006389617919922],[21.998334884643555,-13.004167556762695],[22.000150680541992,-16.171661376953125],[23.476110458374023,-17.625835418701172],[23.28472328186035,-17.66250228881836],[20.85416603088379,-18.01639175415039],[18.915834426879883,-17.815555572509766],[18.451539993286133,-17.389835357666016],[13.993219375610352,-17.423946380615234],[13.160554885864258,-16.952777862548828],[11.752782821655273,-17.254833221435547],[11.820833206176758,-16.503055572509766],[11.810834884643555,-15.993057250976562],[11.731389999389648,-15.846668243408203],[12.509721755981445,-13.42527961730957],[13.792501449584961,-11.791667938232422],[13.773611068725586,-10.684722900390625],[12.984445571899414,-9.087501525878906],[13.391389846801758,-8.387222290039062],[12.245000839233398,-6.098054885864258],[13.17888069152832,-5.856328964233398],[13.997499465942383,-5.848611831665039]]],[[[13.088888168334961,-4.662500381469727],[12.565553665161133,-5.025554656982422],[12.526666641235352,-5.724166870117188],[12.21455192565918,-5.7685546875],[12.026132583618164,-5.014995574951172],[12.779047012329102,-4.38899040222168],[13.091390609741211,-4.633054733276367],[13.088888168334961,-4.662500381469727]]]]}},{"type":"Feature","properties":{"name":"American Samoa","iso2":"AS","iso3":"ASM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-170.542511,-14.297503],[-170.560822,-14.287781],[-170.540039,-14.283892],[-170.542511,-14.297503]]],[[[-170.637268,-14.289446],[-170.826111,-14.325003],[-170.560028,-14.265837],[-170.637268,-14.289446]]],[[[-169.444489,-14.261667],[-169.513062,-14.275833],[-169.536133,-14.231668],[-169.444489,-14.261667]]],[[[-169.62558,-14.189722],[-169.644745,-14.176111],[-169.621948,-14.168612],[-169.62558,-14.189722]]],[[[-169.685577,-14.191944],[-169.690857,-14.167501],[-169.662231,-14.175001],[-169.685577,-14.191944]]]]}},{"type":"Feature","properties":{"name":"Argentina","iso2":"AR","iso3":"ARG"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.60861199999988,-54.891396],[-68.643112,-54.888611],[-68.636124,-54.804771],[-68.60861199999988,-54.891396]]],[[[-63.813614,-54.731392],[-64.678345,-54.907227],[-64.75528,-54.835007],[-63.813614,-54.731392]]],[[[-68.261948,-52.98806],[-68.543625,-53.229446],[-67.359177,-54.028893],[-65.138062,-54.651672],[-65.353897,-54.929169],[-66.44612099999989,-55.051674],[-68.635834,-54.788338],[-68.617584,-52.64151],[-68.261948,-52.98806]]],[[[-61.878891,-39.2425],[-62.095284,-39.089172],[-61.890556,-39.139168],[-61.878891,-39.2425]]],[[[-61.996948,-39.066948],[-62.132782,-39.01889],[-61.981392,-39.026947],[-61.996948,-39.066948]]],[[[-65.748062,-22.111668],[-65.190201,-22.09473],[-64.590561,-22.214725],[-64.324722,-22.873611],[-63.941116,-22.000835],[-62.811951,-21.996948],[-62.643768,-22.238903],[-61.007782,-23.813335],[-57.75611099999986,-25.176945],[-57.576668,-25.549446],[-58.604622,-27.316921],[-55.736115,-27.439445],[-54.698334,-26.438335],[-54.59891499999989,-25.573223],[-53.863335,-25.681114],[-53.807785,-27.129169],[-55.765282,-28.226112],[-57.608002,-30.184925],[-57.806396,-30.748219],[-58.199242,-32.45031],[-58.147224,-33.051674],[-58.426948999999865,-33.096947],[-58.531951999999876,-33.516945],[-58.383896,-34.05584],[-58.469726999999864,-34.539726],[-57.188339,-35.320557],[-57.376671,-35.962784],[-56.741669,-36.318336],[-56.663063,-36.900558],[-57.571671,-38.133057],[-58.301117,-38.485001],[-61.094452,-38.995834],[-62.38139299999989,-38.798615],[-62.020004,-39.378059],[-62.277229,-39.335281],[-62.06778,-39.505562],[-62.489449,-40.299446],[-62.183891,-40.629723],[-62.390006999999855,-40.901947],[-63.765839,-41.16584],[-65.134445,-40.847778],[-65.013626,-42.092224],[-64.45195,-42.445839],[-63.746948,-42.090561],[-63.580559,-42.623894],[-64.086945,-42.890282],[-64.398056,-42.515839],[-64.960556,-42.666389],[-64.295013,-42.991951],[-65.32251,-43.653061],[-65.249451,-44.313057],[-65.691681,-44.716949],[-65.604736,-45.016396],[-66.949448,-45.255562],[-67.584351,-46.000298],[-67.506119,-46.458893],[-66.816956,-46.991669],[-65.779449,-47.189445],[-65.871948,-47.758057],[-66.243622,-47.860283],[-65.787231,-47.962502],[-67.579453,-49.034172],[-67.897232,-49.98584],[-69.011124,-50.011948],[-68.37028499999988,-50.146667],[-68.941116,-50.388062],[-69.40888999999987,-51.077782],[-69.183624,-50.970558],[-68.968063,-51.573891],[-69.613892,-51.625839],[-68.988068,-51.624725],[-68.441757,-52.377777],[-69.998337,-51.996391],[-71.910568,-51.995834],[-72.400558,-51.513618],[-72.294174,-50.649727],[-73.16612199999986,-50.753334],[-73.58361799999989,-49.538063],[-72.564178,-48.804451],[-72.287231,-48.341949],[-72.53639199999986,-47.921394],[-72.360291,-47.470001],[-71.868622,-47.221672],[-71.940292,-46.815559],[-71.669449,-46.679169],[-71.780563,-45.648895],[-71.297791,-45.293335],[-72.078613,-44.769447],[-71.282227,-44.800285],[-71.108063,-44.539726],[-71.855011,-44.371674],[-71.732788,-43.188057],[-72.136948,-43.009171],[-72.131958,-42.288895],[-71.72612,-42.096672],[-71.95056199999988,-40.73278],[-71.695557,-39.58445],[-71.401398,-38.92028],[-70.824173,-38.568062],[-71.185287,-36.842224],[-70.424316,-36.13604],[-70.567505,-35.24778],[-69.8125,-34.235558],[-69.774445,-33.381111],[-70.098892,-33.172501],[-70.533066,-31.188057],[-69.83168,-30.190556],[-70.031403,-29.306393],[-69.65538,-28.400932],[-68.810837,-27.120556],[-68.287231,-26.915279],[-68.583618,-26.50528],[-68.35195899999988,-25.117226],[-68.56500199999988,-24.774445],[-67.335846,-24.021667],[-67.00083899999987,-23.002781],[-67.183624,-22.821667],[-66.22300699999988,-21.780521],[-65.748062,-22.111668]]]]}},{"type":"Feature","properties":{"name":"Australia","iso2":"AU","iso3":"AUS"},"geometry":{"type":"MultiPolygon","coordinates":[[[[158.882173538208,-54.711387634277344],[158.83331489562988,-54.749725341796875],[158.95746040344238,-54.47471618652344],[158.882173538208,-54.711387634277344]]],[[[147.36273384094238,-43.39805603027344],[147.1230182647705,-43.42194366455078],[147.29193305969238,-43.26194763183594],[147.36273384094238,-43.39805603027344]]],[[[147.42968940734863,-43.25361633300781],[147.29193305969238,-43.16444396972656],[147.359956741333,-43.07361602783203],[147.42968940734863,-43.25361633300781]]],[[[148.17053413391113,-42.66388702392578],[148.01416206359863,-42.75305938720703],[148.021089553833,-42.61805725097656],[148.17053413391113,-42.66388702392578]]],[[[148.33331489562988,-42.35889434814453],[148.23108100891113,-42.30194091796875],[148.31912422180176,-42.312774658203125],[148.33331489562988,-42.35889434814453]]],[[[145.10772895812988,-40.82167053222656],[146.58609199523926,-41.18666076660156],[148.22329902648926,-40.85083770751953],[148.36551094055176,-42.215003967285156],[148.18387031555176,-41.94305419921875],[147.84301948547363,-42.86944580078125],[147.99524116516113,-43.22972106933594],[147.317476272583,-42.84666442871094],[146.91670417785645,-43.61784362792969],[146.0383014678955,-43.49805450439453],[146.23636054992676,-43.32722473144531],[145.496919631958,-42.95777893066406],[145.20523262023926,-42.25695037841797],[145.55191230773926,-42.34416198730469],[144.682466506958,-41.22332763671875],[144.70135688781738,-40.75917053222656],[145.10772895812988,-40.82167053222656]]],[[[144.926362991333,-40.722496032714844],[144.92413520812988,-40.61528015136719],[145.0160846710205,-40.69554901123047],[144.926362991333,-40.722496032714844]]],[[[148.20025825500488,-40.59416198730469],[148.09720039367676,-40.53388977050781],[148.2157917022705,-40.501943588256836],[148.20025825500488,-40.59416198730469]]],[[[144.75555610656738,-40.59666442871094],[144.71747016906738,-40.50389099121094],[144.77969551086426,-40.40943908691406],[144.75555610656738,-40.59666442871094]]],[[[144.94134712219238,-40.458892822265625],[144.83218574523926,-40.43360900878906],[144.94970893859863,-40.38722229003906],[144.94134712219238,-40.458892822265625]]],[[[148.35467720031738,-40.3155517578125],[148.4758014678955,-40.443885803222656],[147.99356269836426,-40.420555114746094],[148.35467720031738,-40.3155517578125]]],[[[148.1774616241455,-40.25695037841797],[147.88189888000488,-39.754173278808594],[148.27942085266113,-39.96583557128906],[148.1774616241455,-40.25695037841797]]],[[[143.9577350616455,-40.11000061035156],[143.97302436828613,-39.573333740234375],[144.14749336242676,-39.927223205566406],[143.9577350616455,-40.11000061035156]]],[[[147.35357856750488,-39.49944305419922],[147.307466506958,-39.48750305175781],[147.34442329406738,-39.44805145263672],[147.35357856750488,-39.49944305419922]]],[[[147.29998970031738,-39.482215881347656],[147.285249710083,-39.47388458251953],[147.315523147583,-39.43194580078125],[147.29998970031738,-39.482215881347656]]],[[[146.65555000305176,-38.76972198486328],[146.54471015930176,-38.80027770996094],[146.4677448272705,-38.758056640625],[146.65555000305176,-38.76972198486328]]],[[[145.31164741516113,-38.4677734375],[145.36136054992676,-38.56916809082031],[145.11358833312988,-38.52888488769531],[145.31164741516113,-38.4677734375]]],[[[145.49273872375488,-38.37444305419922],[145.271089553833,-38.36333465576172],[145.30581855773926,-38.29695129394531],[145.49273872375488,-38.37444305419922]]],[[[137.58496284484863,-35.65083312988281],[138.11273384094238,-35.869720458984375],[136.53442573547363,-35.912498474121094],[137.58496284484863,-35.65083312988281]]],[[[136.49524116516113,-35.175559997558594],[136.434419631958,-35.158050537109375],[136.466646194458,-35.13861083984375],[136.49524116516113,-35.175559997558594]]],[[[136.20276069641113,-35.07695007324219],[136.0866413116455,-34.94721984863281],[136.19580268859863,-35.026390075683594],[136.20276069641113,-35.07695007324219]]],[[[118.4719181060791,-34.938331604003906],[118.4246997833252,-34.90777587890625],[118.47638130187988,-34.918060302734375],[118.4719181060791,-34.938331604003906]]],[[[137.358003616333,-34.540283203125],[137.33441352844238,-34.51555633544922],[137.36578559875488,-34.47777557373047],[137.358003616333,-34.540283203125]]],[[[122.24693489074707,-34.15166473388672],[122.22998237609863,-34.112220764160156],[122.25554847717285,-34.12444305419922],[122.24693489074707,-34.15166473388672]]],[[[123.20749092102051,-34.11194610595703],[123.16776466369629,-34.094444274902344],[123.21582221984863,-34.08611297607422],[123.20749092102051,-34.11194610595703]]],[[[134.48663520812988,-33.779998779296875],[134.48025703430176,-33.71416473388672],[134.5402545928955,-33.69666290283203],[134.48663520812988,-33.779998779296875]]],[[[133.58941841125488,-32.311668395996094],[133.53360176086426,-32.304443359375],[133.67498970031738,-32.24055480957031],[133.58941841125488,-32.311668395996094]]],[[[115.68026924133301,-32.22833251953125],[115.66081428527832,-32.233612060546875],[115.64888191223145,-32.1522216796875],[115.68026924133301,-32.22833251953125]]],[[[159.07080268859863,-31.52361297607422],[159.101900100708,-31.57111358642578],[159.07080268859863,-31.599998474121094],[159.07080268859863,-31.52361297607422]]],[[[153.45135688781738,-27.729164123535156],[153.43359565734863,-27.41611099243164],[153.53857612609863,-27.416664123535156],[153.45135688781738,-27.729164123535156]]],[[[153.41497993469238,-27.24805450439453],[153.45413398742676,-27.017780303955078],[153.4252643585205,-27.362777709960938],[153.41497993469238,-27.24805450439453]]],[[[113.20915412902832,-26.14083480834961],[112.95332527160645,-25.786945343017578],[112.95110511779785,-25.488609313964844],[113.20915412902832,-26.14083480834961]]],[[[153.00360298156738,-25.34000015258789],[152.94885444641113,-25.272502899169922],[152.99246406555176,-25.307777404785156],[153.00360298156738,-25.34000015258789]]],[[[113.07361030578613,-25.23360824584961],[113.06165504455566,-25.278614044189453],[113.10164833068848,-25.09722137451172],[113.07361030578613,-25.23360824584961]]],[[[113.13971138000488,-24.926666259765625],[113.11499214172363,-24.995830535888672],[113.14721870422363,-24.76000213623047],[113.13971138000488,-24.926666259765625]]],[[[153.07718086242676,-25.79861068725586],[152.94302558898926,-25.558334350585938],[153.28164863586426,-24.69916534423828],[153.07718086242676,-25.79861068725586]]],[[[151.382173538208,-23.88277816772461],[151.3305377960205,-23.813335418701172],[151.32690620422363,-23.753055572509766],[151.382173538208,-23.88277816772461]]],[[[151.26944160461426,-23.780555725097656],[151.0199909210205,-23.454444885253906],[151.20303535461426,-23.528888702392578],[151.26944160461426,-23.780555725097656]]],[[[150.98217964172363,-23.195552825927734],[150.94720649719238,-23.195552825927734],[150.97830390930176,-23.150554656982422],[150.98217964172363,-23.195552825927734]]],[[[149.73550605773926,-22.423053741455078],[149.73358345031738,-22.340557098388672],[149.76080513000488,-22.363887786865234],[149.73550605773926,-22.423053741455078]]],[[[150.49164009094238,-22.354721069335938],[150.4899616241455,-22.213054656982422],[150.56024360656738,-22.304447174072266],[150.49164009094238,-22.354721069335938]]],[[[149.90081977844238,-22.22833251953125],[149.86578559875488,-22.17388916015625],[149.90832710266113,-22.046945571899414],[149.90081977844238,-22.22833251953125]]],[[[150.33691596984863,-21.775558471679688],[150.29443550109863,-21.744441986083984],[150.3588581085205,-21.73332977294922],[150.33691596984863,-21.775558471679688]]],[[[150.28692817687988,-21.6875],[150.2538776397705,-21.63805389404297],[150.30523872375488,-21.65999984741211],[150.28692817687988,-21.6875]]],[[[115.45498847961426,-20.782501220703125],[115.30386543273926,-20.87277603149414],[115.43525886535645,-20.667221069335938],[115.45498847961426,-20.782501220703125]]],[[[149.06665229797363,-20.526668548583984],[149.03692817687988,-20.501667022705078],[149.07498359680176,-20.486942291259766],[149.06665229797363,-20.526668548583984]]],[[[149.00638008117676,-20.31833267211914],[148.9555377960205,-20.29138946533203],[148.97552680969238,-20.154998779296875],[149.00638008117676,-20.31833267211914]]],[[[148.93579292297363,-20.17194366455078],[148.88189888000488,-20.130279541015625],[148.97024726867676,-20.04861068725586],[148.93579292297363,-20.17194366455078]]],[[[148.47134590148926,-20.046390533447266],[148.44970893859863,-19.97083282470703],[148.48217964172363,-20.00611114501953],[148.47134590148926,-20.046390533447266]]],[[[146.86773872375488,-19.165000915527344],[146.7760944366455,-19.13111114501953],[146.86969184875488,-19.106666564941406],[146.86773872375488,-19.165000915527344]]],[[[146.299409866333,-18.48944091796875],[146.08331489562988,-18.25611114501953],[146.26971626281738,-18.308334350585938],[146.299409866333,-18.48944091796875]]],[[[139.57608222961426,-17.09583282470703],[139.39886665344238,-17.091388702392578],[139.502779006958,-16.996665954589844],[139.57608222961426,-17.09583282470703]]],[[[139.11218452453613,-16.862220764160156],[139.0907917022705,-16.82666778564453],[139.139986038208,-16.810558319091797],[139.11218452453613,-16.862220764160156]]],[[[139.73636054992676,-16.49721908569336],[139.14026069641113,-16.755001068115234],[139.30664253234863,-16.46249771118164],[139.73636054992676,-16.49721908569336]]],[[[136.6672077178955,-15.776666641235352],[136.6349811553955,-15.676111221313477],[136.71301460266113,-15.697778701782227],[136.6672077178955,-15.776666641235352]]],[[[136.7419147491455,-15.75222396850586],[136.73413276672363,-15.648056030273438],[136.809419631958,-15.650278091430664],[136.7419147491455,-15.75222396850586]]],[[[137.06720161437988,-15.829444885253906],[136.934419631958,-15.698888778686523],[137.00305366516113,-15.591388702392578],[137.06720161437988,-15.829444885253906]]],[[[136.52997016906738,-15.645278930664062],[136.57940864562988,-15.511112213134766],[136.597749710083,-15.616109848022461],[136.52997016906738,-15.645278930664062]]],[[[136.85135078430176,-15.634166717529297],[136.84192085266113,-15.549722671508789],[136.87857246398926,-15.501943588256836],[136.85135078430176,-15.634166717529297]]],[[[124.62164497375488,-15.412221908569336],[124.52249336242676,-15.44527816772461],[124.45942878723145,-15.366943359375],[124.54221534729004,-15.261667251586914],[124.62164497375488,-15.412221908569336]]],[[[124.42637825012207,-15.315000534057617],[124.33664894104004,-15.296112060546875],[124.43747901916504,-15.249443054199219],[124.42637825012207,-15.315000534057617]]],[[[124.81609535217285,-15.281112670898438],[124.79749488830566,-15.239721298217773],[124.8499927520752,-15.247220993041992],[124.81609535217285,-15.281112670898438]]],[[[128.19192695617676,-15.18861198425293],[128.11468696594238,-15.131942749023438],[128.12051582336426,-15.043054580688477],[128.19192695617676,-15.18861198425293]]],[[[124.94331550598145,-15.030000686645508],[124.87468910217285,-14.95222282409668],[124.92442512512207,-14.944999694824219],[124.94331550598145,-15.030000686645508]]],[[[128.44107246398926,-15.037500381469727],[128.35717964172363,-14.959999084472656],[128.35635566711426,-14.870277404785156],[128.44107246398926,-15.037500381469727]]],[[[135.764986038208,-14.904167175292969],[135.69940376281738,-14.907777786254883],[135.72830390930176,-14.836666107177734],[135.764986038208,-14.904167175292969]]],[[[129.62994575500488,-14.879444122314453],[129.5805377960205,-14.802778244018555],[129.63080024719238,-14.850831985473633],[129.62994575500488,-14.879444122314453]]],[[[129.58941841125488,-14.907777786254883],[129.59247016906738,-14.966665267944336],[129.5019245147705,-14.788612365722656],[129.58941841125488,-14.907777786254883]]],[[[125.1383228302002,-14.648611068725586],[125.08471870422363,-14.61722183227539],[125.1594181060791,-14.438333511352539],[125.1383228302002,-14.648611068725586]]],[[[126.60637092590332,-13.895553588867188],[126.51193428039551,-13.909444808959961],[126.50248908996582,-13.877777099609375],[126.60637092590332,-13.895553588867188]]],[[[136.7116413116455,-13.835832595825195],[136.91247749328613,-13.774444580078125],[136.69940376281738,-14.120832443237305],[136.94165229797363,-14.277778625488281],[136.378023147583,-14.216388702392578],[136.7116413116455,-13.835832595825195]]],[[[136.2883014678955,-13.733331680297852],[136.10553169250488,-13.818056106567383],[136.19885444641113,-13.664722442626953],[136.2883014678955,-13.733331680297852]]],[[[136.15081977844238,-13.485832214355469],[136.16165351867676,-13.531112670898438],[136.0988483428955,-13.36111068725586],[136.15081977844238,-13.485832214355469]]],[[[132.40469551086426,-12.14083480834961],[132.34024238586426,-12.0897216796875],[132.402193069458,-12.072221755981445],[132.40469551086426,-12.14083480834961]]],[[[136.8205280303955,-12.140556335449219],[136.80053901672363,-12.094165802001953],[136.82608222961426,-12.072221755981445],[136.8205280303955,-12.140556335449219]]],[[[134.90997505187988,-12.121110916137695],[134.8669147491455,-12.066665649414062],[134.92776679992676,-12.072776794433594],[134.90997505187988,-12.121110916137695]]],[[[134.98578071594238,-12.03416633605957],[134.94497871398926,-12.061389923095703],[134.91137886047363,-12.022222518920898],[134.98578071594238,-12.03416633605957]]],[[[136.28192329406738,-12.03555679321289],[136.15832710266113,-12.071388244628906],[136.3063678741455,-11.976943969726562],[136.28192329406738,-12.03555679321289]]],[[[135.11551094055176,-11.934444427490234],[135.04748725891113,-11.945554733276367],[135.06497383117676,-11.913612365722656],[135.11551094055176,-11.934444427490234]]],[[[136.47357368469238,-11.911111831665039],[136.46942329406738,-11.840555191040039],[136.494966506958,-11.803054809570312],[136.47357368469238,-11.911111831665039]]],[[[136.58941841125488,-11.780555725097656],[136.5160846710205,-11.79861068725586],[136.62466621398926,-11.740276336669922],[136.58941841125488,-11.780555725097656]]],[[[136.01275825500488,-11.719165802001953],[135.95996284484863,-11.684165954589844],[136.05386543273926,-11.65999984741211],[136.01275825500488,-11.719165802001953]]],[[[132.56024360656738,-11.724443435668945],[132.5138874053955,-11.643890380859375],[132.6430377960205,-11.648056030273438],[132.56024360656738,-11.724443435668945]]],[[[133.383882522583,-11.667499542236328],[133.3669147491455,-11.614721298217773],[133.48245429992676,-11.586944580078125],[133.383882522583,-11.667499542236328]]],[[[136.47052192687988,-11.519166946411133],[136.178316116333,-11.68777847290039],[136.478853225708,-11.466110229492188],[136.47052192687988,-11.519166946411133]]],[[[133.50555610656738,-11.503889083862305],[133.39135932922363,-11.543889999389648],[133.46942329406738,-11.460832595825195],[133.50555610656738,-11.503889083862305]]],[[[130.491060256958,-11.68861198425293],[130.01638984680176,-11.779722213745117],[130.34247016906738,-11.323610305786133],[130.491060256958,-11.68861198425293]]],[[[130.57330513000488,-11.349443435668945],[131.274995803833,-11.189167022705078],[131.539155960083,-11.461666107177734],[130.95886421203613,-11.938888549804688],[130.37744331359863,-11.170555114746094],[130.57330513000488,-11.349443435668945]]],[[[132.62384223937988,-11.279167175292969],[132.51248359680176,-11.143056869506836],[132.57885932922363,-11.022500991821289],[132.62384223937988,-11.279167175292969]]],[[[136.5361042022705,-11.454999923706055],[136.77191352844238,-11.019721984863281],[136.72497749328613,-11.20694351196289],[136.5361042022705,-11.454999923706055]]],[[[142.51275825500488,-10.866943359375],[143.42914009094238,-12.614444732666016],[143.7821979522705,-14.413333892822266],[144.51053047180176,-14.168333053588867],[145.31579780578613,-14.945554733276367],[145.40359687805176,-16.46221923828125],[145.96051216125488,-16.895278930664062],[145.878023147583,-17.06277847290039],[146.10663032531738,-17.683609008789062],[146.00943183898926,-18.238052368164062],[146.33691596984863,-18.536666870117188],[146.27527046203613,-18.883888244628906],[148.77746772766113,-20.232498168945312],[148.9355182647705,-20.532779693603516],[148.69165229797363,-20.62444305419922],[149.214693069458,-21.080001831054688],[149.6611042022705,-22.496665954589844],[150.043306350708,-22.650833129882812],[150.0341510772705,-22.149723052978516],[150.59301948547363,-22.58611297607422],[150.63720893859863,-22.343891143798828],[150.86718940734863,-23.505001068115234],[151.53857612609863,-24.089168548583984],[151.68387031555176,-23.988887786865234],[151.93719673156738,-24.221664428710938],[153.18191719055176,-25.949443817138672],[153.03387641906738,-27.179443359375],[153.62552070617676,-28.666664123535156],[153.0524616241455,-31.03499984741211],[152.52969551086426,-32.40361022949219],[151.45276069641113,-33.31916809082031],[150.84051704406738,-35.08277893066406],[150.16247749328613,-35.9405517578125],[149.9738483428955,-37.52055358886719],[147.76443672180176,-37.97999572753906],[146.87356758117676,-38.65166473388672],[146.22302436828613,-38.712501525878906],[146.394136428833,-39.14722442626953],[145.41607856750488,-38.54583740234375],[145.55719184875488,-38.37638854980469],[145.44134712219238,-38.226104736328125],[144.89886665344238,-38.50444793701172],[145.13244819641113,-38.140281677246094],[144.92914009094238,-37.869163513183594],[143.54385566711426,-38.86000061035156],[142.3888874053955,-38.364723205566406],[141.57135200500488,-38.41722106933594],[140.52997016906738,-38.000282287597656],[139.8144245147705,-37.29972839355469],[139.8205280303955,-36.54583740234375],[139.07734870910645,-35.68263626098633],[139.66775703430176,-36.23082733154297],[139.09674263000488,-35.61588668823242],[139.33719062805176,-35.69416046142578],[139.35522651672363,-35.37249755859375],[138.09301948547363,-35.62083435058594],[138.51416206359863,-35.028053283691406],[138.09802436828613,-34.13722229003906],[137.74469184875488,-35.13861083984375],[136.8305377960205,-35.254722595214844],[137.0199909210205,-34.90110778808594],[137.43774604797363,-34.934722900390625],[137.44998359680176,-34.151390075683594],[137.95025825500488,-33.55944061279297],[137.77331733703613,-32.52361297607422],[137.77832221984863,-32.99250030517578],[137.20996284484863,-33.666107177734375],[135.93274116516113,-34.54194641113281],[135.95413398742676,-35.010284423828125],[135.105806350708,-34.599998474121094],[135.506929397583,-34.61805725097656],[134.70913887023926,-33.179168701171875],[134.269136428833,-33.15972137451172],[134.18414497375488,-32.486663818359375],[133.851900100708,-32.545005798339844],[133.95218086242676,-32.39472198486328],[133.62219429016113,-32.09833526611328],[133.4172077178955,-32.21333312988281],[132.76443672180176,-31.95083236694336],[132.20385932922363,-32.03166961669922],[131.152193069458,-31.474166870117188],[128.98745918273926,-31.694164276123047],[127.26776313781738,-32.27833557128906],[125.96832466125488,-32.26611328125],[124.28193855285645,-32.985557556152344],[123.54081916809082,-33.90583038330078],[120.00499153137207,-33.92888641357422],[117.93441963195801,-35.125831604003906],[116.46331977844238,-35.00083923339844],[115.00804328918457,-34.2630615234375],[114.98872566223145,-33.52253723144531],[115.36360359191895,-33.633056640625],[115.71111488342285,-33.269996643066406],[115.73943519592285,-31.865276336669922],[115.04553413391113,-30.506946563720703],[114.88553810119629,-29.20111083984375],[113.22442817687988,-26.239166259765625],[113.27916145324707,-26.018333435058594],[113.6413745880127,-26.65277862548828],[113.85582160949707,-26.507503509521484],[113.39166450500488,-25.718055725097656],[113.46943855285645,-25.540836334228516],[113.7119312286377,-26.19527816772461],[113.87886238098145,-26.028888702392578],[114.06609535217285,-26.461944580078125],[114.22083473205566,-26.30638885498047],[114.25916481018066,-25.846668243408203],[113.38971138000488,-24.429443359375],[114.01805305480957,-21.850833892822266],[114.15387153625488,-22.52777862548828],[114.65109443664551,-21.84000015258789],[116.70749092102051,-20.649166107177734],[117.68802833557129,-20.675830841064453],[119.08249092102051,-19.967498779296875],[121.0274829864502,-19.59222412109375],[122.35331916809082,-18.105554580688477],[122.17498970031738,-17.243331909179688],[122.91776466369629,-16.41555404663086],[123.57527351379395,-17.59749984741211],[123.59665107727051,-16.98999786376953],[123.91832160949707,-17.204444885253906],[123.42442512512207,-16.50250244140625],[123.7088794708252,-16.430278778076172],[123.5697193145752,-16.17194366455078],[123.72943305969238,-16.13888931274414],[123.8913745880127,-16.378887176513672],[123.96443367004395,-16.24555206298828],[124.23858833312988,-16.406665802001953],[124.8994312286377,-16.415000915527344],[124.40054512023926,-16.329444885253906],[124.72831916809082,-15.810556411743164],[124.4013843536377,-15.871110916137695],[124.4477481842041,-15.486387252807617],[124.65637397766113,-15.479721069335938],[124.70221138000488,-15.252500534057617],[125.18181037902832,-15.520685195922852],[124.82554817199707,-15.155834197998047],[125.43332099914551,-15.138612747192383],[125.13553810119629,-14.741388320922852],[125.5888843536377,-14.549444198608398],[125.60693550109863,-14.223054885864258],[125.63720893859863,-14.635000228881836],[125.71887397766113,-14.400278091430664],[126.03720283508301,-14.516666412353516],[126.01944160461426,-13.919166564941406],[126.28777503967285,-14.233055114746094],[126.86276435852051,-13.749164581298828],[127.42082405090332,-13.949722290039062],[128.16943550109863,-14.702777862548828],[128.01361274719238,-15.5],[128.129243850708,-15.212888717651367],[128.28997993469238,-15.405279159545898],[128.19412422180176,-15.05666732788086],[128.31497383117676,-14.907777786254883],[128.3508014678955,-15.044723510742188],[128.45245552062988,-15.046388626098633],[128.38189888000488,-14.802499771118164],[128.53027534484863,-14.759166717529297],[129.73245429992676,-15.197221755981445],[129.64386177062988,-14.837221145629883],[129.944429397583,-14.767778396606445],[129.37024116516113,-14.333332061767578],[129.88611030578613,-13.44527816772461],[130.26443672180176,-13.325277328491211],[130.14081001281738,-12.92416763305664],[130.69525337219238,-12.702499389648438],[130.58304023742676,-12.395278930664062],[130.89636421203613,-12.640277862548828],[131.027193069458,-12.145553588867188],[132.38360786437988,-12.379999160766602],[132.75442695617676,-12.132776260375977],[132.62774848937988,-12.04194450378418],[132.69107246398926,-11.655000686645508],[132.4899616241455,-11.476943969726562],[132.09247016906738,-11.526390075683594],[131.766939163208,-11.316389083862305],[131.9799518585205,-11.125555038452148],[132.19970893859863,-11.412778854370117],[132.14331245422363,-11.133333206176758],[132.33746528625488,-11.129165649414062],[133.18304634094238,-11.716665267944336],[135.23135566711426,-12.294445037841797],[135.90802192687988,-11.763055801391602],[135.66971015930176,-12.196666717529297],[136.023042678833,-12.111944198608398],[136.03970527648926,-12.47166633605957],[136.56219673156738,-11.934444427490234],[136.9819049835205,-12.356943130493164],[136.49441719055176,-12.779167175292969],[136.45800971984863,-13.252500534057617],[136.35052680969238,-13.052499771118164],[135.92386054992676,-13.281389236450195],[136.02026557922363,-13.762500762939453],[135.456636428833,-14.941110610961914],[136.76581001281738,-15.90444564819336],[137.730806350708,-16.246109008789062],[138.19024848937988,-16.704998016357422],[139.01748847961426,-16.903053283691406],[139.26053047180176,-17.342498779296875],[140.494966506958,-17.64083480834961],[141.42691230773926,-16.079166412353516],[141.58386421203613,-12.989166259765625],[141.79858589172363,-12.685832977294922],[141.94079780578613,-12.875831604003906],[141.75247383117676,-12.467222213745117],[141.58941841125488,-12.546945571899414],[142.02887153625488,-12.06222152709961],[142.141939163208,-10.956666946411133],[142.51275825500488,-10.866943359375]]],[[[142.26581001281738,-10.683610916137695],[142.1833209991455,-10.770278930664062],[142.11523628234863,-10.66055679321289],[142.26581001281738,-10.683610916137695]]],[[[142.2780475616455,-10.643611907958984],[142.24969673156738,-10.587499618530273],[142.31414985656738,-10.584165573120117],[142.2780475616455,-10.643611907958984]]],[[[142.230806350708,-10.568889617919922],[142.19134712219238,-10.565834045410156],[142.22662544250488,-10.525278091430664],[142.230806350708,-10.568889617919922]]],[[[142.32107734680176,-10.54861068725586],[142.2922077178955,-10.533889770507812],[142.31802558898926,-10.51388931274414],[142.32107734680176,-10.54861068725586]]],[[[142.28552436828613,-10.26472282409668],[142.2258014678955,-10.146112442016602],[142.3305377960205,-10.171945571899414],[142.28552436828613,-10.26472282409668]]],[[[142.15774726867676,-10.189722061157227],[142.089693069458,-10.133890151977539],[142.14358711242676,-10.051666259765625],[142.15774726867676,-10.189722061157227]]]]}},{"type":"Feature","properties":{"name":"Bahrain","iso2":"BH","iso3":"BHR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[50.812492000000105,25.64222],[50.782219,25.65944300000011],[50.821388,25.651943],[50.812492000000105,25.64222]]],[[[50.813332,25.678608],[50.804161,25.680553],[50.807777,25.68972],[50.813332,25.678608]]],[[[50.76194000000012,25.595276],[50.741661000000164,25.683052],[50.796661,25.72833300000012],[50.76194000000012,25.595276]]],[[[50.769722,25.746944],[50.760551000000106,25.750275],[50.764717000000104,25.75471900000015],[50.769722,25.746944]]],[[[50.532219,26.234444],[50.57333,25.809723],[50.46166200000019,25.965275],[50.532219,26.234444]]],[[[50.6536100000001,26.247498],[50.604439,26.267776],[50.62722,26.288887],[50.6536100000001,26.247498]]]]}},{"type":"Feature","properties":{"name":"Barbados","iso2":"BB","iso3":"BRB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-59.533058,13.050554],[-59.641113,13.331388],[-59.429169,13.164999],[-59.533058,13.050554]]]]}},{"type":"Feature","properties":{"name":"Bermuda","iso2":"BM","iso3":"BMU"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-64.855835,32.278610000000114],[-64.874451,32.293053],[-64.838058,32.314163000000136],[-64.855835,32.278610000000114]]],[[[-64.643341,32.35443900000014],[-64.685837,32.357216],[-64.6552889999999,32.370827],[-64.643341,32.35443900000014]]],[[[-64.78334,32.270554],[-64.858269,32.266796],[-64.671677,32.379997],[-64.78334,32.270554]]]]}},{"type":"Feature","properties":{"name":"Bahamas","iso2":"BS","iso3":"BHS"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-73.0372314453125,21.13944435119629],[-73.68583679199219,20.935556411743164],[-73.02444458007812,21.33249855041504],[-73.0372314453125,21.13944435119629]]],[[[-72.92472839355469,21.483610153198242],[-73.03807067871094,21.434999465942383],[-73.0675048828125,21.507776260375977],[-72.92472839355469,21.483610153198242]]],[[[-72.82917785644531,22.38222312927246],[-72.78140258789062,22.28416633605957],[-73.16473388671875,22.370832443237305],[-72.82917785644531,22.38222312927246]]],[[[-73.61029052734375,22.579721450805664],[-73.62055969238281,22.599721908569336],[-73.59834289550781,22.614721298217773],[-73.61029052734375,22.579721450805664]]],[[[-73.46278381347656,22.601945877075195],[-73.5513916015625,22.61222267150879],[-73.49778747558594,22.6188907623291],[-73.46278381347656,22.601945877075195]]],[[[-74.37779235839844,22.538888931274414],[-74.37945556640625,22.576387405395508],[-74.28001403808594,22.662500381469727],[-74.37779235839844,22.538888931274414]]],[[[-73.84722900390625,22.72361183166504],[-73.86750793457031,22.469446182250977],[-74.28140258789062,22.17305564880371],[-73.84722900390625,22.72361183166504]]],[[[-74.07362365722656,22.663331985473633],[-74.34390258789062,22.83500099182129],[-74.01779174804688,22.71639060974121],[-74.07362365722656,22.663331985473633]]],[[[-73.72889709472656,23.070554733276367],[-73.81361389160156,23.09694480895996],[-73.66500854492188,23.08888816833496],[-73.72889709472656,23.070554733276367]]],[[[-75.55111694335938,23.4313907623291],[-75.52500915527344,23.404443740844727],[-75.65084838867188,23.45583152770996],[-75.55111694335938,23.4313907623291]]],[[[-75.02139282226562,23.10638999938965],[-75.30751037597656,23.667776107788086],[-74.83056640625,22.8608341217041],[-75.02139282226562,23.10638999938965]]],[[[-75.77195739746094,23.499723434448242],[-75.99111938476562,23.599443435668945],[-76.02862358093262,23.67249870300293],[-75.77195739746094,23.499723434448242]]],[[[-74.78195190429688,23.683889389038086],[-74.81973266601562,23.63944435119629],[-74.94862365722656,23.685277938842773],[-74.78195190429688,23.683889389038086]]],[[[-76.3638916015625,24.072221755981445],[-76.32167053222656,23.972776412963867],[-76.39834594726562,24.113332748413086],[-76.3638916015625,24.072221755981445]]],[[[-74.49028015136719,23.954442977905273],[-74.52694702148438,24.100831985473633],[-74.46084594726562,24.142778396606445],[-74.49028015136719,23.954442977905273]]],[[[-77.94667053222656,24.149999618530273],[-77.9716796875,24.1936092376709],[-77.80029296875,24.253332138061523],[-77.94667053222656,24.149999618530273]]],[[[-77.93667602539062,24.225831985473633],[-78.01945495605469,24.25083351135254],[-77.93112182617188,24.279443740844727],[-77.93667602539062,24.225831985473633]]],[[[-76.46890258789062,24.21000099182129],[-76.50361633300781,24.2177791595459],[-76.5452880859375,24.2902774810791],[-76.46890258789062,24.21000099182129]]],[[[-77.73556518554688,24.02861213684082],[-77.60667419433594,24.21388816833496],[-77.56695556640625,23.739168167114258],[-77.87667846679688,24.073057174682617],[-77.6763916015625,24.296110153198242],[-77.73556518554688,24.02861213684082]]],[[[-77.68695068359375,24.337221145629883],[-77.80667114257812,24.31972312927246],[-77.70333862304688,24.369722366333008],[-77.68695068359375,24.337221145629883]]],[[[-75.31472778320312,24.21388816833496],[-75.5150146484375,24.13972282409668],[-75.73945617675781,24.69500160217285],[-75.31472778320312,24.21388816833496]]],[[[-77.4364013671875,25.008054733276367],[-77.5614013671875,25.027498245239258],[-77.25862121582031,25.0494441986084],[-77.4364013671875,25.008054733276367]]],[[[-78.19195556640625,25.203611373901367],[-77.7166748046875,24.50666618347168],[-78.02139282226562,24.27277946472168],[-78.44056701660156,24.613611221313477],[-78.19277954101562,24.597501754760742],[-78.19195556640625,25.203611373901367]]],[[[-76.53334045410156,25.398332595825195],[-76.34970092773438,25.34328269958496],[-76.11889457702637,25.1311092376709],[-76.1683349609375,24.690000534057617],[-76.17167663574219,25.140832901000977],[-76.3558349609375,25.318334579467773],[-76.71583557128906,25.441667556762695],[-76.73529052734375,25.559167861938477],[-76.53334045410156,25.398332595825195]]],[[[-77.82194519042969,25.70222282409668],[-77.8880615234375,25.785001754760742],[-77.85639953613281,25.775278091430664],[-77.82194519042969,25.70222282409668]]],[[[-77.56333923339844,26.268888473510742],[-77.572509765625,26.336111068725586],[-77.5372314453125,26.306943893432617],[-77.56333923339844,26.268888473510742]]],[[[-77.917236328125,26.74527931213379],[-78.7086181640625,26.489721298217773],[-78.97889709472656,26.695276260375977],[-77.917236328125,26.74527931213379]]],[[[-77.73500061035156,26.914445877075195],[-77.042236328125,26.50889015197754],[-77.20472717285156,25.880834579467773],[-77.39805603027344,26.02638816833496],[-77.14889526367188,26.548887252807617],[-77.95028686523438,26.89777946472168],[-77.73500061035156,26.914445877075195]]]]}},{"type":"Feature","properties":{"name":"Bangladesh","iso2":"BD","iso3":"BGD"},"geometry":{"type":"MultiPolygon","coordinates":[[[[91.89749336242676,21.47666358947754],[91.88109016418457,21.755277633666992],[91.98221015930176,21.62388801574707],[91.89749336242676,21.47666358947754]]],[[[90.49054145812988,21.80360984802246],[90.46748542785645,21.820554733276367],[90.49275398254395,21.814443588256836],[90.49054145812988,21.80360984802246]]],[[[90.43248176574707,21.819997787475586],[90.41276741027832,21.823610305786133],[90.4527759552002,21.85027503967285],[90.43248176574707,21.819997787475586]]],[[[89.12664985656738,21.714162826538086],[89.05053901672363,21.91472053527832],[89.1463794708252,21.748884201049805],[89.12664985656738,21.714162826538086]]],[[[90.75305366516113,21.891942977905273],[90.74443244934082,21.92249870300293],[90.76220893859863,21.90638542175293],[90.75305366516113,21.891942977905273]]],[[[91.83276557922363,21.722219467163086],[91.86303901672363,21.92805290222168],[91.88638496398926,21.842775344848633],[91.83276557922363,21.722219467163086]]],[[[90.64387702941895,21.90610694885254],[90.63333320617676,21.930551528930664],[90.6655445098877,21.95555305480957],[90.64387702941895,21.90610694885254]]],[[[90.69914436340332,21.9547176361084],[90.67526435852051,21.94999885559082],[90.69053840637207,21.9727725982666],[90.69914436340332,21.9547176361084]]],[[[90.52249336242676,21.855833053588867],[90.51971626281738,21.9355525970459],[90.58831977844238,21.981386184692383],[90.52249336242676,21.855833053588867]]],[[[90.41081428527832,21.899442672729492],[90.43026924133301,22.04222297668457],[90.48498725891113,21.964998245239258],[90.41081428527832,21.899442672729492]]],[[[90.37414741516113,22.010000228881836],[90.34166145324707,21.966386795043945],[90.3802661895752,22.050554275512695],[90.37414741516113,22.010000228881836]]],[[[90.52360725402832,21.991106033325195],[90.48692512512207,22.078886032104492],[90.6121997833252,22.16388511657715],[90.52360725402832,21.991106033325195]]],[[[90.51693916320801,22.16221809387207],[90.51220893859863,22.171110153198242],[90.52777290344238,22.179441452026367],[90.51693916320801,22.16221809387207]]],[[[90.93748664855957,22.112775802612305],[90.91470527648926,22.131940841674805],[90.95221138000488,22.209440231323242],[90.93748664855957,22.112775802612305]]],[[[90.98498725891113,22.182497024536133],[90.97192573547363,22.24083137512207],[90.99165534973145,22.259164810180664],[90.98498725891113,22.182497024536133]]],[[[90.94941902160645,22.221384048461914],[90.97638130187988,22.35777473449707],[90.98858833312988,22.286943435668945],[90.94941902160645,22.221384048461914]]],[[[91.00583076477051,22.36805534362793],[90.98526191711426,22.38527488708496],[90.98997688293457,22.41416358947754],[91.00583076477051,22.36805534362793]]],[[[90.66026496887207,22.356386184692383],[90.6402759552002,22.308332443237305],[90.61026191711426,22.451940536499023],[90.66026496887207,22.356386184692383]]],[[[91.03610420227051,22.404996871948242],[91.01805305480957,22.41472053527832],[91.0405445098877,22.4536075592041],[91.03610420227051,22.404996871948242]]],[[[91.21054267883301,22.41221809387207],[91.18553352355957,22.39249610900879],[91.1685962677002,22.46138572692871],[91.21054267883301,22.41221809387207]]],[[[91.00749397277832,22.424997329711914],[90.98776435852051,22.440832138061523],[91.00915718078613,22.47638511657715],[91.00749397277832,22.424997329711914]]],[[[90.66304206848145,22.434995651245117],[90.64749336242676,22.42777442932129],[90.65555000305176,22.478609085083008],[90.66304206848145,22.434995651245117]]],[[[91.03166389465332,22.084165573120117],[91.08804512023926,22.52583122253418],[91.1746997833252,22.21860694885254],[91.03166389465332,22.084165573120117]]],[[[91.52971076965332,22.347776412963867],[91.40832710266113,22.472219467163086],[91.4316577911377,22.62388801574707],[91.52971076965332,22.347776412963867]]],[[[91.33943367004395,22.6299991607666],[91.3177661895752,22.608888626098633],[91.3047046661377,22.628332138061523],[91.33943367004395,22.6299991607666]]],[[[90.76388740539551,22.064443588256836],[90.6010913848877,22.03416633605957],[90.6847095489502,22.39249610900879],[90.64276313781738,22.55305290222168],[90.55693244934082,22.605276107788086],[90.58777046203613,22.771944046020508],[90.87747383117676,22.45722007751465],[90.76388740539551,22.064443588256836]]],[[[90.54721260070801,22.71944236755371],[90.46971321105957,22.868886947631836],[90.69108772277832,22.84694480895996],[90.5416202545166,22.7831974029541],[90.54721260070801,22.71944236755371]]],[[[90.66220283508301,22.956384658813477],[90.63275337219238,22.94916343688965],[90.65609931945801,22.91221809387207],[90.50915718078613,22.951108932495117],[90.57083320617676,23.0402774810791],[90.66220283508301,22.956384658813477]]],[[[90.47747993469238,23.007776260375977],[90.46331977844238,23.05916404724121],[90.51082038879395,23.06194496154785],[90.47747993469238,23.007776260375977]]],[[[90.52971076965332,23.04722023010254],[90.52192878723145,23.054719924926758],[90.54498481750488,23.065275192260742],[90.52971076965332,23.04722023010254]]],[[[90.54081916809082,23.343889236450195],[90.59027290344238,23.302499771118164],[90.4216480255127,23.383054733276367],[90.54081916809082,23.343889236450195]]],[[[90.57361030578613,23.564722061157227],[90.56442451477051,23.57694435119629],[90.58415412902832,23.583887100219727],[90.57361030578613,23.564722061157227]]],[[[88.43304634094238,26.551389694213867],[89.34277534484863,26.017030715942383],[89.7391529083252,26.15638542175293],[89.84526252746582,25.288610458374023],[92.40637397766113,25.030553817749023],[92.12137031555176,24.39333152770996],[91.37329292297363,24.10194206237793],[91.15942573547363,23.640554428100586],[91.61360359191895,22.943052291870117],[91.94999885559082,23.73221778869629],[92.28332710266113,23.70527458190918],[92.60081672668457,21.98221778869629],[92.66934394836426,21.29698371887207],[92.26082038879395,21.41444206237793],[92.26193428039551,21.054311752319336],[92.32361030578613,20.73805046081543],[91.69999885559082,22.48832893371582],[91.4558277130127,22.78999900817871],[90.83360481262207,22.6855525970459],[90.59382820129395,23.59796714782715],[90.30887031555176,23.41444206237793],[90.61248970031738,23.222219467163086],[90.57859992980957,23.089998245239258],[90.44664192199707,23.065000534057617],[90.42440223693848,22.77018928527832],[90.61775398254395,22.3538875579834],[90.44053840637207,22.071664810180664],[90.4013843536377,22.260557174682617],[90.27249336242676,21.849164962768555],[90.02470588684082,21.85999870300293],[90.07304573059082,22.16277503967285],[89.93220710754395,21.997774124145508],[90.00000190734863,22.48375129699707],[89.58110237121582,21.701662063598633],[89.62082099914551,22.32444190979004],[89.24914741516113,21.64249610900879],[89.0630054473877,22.115476608276367],[88.9861011505127,23.208330154418945],[88.56387519836426,23.652219772338867],[88.75053596496582,24.220983505249023],[88.04332160949707,24.68416404724121],[88.4508228302002,25.187776565551758],[89.00943183898926,25.288331985473633],[88.11053657531738,25.835554122924805],[88.43304634094238,26.551389694213867]],[[90.23776435852051,22.192773818969727],[90.06137275695801,21.99177360534668],[90.21609687805176,22.114442825317383],[90.23776435852051,22.192773818969727]],[[90.68498420715332,23.48277473449707],[90.69192695617676,23.497217178344727],[90.65027046203613,23.504167556762695],[90.68498420715332,23.48277473449707]]]]}},{"type":"Feature","properties":{"name":"Belize","iso2":"BZ","iso3":"BLZ"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-87.803345,17.294167000000144],[-87.825012,17.291664000000154],[-87.82695,17.400276],[-87.803345,17.294167000000144]]],[[[-87.820557,17.426941],[-87.926682,17.275555],[-87.81945799999988,17.549999],[-87.820557,17.426941]]],[[[-88.045013,17.552776],[-88.070282,17.638332],[-88.053619,17.613052],[-88.045013,17.552776]]],[[[-88.132507,17.667221],[-88.167511,17.66972],[-88.072784,17.73388700000011],[-88.132507,17.667221]]],[[[-87.892227,18.0425],[-88.006119,17.901943000000145],[-87.853058,18.164719],[-87.892227,18.0425]]],[[[-88.377792,18.482777000000127],[-88.2995,18.482929],[-88.077789,18.215553],[-88.281403,17.636108],[-88.208618,16.968609],[-88.910568,15.893610000000123],[-89.216171,15.88985100000015],[-89.141953,17.818886],[-88.377792,18.482777000000127]]]]}},{"type":"Feature","properties":{"name":"Bosnia and Herzegovina","iso2":"BA","iso3":"BIH"},"geometry":{"type":"MultiPolygon","coordinates":[[[[17.649841,42.889076],[17.578526000000124,42.943825],[16.143055,44.19944],[15.786665,45.171944],[18.251942,45.138885],[19.039719,44.861382],[19.371387,44.88916],[19.104443,44.355827],[19.620476,44.048454],[19.237019,44.011009],[19.51083,43.679718],[19.228809,43.513214],[18.699997,43.255554],[18.455555,42.565826],[17.649841,42.889076]]]]}},{"type":"Feature","properties":{"name":"Bolivia","iso2":"BO","iso3":"BOL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-65.190201,-22.09473],[-65.748062,-22.111668],[-66.22300699999988,-21.780521],[-67.183624,-22.821667],[-67.876404,-22.828056],[-68.188614,-21.296947],[-68.756958,-20.406948],[-68.4375,-19.430279],[-68.907791,-19.055279],[-69.071671,-18.038891],[-69.48361199999988,-17.635559],[-69.499725,-17.50528],[-69.618896,-17.214725],[-68.82251,-16.339725],[-69.421951,-15.618057],[-69.136948,-15.245834],[-69.366394,-14.802502],[-68.853058,-14.199167],[-68.974457,-12.869722],[-68.673904,-12.50115],[-69.568436,-10.951092],[-68.58344999999986,-11.106138],[-66.634445,-9.906946],[-65.381958,-9.697779],[-65.392792,-11.26639],[-64.991669,-12.008057],[-64.39418,-12.461668],[-63.07500499999989,-12.650002],[-61.833893,-13.544724],[-61.038979,-13.493118],[-60.470839999999896,-13.807222],[-60.258896,-15.093613],[-60.571396,-15.097502],[-60.160278,-16.263058],[-58.327507,-16.279167],[-58.397507,-17.249168],[-57.743057,-17.593056],[-57.521118,-18.203892],[-58.121117,-19.74139],[-57.84874699999989,-19.978794],[-58.15889,-20.168056],[-58.15139,-19.828056],[-59.09584,-19.348892],[-61.7425,-19.645],[-62.643768,-22.238903],[-62.811951,-21.996948],[-63.941116,-22.000835],[-64.324722,-22.873611],[-64.590561,-22.214725],[-65.190201,-22.09473]]]]}},{"type":"Feature","properties":{"name":"Burma","iso2":"MM","iso3":"MMR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[98.0358120000001,9.786386],[98.024994,9.838331],[98.060257,9.81361],[98.0358120000001,9.786386]]],[[[98.29332000000014,10.010277],[98.116089,9.852497],[98.17858900000013,10.017776],[98.29332000000014,10.010277]]],[[[98.186646,10.040276],[98.19859300000022,10.189999],[98.238876,10.165833],[98.186646,10.040276]]],[[[97.907486,10.396944000000133],[97.903595,10.490831],[97.942749,10.442776],[97.907486,10.396944000000133]]],[[[98.216385,10.481386],[98.1824800000002,10.5075],[98.238876,10.529999],[98.216385,10.481386]]],[[[98.52360500000012,10.781666],[98.486923,10.883053],[98.550812,10.850275],[98.52360500000012,10.781666]]],[[[97.919708,10.858332],[97.885818,10.843609],[97.91609200000019,10.929443],[97.919708,10.858332]]],[[[98.21220400000018,10.947777000000102],[98.264435,10.68972],[98.075546,10.88611],[98.21220400000018,10.947777000000102]]],[[[98.437195,10.961943000000161],[98.42997700000015,10.995831],[98.452774,11.007776],[98.437195,10.961943000000161]]],[[[98.533875,10.950554],[98.470535,10.983887],[98.524994,11.087219000000147],[98.533875,10.950554]]],[[[98.25610400000019,11.212498],[98.23109400000013,11.262499],[98.27777100000012,11.276388],[98.25610400000019,11.212498]]],[[[98.20748900000015,11.443609000000109],[98.289154,11.798609],[98.28082300000014,11.481665000000106],[98.20748900000015,11.443609000000109]]],[[[98.49832200000012,11.566109],[98.3713680000001,11.78611],[98.548874,11.788332],[98.49832200000012,11.566109]]],[[[97.48719800000012,11.774443000000133],[97.43775900000011,11.803331],[97.4616550000002,11.803053],[97.48719800000012,11.774443000000133]]],[[[98.089981,11.631109000000109],[98.033051,11.683054000000169],[98.007217,11.858332],[98.089981,11.631109000000109]]],[[[97.66832,11.836943],[97.633881,11.876108],[97.664429,11.901110000000102],[97.66832,11.836943]]],[[[98.271103,11.84972],[98.260269,11.907221],[98.28804,11.887499000000133],[98.271103,11.84972]]],[[[98.256378,11.92111],[98.226379,11.94972],[98.251663,11.980276],[98.256378,11.92111]]],[[[98.5,11.884443],[98.438583,12.111387],[98.664993,11.941942],[98.5,11.884443]]],[[[98.14193700000013,12.141943],[98.05554200000014,12.281111],[98.124695,12.27861],[98.14193700000013,12.141943]]],[[[98.64082300000021,12.372219],[98.619141,12.378885000000153],[98.639709,12.380552],[98.64082300000021,12.372219]]],[[[98.61780500000012,12.352951],[98.68248,12.340553],[98.55970800000014,12.328886],[98.540817,12.370552],[98.57193,12.409164],[98.61780500000012,12.352951]]],[[[98.09166,12.360554],[98.00555400000022,12.281942],[97.937485,12.337498],[98.09166,12.360554]]],[[[98.501099,12.402222],[98.471924,12.417776000000146],[98.49887100000015,12.513887],[98.501099,12.402222]]],[[[98.285812,12.502499000000114],[98.24331700000019,12.49222],[98.229706,12.548054000000107],[98.285812,12.502499000000114]]],[[[97.853592,12.539999000000122],[97.817764,12.583332000000112],[97.837494,12.598053],[97.853592,12.539999000000122]]],[[[98.349426,12.316942000000111],[98.32193000000015,12.67111],[98.46693400000018,12.570831],[98.349426,12.316942000000111]]],[[[97.872208,12.764166000000131],[97.83728,12.772419000000156],[97.84414700000016,12.819443],[97.872208,12.764166000000131]]],[[[98.304153,13.041666000000106],[98.29803500000017,12.941387],[98.23942600000012,13.213331],[98.304153,13.041666000000106]]],[[[97.92109700000012,13.783054],[97.921921,13.861664000000161],[97.934708,13.851664],[97.92109700000012,13.783054]]],[[[97.924423,13.905832],[97.92303500000017,13.894444],[97.91835,13.93908100000013],[97.924423,13.905832]]],[[[93.380539,14.064165],[93.38638300000017,14.151665],[93.4008180000001,14.096109],[93.380539,14.064165]]],[[[97.80636600000011,14.134443],[97.78915400000014,14.155277],[97.814148,14.179998000000126],[97.80636600000011,14.134443]]],[[[93.722488,14.904444],[93.679153,14.848331],[93.6922,14.890833],[93.722488,14.904444]]],[[[97.669708,15.521387],[97.66304,15.497219],[97.65416,15.578331],[97.669708,15.521387]]],[[[94.79776000000012,15.791666],[94.728043,15.815275],[94.82054100000013,15.948053],[94.79776000000012,15.791666]]],[[[94.583328,16.00972],[94.415817,15.868053000000103],[94.38665800000015,15.995831],[94.649429,16.245274],[94.583328,16.00972]]],[[[97.569153,16.233604],[97.515549,16.506107],[97.616653,16.465271000000158],[97.569153,16.233604]]],[[[93.67109700000017,18.867496000000145],[93.703049,18.668053],[93.48442100000014,18.869717],[93.67109700000017,18.867496000000145]]],[[[93.79092400000016,19.231342],[93.94220000000021,18.862495],[93.49054000000015,19.400829],[93.79092400000016,19.231342]]],[[[93.801651,19.268608],[93.682755,19.560555],[93.96832300000014,19.42083],[93.801651,19.268608]]],[[[93.51304600000017,19.744438],[93.395828,19.955273],[93.498596,19.88055],[93.51304600000017,19.744438]]],[[[93.024429,19.827774000000105],[92.912491,20.086662],[92.954437,20.06361],[93.024429,19.827774000000105]]],[[[97.806641,28.344162],[98.316376,27.541943],[98.699707,27.539165],[98.77832,26.636383],[98.710815,25.855553],[97.5524750000001,24.74305],[97.759995,24.257496],[97.535538,23.939716],[98.890732,24.16006900000015],[98.6772,23.968052],[98.927475,23.189163000000107],[99.566376,22.938049],[99.162766,22.159161],[99.964432,22.048885],[100.212753,21.432552],[101.10526300000018,21.771385],[101.14823900000013,21.572636],[100.09137,20.348606],[100.08132200000014,20.348841],[99.522766,20.352776000000134],[98.995529,19.780552],[98.049988,19.807499000000135],[97.774704,18.569996],[97.346375,18.562496000000138],[98.68969700000011,16.284996],[98.92804,16.38583],[98.201096,15.074999],[99.173965,13.727781],[99.112198,13.055832],[99.661652,11.826942],[98.742752,10.348608],[98.54664600000015,9.981665],[98.46026600000019,10.734442],[98.710815,10.918331],[98.743591,11.666943000000117],[98.890549,11.700275],[98.597488,11.751665],[98.72192400000014,11.976109],[98.705872,12.224465],[98.533165,12.245721],[98.70359000000022,12.340046],[98.583328,13.172775],[98.18553200000011,14.059164000000138],[98.13888500000016,13.539721],[97.797256,14.881962],[97.737488,16.563885],[97.378036,16.494995],[96.87803600000021,17.449997],[96.77777100000017,16.703884000000116],[96.3797,16.501389],[96.241928,16.803734],[96.268326,16.389717000000147],[95.42858900000013,15.729719],[95.3608090000001,16.144718],[95.216385,15.782776000000112],[95.13720700000013,16.137218],[94.848877,15.77972],[94.99081400000014,16.246662000000114],[94.650543,15.854164],[94.793045,16.153606],[94.560257,15.941942],[94.679703,16.115829],[94.631088,16.34277300000015],[94.24552900000018,15.959997],[94.6147,17.546387],[93.99192800000017,19.457218],[93.599152,19.719715],[93.728592,19.931664],[93.128311,20.085552],[93.12997400000015,19.835552000000106],[93.081665,20.548607],[92.860809,20.121109],[92.261932,21.05431],[92.26081800000011,21.41444000000014],[92.669342,21.296982],[92.600815,21.982216],[93.19664,22.256386],[93.33873,24.077915],[94.151093,23.855274],[94.734421,25.024719],[94.6255340000001,25.397774],[95.17804,26.058887],[95.141373,26.612495000000123],[96.194138,27.270832],[97.13665800000015,27.085831],[96.886658,27.60610600000011],[97.3488770000001,28.222771],[97.555252,28.548054000000107],[97.806641,28.344162]]]]}},{"type":"Feature","properties":{"name":"Benin","iso2":"BJ","iso3":"BEN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[2.484418,6.340486],[1.635404,6.218721],[1.398542,9.429901],[1.355,9.995277],[0.776667,10.376665],[0.91797,10.996399],[1.435278,11.458887],[2.014722,11.422499],[2.397925,11.896152],[2.378054,12.240274],[2.83862,12.396658],[3.604459,11.693274],[3.855,10.584999],[3.095,9.090555],[2.789444,9.043888],[2.719606,6.365505],[2.484418,6.340486]]]]}},{"type":"Feature","properties":{"name":"Solomon Islands","iso2":"SB","iso3":"SLB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[166.85052680969238,-11.696945190429688],[166.76138496398926,-11.579444885253906],[166.93191719055176,-11.66722297668457],[166.85052680969238,-11.696945190429688]]],[[[160.08081245422363,-11.498054504394531],[160.52746772766113,-11.808055877685547],[159.960786819458,-11.521665573120117],[160.08081245422363,-11.498054504394531]]],[[[159.85330390930176,-11.324722290039062],[159.77664375305176,-11.288612365722656],[159.841646194458,-11.303888320922852],[159.85330390930176,-11.324722290039062]]],[[[166.535249710083,-11.363887786865234],[166.5180377960205,-11.271112442016602],[166.5805377960205,-11.324167251586914],[166.535249710083,-11.363887786865234]]],[[[162.47497749328613,-10.855554580688477],[162.48135566711426,-10.807500839233398],[162.50055122375488,-10.84000015258789],[162.47497749328613,-10.855554580688477]]],[[[166.139986038208,-10.761112213134766],[165.77746772766113,-10.805000305175781],[165.904146194458,-10.67361068725586],[166.139986038208,-10.761112213134766]]],[[[161.545259475708,-10.276666641235352],[162.39081001281738,-10.841943740844727],[161.28332710266113,-10.33194351196289],[161.545259475708,-10.276666641235352]]],[[[161.75137519836426,-10.294445037841797],[161.71997261047363,-10.2147216796875],[161.77191352844238,-10.254446029663086],[161.75137519836426,-10.294445037841797]]],[[[167.20385932922363,-9.963611602783203],[167.18829536437988,-9.942222595214844],[167.20800971984863,-9.95083236694336],[167.20385932922363,-9.963611602783203]]],[[[167.12774848937988,-9.88083267211914],[167.108003616333,-9.869165420532227],[167.12634468078613,-9.86722183227539],[167.12774848937988,-9.88083267211914]]],[[[167.10330390930176,-9.851663589477539],[167.08941841125488,-9.84749984741211],[167.10858345031738,-9.84083366394043],[167.10330390930176,-9.851663589477539]]],[[[161.97467231750488,-9.85305404663086],[161.94470405578613,-9.690277099609375],[161.97412300109863,-9.689722061157227],[161.97467231750488,-9.85305404663086]]],[[[161.56912422180176,-9.724166870117188],[161.39721870422363,-9.669445037841797],[161.34997749328613,-9.338888168334961],[161.56912422180176,-9.724166870117188]],[[161.38748359680176,-9.468610763549805],[161.38553047180176,-9.454444885253906],[161.38134956359863,-9.469444274902344],[161.38748359680176,-9.468610763549805]]],[[[159.93829536437988,-9.433610916137695],[160.38638496398926,-9.426666259765625],[160.83108711242676,-9.861944198608398],[159.82803535461426,-9.796945571899414],[159.601900100708,-9.317222595214844],[159.93829536437988,-9.433610916137695]]],[[[159.8285846710205,-9.172500610351562],[159.811372756958,-9.110832214355469],[159.845796585083,-9.138055801391602],[159.8285846710205,-9.172500610351562]]],[[[160.4111042022705,-9.136667251586914],[160.21246528625488,-9.170555114746094],[160.3185749053955,-9.060277938842773],[160.4111042022705,-9.136667251586914]]],[[[159.20440864562988,-9.133333206176758],[159.16803169250488,-9.102775573730469],[159.22830390930176,-9.025556564331055],[159.20440864562988,-9.133333206176758]]],[[[159.14749336242676,-9.108888626098633],[159.03247261047363,-9.060277938842773],[159.13720893859863,-8.994443893432617],[159.14749336242676,-9.108888626098633]]],[[[160.11218452453613,-8.997220993041992],[160.06579780578613,-9.017499923706055],[160.07330513000488,-8.947778701782227],[160.11218452453613,-8.997220993041992]]],[[[160.047212600708,-8.915275573730469],[160.00833320617676,-8.884723663330078],[160.02942085266113,-8.880277633666992],[160.047212600708,-8.915275573730469]]],[[[161.06079292297363,-8.748054504394531],[161.04443550109863,-8.772500991821289],[161.00943183898926,-8.754167556762695],[161.06079292297363,-8.748054504394531]]],[[[157.633882522583,-8.748054504394531],[157.619966506958,-8.800832748413086],[157.44384956359863,-8.71500015258789],[157.633882522583,-8.748054504394531]]],[[[158.20523262023926,-8.833332061767578],[158.14972114562988,-8.781389236450195],[158.2135944366455,-8.681112289428711],[158.20523262023926,-8.833332061767578]]],[[[158.00305366516113,-8.771112442016602],[157.87552070617676,-8.60999870300293],[158.1169147491455,-8.533332824707031],[158.00305366516113,-8.771112442016602]]],[[[157.40832710266113,-8.500833511352539],[157.38443183898926,-8.734443664550781],[157.19912910461426,-8.565834045410156],[157.40832710266113,-8.500833511352539]]],[[[159.6833209991455,-8.546945571899414],[159.53747749328613,-8.468332290649414],[159.56884956359863,-8.378887176513672],[159.6833209991455,-8.546945571899414]]],[[[162.741060256958,-8.37388801574707],[162.76165962219238,-8.378055572509766],[162.72525215148926,-8.381387710571289],[162.741060256958,-8.37388801574707]]],[[[160.97439765930176,-8.84749984741211],[161.378023147583,-9.635000228881836],[160.58026313781738,-8.329999923706055],[160.97439765930176,-8.84749984741211]]],[[[157.12466621398926,-8.255279541015625],[157.15136909484863,-8.342777252197266],[157.023042678833,-8.190834045410156],[157.12466621398926,-8.255279541015625]]],[[[157.20746040344238,-8.270278930664062],[157.09247016906738,-8.165834426879883],[157.18081855773926,-8.170555114746094],[157.20746040344238,-8.270278930664062]]],[[[156.84497261047363,-8.118331909179688],[156.78332710266113,-8.098054885864258],[156.78274726867676,-8.055278778076172],[156.84497261047363,-8.118331909179688]]],[[[157.63162422180176,-8.236387252807617],[157.81192207336426,-8.620832443237305],[157.21441841125488,-8.24305534362793],[157.49746894836426,-7.965555191040039],[157.63162422180176,-8.236387252807617]]],[[[156.5988483428955,-8.203054428100586],[156.53192329406738,-8.091943740844727],[156.5422077178955,-7.944721221923828],[156.5988483428955,-8.203054428100586]]],[[[157.156099319458,-8.150278091430664],[156.9677448272705,-8.046388626098633],[157.027193069458,-7.865276336669922],[157.156099319458,-8.150278091430664]]],[[[158.57190132141113,-7.703611373901367],[158.5321979522705,-7.691387176513672],[158.54998970031738,-7.664165496826172],[158.57190132141113,-7.703611373901367]]],[[[158.53082466125488,-7.654167175292969],[158.35940742492676,-7.640556335449219],[158.31274604797363,-7.580833435058594],[158.53082466125488,-7.654167175292969]]],[[[156.706636428833,-7.897222518920898],[156.5544147491455,-7.578611373901367],[156.80859565734863,-7.726665496826172],[156.706636428833,-7.897222518920898]]],[[[159.85244941711426,-8.33388900756836],[159.8869342803955,-8.566389083862305],[158.48745918273926,-7.554166793823242],[159.85244941711426,-8.33388900756836]]],[[[158.4294147491455,-7.529722213745117],[158.37051582336426,-7.552776336669922],[158.26275825500488,-7.477499008178711],[158.4294147491455,-7.529722213745117]]],[[[157.78164863586426,-7.476110458374023],[157.68359565734863,-7.415555953979492],[157.74939155578613,-7.393888473510742],[157.78164863586426,-7.476110458374023]]],[[[155.58746528625488,-7.390556335449219],[155.51080513000488,-7.351110458374023],[155.5846881866455,-7.331943511962891],[155.58746528625488,-7.390556335449219]]],[[[155.8588581085205,-7.100276947021484],[155.66971015930176,-7.088054656982422],[155.74023628234863,-6.967498779296875],[155.8588581085205,-7.100276947021484]]],[[[156.11023139953613,-6.941110610961914],[156.08496284484863,-6.989442825317383],[156.0746784210205,-6.81916618347168],[156.11023139953613,-6.941110610961914]]],[[[156.0199909210205,-6.824722290039063],[156.00000190734863,-6.803609848022461],[156.045259475708,-6.788610458374023],[156.0199909210205,-6.824722290039063]]],[[[157.42886543273926,-7.324443817138672],[156.93609809875488,-7.219165802001953],[156.438570022583,-6.643611907958984],[157.42886543273926,-7.324443817138672]]],[[[159.712739944458,-5.516666412353516],[159.71414375305176,-5.483888626098633],[159.7238483428955,-5.489999771118164],[159.712739944458,-5.516666412353516]]],[[[159.52859687805176,-5.49888801574707],[159.49633979797363,-5.466943740844727],[159.5099811553955,-5.470832824707031],[159.52859687805176,-5.49888801574707]]],[[[159.40387153625488,-5.448331832885742],[159.37161445617676,-5.440832138061523],[159.3488483428955,-5.41583251953125],[159.40387153625488,-5.448331832885742]]],[[[159.25219917297363,-5.312778472900391],[159.25027656555176,-5.324167251586914],[159.24884223937988,-5.293054580688477],[159.25219917297363,-5.312778472900391]]]]}},{"type":"Feature","properties":{"name":"Brazil","iso2":"BR","iso3":"BRA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-48.550559997558594,-27.821392059326172],[-48.51722717285156,-27.430835723876953],[-48.4183349609375,-27.38888931274414],[-48.550559997558594,-27.821392059326172]]],[[[-48.58111572265625,-26.39167022705078],[-48.70777893066406,-26.309722900390625],[-48.53778076171875,-26.167224884033203],[-48.58111572265625,-26.39167022705078]]],[[[-48.282501220703125,-25.486114501953125],[-48.33306121826172,-25.41305923461914],[-48.25666809082031,-25.338890075683594],[-48.282501220703125,-25.486114501953125]]],[[[-47.877784729003906,-25.026947021484375],[-47.816673278808594,-24.900001525878906],[-47.60667419433594,-24.783611297607422],[-47.877784729003906,-25.026947021484375]]],[[[-46.28278350830078,-23.98917007446289],[-46.41638946533203,-23.950279235839844],[-46.32361602783203,-23.93000030517578],[-46.28278350830078,-23.98917007446289]]],[[[-45.12639617919922,-23.821392059326172],[-45.136390686035156,-23.797779083251953],[-45.105003356933594,-23.806392669677734],[-45.12639617919922,-23.821392059326172]]],[[[-45.22084045410156,-23.77944564819336],[-45.21833801269531,-23.955833435058594],[-45.44139099121094,-23.928890228271484],[-45.22084045410156,-23.77944564819336]]],[[[-44.088890075683594,-23.17444610595703],[-44.369171142578125,-23.172225952148438],[-44.228614807128906,-23.07111358642578],[-44.088890075683594,-23.17444610595703]]],[[[-29.84000015258789,-20.49639129638672],[-29.848892211914062,-20.500835418701172],[-29.852222442626953,-20.491111755371094],[-29.84000015258789,-20.49639129638672]]],[[[-30.29528045654297,-20.505834579467773],[-30.319446563720703,-20.520000457763672],[-30.334165573120117,-20.482223510742188],[-30.29528045654297,-20.505834579467773]]],[[[-38.91166687011719,-13.67527961730957],[-38.99195098876953,-13.593055725097656],[-38.91278076171875,-13.587501525878906],[-38.91166687011719,-13.67527961730957]]],[[[-38.93695068359375,-13.5625],[-38.98445129394531,-13.5625],[-38.96444320678711,-13.498844146728516],[-39.041114807128906,-13.462223052978516],[-39.038612365722656,-13.39777946472168],[-38.908058166503906,-13.385557174682617],[-38.93695068359375,-13.5625]]],[[[-38.754722595214844,-13.113056182861328],[-38.643333435058594,-12.892223358154297],[-38.59166717529297,-12.98750114440918],[-38.754722595214844,-13.113056182861328]]],[[[-37.13250732421875,-11.129446029663086],[-37.146392822265625,-11.108612060546875],[-37.036949157714844,-10.95250129699707],[-37.13250732421875,-11.129446029663086]]],[[[-34.87389373779297,-7.073333740234375],[-34.888893127441406,-7.071945190429688],[-34.866668701171875,-7.048610687255859],[-34.87389373779297,-7.073333740234375]]],[[[-34.85417175292969,-7.005277633666992],[-34.863059997558594,-7.013889312744141],[-34.85972595214844,-6.994443893432617],[-34.85417175292969,-7.005277633666992]]],[[[-32.450836181640625,-3.883609771728516],[-32.424171447753906,-3.845832824707031],[-32.38667297363281,-3.840276718139648],[-32.450836181640625,-3.883609771728516]]],[[[-44.61028289794922,-3.008054733276367],[-44.65611267089844,-2.973609924316406],[-44.611671447753906,-2.887222290039063],[-44.61028289794922,-3.008054733276367]]],[[[-44.586395263671875,-3.052499771118164],[-44.57750701904297,-2.801944732666016],[-44.48389434814453,-2.709999084472656],[-44.586395263671875,-3.052499771118164]]],[[[-42.05083465576172,-2.761667251586914],[-42.1844482421875,-2.677499771118164],[-42.06945037841797,-2.685832977294922],[-42.05083465576172,-2.761667251586914]]],[[[-43.69333457946777,-2.326944351196289],[-43.739173889160156,-2.350276947021484],[-43.61528015136719,-2.26249885559082],[-43.69333457946777,-2.326944351196289]]],[[[-50.8638916015625,-1.910833358764648],[-50.988059997558594,-1.993610382080078],[-51.148338317871094,-1.828611373901367],[-50.8638916015625,-1.910833358764648]]],[[[-49.024169921875,-1.829166412353516],[-49.156951904296875,-1.858055114746094],[-49.05555725097656,-1.721111297607422],[-49.024169921875,-1.829166412353516]]],[[[-48.96111297607422,-1.795831680297852],[-49.046112060546875,-1.705278396606445],[-48.90277862548828,-1.577220916748047],[-48.96111297607422,-1.795831680297852]]],[[[-44.65277862548828,-1.62388801574707],[-44.66222381591797,-1.661945343017578],[-44.778892517089844,-1.668054580688477],[-44.78334045410156,-1.619167327880859],[-44.71305847167969,-1.561111450195313],[-44.65277862548828,-1.62388801574707]]],[[[-52.02472686767578,-1.580278396606445],[-52.200836181640625,-1.646665573120117],[-52.029449462890625,-1.439722061157227],[-51.914451599121094,-1.516387939453125],[-52.02472686767578,-1.580278396606445]]],[[[-52.4183349609375,-1.527500152587891],[-52.431114196777344,-1.466388702392578],[-52.168617248535156,-1.408332824707031],[-52.4183349609375,-1.527500152587891]]],[[[-48.63361358642578,-1.484722137451172],[-48.69667053222656,-1.449167251586914],[-48.657501220703125,-1.375833511352539],[-48.63361358642578,-1.484722137451172]]],[[[-48.525840759277344,-1.524999618530273],[-48.592506408691406,-1.442220687866211],[-48.55333709716797,-1.366109848022461],[-48.525840759277344,-1.524999618530273]]],[[[-44.98750305175781,-1.401945114135742],[-44.975563049316406,-1.261667251586914],[-44.88111114501953,-1.283056259155273],[-44.98750305175781,-1.401945114135742]]],[[[-45.63417053222656,-1.34638786315918],[-45.689443588256836,-1.360832214355469],[-45.626943588256836,-1.126943588256836],[-45.63417053222656,-1.34638786315918]]],[[[-48.34027862548828,-1.212778091430664],[-48.46556091308594,-1.162776947021484],[-48.41222381591797,-1.07499885559082],[-48.32250213623047,-1.076944351196289],[-48.34027862548828,-1.212778091430664]]],[[[-46.49889373779297,-1.02027702331543],[-46.53334045410156,-1.017499923706055],[-46.54833984375,-0.972221374511719],[-46.45667266845703,-0.88861083984375],[-46.44000244140625,-1.006387710571289],[-46.49889373779297,-1.02027702331543]]],[[[-50.98722839355469,-0.866388320922852],[-50.92083740234375,-0.869722366333008],[-51.01261901855469,-0.919502258300781],[-51.019447326660156,-0.991666793823242],[-51.070037841796875,-1.03779411315918],[-51.18250274658203,-1.091667175292969],[-50.98722839355469,-0.866388320922852]]],[[[-51.375282287597656,-1.21360969543457],[-51.40028381347656,-1.201944351196289],[-51.363616943359375,-1.129444122314453],[-51.24889373779297,-1.024721145629883],[-51.20305633544922,-0.841667175292969],[-51.23944854736328,-1.143888473510742],[-51.375282287597656,-1.21360969543457]]],[[[-50.92028045654297,-0.844999313354492],[-50.92278289794922,-0.729166030883789],[-50.84278106689453,-0.727777481079102],[-50.92028045654297,-0.844999313354492]]],[[[-47.93500518798828,-0.727222442626953],[-47.95166778564453,-0.731945037841797],[-47.97084045410156,-0.680000305175781],[-47.93250274658203,-0.636667251586914],[-47.87611389160156,-0.673055648803711],[-47.93500518798828,-0.727222442626953]]],[[[-47.668060302734375,-0.709165573120117],[-47.69667053222656,-0.7147216796875],[-47.718894958496094,-0.640556335449219],[-47.665283203125,-0.573610305786133],[-47.63722229003906,-0.620832443237305],[-47.668060302734375,-0.709165573120117]]],[[[-51.13195037841797,-0.959444046020508],[-51.070281982421875,-0.69444465637207],[-50.815834045410156,-0.572221755981445],[-51.13195037841797,-0.959444046020508]]],[[[-51.051116943359375,-0.65916633605957],[-51.09833526611328,-0.633888244628906],[-51.02528381347656,-0.560556411743164],[-51.051116943359375,-0.65916633605957]]],[[[-51.901390075683594,-1.476667404174805],[-51.95222473144531,-1.430831909179688],[-51.88500213623047,-1.178888320922852],[-51.66222381591797,-1.083332061767578],[-51.60972595214844,-0.733888626098633],[-51.38195037841797,-0.541389465332031],[-51.19972229003906,-0.529167175292969],[-51.148338317871094,-0.669721603393555],[-51.27166557312012,-1.014165878295898],[-51.48333740234375,-1.240278244018555],[-51.901390075683594,-1.476667404174805]]],[[[-51.40333557128906,-0.54083251953125],[-51.41139221191406,-0.499721527099609],[-51.23944854736328,-0.454442977905273],[-51.40333557128906,-0.54083251953125]]],[[[-50.9586181640625,-0.567499160766602],[-50.878334045410156,-0.385276794433594],[-50.776947021484375,-0.383888244628906],[-50.9586181640625,-0.567499160766602]]],[[[-51.10778045654297,-0.539999008178711],[-51.03472900390625,-0.283056259155273],[-50.94667053222656,-0.353889465332031],[-51.10778045654297,-0.539999008178711]]],[[[-50.9072265625,-0.335832595825195],[-51.025001525878906,-0.24888801574707],[-50.88861846923828,-0.291389465332031],[-50.9072265625,-0.335832595825195]]],[[[-49.713340759277344,-0.227777481079102],[-48.37306213378906,-0.289167404174805],[-48.627227783203125,-1.064443588256836],[-49.16638946533203,-1.613887786865234],[-50.57805633544922,-1.800832748413086],[-50.803611755371094,-1.440555572509766],[-50.78111267089844,-1.151945114135742],[-50.55000305175781,-1.06916618347168],[-50.79695129394531,-0.971942901611328],[-50.65778350830078,-0.279167175292969],[-49.713340759277344,-0.227777481079102]]],[[[-50.80333709716797,-0.358888626098633],[-50.908058166503906,-0.358331680297852],[-50.74889373779297,-0.226667404174805],[-50.80333709716797,-0.358888626098633]]],[[[-51.38056182861328,-0.484722137451172],[-51.103057861328125,-0.121389389038086],[-51.13750457763672,-0.2852783203125],[-51.38056182861328,-0.484722137451172]]],[[[-50.55694580078125,-0.0625],[-50.85778045654297,-0.283056259155273],[-51.02722930908203,-0.224166870117188],[-50.55694580078125,-0.0625]]],[[[-50.90167236328125,-0.04749870300293],[-50.82972717285156,0.060834884643555],[-50.69750213623047,0.023889541625977],[-50.90167236328125,-0.04749870300293]]],[[[-49.52555847167969,-0.134443283081055],[-49.852500915527344,-0.064443588256836],[-49.501670837402344,0.070558547973633],[-49.52555847167969,-0.134443283081055]]],[[[-50.45555877685547,-0.022777557373047],[-50.643333435058594,0.171110153198242],[-50.465003967285156,0.146669387817383],[-50.45555877685547,-0.022777557373047]]],[[[-49.63611602783203,0.227502822875977],[-49.98472595214844,-0.072221755981445],[-50.39250183105469,0.109445571899414],[-49.63611602783203,0.227502822875977]]],[[[-50.24305725097656,0.22944450378418],[-50.184173583984375,0.324167251586914],[-50.0836181640625,0.320001602172852],[-50.24305725097656,0.22944450378418]]],[[[-50.41638946533203,0.210832595825195],[-50.53639221191406,0.226110458374023],[-50.37389373779297,0.621389389038086],[-50.41638946533203,0.210832595825195]]],[[[-50.23750305175781,0.350835800170898],[-50.30805969238281,0.506391525268555],[-50.06361389160156,0.646112442016602],[-50.23750305175781,0.350835800170898]]],[[[-50.007225036621094,0.88166618347168],[-50.267784118652344,0.751668930053711],[-50.2005615234375,0.879167556762695],[-50.007225036621094,0.88166618347168]]],[[[-50.037506103515625,0.884443283081055],[-50.093894958496094,0.920835494995117],[-50.04222869873047,0.918058395385742],[-50.037506103515625,0.884443283081055]]],[[[-50.00944519042969,0.935277938842773],[-50.07444763183594,0.981111526489258],[-49.947784423828125,1.054445266723633],[-50.00944519042969,0.935277938842773]]],[[[-50.39666557312012,1.881391525268555],[-50.5050048828125,2.024999618530273],[-50.356117248535156,2.116945266723633],[-50.39666557312012,1.881391525268555]]],[[[-50.47528076171875,2.119722366333008],[-50.51722717285156,2.203054428100586],[-50.405555725097656,2.193613052368164],[-50.47528076171875,2.119722366333008]]],[[[-60.09833526611328,5.217222213745117],[-60.14750671386719,4.517499923706055],[-59.67583465576172,4.388887405395508],[-59.56861114501953,3.899446487426758],[-59.98944854736328,2.693613052368164],[-59.642784118652344,1.731111526489258],[-58.80694580078125,1.185556411743164],[-57.32472229003906,1.975278854370117],[-56.47063446044922,1.944498062133789],[-55.90416717529297,1.893056869506836],[-55.96583557128906,2.532777786254883],[-54.603782653808594,2.329195022583008],[-52.90972900390625,2.195833206176758],[-51.68406677246094,4.034162521362305],[-51.447784423828125,3.972501754760742],[-51.537506103515625,4.391389846801758],[-51.08861541748047,3.91166877746582],[-50.679725646972656,2.164724349975586],[-50.445281982421875,1.825834274291992],[-49.93000030517578,1.70805549621582],[-50.1219482421875,1.214166641235352],[-49.903892517089844,1.170278549194336],[-51.25861358642578,-0.142778396606445],[-51.70000457763672,-0.752498626708984],[-51.712501525878906,-1.026666641235352],[-51.920005798339844,-1.166389465332031],[-51.92833709716797,-1.337778091430664],[-52.0675048828125,-1.420000076293945],[-52.232505798339844,-1.345277786254883],[-52.71278381347656,-1.60333251953125],[-52.20846939086914,-1.69207763671875],[-51.257225036621094,-1.218332290649414],[-50.99278259277344,-0.998611450195313],[-51.00917053222656,-0.949167251586914],[-50.992225646972656,-0.925277709960938],[-50.85833740234375,-0.913610458374023],[-50.816673278808594,-1.439722061157227],[-50.66389465332031,-1.767778396606445],[-51.336944580078125,-1.646944046020508],[-51.45195007324219,-2.273611068725586],[-51.30750274658203,-1.76361083984375],[-50.84611511230469,-2.508609771728516],[-50.98389434814453,-2.066110610961914],[-50.706390380859375,-2.220556259155273],[-50.677955627441406,-1.810443878173828],[-49.28972625732422,-1.708332061767578],[-49.49000358581543,-2.564998626708984],[-48.69722557067871,-1.469165802001953],[-48.43055725097656,-1.661666870117188],[-48.413612365722656,-1.499443054199219],[-48.1844482421875,-1.471944808959961],[-48.50305938720703,-1.458332061767578],[-48.47917175292969,-1.301942825317383],[-48.33167266845703,-1.308332443237305],[-48.29222869873047,-0.944999694824219],[-48.06056213378906,-0.710832595825195],[-47.956947326660156,-0.775278091430664],[-47.74945068359375,-0.635276794433594],[-47.726951599121094,-0.758054733276367],[-47.542503356933594,-0.636667251586914],[-47.393890380859375,-0.812778472900391],[-47.43139457702637,-0.582500457763672],[-46.95472717285156,-0.704444885253906],[-46.95111846923828,-0.908056259155273],[-46.82167053222656,-0.712778091430664],[-46.60417175292969,-1.029443740844727],[-46.55778503417969,-0.999166488647461],[-46.53583526611328,-1.032220840454102],[-46.448333740234375,-1.043054580688477],[-46.19194793701172,-0.957500457763672],[-46.25972557067871,-1.183610916137695],[-46.0433349609375,-1.210277557373047],[-45.97472381591797,-1.07499885559082],[-45.851951599121094,-1.271944046020508],[-45.735557556152344,-1.180000305175781],[-45.69611358642578,-1.370277404785156],[-45.44694519042969,-1.310832977294922],[-45.46222686767578,-1.545555114746094],[-45.32666778564453,-1.313333511352539],[-45.347503662109375,-1.740278244018555],[-44.86028289794922,-1.425277709960938],[-44.951393127441406,-1.601667404174805],[-44.820556640625,-1.578332901000977],[-44.799171447753906,-1.704999923706055],[-44.69500732421875,-1.817777633666992],[-44.53889465332031,-1.832221984863281],[-44.490562438964844,-1.980833053588867],[-44.656394958496094,-2.331110000610352],[-44.36000061035156,-2.338888168334961],[-44.58222961425781,-2.556943893432617],[-44.78639221191406,-3.29749870300293],[-44.420562744140625,-2.930000305175781],[-44.35694885253906,-2.526666641235352],[-44.06333923339844,-2.405834197998047],[-44.33972930908203,-2.830278396606445],[-43.347503662109375,-2.365833282470703],[-41.248069763183594,-3.023553848266602],[-39.9969482421875,-2.84638786315918],[-37.17444610595703,-4.918611526489258],[-35.417503356933594,-5.2147216796875],[-34.80083465576172,-7.631111145019531],[-35.29277801513672,-9.180000305175781],[-36.393333435058594,-10.492500305175781],[-37.02166557312012,-10.935834884643555],[-37.15333557128906,-10.748611450195312],[-38.04138946533203,-12.633056640625],[-38.488616943359375,-13.020000457763672],[-38.691673278808594,-12.577777862548828],[-38.90111541748047,-12.705556869506836],[-38.72528076171875,-12.874444961547852],[-38.95667266845703,-13.380001068115234],[-39.05639457702637,-13.377500534057617],[-39.080284118652344,-13.538333892822266],[-38.96305847167969,-13.681390762329102],[-39.03889465332031,-14.175834655761719],[-38.920562744140625,-13.915555953979492],[-39.06694793701172,-14.643890380859375],[-38.8719482421875,-15.874168395996094],[-39.20667266845703,-17.147502899169922],[-39.13083457946777,-17.68389129638672],[-39.64361572265625,-18.22333526611328],[-39.8013916015625,-19.632503509521484],[-40.96055603027344,-21.235836029052734],[-40.97167205810547,-21.988056182861328],[-41.7630615234375,-22.346111297607422],[-42.034446716308594,-22.919170379638672],[-43.091949462890625,-22.954723358154297],[-43.075836181640625,-22.6683349609375],[-43.21833801269531,-22.9969482421875],[-44.662506103515625,-23.048057556152344],[-44.57722473144531,-23.35611343383789],[-45.4183349609375,-23.830833435058594],[-46.382781982421875,-23.868335723876953],[-48.02611541748047,-25.015003204345703],[-48.2086181640625,-25.461669921875],[-48.13139343261719,-25.27222442626953],[-48.71861267089844,-25.424724578857422],[-48.36138916015625,-25.57638931274414],[-48.77056121826172,-25.880001068115234],[-48.581947326660156,-26.18000030517578],[-48.80250358581543,-26.067222595214844],[-48.48528289794922,-27.21139144897461],[-48.77472686767578,-28.52222442626953],[-49.75250244140625,-29.36972427368164],[-50.74945068359375,-31.081111907958984],[-52.07250213623047,-32.174171447753906],[-52.086395263671875,-31.823612213134766],[-51.25139617919922,-31.471668243408203],[-50.567222595214844,-30.457225799560547],[-50.60889434814453,-30.190555572509766],[-50.92833709716797,-30.419445037841797],[-51.28166961669922,-30.01000213623047],[-51.2711181640625,-30.79555892944336],[-51.96527862548828,-31.339447021484375],[-52.63667297363281,-33.12944793701172],[-53.374298095703125,-33.74066925048828],[-53.52278137207031,-33.14778137207031],[-53.093055725097656,-32.72972869873047],[-53.879722595214844,-31.96778106689453],[-55.581947326660156,-30.845836639404297],[-56.0089225769043,-31.07979393005371],[-56.81139373779297,-30.10527801513672],[-57.608001708984375,-30.184925079345703],[-55.765281677246094,-28.226112365722656],[-53.80778503417969,-27.129169464111328],[-53.86333465576172,-25.681114196777344],[-54.598915100097656,-25.573223114013672],[-54.33055877685547,-24.6794490814209],[-54.4072265625,-23.916667938232422],[-55.41166687011719,-23.956390380859375],[-55.84972381591797,-22.288890838623047],[-57.985107421875,-22.091827392578125],[-57.814443588256836,-20.971946716308594],[-58.15888977050781,-20.168054580688477],[-57.84874725341797,-19.97879409790039],[-58.121116638183594,-19.741390228271484],[-57.5211181640625,-18.20389175415039],[-57.74305725097656,-17.593055725097656],[-58.39750671386719,-17.249168395996094],[-58.32750701904297,-16.27916717529297],[-60.1602783203125,-16.263057708740234],[-60.57139587402344,-15.097501754760742],[-60.25889587402344,-15.093612670898438],[-60.47084045410156,-13.807222366333008],[-61.038978576660156,-13.493118286132812],[-61.833892822265625,-13.544723510742188],[-63.07500457763672,-12.650001525878906],[-64.39418029785156,-12.461668014526367],[-64.99166870117188,-12.008056640625],[-65.39279174804688,-11.266389846801758],[-65.3819580078125,-9.697778701782227],[-66.63444519042969,-9.906946182250977],[-68.58345031738281,-11.106138229370117],[-69.56843566894531,-10.951091766357422],[-70.63139343261719,-11.009166717529297],[-70.51466369628906,-9.428001403808594],[-71.29888916015625,-9.996389389038086],[-72.14389038085938,-10.004722595214844],[-72.36639404296875,-9.49444580078125],[-73.20529174804688,-9.407222747802734],[-72.96417236328125,-8.983333587646484],[-74.01055908203125,-7.541389465332031],[-73.74417114257812,-6.876943588256836],[-73.1239013671875,-6.447221755981445],[-72.85195922851562,-5.124721527099609],[-70.76583862304688,-4.146389007568359],[-69.95692443847656,-4.236873626708984],[-69.37806701660156,-1.338054656982422],[-69.60751342773438,-0.517499923706055],[-70.05805969238281,-0.157499313354492],[-70.04417419433594,0.59083366394043],[-69.12472534179688,0.645002365112305],[-69.27000427246094,1.038335800170898],[-69.84222412109375,1.072221755981445],[-69.84609985351562,1.710454940795898],[-68.15306091308594,1.72416877746582],[-68.19639587402344,1.977502822875977],[-67.91473388671875,1.745279312133789],[-67.42417907714844,2.143888473510742],[-67.07667541503906,1.173334121704102],[-66.87188720703125,1.221643447875977],[-66.31195068359375,0.750558853149414],[-65.58973693847656,0.989168167114258],[-65.51889038085938,0.649721145629883],[-63.39305877685547,2.151388168334961],[-63.361114501953125,2.419168472290039],[-64.04501342773438,2.482500076293945],[-64.19111633300781,3.594446182250977],[-64.7952880859375,4.281389236450195],[-64.01779174804688,3.886110305786133],[-63.343055725097656,3.961111068725586],[-62.875,3.560277938842773],[-62.74583435058594,4.032499313354492],[-60.98500061035156,4.52055549621582],[-60.57972717285156,4.94666862487793],[-60.730369567871094,5.204801559448242],[-60.09833526611328,5.217222213745117]]]]}},{"type":"Feature","properties":{"name":"Bulgaria","iso2":"BG","iso3":"BGR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[27.879166,42.841103],[27.44833,42.469994],[28.013054,41.982216],[27.394997,42.008041],[26.361095,41.711052],[26.294167,41.708054],[26.066109,41.69749500000013],[26.139996,41.354713],[25.28500000000014,41.24305],[24.263885,41.570549],[22.935604,41.342125],[23.014721,41.762215],[22.365276,42.323883],[22.442219,42.821663],[23.004997,43.192772],[22.367222,43.826942],[22.681435,44.224701],[23.044167,44.076111],[22.875275,43.842499],[24.179996,43.684715],[25.430229,43.626778],[27.036427,44.147339],[28.583244,43.747765],[27.879166,42.841103]]]]}},{"type":"Feature","properties":{"name":"Brunei Darussalam","iso2":"BN","iso3":"BRN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[115.223038,4.804998000000126],[115.343323,4.311943],[115.029129,4.82021],[115.145782,4.90324],[115.223038,4.804998000000126]]],[[[114.981369,4.892499],[115.018433,4.895795000000135],[114.641098,4.018888],[114.095078,4.590538],[114.981369,4.892499]]]]}},{"type":"Feature","properties":{"name":"Canada","iso2":"CA","iso3":"CAN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-65.61361694335938,43.42027473449707],[-65.633056640625,43.47471046447754],[-65.56610107421875,43.50833320617676],[-65.61361694335938,43.42027473449707]]],[[[-59.81694793701172,43.92833137512207],[-60.12999725341797,43.94193458557129],[-59.72471618652344,43.991106033325195],[-59.81694793701172,43.92833137512207]]],[[[-66.28277587890625,44.28972053527832],[-66.32223510742188,44.25277900695801],[-66.20639038085938,44.395273208618164],[-66.28277587890625,44.28972053527832]]],[[[-66.88612365722656,44.61444282531738],[-66.77250671386719,44.809160232543945],[-66.74028015136719,44.707773208618164],[-66.88612365722656,44.61444282531738]]],[[[-60.99388885498047,45.457773208618164],[-61.10444641113281,45.54638862609863],[-60.87999725341797,45.56054878234863],[-60.99388885498047,45.457773208618164]]],[[[-61.19999694824219,45.55832862854004],[-61.22416687011719,45.564157485961914],[-61.21416473388672,45.56888771057129],[-61.19999694824219,45.55832862854004]]],[[[-63.24639129638672,46.43554878234863],[-63.285003662109375,46.45083045959473],[-63.24583435058594,46.442766189575195],[-63.24639129638672,46.43554878234863]]],[[[-60.445274353027344,46.86166572570801],[-60.609169006347656,46.20193672180176],[-60.41999816894531,46.27999305725098],[-61.149169921875,45.699716567993164],[-60.40916442871094,45.979990005493164],[-60.78972625732422,45.93443489074707],[-60.3477783203125,46.31054878234863],[-59.840553283691406,45.93832588195801],[-61.336944580078125,45.57332801818848],[-61.447776794433594,46.14943885803223],[-60.609169006347656,47.02443885803223],[-60.445274353027344,46.86166572570801]]],[[[-64.03971862792969,46.74332618713379],[-63.742225646972656,46.43943214416504],[-63.64722442626953,46.567216873168945],[-63.216392517089844,46.41221046447754],[-61.965003967285156,46.453325271606445],[-62.76111602783203,45.95416450500488],[-62.96277618408203,46.31999397277832],[-63.591941833496094,46.21193885803223],[-64.41555786132812,46.670549392700195],[-64.02084350585938,47.03860664367676],[-64.03971862792969,46.74332618713379]]],[[[-55.87610626220703,47.26055335998535],[-55.96833038330078,47.25777626037598],[-55.88111114501953,47.2933292388916],[-55.87610626220703,47.26055335998535]]],[[[-61.38055419921875,47.62027168273926],[-62.0130615234375,47.2258243560791],[-61.92805480957031,47.40721321105957],[-61.38055419921875,47.62027168273926]]],[[[-54.261390686035156,47.390275955200195],[-54.36555480957031,47.41166114807129],[-54.128883361816406,47.670549392700195],[-54.261390686035156,47.390275955200195]]],[[[-54.07749938964844,47.47943305969238],[-54.10194396972656,47.50139045715332],[-54.071388244628906,47.68554878234863],[-54.07749938964844,47.47943305969238]]],[[[-55.901939392089844,47.602495193481445],[-56.113616943359375,47.64471626281738],[-55.93388366699219,47.68832588195801],[-55.901939392089844,47.602495193481445]]],[[[-64.48277282714844,47.91777229309082],[-64.6905517578125,47.75305366516113],[-64.66749572753906,47.8669376373291],[-64.48277282714844,47.91777229309082]]],[[[-64.5675048828125,47.89943885803223],[-64.50111389160156,48.02749061584473],[-64.47055053710938,47.953325271606445],[-64.5675048828125,47.89943885803223]]],[[[-53.71277618408203,48.148881912231445],[-53.935829162597656,48.18249702453613],[-53.50972557067871,48.19832801818848],[-53.71277618408203,48.148881912231445]]],[[[-123.47444152832031,48.70916175842285],[-123.5966567993164,48.94693946838379],[-123.37026977539062,48.768327713012695],[-123.47444152832031,48.70916175842285]]],[[[-123.3227767944336,48.86110877990723],[-123.54055786132812,48.94499397277832],[-123.70249938964844,49.10555458068848],[-123.3227767944336,48.86110877990723]]],[[[-125.81610107421875,49.12582588195801],[-125.93305969238281,49.21805000305176],[-125.79915618896484,49.208330154418945],[-125.81610107421875,49.12582588195801]]],[[[-126.13194274902344,49.393327713012695],[-126.06471252441406,49.25083351135254],[-126.23916625976562,49.28972053527832],[-126.13194274902344,49.393327713012695]]],[[[-123.37944030761719,49.32694435119629],[-123.42027282714844,49.381662368774414],[-123.31221008300781,49.414995193481445],[-123.37944030761719,49.32694435119629]]],[[[-54.70527458190918,49.40054512023926],[-54.75917053222656,49.43776893615723],[-54.673057556152344,49.49249458312988],[-54.640838623046875,49.463884353637695],[-54.70527458190918,49.40054512023926]]],[[[-124.17916870117188,49.44110298156738],[-124.381103515625,49.51194190979004],[-124.24472045898438,49.50139045715332],[-124.17916870117188,49.44110298156738]]],[[[-123.33277893066406,49.44110298156738],[-123.45944213867188,49.46721076965332],[-123.43666076660156,49.52221870422363],[-123.3550033569336,49.531938552856445],[-123.33277893066406,49.44110298156738]]],[[[-55.69554901123047,49.50694465637207],[-55.72277069091797,49.55777168273926],[-55.653053283691406,49.55526924133301],[-55.69554901123047,49.50694465637207]]],[[[-124.68943786621094,49.48027229309082],[-124.82362365722656,49.539438247680664],[-124.83168029785156,49.610551834106445],[-124.68943786621094,49.48027229309082]]],[[[-55.69305419921875,49.5674991607666],[-55.65972137451172,49.63555335998535],[-55.5675048828125,49.60000038146973],[-55.69305419921875,49.5674991607666]]],[[[-54.57666778564453,49.558603286743164],[-54.894447326660156,49.58526802062988],[-54.53611755371094,49.66415596008301],[-54.57666778564453,49.558603286743164]]],[[[-54.00444793701172,49.64749336242676],[-54.29888916015625,49.609994888305664],[-54.141944885253906,49.75000190734863],[-54.00444793701172,49.64749336242676]]],[[[-124.12970733642578,49.650827407836914],[-124.19943237304688,49.70610237121582],[-124.01611328125,49.77555274963379],[-124.12970733642578,49.650827407836914]]],[[[-124.44611358642578,49.72332191467285],[-124.12277221679688,49.493608474731445],[-124.65666198730469,49.796945571899414],[-124.44611358642578,49.72332191467285]]],[[[-62.0897216796875,49.38638496398926],[-61.66166687011719,49.14444160461426],[-63.089996337890625,49.228044509887695],[-64.51390075683594,49.86361122131348],[-62.0897216796875,49.38638496398926]]],[[[-126.67610168457031,49.58360481262207],[-126.9405517578125,49.83138465881348],[-126.77749633789062,49.879716873168945],[-126.67804718017578,49.825273513793945],[-126.61332702636719,49.648332595825195],[-126.67610168457031,49.58360481262207]]],[[[-124.92415618896484,50.058603286743164],[-125.06696319580078,50.107500076293945],[-124.98332214355469,50.22554969787598],[-124.92415618896484,50.058603286743164]]],[[[-63.85944366455078,50.197771072387695],[-63.93055725097656,50.22943305969238],[-63.88972473144531,50.24221992492676],[-63.85944366455078,50.197771072387695]]],[[[-125.16777038574219,49.98082160949707],[-125.33999633789062,50.26888465881348],[-125.25473022460938,50.29361152648926],[-125.16722106933594,50.21360969543457],[-125.16777038574219,49.98082160949707]]],[[[-124.8125,50.11138343811035],[-124.91832733154297,50.29972267150879],[-124.75666809082031,50.17833137512207],[-124.8125,50.11138343811035]]],[[[-124.73082733154297,50.30221748352051],[-124.65943908691406,50.25833320617676],[-124.69583129882812,50.15749549865723],[-124.79499816894531,50.2288761138916],[-124.73082733154297,50.30221748352051]]],[[[-125.16555786132812,50.37443733215332],[-125.14028930664062,50.121660232543945],[-125.15611267089844,50.23916053771973],[-125.213623046875,50.316667556762695],[-125.40028381347656,50.32083320617676],[-125.16555786132812,50.37443733215332]]],[[[-125.80722045898438,50.41360664367676],[-125.95111083984375,50.43387794494629],[-125.73805236816406,50.428049087524414],[-125.80722045898438,50.41360664367676]]],[[[-125.54387664794922,50.39388465881348],[-125.76363372802734,50.39749336242676],[-125.5239028930664,50.43443489074707],[-125.54387664794922,50.39388465881348]]],[[[-125.42610168457031,50.35555458068848],[-125.52806091308594,50.381662368774414],[-125.33194732666016,50.43554878234863],[-125.42610168457031,50.35555458068848]]],[[[-126.225830078125,50.55526924133301],[-126.62389373779297,50.533884048461914],[-126.28611755371094,50.59832954406738],[-126.225830078125,50.55526924133301]]],[[[-126.46640014648438,50.57583045959473],[-126.55416870117188,50.6027774810791],[-126.36138916015625,50.61583137512207],[-126.46640014648438,50.57583045959473]]],[[[-59.34583282470703,50.533884048461914],[-59.37194061279297,50.65277290344238],[-59.30027770996094,50.58194160461426],[-59.34583282470703,50.533884048461914]]],[[[-126.87332153320312,50.6633243560791],[-126.83112335205078,50.629159927368164],[-127.14472961425781,50.63388252258301],[-126.87332153320312,50.6633243560791]]],[[[-126.64389038085938,50.69193458557129],[-126.685546875,50.75889015197754],[-126.53639221191406,50.76361274719238],[-126.64389038085938,50.69193458557129]]],[[[-127.22693634033203,50.63611030578613],[-125.44972229003906,50.32361030578613],[-124.78943634033203,49.46415901184082],[-123.69943237304688,49.14388465881348],[-123.8505630493164,49.14554786682129],[-123.28971862792969,48.4133243560791],[-125.1138916015625,48.73110389709473],[-124.80776977539062,49.240549087524414],[-125.48361206054688,48.91582679748535],[-125.90471458435059,49.43582344055176],[-126.54222106933594,49.37443733215332],[-126.08750915527344,49.66221046447754],[-126.58500671386719,49.70110511779785],[-126.67971801757812,49.87887763977051],[-126.804443359375,49.90915870666504],[-127.1211166381836,49.8522891998291],[-127.24137878417969,49.96193885803223],[-127.15834045410156,50.096384048461914],[-127.89584350585938,50.10888862609863],[-127.92388916015625,50.46277046203613],[-127.44695281982422,50.37276649475098],[-127.41139221191406,50.58749580383301],[-128.05142211914062,50.44669532775879],[-128.416654586792,50.7691593170166],[-127.22693634033203,50.63611030578613]]],[[[-55.564720153808594,50.699716567993164],[-55.624717712402344,50.78721809387207],[-55.45055389404297,50.7983341217041],[-55.564720153808594,50.699716567993164]]],[[[-126.73137664794922,50.77193641662598],[-126.90583801269531,50.822771072387695],[-126.56304931640625,50.799997329711914],[-126.73137664794922,50.77193641662598]]],[[[-126.27306365966797,50.65277290344238],[-126.61749267578125,50.66777229309082],[-126.26640319824219,50.827775955200195],[-126.27306365966797,50.65277290344238]]],[[[-127.65471458435059,50.83777046203613],[-127.83860778808594,50.881662368774414],[-127.72638702392578,50.90860176086426],[-127.65471458435059,50.83777046203613]]],[[[-55.55555725097656,50.88638496398926],[-55.635276794433594,50.961381912231445],[-55.5352783203125,50.98137855529785],[-55.55555725097656,50.88638496398926]]],[[[-58.413330078125,51.2388858795166],[-58.56500244140625,51.23333168029785],[-58.41944885253906,51.27471351623535],[-58.413330078125,51.2388858795166]]],[[[-53.75636672973633,48.50326347351074],[-54.094444274902344,48.42582893371582],[-54.13805389404297,48.35916328430176],[-53.75636672973633,48.50326347351074],[-52.978050231933594,48.604440689086914],[-53.945274353027344,48.17888069152832],[-53.60778045654297,48.051103591918945],[-53.850555419921875,47.76055335998535],[-53.55055236816406,47.52916145324707],[-53.274444580078125,48.01333045959473],[-52.831390380859375,48.10166358947754],[-53.26721954345703,47.60610389709473],[-53.12194061279297,47.4133243560791],[-52.779441833496094,47.803049087524414],[-52.61444854736328,47.51666450500488],[-53.102500915527344,46.63665962219238],[-53.617774963378906,46.6441593170166],[-53.59138488769531,47.15609931945801],[-54.187774658203125,46.819162368774414],[-53.86750030517578,47.40277290344238],[-54.195274353027344,47.857500076293945],[-54.48277282714844,47.39166450500488],[-54.4183349609375,47.60360908508301],[-55.689720153808594,46.85833168029785],[-55.983055114746094,46.95249366760254],[-54.84583282470703,47.55694007873535],[-54.93611145019531,47.78166389465332],[-55.58777618408203,47.39860725402832],[-56.17250061035156,47.49721717834473],[-55.628334045410156,47.67471504211426],[-55.917503356933594,47.65749549865723],[-55.77361297607422,47.95694160461426],[-56.84083557128906,47.521379470825195],[-59.13555908203125,47.55638313293457],[-59.406944274902344,47.889719009399414],[-58.4183349609375,48.48665809631348],[-59.26111602783203,48.47665596008301],[-58.77471923828125,48.778879165649414],[-58.95861053466797,48.6138858795166],[-58.709442138671875,48.57083320617676],[-58.39611053466797,49.13138008117676],[-57.88166809082031,48.968881607055664],[-58.22332763671875,49.390275955200195],[-57.696388244628906,49.46360969543457],[-57.948333740234375,49.67416572570801],[-57.14805603027344,50.62193489074707],[-57.37860870361328,50.68776893615723],[-55.89805603027344,51.62860298156738],[-55.4052734375,51.561662673950195],[-56.08555603027344,51.36832618713379],[-55.73249816894531,51.07999610900879],[-56.1552734375,50.88555335998535],[-56.84888458251953,49.544443130493164],[-56.15388488769531,50.15054512023926],[-55.49169921875,50.00731086730957],[-56.12916564941406,49.425554275512695],[-55.315277099609375,49.31443977355957],[-55.14111328125,49.54527473449707],[-55.383331298828125,49.04083442687988],[-55.07805633544922,49.356943130493164],[-54.82444763183594,49.2691593170166],[-54.52888488769531,49.533334732055664],[-54.48694610595703,49.259721755981445],[-53.775001525878906,49.39610481262207],[-53.488609313964844,49.22054481506348],[-54.09610557556152,48.812211990356445],[-53.60194396972656,48.689714431762695],[-53.95610809326172,48.54388618469238],[-53.75636672973633,48.50326347351074]],[[-56.803611755371094,49.76333045959473],[-56.78221893310547,49.786943435668945],[-56.838050842285156,49.76749610900879],[-56.803611755371094,49.76333045959473]],[[-55.99388885498047,51.200273513793945],[-55.9677734375,51.22665596008301],[-55.99805450439453,51.20749855041504],[-55.99388885498047,51.200273513793945]],[[-58.34222412109375,49.06610298156738],[-58.33361053466797,49.077775955200195],[-58.356109619140625,49.06582832336426],[-58.34222412109375,49.06610298156738]]],[[[-127.91443634033203,51.41082191467285],[-128.14556884765625,51.65360450744629],[-128,51.72054481506348],[-127.91443634033203,51.41082191467285]]],[[[-55.36750030517578,51.874162673950195],[-55.43055725097656,51.89666175842285],[-55.269996643066406,52.00055122375488],[-55.36750030517578,51.874162673950195]]],[[[-128.05389404296875,51.753610610961914],[-128.25308227539062,51.87221717834473],[-127.98332214355469,52.06193733215332],[-128.05389404296875,51.753610610961914]]],[[[-79.25279235839844,52.07138252258301],[-79.37666320800781,51.936105728149414],[-79.6541748046875,51.98665809631348],[-79.25279235839844,52.07138252258301]]],[[[-131.01889038085938,51.94610023498535],[-131.11026000976562,52.15110206604004],[-131.00946044921875,52.1027774810791],[-131.01889038085938,51.94610023498535]]],[[[-127.96278381347656,52.074716567993164],[-128.12081909179688,52.14193916320801],[-127.881103515625,52.17222023010254],[-127.96278381347656,52.074716567993164]]],[[[-128.21194458007812,52.01555061340332],[-128.29415893554688,52.11361122131348],[-128.153076171875,52.195268630981445],[-128.21194458007812,52.01555061340332]]],[[[-128.29998779296875,52.13360786437988],[-128.377197265625,52.22387886047363],[-128.22720336914062,52.218881607055664],[-128.29998779296875,52.13360786437988]]],[[[-128.4283447265625,52.13749885559082],[-128.51113891601562,52.169992446899414],[-128.41641235351562,52.22638130187988],[-128.4283447265625,52.13749885559082]]],[[[-127.92471313476562,52.17416572570801],[-128.17001342773438,52.24971961975098],[-127.9727783203125,52.29527473449707],[-127.92471313476562,52.17416572570801]]],[[[-81.47694396972656,52.249162673950195],[-81.71000671386719,52.26249885559082],[-81.55166625976562,52.298051834106445],[-81.47694396972656,52.249162673950195]]],[[[-127.72444152832031,51.976938247680664],[-127.78916931152344,52.221933364868164],[-127.23473358154297,52.416940689086914],[-127.72444152832031,51.976938247680664]]],[[[-128.1844482421875,52.27860450744629],[-128.10443115234375,52.4213809967041],[-128.05667114257812,52.32888221740723],[-128.1844482421875,52.27860450744629]]],[[[-128.66860961914062,52.26638984680176],[-128.74722290039062,52.47165870666504],[-128.61581420898438,52.4536075592041],[-128.66860961914062,52.26638984680176]]],[[[-128.471923828125,52.49276924133301],[-128.81390380859375,52.52499580383301],[-128.73248291015625,52.59054756164551],[-128.57818603515625,52.593645095825195],[-128.5352783203125,52.64721870422363],[-128.471923828125,52.49276924133301]]],[[[-131.46444702148438,52.62748908996582],[-131.709716796875,52.705270767211914],[-131.47528076171875,52.73665809631348],[-131.46444702148438,52.62748908996582]]],[[[-128.4302978515625,52.368051528930664],[-128.38333129882812,52.797494888305664],[-128.2750244140625,52.48999214172363],[-128.4302978515625,52.368051528930664]]],[[[-128.97442626953125,52.453325271606445],[-129.2772216796875,52.82305335998535],[-128.92333984375,52.60666084289551],[-128.97442626953125,52.453325271606445]]],[[[-128.26974487304688,52.596940994262695],[-128.32501220703125,52.77610206604004],[-128.17779541015625,52.82610511779785],[-128.26974487304688,52.596940994262695]]],[[[-131.63973999023438,52.82805061340332],[-131.73306274414062,52.808603286743164],[-131.83139038085938,52.841936111450195],[-131.63973999023438,52.82805061340332]]],[[[-128.50527954101562,52.6411075592041],[-128.50613403320312,52.87304878234863],[-128.45083618164062,52.80526924133301],[-128.50527954101562,52.6411075592041]]],[[[-129.61053466796875,52.95499610900879],[-129.65084838867188,53.01888465881348],[-129.5574951171875,53.006662368774414],[-129.61053466796875,52.95499610900879]]],[[[-129.53167724609375,53.01055335998535],[-129.6400146484375,53.04416084289551],[-129.56277465820312,53.053049087524414],[-129.53167724609375,53.01055335998535]]],[[[-55.7630615234375,53.029436111450195],[-55.87638854980469,53.02749061584473],[-55.80055236816406,53.09360694885254],[-55.7630615234375,53.029436111450195]]],[[[-129.60247802734375,53.05721473693848],[-129.73831176757812,53.127214431762695],[-129.65444946289062,53.132768630981445],[-129.60247802734375,53.05721473693848]]],[[[-129.4324951171875,53.151384353637695],[-129.28945922851562,52.971933364868164],[-129.5472412109375,53.1330509185791],[-129.4324951171875,53.151384353637695]]],[[[-79.90916442871094,53.08194160461426],[-79.89778137207031,53.17444038391113],[-79.78721618652344,53.101938247680664],[-79.90916442871094,53.08194160461426]]],[[[-81.10610961914062,53.199716567993164],[-80.69972229003906,52.69610023498535],[-82.06332397460938,53.02665901184082],[-81.10610961914062,53.199716567993164]]],[[[-131.76223754882812,53.19665718078613],[-131.5947265625,53.0352725982666],[-131.9647216796875,53.04638862609863],[-131.61553955078125,52.92027473449707],[-131.98248291015625,52.879716873168945],[-131.03030395507812,52.17388343811035],[-132.56362915039062,53.13916206359863],[-132.54916381835938,53.15110206604004],[-132.41363525390625,53.12748908996582],[-132.07083129882812,53.153879165649414],[-131.81112670898438,53.253610610961914],[-131.76223754882812,53.19665718078613]]],[[[-128.689453125,53.164438247680664],[-128.51834106445312,52.91110420227051],[-128.59222412109375,52.6138858795166],[-128.74887084960938,52.59721565246582],[-128.64697265625,52.963327407836914],[-128.88446044921875,52.64805030822754],[-129.12191772460938,52.863054275512695],[-128.84359741210938,53.04416084289551],[-129.19137573242188,53.01333045959473],[-129.07528686523438,53.10305213928223],[-129.066650390625,53.30082893371582],[-128.689453125,53.164438247680664]]],[[[-55.778053283691406,53.28972053527832],[-55.79722595214844,53.295549392700195],[-55.785003662109375,53.303606033325195],[-55.778053283691406,53.28972053527832]]],[[[-129.153076171875,53.09832954406738],[-129.33248901367188,53.13749885559082],[-129.26806640625,53.33194160461426],[-129.16860961914062,53.29610633850098],[-129.153076171875,53.09832954406738]]],[[[-79.94276428222656,53.26693916320801],[-80.08528137207031,53.32694435119629],[-79.94471740722656,53.368051528930664],[-79.94276428222656,53.26693916320801]]],[[[-129.35833740234375,53.30416297912598],[-129.39501953125,53.41082191467285],[-129.3033447265625,53.33111000061035],[-129.35833740234375,53.30416297912598]]],[[[-55.787506103515625,53.3941593170166],[-55.979164123535156,53.45916175842285],[-55.729164123535156,53.455270767211914],[-55.787506103515625,53.3941593170166]]],[[[-128.9425048828125,53.3174991607666],[-129.14334106445312,53.34971809387207],[-128.99942016601562,53.539438247680664],[-128.901123046875,53.38665962219238],[-128.9425048828125,53.3174991607666]]],[[[-79.70973205566406,53.5080509185791],[-79.77362060546875,53.53166389465332],[-79.76139831542969,53.54610633850098],[-79.70973205566406,53.5080509185791]]],[[[-129.93472290039062,53.48416328430176],[-130.0211181640625,53.50527381896973],[-129.94195556640625,53.551103591918945],[-129.88668823242188,53.54222297668457],[-129.93472290039062,53.48416328430176]]],[[[-129.87942504882812,53.392770767211914],[-129.76223754882812,53.158884048461914],[-130.52029418945312,53.624711990356445],[-129.87942504882812,53.392770767211914]]],[[[-129.08639526367188,53.44610023498535],[-129.153076171875,53.63860511779785],[-128.81887817382812,53.70916175842285],[-129.08554077148438,53.5049991607666],[-129.08639526367188,53.44610023498535]]],[[[-56.867218017578125,53.76500129699707],[-57.01445007324219,53.78555488586426],[-56.844444274902344,53.792497634887695],[-56.867218017578125,53.76500129699707]]],[[[-130.09109497070312,53.56944465637207],[-130.40335083007812,53.68249702453613],[-130.26168823242188,53.79638862609863],[-130.09109497070312,53.56944465637207]]],[[[-129.82611083984375,53.72416114807129],[-129.50668334960938,53.21666145324707],[-129.80722045898438,53.384164810180664],[-129.8839111328125,53.579721450805664],[-130.05639457702637,53.60388374328613],[-129.92820739746094,53.639604568481445],[-130.28640747070312,53.83749580383301],[-129.82611083984375,53.72416114807129]]],[[[-79.86416625976562,53.906381607055664],[-79.90611267089844,53.91388130187988],[-79.9263916015625,53.93526649475098],[-79.86416625976562,53.906381607055664]]],[[[-130.14974975585938,53.98916053771973],[-130.193603515625,54.079721450805664],[-130.13247680664062,54.049997329711914],[-130.14974975585938,53.98916053771973]]],[[[-130.25918579101562,54.004716873168945],[-130.7127685546875,53.86110877990723],[-130.4111328125,54.10083198547363],[-130.25918579101562,54.004716873168945]]],[[[-58.518333435058594,54.05166053771973],[-58.56138610839844,54.06388282775879],[-58.37388610839844,54.10416603088379],[-58.518333435058594,54.05166053771973]]],[[[-132.80804443359375,54.12027168273926],[-132.15029907226562,53.99276924133301],[-132.663330078125,53.6794376373291],[-132.41806030273438,53.60610389709473],[-131.66305541992188,54.1522159576416],[-131.98220825195312,53.251665115356445],[-132.27279663085938,53.210275650024414],[-132.12191772460938,53.18943214416504],[-132.18695068359375,53.16054725646973],[-132.45748901367188,53.145273208618164],[-132.53668212890625,53.17888069152832],[-132.59664916992188,53.24749183654785],[-132.68362426757812,53.256662368774414],[-132.5433349609375,53.33055305480957],[-132.73388671875,53.33721351623535],[-132.40667724609375,53.3397159576416],[-132.97250366210938,53.55582618713379],[-133.0716552734375,54.16888618469238],[-132.80804443359375,54.12027168273926]]],[[[-130.195556640625,54.118051528930664],[-130.2528076171875,54.18554878234863],[-130.15194702148438,54.154436111450195],[-130.195556640625,54.118051528930664]]],[[[-79.4697265625,54.167497634887695],[-79.47555541992188,54.19137763977051],[-79.41305541992188,54.191659927368164],[-79.4697265625,54.167497634887695]]],[[[-130.64862060546875,54.11444282531738],[-130.78500366210938,54.14999580383301],[-130.78167724609375,54.2116641998291],[-130.64862060546875,54.11444282531738]]],[[[-130.35556030273438,54.25777626037598],[-130.46722412109375,54.308603286743164],[-130.41778564453125,54.32638740539551],[-130.35556030273438,54.25777626037598]]],[[[-130.26641845703125,54.26055335998535],[-130.35028076171875,54.305551528930664],[-130.27279663085938,54.329721450805664],[-130.26641845703125,54.26055335998535]]],[[[-130.70416259765625,54.35666084289551],[-130.76779174804688,54.38499641418457],[-130.69943237304688,54.40665626525879],[-130.70416259765625,54.35666084289551]]],[[[-57.32472229003906,54.49888038635254],[-57.26721954345703,54.58555030822754],[-57.24028015136719,54.517770767211914],[-57.32472229003906,54.49888038635254]]],[[[-130.95166015625,54.45471382141113],[-130.92556762695312,54.61944007873535],[-130.74777221679688,54.62610054016113],[-130.95166015625,54.45471382141113]]],[[[-79.66722106933594,54.76388740539551],[-79.72694396972656,54.75249671936035],[-79.58721923828125,54.79916572570801],[-79.66722106933594,54.76388740539551]]],[[[-130.51834106445312,54.70249366760254],[-130.61166381835938,54.7580509185791],[-130.46945190429688,54.80777168273926],[-130.51834106445312,54.70249366760254]]],[[[-130.26834106445312,54.71499824523926],[-130.37887573242188,54.695268630981445],[-130.20944213867188,54.80777168273926],[-130.26834106445312,54.71499824523926]]],[[[-57.940834045410156,54.911935806274414],[-57.84166717529297,54.8124942779541],[-58.22471618652344,54.83526802062988],[-57.940834045410156,54.911935806274414]]],[[[-79.12582397460938,54.89721870422363],[-79.77694702148438,54.77804756164551],[-79.0150146484375,54.93832588195801],[-79.12582397460938,54.89721870422363]]],[[[-58.67527770996094,54.91415596008301],[-58.76055908203125,54.920549392700195],[-58.6602783203125,55.00860786437988],[-58.67527770996094,54.91415596008301]]],[[[-130.38528442382812,54.76999092102051],[-130.45999145507812,54.82833290100098],[-130.1683349609375,55.01971626281738],[-130.38528442382812,54.76999092102051]]],[[[-82.9647216796875,55.26361274719238],[-83.0352783203125,55.278879165649414],[-82.9808349609375,55.278879165649414],[-82.9647216796875,55.26361274719238]]],[[[-77.5927734375,55.43526649475098],[-77.6441650390625,55.42582893371582],[-77.19999694824219,55.65027046203613],[-77.5927734375,55.43526649475098]]],[[[-60.97083282470703,55.86944007873535],[-61.070556640625,55.93860054016113],[-60.90833282470703,55.898332595825195],[-60.97083282470703,55.86944007873535]]],[[[-60.858612060546875,55.86471748352051],[-60.86500358581543,55.952775955200195],[-60.68638610839844,55.92193794250488],[-60.858612060546875,55.86471748352051]]],[[[-79.123046875,55.789995193481445],[-78.95750427246094,56.08360481262207],[-78.93971252441406,56.02527046203613],[-79.123046875,55.789995193481445]]],[[[-60.943328857421875,56.006662368774414],[-61.23277282714844,56.09110450744629],[-61.08916473388672,56.169992446899414],[-60.943328857421875,56.006662368774414]]],[[[-61.62361145019531,56.39999580383301],[-61.41221618652344,56.32666206359863],[-61.796112060546875,56.41304969787598],[-61.62361145019531,56.39999580383301]]],[[[-78.83999633789062,56.12999153137207],[-78.66722106933594,56.439714431762695],[-78.6763916015625,56.181108474731445],[-78.83999633789062,56.12999153137207]]],[[[-79.6199951171875,56.385271072387695],[-80.10972595214844,56.197771072387695],[-79.5433349609375,56.52777290344238],[-79.6199951171875,56.385271072387695]]],[[[-61.435829162597656,56.54138374328613],[-61.148887634277344,56.44110298156738],[-61.64222717285156,56.48638343811035],[-61.435829162597656,56.54138374328613]]],[[[-79.02166557312012,56.42694282531738],[-78.92471313476562,56.419443130493164],[-78.94332885742188,56.28499794006348],[-79.19526672363281,55.89193916320801],[-78.97721862792969,56.38860511779785],[-79.2833251953125,55.86444282531738],[-79.15055847167969,56.233049392700195],[-79.47999572753906,55.8638858795166],[-79.78195190429688,55.78804969787598],[-79.5130615234375,56.13499641418457],[-79.98582458496094,55.89805030822754],[-79.46611022949219,56.5483341217041],[-79.51445007324219,56.18638038635254],[-79.28639221191406,56.57027626037598],[-79.02166557312012,56.42694282531738]],[[-79.62693786621094,56.265275955200195],[-79.56111145019531,56.29916572570801],[-79.49221801757812,56.44693946838379],[-79.62693786621094,56.265275955200195]]],[[[-79.14195251464844,56.61666297912598],[-79.28028869628906,56.65499305725098],[-79.20889282226562,56.68387794494629],[-79.14195251464844,56.61666297912598]]],[[[-61.1875,56.58610725402832],[-61.16583251953125,56.68443489074707],[-61.077781677246094,56.674997329711914],[-61.1875,56.58610725402832]]],[[[-79.56082153320312,56.61776924133301],[-79.5675048828125,56.81777381896973],[-79.47471618652344,56.689157485961914],[-79.56082153320312,56.61776924133301]]],[[[-79.88194274902344,56.743608474731445],[-79.9586181640625,56.81138038635254],[-79.8194580078125,56.84027290344238],[-79.88194274902344,56.743608474731445]]],[[[-79.75056457519531,56.90582466125488],[-79.75750732421875,56.781938552856445],[-79.82376861572266,56.89500617980957],[-79.89750671386719,56.88499641418457],[-79.75056457519531,56.90582466125488]]],[[[-61.4292106628418,56.92970848083496],[-61.40913772583008,56.615610122680664],[-61.64439392089844,56.73477745056152],[-61.4292106628418,56.92970848083496]]],[[[-76.62110900878906,57.0755558013916],[-76.7086181640625,57.18832588195801],[-76.66999816894531,57.20249366760254],[-76.62110900878906,57.0755558013916]]],[[[-61.621665954589844,57.33555030822754],[-61.76860809326172,57.32499885559082],[-61.72694396972656,57.37443733215332],[-61.621665954589844,57.33555030822754]]],[[[-76.71501159667969,57.29277229309082],[-76.82167053222656,57.4294376373291],[-76.73110961914062,57.38193702697754],[-76.71501159667969,57.29277229309082]]],[[[-61.6552734375,57.39138221740723],[-61.90027618408203,57.4374942779541],[-61.64805603027344,57.53027534484863],[-61.6552734375,57.39138221740723]]],[[[-61.878334045410156,57.46305274963379],[-62.02027893066406,57.5402774810791],[-61.78361511230469,57.550546646118164],[-61.878334045410156,57.46305274963379]]],[[[-79.79750061035156,57.41888618469238],[-79.82695007324219,57.53804969787598],[-79.727783203125,57.61721229553223],[-79.79750061035156,57.41888618469238]]],[[[-61.68860626220703,57.71305274963379],[-61.89611053466797,57.76971626281738],[-61.71111297607422,57.83416175842285],[-61.68860626220703,57.71305274963379]]],[[[-61.94749450683594,57.78721809387207],[-62.10833740234375,57.824716567993164],[-62.00917053222656,57.904436111450195],[-61.92833709716797,57.90860176086426],[-61.94749450683594,57.78721809387207]]],[[[-67.59611511230469,58.28416633605957],[-67.67666625976562,58.3013858795166],[-67.6199951171875,58.37221717834473],[-67.51750183105469,58.33526802062988],[-67.59611511230469,58.28416633605957]]],[[[-78.45388793945312,58.539995193481445],[-78.67250061035156,58.610551834106445],[-78.6986083984375,58.68860054016113],[-78.45388793945312,58.539995193481445]]],[[[-69.19444274902344,59.064714431762695],[-69.35556030273438,58.949716567993164],[-69.35722351074219,59.139719009399414],[-69.19444274902344,59.064714431762695]]],[[[-80.53443908691406,59.36944007873535],[-80.5494384765625,59.44693946838379],[-80.47555541992188,59.48110389709473],[-80.53443908691406,59.36944007873535]]],[[[-80.27749633789062,59.618600845336914],[-80.34388732910156,59.619157791137695],[-80.14527893066406,59.70555305480957],[-80.27749633789062,59.618600845336914]]],[[[-80.0897216796875,59.75193977355957],[-80.18472290039062,59.75277900695801],[-79.87887573242188,59.85471534729004],[-80.0897216796875,59.75193977355957]]],[[[-64.01972961425781,59.7147159576416],[-64.20445251464844,59.73443794250488],[-64.06138610839844,59.86444282531738],[-64.01972961425781,59.7147159576416]]],[[[-64.42767333984375,60.372934341430664],[-64.4486083984375,60.28416633605957],[-64.86805725097656,60.45888710021973],[-64.42767333984375,60.372934341430664]]],[[[-68.25140380859375,60.23082160949707],[-68.11915588378906,60.577219009399414],[-67.79861450195312,60.45749855041504],[-68.25140380859375,60.23082160949707]]],[[[-64.68998718261719,60.58443641662598],[-64.71083068847656,60.6027774810791],[-64.5927734375,60.68554878234863],[-64.68998718261719,60.58443641662598]]],[[[-78.65638732910156,60.702775955200195],[-78.57362365722656,60.78416633605957],[-78.21945190429688,60.82388496398926],[-78.65638732910156,60.702775955200195]]],[[[-69.97721862792969,60.933053970336914],[-70.02500915527344,61.00193977355957],[-69.943603515625,61.031381607055664],[-69.97721862792969,60.933053970336914]]],[[[-64.72389221191406,61.53833198547363],[-64.87527465820312,61.32249641418457],[-65.4869384765625,61.61082649230957],[-64.72389221191406,61.53833198547363]]],[[[-65.69526672363281,61.77665901184082],[-65.94804382324219,61.7902774810791],[-65.77806091308594,61.865549087524414],[-65.69526672363281,61.77665901184082]]],[[[-64.91610717773438,61.719438552856445],[-65.2550048828125,61.90165901184082],[-64.9808349609375,61.88582801818848],[-64.91610717773438,61.719438552856445]]],[[[-92.96389770507812,61.879159927368164],[-93.07028198242188,61.825273513793945],[-93.22610473632812,61.90832710266113],[-92.96389770507812,61.879159927368164]]],[[[-65.85249328613281,62.08471870422363],[-66.02027893066406,62.12443733215332],[-65.90444946289062,62.15277290344238],[-65.85249328613281,62.08471870422363]]],[[[-92.22361755371094,62.35555458068848],[-92.37249755859375,62.39193916320801],[-92.13972473144531,62.39972114562988],[-92.22361755371094,62.35555458068848]]],[[[-79.54055786132812,62.41110420227051],[-79.26139831542969,62.16360664367676],[-79.65695190429688,61.64249610900879],[-80.27528381347656,61.806657791137695],[-80.01750183105469,62.35860633850098],[-79.54055786132812,62.41110420227051]]],[[[-92.41111755371094,62.39388465881348],[-92.60055541992188,62.38694190979004],[-92.53111267089844,62.43138313293457],[-92.41111755371094,62.39388465881348]]],[[[-64.65388488769531,62.54083442687988],[-64.38276672363281,62.51138496398926],[-64.96583557128906,62.465829849243164],[-64.65388488769531,62.54083442687988]]],[[[-64.98306274414062,62.52804756164551],[-65.14167785644531,62.546945571899414],[-64.83944702148438,62.577775955200195],[-64.98306274414062,62.52804756164551]]],[[[-77.80526733398438,62.59249305725098],[-77.62138366699219,62.58443641662598],[-77.74526977539062,62.53416633605957],[-77.80526733398438,62.59249305725098]]],[[[-78.00834655761719,62.59360694885254],[-77.83778381347656,62.55694007873535],[-78.11305236816406,62.562211990356445],[-78.00834655761719,62.59360694885254]]],[[[-91.57278442382812,62.62748908996582],[-91.66806030273438,62.6491641998291],[-91.685546875,62.666940689086914],[-91.57278442382812,62.62748908996582]]],[[[-90.97999572753906,62.65777015686035],[-91.2711181640625,62.67999458312988],[-91.08029174804688,62.68693733215332],[-90.97999572753906,62.65777015686035]]],[[[-74.3477783203125,62.6794376373291],[-73.95805358886719,62.612497329711914],[-74.65139770507812,62.716936111450195],[-74.3477783203125,62.6794376373291]]],[[[-70.711669921875,62.81499671936035],[-70.21112060546875,62.57916450500488],[-71.24137878417969,62.88138008117676],[-70.711669921875,62.81499671936035]]],[[[-66.36833190917969,62.83526802062988],[-66.60166931152344,62.90665626525879],[-66.54777526855469,62.91054725646973],[-66.36833190917969,62.83526802062988]]],[[[-81.87110900878906,62.92833137512207],[-83.08778381347656,62.17888069152832],[-83.70388793945312,62.14166450500488],[-83.94526672363281,62.42721748352051],[-83.31082153320312,62.92444038391113],[-81.87110900878906,62.92833137512207]]],[[[-66.8255615234375,62.98416328430176],[-67.0694580078125,63.107500076293945],[-66.94610595703125,63.07499885559082],[-66.8255615234375,62.98416328430176]]],[[[-67.76445007324219,63.162492752075195],[-67.875,63.22304725646973],[-67.83195495605469,63.244157791137695],[-67.76445007324219,63.162492752075195]]],[[[-67.92500305175781,63.18332862854004],[-67.96694946289062,63.18387794494629],[-68.11221313476562,63.313608169555664],[-67.92500305175781,63.18332862854004]]],[[[-78.07972717285156,63.469438552856445],[-77.4949951171875,63.26583290100098],[-77.9466552734375,63.09110450744629],[-78.57278442382812,63.44027137756348],[-78.07972717285156,63.469438552856445]]],[[[-90.65388488769531,63.44110298156738],[-90.75723266601562,63.49444007873535],[-90.59805297851562,63.45443916320801],[-90.65388488769531,63.44110298156738]]],[[[-78.5574951171875,63.45749855041504],[-78.51583862304688,63.53166389465332],[-78.461669921875,63.50750160217285],[-78.5574951171875,63.45749855041504]]],[[[-90.79360961914062,63.494157791137695],[-90.96833801269531,63.55027198791504],[-90.67471313476562,63.51388740539551],[-90.79360961914062,63.494157791137695]]],[[[-72.1824951171875,63.51999092102051],[-72.28666687011719,63.583330154418945],[-72.12916564941406,63.55888557434082],[-72.1824951171875,63.51999092102051]]],[[[-64.09249877929688,63.48166084289551],[-64.21278381347656,63.623605728149414],[-64.09333801269531,63.56833076477051],[-64.09249877929688,63.48166084289551]]],[[[-76.810546875,63.60110664367676],[-76.54194641113281,63.46249580383301],[-77.45722961425781,63.643327713012695],[-76.810546875,63.60110664367676]]],[[[-64.06111145019531,63.27054786682129],[-64.47917175292969,63.63694190979004],[-64.32888793945312,63.64444160461426],[-64.06111145019531,63.27054786682129]]],[[[-68.65638732910156,63.62638282775879],[-68.82167053222656,63.65249061584473],[-68.67694091796875,63.6713809967041],[-68.65638732910156,63.62638282775879]]],[[[-72.5947265625,63.64249610900879],[-72.7833251953125,63.664438247680664],[-72.45973205566406,63.67916297912598],[-72.5947265625,63.64249610900879]]],[[[-71.79916381835938,63.615549087524414],[-71.86332702636719,63.61944007873535],[-71.86416625976562,63.669443130493164],[-71.77944946289062,63.68832588195801],[-71.79916381835938,63.615549087524414]]],[[[-64.03250122070312,63.689714431762695],[-64.21250915527344,63.71221351623535],[-64.07528686523438,63.7580509185791],[-64.03250122070312,63.689714431762695]]],[[[-72.66777038574219,63.69582557678223],[-72.7197265625,63.76388740539551],[-72.62666320800781,63.73221015930176],[-72.66777038574219,63.69582557678223]]],[[[-64.28443908691406,63.70860481262207],[-64.381103515625,63.80749702453613],[-64.27861022949219,63.770830154418945],[-64.28443908691406,63.70860481262207]]],[[[-64.57611083984375,63.78082466125488],[-64.38612365722656,63.70166206359863],[-64.92027282714844,63.824716567993164],[-64.57611083984375,63.78082466125488]]],[[[-64.17027282714844,63.85638618469238],[-64.23443603515625,63.771379470825195],[-64.399169921875,63.849435806274414],[-64.17027282714844,63.85638618469238]]],[[[-77.74388122558594,63.92666053771973],[-77.98249816894531,63.983049392700195],[-77.54444885253906,64.02192878723145],[-77.74388122558594,63.92666053771973]]],[[[-89.80888366699219,64.05636787414551],[-89.86111450195312,64.07165718078613],[-89.86776733398438,64.09582710266113],[-89.80888366699219,64.05636787414551]]],[[[-64.96278381347656,64.11081123352051],[-64.8699951171875,64.09332466125488],[-65.0574951171875,64.11303901672363],[-64.96278381347656,64.11081123352051]]],[[[-64.49110412597656,64.1091480255127],[-64.59584045410156,64.15664863586426],[-64.45333862304688,64.14694404602051],[-64.49110412597656,64.1091480255127]]],[[[-73.17694091796875,64.20027351379395],[-73.28277587890625,64.1433277130127],[-73.40167236328125,64.1655445098877],[-73.17694091796875,64.20027351379395]]],[[[-81.47138977050781,64.18887519836426],[-81.53805541992188,64.21805000305176],[-81.37582397460938,64.22082710266113],[-81.47138977050781,64.18887519836426]]],[[[-64.52027893066406,64.22026252746582],[-64.64778137207031,64.25000190734863],[-64.46221923828125,64.23748970031738],[-64.52027893066406,64.22026252746582]]],[[[-64.9385986328125,64.23553657531738],[-65.11250305175781,64.33970832824707],[-64.88473510742188,64.28776741027832],[-64.9385986328125,64.23553657531738]]],[[[-75.5513916015625,64.30386543273926],[-75.70584106445312,64.3419361114502],[-75.49360656738281,64.31637763977051],[-75.5513916015625,64.30386543273926]]],[[[-73.87638854980469,64.30137825012207],[-73.97250366210938,64.3097095489502],[-73.9566650390625,64.36831855773926],[-73.87638854980469,64.30137825012207]]],[[[-73.69776916503906,64.26999092102051],[-73.8336181640625,64.33166694641113],[-73.78138732910156,64.40555000305176],[-73.69776916503906,64.26999092102051]]],[[[-64.8497314453125,64.30748176574707],[-64.9586181640625,64.40582466125488],[-64.77194213867188,64.34887886047363],[-64.8497314453125,64.30748176574707]]],[[[-74.27194213867188,64.41360664367676],[-74.43943786621094,64.45332527160645],[-74.17332458496094,64.43914985656738],[-74.27194213867188,64.41360664367676]]],[[[-73.7449951171875,64.42608833312988],[-73.78138732910156,64.43193244934082],[-73.77333068847656,64.50332832336426],[-73.66860961914062,64.46443367004395],[-73.7449951171875,64.42608833312988]]],[[[-74.21278381347656,64.4830493927002],[-74.35777282714844,64.55108833312988],[-74.16972351074219,64.52388191223145],[-74.21278381347656,64.4830493927002]]],[[[-73.5574951171875,64.3127613067627],[-73.6824951171875,64.50972175598145],[-73.52778625488281,64.56694221496582],[-73.5574951171875,64.3127613067627]]],[[[-65.49276733398438,64.51776313781738],[-65.69027709960938,64.52415657043457],[-65.20805358886719,64.63971138000488],[-65.49276733398438,64.51776313781738]]],[[[-63.35333251953125,64.99498176574707],[-63.25889587402344,64.92109870910645],[-63.42028045654297,64.9760913848877],[-63.35333251953125,64.99498176574707]]],[[[-63.243614196777344,65.25499153137207],[-63.311668395996094,65.29803657531738],[-63.16638946533203,65.28610420227051],[-63.243614196777344,65.25499153137207]]],[[[-66.92471313476562,65.28442573547363],[-67.01055908203125,65.33333015441895],[-66.91082763671875,65.35693550109863],[-66.92471313476562,65.28442573547363]]],[[[-88.43028259277344,65.45526313781738],[-88.51222229003906,65.46971321105957],[-88.3941650390625,65.46582221984863],[-88.43028259277344,65.45526313781738]]],[[[-62.795005798339844,65.51999092102051],[-62.88444519042969,65.60554695129395],[-62.75083923339844,65.55137825012207],[-62.795005798339844,65.51999092102051]]],[[[-83.88276672363281,65.66693305969238],[-83.94221496582031,65.68692207336426],[-83.87277221679688,65.71220588684082],[-83.88276672363281,65.66693305969238]]],[[[-62.268333435058594,65.70166206359863],[-62.13194274902344,65.65721321105957],[-62.48444366455078,65.72693061828613],[-62.268333435058594,65.70166206359863]]],[[[-67.47250366210938,65.70526313781738],[-67.71583557128906,65.70166206359863],[-67.4244384765625,65.73526191711426],[-67.47250366210938,65.70526313781738]]],[[[-85.48056030273438,65.79193305969238],[-85.15638732910156,65.77665901184082],[-85.31193542480469,65.53776741027832],[-84.92471313476562,65.20971870422363],[-84.44027709960938,65.45665168762207],[-81.7630615234375,64.50110054016113],[-81.60249328613281,64.12997627258301],[-81.9869384765625,63.994157791137695],[-80.89083862304688,64.11554145812988],[-80.17166137695312,63.77110481262207],[-81.07640075683594,63.45138740539551],[-82.47222900390625,63.68027687072754],[-82.36138916015625,63.9052677154541],[-83.09889221191406,63.95916175842285],[-83.07278442382812,64.18664741516113],[-85.26640319824219,63.11749458312988],[-85.58917236328125,63.17471504211426],[-85.71749877929688,63.71610450744629],[-87.18804931640625,63.58999061584473],[-86.18943786621094,64.10165596008301],[-86.40167236328125,64.43664741516113],[-86.0977783203125,65.52916145324707],[-85.48056030273438,65.79193305969238]]],[[[-83.28388977050781,65.83415412902832],[-83.48527526855469,65.80081367492676],[-83.58612060546875,65.85415840148926],[-83.28388977050781,65.83415412902832]]],[[[-65.64584350585938,65.81303596496582],[-65.64778137207031,65.87997627258301],[-65.51139831542969,65.90304756164551],[-65.64584350585938,65.81303596496582]]],[[[-62.13666534423828,65.85138130187988],[-62.296669006347656,65.93858528137207],[-62.137779235839844,65.92581367492676],[-62.13666534423828,65.85138130187988]]],[[[-67.13833618164062,65.92692756652832],[-67.21194458007812,65.98275947570801],[-67.15388488769531,65.97859382629395],[-67.13833618164062,65.92692756652832]]],[[[-84.7227783203125,65.54609870910645],[-85.17304992675781,65.99470710754395],[-84.586669921875,65.69220161437988],[-84.7227783203125,65.54609870910645]]],[[[-83.57695007324219,65.9830493927002],[-83.60444641113281,65.98776435852051],[-83.49305725097656,66.01277351379395],[-83.57695007324219,65.9830493927002]]],[[[-83.60861206054688,66.04414558410645],[-83.65361022949219,66.04136848449707],[-83.60722351074219,66.07748603820801],[-83.57084655761719,66.05636787414551],[-83.60861206054688,66.04414558410645]]],[[[-85.0191650390625,66.05720710754395],[-85.149169921875,66.05053901672363],[-85.0997314453125,66.08970832824707],[-85.0191650390625,66.05720710754395]]],[[[-83.64944458007812,66.08360481262207],[-83.68527221679688,66.12109565734863],[-83.58778381347656,66.1172046661377],[-83.64944458007812,66.08360481262207]]],[[[-83.92138671875,66.00972175598145],[-83.69415283203125,65.9246997833252],[-83.72749328613281,65.79971504211426],[-83.21083068847656,65.7058277130127],[-83.8427734375,65.64915657043457],[-83.68276977539062,65.74942207336426],[-84.14361572265625,65.76416206359863],[-84.12361145019531,65.90027046203613],[-84.47027587890625,66.13333320617676],[-83.92138671875,66.00972175598145]]],[[[-84.57972717285156,66.1413745880127],[-84.63999938964844,66.14055061340332],[-84.67860412597656,66.18248176574707],[-84.57972717285156,66.1413745880127]]],[[[-84.26528930664062,66.17776679992676],[-84.36361694335938,66.20942878723145],[-84.27305603027344,66.19664192199707],[-84.26528930664062,66.17776679992676]]],[[[-62.18388366699219,66.2371997833252],[-62.43000030517578,66.22915840148926],[-62.26167297363281,66.28027534484863],[-62.18388366699219,66.2371997833252]]],[[[-83.06723022460938,66.25555610656738],[-83.29833984375,66.31387519836426],[-82.90249633789062,66.27165412902832],[-83.06723022460938,66.25555610656738]]],[[[-66.62332153320312,66.28082466125488],[-66.95834350585938,66.41192817687988],[-66.57501220703125,66.31387519836426],[-66.62332153320312,66.28082466125488]]],[[[-66.99833679199219,66.49304389953613],[-66.86888122558594,66.46443367004395],[-67.03666687011719,66.45610237121582],[-66.99833679199219,66.49304389953613]]],[[[-107.92304992675781,66.85054206848145],[-107.79499816894531,66.9972095489502],[-107.82389831542969,66.90109443664551],[-107.92304992675781,66.85054206848145]]],[[[-63.059165954589844,66.95776557922363],[-63.166107177734375,67.00499153137207],[-63,66.98442268371582],[-63.059165954589844,66.95776557922363]]],[[[-108.01445007324219,66.89776802062988],[-108.10659790039062,67.02600288391113],[-107.93831634521484,66.94693183898926],[-108.01445007324219,66.89776802062988]]],[[[-62.9183349609375,67.00972175598145],[-63.13805389404297,67.06526374816895],[-63.002227783203125,67.06944465637207],[-62.9183349609375,67.00972175598145]]],[[[-62.6441650390625,67.05748176574707],[-62.899444580078125,67.05832099914551],[-62.375274658203125,67.16581916809082],[-62.6441650390625,67.05748176574707]]],[[[-107.40778350830078,67.08305549621582],[-107.52778625488281,67.07805061340332],[-107.62666320800781,67.20027351379395],[-107.40778350830078,67.08305549621582]]],[[[-95.36166381835938,67.19775581359863],[-95.55278015136719,67.23526191711426],[-95.30722045898438,67.25248908996582],[-95.36166381835938,67.19775581359863]]],[[[-107.66278076171875,67.22026252746582],[-107.72501373291016,67.31303596496582],[-107.66000366210938,67.29887580871582],[-107.66278076171875,67.22026252746582]]],[[[-63.36639404296875,67.28776741027832],[-63.82972717285156,67.28415107727051],[-63.58583068847656,67.35331916809082],[-63.36639404296875,67.28776741027832]]],[[[-107.91082763671875,67.31053352355957],[-108.07389831542969,67.43081855773926],[-107.89472961425781,67.48553657531738],[-107.91082763671875,67.31053352355957]]],[[[-108.36833190917969,67.46721076965332],[-108.49137878417969,67.56303596496582],[-108.29750061035156,67.55720710754395],[-108.36833190917969,67.46721076965332]]],[[[-108.14111328125,67.44999885559082],[-108.27194213867188,67.47137641906738],[-108.21916198730469,67.57110786437988],[-108.14111328125,67.44999885559082]]],[[[-108.3227767944336,67.5899829864502],[-108.48388671875,67.63665962219238],[-108.39028930664062,67.63109016418457],[-108.3227767944336,67.5899829864502]]],[[[-63.88194274902344,67.50332832336426],[-64.02972412109375,67.51388740539551],[-63.97694396972656,67.6494312286377],[-63.758056640625,67.52054023742676],[-63.88194274902344,67.50332832336426]]],[[[-108.05999755859375,67.47526741027832],[-108.11361694335938,67.67526435852051],[-107.92138671875,67.5466480255127],[-108.05999755859375,67.47526741027832]]],[[[-97.50279235839844,67.62442207336426],[-97.560546875,67.69275093078613],[-97.33778381347656,67.72415351867676],[-97.50279235839844,67.62442207336426]]],[[[-109.11221313476562,67.7633228302002],[-109.20777893066406,67.78387641906738],[-109.03916931152344,67.79332160949707],[-109.11221313476562,67.7633228302002]]],[[[-96.17054557800293,67.77304267883301],[-96.07722473144531,67.8388843536377],[-95.99749755859375,67.82083320617676],[-96.17054557800293,67.77304267883301]]],[[[-114.1150131225586,67.88388252258301],[-114.29695129394531,67.89526557922363],[-113.92138671875,67.87803840637207],[-114.1150131225586,67.88388252258301]]],[[[-113.39028930664062,67.89776802062988],[-113.60333251953125,67.90304756164551],[-113.2469482421875,67.91443061828613],[-113.39028930664062,67.89776802062988]]],[[[-112.93055725097656,67.91665840148926],[-113.14750671386719,67.91220283508301],[-112.88722229003906,67.92720222473145],[-112.93055725097656,67.91665840148926]]],[[[-108.64695739746094,67.86943244934082],[-108.54472351074219,67.92831611633301],[-108.35944366455078,67.89999580383301],[-108.64695739746094,67.86943244934082]]],[[[-114.21916198730469,67.94525337219238],[-114.31723022460938,67.94970893859863],[-114.12110900878906,67.9619312286377],[-114.21916198730469,67.94525337219238]]],[[[-108.1380615234375,67.87248420715332],[-108.25556945800781,67.88720893859863],[-108.054443359375,67.96331977844238],[-108.1380615234375,67.87248420715332]]],[[[-113.72000122070312,67.97331428527832],[-113.99305725097656,67.96110725402832],[-113.77223205566406,67.98027229309082],[-113.72000122070312,67.97331428527832]]],[[[-109.19526672363281,67.98997688293457],[-108.95111083984375,67.97331428527832],[-108.8660945892334,67.90027046203613],[-109.19526672363281,67.98997688293457]]],[[[-110.33444213867188,68.01165962219238],[-110.42083740234375,68.02083015441895],[-110.31749725341797,68.04971504211426],[-110.33444213867188,68.01165962219238]]],[[[-98.95140075683594,67.97998237609863],[-99.07861328125,68.04559516906738],[-98.97555541992188,68.07721138000488],[-98.95140075683594,67.97998237609863]]],[[[-108.50611877441406,68.03471565246582],[-108.540283203125,68.03997993469238],[-108.4474868774414,68.08777046203613],[-108.50611877441406,68.03471565246582]]],[[[-65.39723205566406,68.03997993469238],[-65.51972961425781,68.06749153137207],[-65.38639831542969,68.08831977844238],[-65.39723205566406,68.03997993469238]]],[[[-109.32167053222656,67.9810962677002],[-109.54306030273438,68.05220222473145],[-109.44721984863281,68.09221076965332],[-109.32167053222656,67.9810962677002]]],[[[-108.36054992675781,68.04971504211426],[-108.40805053710938,68.0697193145752],[-108.29444885253906,68.09721565246582],[-108.36054992675781,68.04971504211426]]],[[[-74.21556091308594,68.11775398254395],[-73.34861755371094,67.82805061340332],[-74.7772216796875,67.97387886047363],[-74.21556091308594,68.11775398254395]]],[[[-110.213623046875,68.03804206848145],[-110.25862121582031,68.04193305969238],[-109.87721252441406,68.12692451477051],[-110.213623046875,68.03804206848145]]],[[[-65.64222717285156,68.15942573547363],[-65.49554443359375,68.1283130645752],[-65.70973205566406,68.1060962677002],[-65.64222717285156,68.15942573547363]]],[[[-112.78056335449219,68.13109016418457],[-112.92223358154297,68.14665412902832],[-112.75167846679688,68.16470527648926],[-112.78056335449219,68.13109016418457]]],[[[-107.47361755371094,68.14471626281738],[-107.55416870117188,68.16609382629395],[-107.46806335449219,68.18858528137207],[-107.47361755371094,68.14471626281738]]],[[[-104.45305633544922,68.10220527648926],[-104.55387878417969,68.16165351867676],[-104.37721252441406,68.19970893859863],[-104.45305633544922,68.10220527648926]]],[[[-107.38890075683594,68.17221260070801],[-107.44526672363281,68.20166206359863],[-107.29167175292969,68.2027759552002],[-107.38890075683594,68.17221260070801]]],[[[-98.65028381347656,68.18026924133301],[-98.70445251464844,68.17608833312988],[-98.69332885742188,68.21360969543457],[-98.65028381347656,68.18026924133301]]],[[[-111.83332824707031,68.18193244934082],[-111.86554718017578,68.18803596496582],[-111.75499725341797,68.21582221984863],[-111.83332824707031,68.18193244934082]]],[[[-96.38417053222656,68.2008228302002],[-96.46278381347656,68.21609687805176],[-96.3175048828125,68.23193550109863],[-96.38417053222656,68.2008228302002]]],[[[-74.06277465820312,68.15165901184082],[-74.1763916015625,68.20416450500488],[-74.07972717285156,68.23248481750488],[-74.06277465820312,68.15165901184082]]],[[[-108.59028625488281,68.21443367004395],[-108.677490234375,68.16887092590332],[-108.55972290039062,68.2361011505127],[-108.59028625488281,68.21443367004395]]],[[[-66.31361389160156,68.14776802062988],[-66.60722351074219,68.21721076965332],[-66.22193908691406,68.24109077453613],[-66.31361389160156,68.14776802062988]]],[[[-109.78388977050781,68.13749885559082],[-109.85665893554688,68.14776802062988],[-109.56806945800781,68.2472095489502],[-109.78388977050781,68.13749885559082]]],[[[-78.57167053222656,68.20027351379395],[-78.66221618652344,68.18914985656738],[-78.54804992675781,68.26304817199707],[-78.57167053222656,68.20027351379395]]],[[[-111.71028137207031,68.22053718566895],[-111.7772216796875,68.25305366516113],[-111.49944305419922,68.29693794250488],[-111.71028137207031,68.22053718566895]]],[[[-75.58277893066406,68.30026435852051],[-75.00306701660156,68.13220405578613],[-75.1986083984375,67.44331550598145],[-76.66361999511719,67.2199878692627],[-77.2469482421875,67.45193672180176],[-77.251953125,67.82638740539551],[-76.72610473632812,68.23887825012207],[-75.58277893066406,68.30026435852051]]],[[[-86.4263916015625,68.06915473937988],[-86.5836181640625,67.72526741027832],[-86.99276733398438,68.0666675567627],[-86.67500305175781,68.30609321594238],[-86.4263916015625,68.06915473937988]]],[[[-79.02055358886719,68.16914558410645],[-79.19110107421875,68.31944465637207],[-78.80166625976562,68.27916145324707],[-79.02055358886719,68.16914558410645]]],[[[-100.07472229003906,68.34971809387207],[-100.09944152832031,68.27859687805176],[-100.23082733154297,68.3197193145752],[-100.07472229003906,68.34971809387207]]],[[[-82.05999755859375,68.30609321594238],[-82.34555053710938,68.36775398254395],[-81.99722290039062,68.34137153625488],[-82.05999755859375,68.30609321594238]]],[[[-111.11444091796875,68.40582466125488],[-111.149169921875,68.43997383117676],[-111.0824966430664,68.44470405578613],[-111.11444091796875,68.40582466125488]]],[[[-74.16221618652344,68.24609565734863],[-74.39306640625,68.44525337219238],[-74.07945251464844,68.33859443664551],[-74.16221618652344,68.24609565734863]]],[[[-99.04527282714844,68.42387580871582],[-99.05499267578125,68.40832710266113],[-99.15916442871094,68.45109748840332],[-99.04527282714844,68.42387580871582]]],[[[-100.71056365966797,68.4024829864502],[-100.88971710205078,68.4527759552002],[-100.79332733154297,68.46887397766113],[-100.71056365966797,68.4024829864502]]],[[[-110.86250305175781,68.47415351867676],[-111.09750366210938,68.48275947570801],[-110.69611358642578,68.48637580871582],[-110.86250305175781,68.47415351867676]]],[[[-110.5869369506836,68.52415657043457],[-110.76194763183594,68.56164741516113],[-110.51834106445312,68.53915596008301],[-110.5869369506836,68.52415657043457]]],[[[-104.54527282714844,68.39610481262207],[-105.08168029785156,68.54637336730957],[-104.68250274658203,68.57388496398926],[-104.54527282714844,68.39610481262207]]],[[[-105.1391830444336,68.53637886047363],[-105.05888366699219,68.5041675567627],[-105.29222106933594,68.58221626281738],[-105.1391830444336,68.53637886047363]]],[[[-113.78611755371094,68.58276557922363],[-113.96611022949219,68.6111011505127],[-113.76194763183594,68.59221076965332],[-113.78611755371094,68.58276557922363]]],[[[-100.74054718017578,68.59637641906738],[-100.88249206542969,68.61137580871582],[-100.81388854980469,68.61914253234863],[-100.74054718017578,68.59637641906738]]],[[[-78.46888732910156,68.56387519836426],[-78.95973205566406,68.47470283508301],[-78.8638916015625,68.65971565246582],[-78.46888732910156,68.56387519836426]]],[[[-74.81138610839844,68.32054328918457],[-75.39695739746094,68.6111011505127],[-75,68.67224311828613],[-74.81138610839844,68.32054328918457]]],[[[-74.76889038085938,68.67387580871582],[-74.51834106445312,68.55859565734863],[-74.89028930664062,68.62498664855957],[-74.76889038085938,68.67387580871582]]],[[[-114.04723358154297,68.61360359191895],[-114.18998718261719,68.68026924133301],[-114.14195251464844,68.67692756652832],[-114.04723358154297,68.61360359191895]]],[[[-101.83112335205078,68.56694221496582],[-102.31639099121094,68.67221260070801],[-101.69387817382812,68.76805305480957],[-101.83112335205078,68.56694221496582]]],[[[-68.11027526855469,68.78276252746582],[-67.66139221191406,68.70193672180176],[-68.45944213867188,68.79109382629395],[-68.11027526855469,68.78276252746582]]],[[[-102.600830078125,68.81331062316895],[-102.70722961425781,68.8166675567627],[-102.61277770996094,68.84305000305176],[-102.600830078125,68.81331062316895]]],[[[-89.94444274902344,68.66220283508301],[-89.94444274902344,68.84749031066895],[-89.78167724609375,68.76666450500488],[-89.94444274902344,68.66220283508301]]],[[[-114.350830078125,68.87164497375488],[-114.4716567993164,68.89248847961426],[-114.32333374023438,68.88304328918457],[-114.350830078125,68.87164497375488]]],[[[-67.8477783203125,68.85193061828613],[-67.96055603027344,68.92997932434082],[-67.87638854980469,68.94941902160645],[-67.8477783203125,68.85193061828613]]],[[[-100.17555236816406,68.79471015930176],[-100.623046875,68.76193428039551],[-100.59999084472656,69.00055122375488],[-100.17555236816406,68.79471015930176]]],[[[-85.3416748046875,68.98359870910645],[-85.45306396484375,69.00583076477051],[-85.3699951171875,69.00193977355957],[-85.3416748046875,68.98359870910645]]],[[[-89.90834045410156,68.91775703430176],[-90.070556640625,68.98193550109863],[-89.92083740234375,69.0102710723877],[-89.90834045410156,68.91775703430176]]],[[[-85.11944580078125,69.01471138000488],[-85.17027282714844,69.03581428527832],[-85.06138610839844,69.03665351867676],[-85.11944580078125,69.01471138000488]]],[[[-85.26528930664062,69.07249641418457],[-85.39889526367188,69.08610725402832],[-85.241943359375,69.09137153625488],[-85.26528930664062,69.07249641418457]]],[[[-99.99943542480469,68.94359016418457],[-100.25862121582031,69.04193305969238],[-100.05304718017578,69.10247993469238],[-99.99943542480469,68.94359016418457]]],[[[-90.12471008300781,69.04942512512207],[-90.27639770507812,69.12581062316895],[-90.14723205566406,69.10359382629395],[-90.12471008300781,69.04942512512207]]],[[[-101.66416931152344,69.08360481262207],[-101.69526672363281,69.20694160461426],[-101.49500274658203,69.1655445098877],[-101.66416931152344,69.08360481262207]]],[[[-90.51251220703125,69.20248603820801],[-90.77583312988281,69.32998847961426],[-90.58250427246094,69.35971260070801],[-90.51251220703125,69.20248603820801]]],[[[-78.41221618652344,69.37970161437988],[-78.21083068847656,69.29443550109863],[-78.83029174804688,68.91304206848145],[-79.40028381347656,68.87191963195801],[-78.41221618652344,69.37970161437988]]],[[[-135.28890991210938,69.30941963195801],[-135.5655517578125,69.39055061340332],[-135.3377685546875,69.38859748840332],[-135.28890991210938,69.30941963195801]]],[[[-76.95083618164062,69.39526557922363],[-76.64666557312012,69.3369312286377],[-77.38194274902344,69.24748420715332],[-76.95083618164062,69.39526557922363]]],[[[-90.32945251464844,69.23581123352051],[-90.51445007324219,69.36387825012207],[-90.20083618164062,69.44442939758301],[-90.32945251464844,69.23581123352051]]],[[[-135.59222412109375,69.48221015930176],[-135.57443237304688,69.44664192199707],[-135.8155517578125,69.50248908996582],[-135.59222412109375,69.48221015930176]]],[[[-101.05304718017578,69.50444221496582],[-101.23029327392578,69.36859321594238],[-101.38722229003906,69.53776741027832],[-101.05304718017578,69.50444221496582]]],[[[-96.66305541992188,69.5697193145752],[-96.09611511230469,69.46805000305176],[-96.23388671875,69.35971260070801],[-96.66305541992188,69.5697193145752]]],[[[-67.310546875,69.54915046691895],[-67.74972534179688,69.52110481262207],[-67.48443603515625,69.59027290344238],[-67.310546875,69.54915046691895]]],[[[-95.4888916015625,69.56553840637207],[-95.51583862304688,69.3308277130127],[-95.7369384765625,69.32443428039551],[-95.66915893554688,69.50749397277832],[-95.81582641601562,69.5627613067627],[-95.99082946777344,69.35331916809082],[-95.91999816894531,69.59526252746582],[-95.4888916015625,69.56553840637207]]],[[[-96.76055908203125,69.54553413391113],[-96.88389587402344,69.55914497375488],[-96.9022216796875,69.59776496887207],[-96.76055908203125,69.54553413391113]]],[[[-91.11000061035156,69.54942512512207],[-91.10888671875,69.60220527648926],[-90.91915893554688,69.6060962677002],[-91.11000061035156,69.54942512512207]]],[[[-133.93222045898438,69.56025886535645],[-134.01666259765625,69.57609748840332],[-133.93362426757812,69.61609077453613],[-133.8447265625,69.60081672668457],[-133.93222045898438,69.56025886535645]]],[[[-135.51724243164062,69.56915473937988],[-135.58944702148438,69.59610176086426],[-135.39779663085938,69.64694404602051],[-135.51724243164062,69.56915473937988]]],[[[-138.86721801757812,69.58831977844238],[-139.33248901367188,69.56608772277832],[-139.12026977539062,69.64999580383301],[-138.86721801757812,69.58831977844238]]],[[[-67.92027282714844,69.52192878723145],[-68.24888610839844,69.59665107727051],[-67.88972473144531,69.70833015441895],[-67.92027282714844,69.52192878723145]]],[[[-134.26058959960938,68.7335376739502],[-134.49554443359375,68.7522144317627],[-134.82583618164062,68.97886848449707],[-134.91473388671875,68.96666145324707],[-134.96112060546875,68.89248847961426],[-135.1419677734375,68.9013843536377],[-135.20166015625,68.9327564239502],[-135.3919677734375,68.9266529083252],[-135.4608154296875,68.94275093078613],[-135.90585327148438,68.91137886047363],[-135.97833251953125,69.04081916809082],[-135.51779174804688,69.02388191223145],[-135.96722412109375,69.21470832824707],[-135.4869384765625,69.11331367492676],[-135.854154586792,69.29081916809082],[-135.17056274414062,69.25776863098145],[-135.2872314453125,69.41914558410645],[-135.15084838867188,69.47693061828613],[-134.43832397460938,69.45471382141113],[-134.4910888671875,69.72221565246582],[-134.11331176757812,69.53888130187988],[-133.77835083007812,69.57638740539551],[-134.67361450195312,69.01776313781738],[-134.26058959960938,68.7335376739502]]],[[[-102.14527893066406,69.64860725402832],[-102.24137878417969,69.71026802062988],[-102.1347427368164,69.72470283508301],[-102.14527893066406,69.64860725402832]]],[[[-77.9466552734375,69.64665412902832],[-78.88027954101562,69.47693061828613],[-78.18055725097656,69.7522144317627],[-77.9466552734375,69.64665412902832]]],[[[-82.50778198242188,69.70498847961426],[-82.87944030761719,69.77859687805176],[-82.46028137207031,69.76165962219238],[-82.50778198242188,69.70498847961426]]],[[[-79.42304992675781,69.78499031066895],[-80.01194763183594,69.49165534973145],[-80.80943298339844,69.68304634094238],[-79.42304992675781,69.78499031066895]]],[[[-83.6744384765625,69.7199878692627],[-83.91722106933594,69.77859687805176],[-83.5291748046875,69.78665351867676],[-83.7086181640625,69.75943183898926],[-83.6744384765625,69.7199878692627]]],[[[-82.429443359375,69.78221321105957],[-82.6885986328125,69.85081672668457],[-82.51722717285156,69.85415840148926],[-82.429443359375,69.78221321105957]]],[[[-91.81916809082031,69.82165718078613],[-91.86416625976562,69.84414863586426],[-91.63972473144531,69.85498237609863],[-91.81916809082031,69.82165718078613]]],[[[-91.52000427246094,69.73137092590332],[-91.73554992675781,69.78915596008301],[-91.40916442871094,69.87498664855957],[-91.52000427246094,69.73137092590332]]],[[[-97.39778137207031,69.68553352355957],[-95.20695495605469,68.85026741027832],[-96.53056335449219,68.44497871398926],[-99.59638977050781,69.02054023742676],[-98.39334106445312,69.30803108215332],[-98.55665588378906,69.5808277130127],[-98.00389099121094,69.4358081817627],[-98.36776733398438,69.6010913848877],[-98.01222229003906,69.88582038879395],[-97.39778137207031,69.68553352355957]]],[[[-97.32501220703125,69.88916206359863],[-97.48860168457031,69.9438648223877],[-97.22694396972656,69.87359809875488],[-97.32501220703125,69.88916206359863]]],[[[-100.8497314453125,69.92553901672363],[-100.85861206054688,69.97776985168457],[-100.80695343017578,69.98581123352051],[-100.8497314453125,69.92553901672363]]],[[[-87.09138488769531,70.15027046203613],[-86.4566650390625,70.00749397277832],[-87.37832641601562,70.09610176086426],[-87.09138488769531,70.15027046203613]]],[[[-125.05695343017578,70.11831855773926],[-125.12332153320312,70.13546943664551],[-124.95500183105469,70.16415596008301],[-125.05695343017578,70.11831855773926]]],[[[-124.679443359375,70.16165351867676],[-124.76194763183594,70.19192695617676],[-124.50527954101562,70.19832038879395],[-124.679443359375,70.16165351867676]]],[[[-112.9697265625,70.28137397766113],[-113.20361328125,70.29248237609863],[-112.94554138183594,70.28665351867676],[-112.9697265625,70.28137397766113]]],[[[-112.6552734375,70.26609992980957],[-112.76139831542969,70.2986011505127],[-112.6875,70.30636787414551],[-112.6552734375,70.26609992980957]]],[[[-100.76528930664062,70.25000190734863],[-100.85193634033203,70.32388496398926],[-100.748046875,70.31694221496582],[-100.76528930664062,70.25000190734863]]],[[[-116.80526733398438,70.50943183898926],[-116.56833457946777,70.47387886047363],[-116.71916198730469,70.47026252746582],[-116.80526733398438,70.50943183898926]]],[[[-116.28778076171875,70.55331611633301],[-116.12748718261719,70.53581428527832],[-116.4958267211914,70.52276802062988],[-116.28778076171875,70.55331611633301]]],[[[-116.56304931640625,70.53442573547363],[-116.7744369506836,70.54525947570801],[-116.50945281982422,70.55609321594238],[-116.56304931640625,70.53442573547363]]],[[[-115.92054557800293,70.54136848449707],[-116.06111145019531,70.54832649230957],[-115.80803680419922,70.57054328918457],[-115.92054557800293,70.54136848449707]]],[[[-116.87944030761719,70.54748725891113],[-117.30166625976562,70.56192207336426],[-117.19943237304688,70.59166145324707],[-116.87944030761719,70.54748725891113]]],[[[-128.08612060546875,70.60554695129395],[-128.3416748046875,70.54220771789551],[-128.23416137695312,70.65609931945801],[-128.08612060546875,70.60554695129395]]],[[[-100.23082733154297,70.45166206359863],[-100.67083740234375,70.55887031555176],[-100.65194702148438,70.66971015930176],[-100.23082733154297,70.45166206359863]]],[[[-103.17778015136719,70.62248420715332],[-103.28138732910156,70.63804817199707],[-103.21000671386719,70.6766529083252],[-103.17778015136719,70.62248420715332]]],[[[-103.350830078125,70.68719673156738],[-103.46278381347656,70.73221015930176],[-103.34111022949219,70.72026252746582],[-103.350830078125,70.68719673156738]]],[[[-71.47166442871094,71.01277351379395],[-71.95556640625,70.81833076477051],[-72.22639465332031,70.93054389953613],[-71.47166442871094,71.01277351379395]]],[[[-96.56332397460938,71.29220771789551],[-96.47250366210938,71.23221015930176],[-96.4808349609375,71.2088794708252],[-96.63861083984375,71.2260913848877],[-96.56332397460938,71.29220771789551]]],[[[-98.89555358886719,71.27777290344238],[-99.00889587402344,71.31387519836426],[-98.95584106445312,71.35220527648926],[-98.89555358886719,71.27777290344238]]],[[[-73.12054443359375,71.47970771789551],[-73.37998962402344,71.51971626281738],[-72.8175048828125,71.44497871398926],[-73.12054443359375,71.47970771789551]]],[[[-72.76083374023438,71.53193855285645],[-73.03999328613281,71.57998847961426],[-72.69583129882812,71.65109443664551],[-72.76083374023438,71.53193855285645]]],[[[-73.37026977539062,71.55443000793457],[-73.44804382324219,71.59414863586426],[-73.14889526367188,71.67997932434082],[-73.37026977539062,71.55443000793457]]],[[[-96.95889282226562,71.70443916320801],[-97.05027770996094,71.70416450500488],[-96.84445190429688,71.74414253234863],[-96.95889282226562,71.70443916320801]]],[[[-95.33999633789062,71.73137092590332],[-95.48805236816406,71.74553108215332],[-95.26583862304688,71.83665657043457],[-95.33999633789062,71.73137092590332]]],[[[-134.49554443359375,68.7522144317627],[-134.33999633789062,68.67886543273926],[-134.2269287109375,68.69413948059082],[-134.26058959960938,68.7335376739502],[-134.56222534179688,69.08276557922363],[-130.54306030273438,70.16832160949707],[-129.40335083007812,70.11775398254395],[-130.92861938476562,69.56331062316895],[-131.05307006835938,69.63720893859863],[-131.99722290039062,69.53137397766113],[-133.49081420898438,68.82165718078613],[-132.47027587890625,68.80693244934082],[-132.86944580078125,69.0627613067627],[-131.6522216796875,69.47192573547363],[-131.32470703125,69.31999397277832],[-131.16650390625,69.40493202209473],[-131.2538604736328,69.57184791564941],[-131.11053466796875,69.48533058166504],[-131.13583374023438,69.35998725891113],[-131.06394958496094,69.51239204406738],[-131.19610595703125,69.5899829864502],[-131.08306884765625,69.60054206848145],[-131.02780151367188,69.4638843536377],[-131.10888671875,69.32165718078613],[-130.95278930664062,69.54332160949707],[-130.93722534179688,69.13443183898926],[-130.3660888671875,69.68637275695801],[-128.90084838867188,69.97192573547363],[-129.16946411132812,69.82470893859863],[-128.92501831054688,69.68081855773926],[-127.51500701904297,70.22165107727051],[-128.1966552734375,70.39193916320801],[-127.99665832519531,70.59054756164551],[-125.4263916015625,69.31218147277832],[-125.08944702148438,69.44970893859863],[-125.62249755859375,69.4185962677002],[-125.11805725097656,69.48579597473145],[-125.36554718017578,69.69026374816895],[-124.82195281982422,69.71499824523926],[-125.27639770507812,69.8082447052002],[-124.79527282714844,70.00888252258301],[-125.1974868774414,70.00450325012207],[-124.43611145019531,70.15109443664551],[-124.50055694580078,69.72581672668457],[-124.04083251953125,69.70138740539551],[-124.44666290283203,69.3672046661377],[-123.46611022949219,69.38388252258301],[-122.95916557312012,69.83360481262207],[-121.68388366699219,69.7935962677002],[-117.15387725830078,68.88554573059082],[-115.59306335449219,68.97165107727051],[-114.070556640625,68.47747993469238],[-114.02333068847656,68.24136543273926],[-115.5425033569336,67.9216480255127],[-115.10360717773438,67.7966480255127],[-112.39584350585938,67.67915534973145],[-111.00583457946777,67.76500129699707],[-110.08389282226562,68.00694465637207],[-109.06582641601562,67.71415901184082],[-108.82501220703125,67.34942817687988],[-108.6552734375,67.6283130645752],[-108.48416137695312,67.34942817687988],[-108.366943359375,67.44497871398926],[-108.01528930664062,67.29304695129395],[-107.88054656982422,67.04832649230957],[-108.62277221679688,67.14999580383301],[-107.248046875,66.3499927520752],[-107.74665832519531,66.92276191711426],[-107.0836181640625,66.82054328918457],[-108.0069580078125,67.70749092102051],[-107.65110778808594,67.94053840637207],[-107.89055633544922,68.08166694641113],[-106.43195343017578,68.15304756164551],[-106.46501159667969,68.33581733703613],[-105.7397232055664,68.41526985168457],[-105.6449966430664,68.63388252258301],[-106.54387664794922,68.51193428039551],[-106.54332733154297,68.29136848449707],[-106.80278015136719,68.41443061828613],[-107.8852767944336,68.26887702941895],[-107.60305786132812,68.16526985168457],[-108.81916809082031,68.26666450500488],[-108.31416320800781,68.61137580871582],[-106.22917175292969,68.9408130645752],[-105.4869384765625,68.72943305969238],[-105.38082885742188,68.48665046691895],[-105.54110717773438,68.41276741027832],[-104.60973358154297,68.24136543273926],[-104.67027282714844,68.13859748840332],[-104.5,68.03193855285645],[-103.42166137695312,68.16665840148926],[-102.25110626220703,67.72526741027832],[-98.35444641113281,67.79609870910645],[-98.61555480957031,68.07470893859863],[-98.09445190429688,67.76609992980957],[-97.50973510742188,67.59915351867676],[-97.11915588378906,67.79248237609863],[-97.68305969238281,68.01860237121582],[-98.02999877929688,67.94192695617676],[-98.07861328125,67.83027839660645],[-98.58750915527344,68.1494312286377],[-98.32611083984375,68.17137336730957],[-98.71444702148438,68.3722095489502],[-96.4041748046875,68.31137275695801],[-96.70834350585938,68.00860786437988],[-95.98028564453125,68.25471687316895],[-96.4647216796875,67.4780445098877],[-96.09722900390625,67.46470832824707],[-96.11444091796875,67.21331977844238],[-95.56582641601562,67.37664985656738],[-95.83332824707031,67.16276741027832],[-95.32611083984375,67.02720832824707],[-95.90249633789062,66.94664192199707],[-96.46055603027344,67.06219673156738],[-95.62971496582031,66.67553901672363],[-95.90249633789062,66.94664192199707],[-95.22084045410156,66.96832466125488],[-95.163330078125,67.28720283508301],[-95.70916557312012,67.72776985168457],[-95.4727783203125,68.06053352355957],[-94.72222900390625,68.05497932434082],[-93.55332946777344,68.58638191223145],[-93.66694641113281,68.97221565246582],[-94.625,68.76138496398926],[-94.07278442382812,69.12664985656738],[-94.30332946777344,69.30497932434082],[-93.36277770996094,69.37164497375488],[-95.96083068847656,69.77804756164551],[-96.53167724609375,70.13109016418457],[-96.23277282714844,70.56219673156738],[-95.78944396972656,70.53665351867676],[-96.6119384765625,70.79443550109863],[-96.3699951171875,71.0899829864502],[-96.560546875,71.12637519836426],[-96.46722412109375,71.16526985168457],[-96.46220397949219,71.25550270080566],[-96.50389099121094,71.27720832824707],[-95.5352783203125,71.29081916809082],[-95.94305419921875,71.55359077453613],[-94.60665893554688,71.86331367492676],[-95.21749877929688,71.94497871398926],[-93.711669921875,71.76138496398926],[-92.97389221191406,71.34082221984863],[-93.02749633789062,70.85276985168457],[-91.51362609863281,70.16720771789551],[-92.26834106445312,70.2088794708252],[-92.45028686523438,70.07110786437988],[-91.93971252441406,70.02026557922363],[-92.92027282714844,69.66971015930176],[-90.30776977539062,69.45027351379395],[-91.44721984863281,69.35276985168457],[-90.43638610839844,68.87442207336426],[-90.60665893554688,68.44609260559082],[-90.27139282226562,68.23887825012207],[-89.30665588378906,69.25139045715332],[-88.05221557617188,68.82304573059082],[-87.79222106933594,68.33442878723145],[-88.39222717285156,68.2874927520752],[-88.37083435058594,67.95915412902832],[-87.35777282714844,67.26220893859863],[-87.51028442382812,67.1121997833252],[-86.52362060546875,67.35220527648926],[-85.66361999511719,68.72693061828613],[-84.78721618652344,68.73359870910645],[-85.19444274902344,68.8672046661377],[-84.52833557128906,69.01748847961426],[-85.47332763671875,69.27192878723145],[-85.33195495605469,69.77916145324707],[-85.57194519042969,69.8560962677002],[-85.06443786621094,69.76999092102051],[-84.37582397460938,69.85748481750488],[-83.70500183105469,69.70359992980957],[-82.26333618164062,69.63804817199707],[-83.22805786132812,69.5385913848877],[-81.33250427246094,69.18248176574707],[-82.05722045898438,68.87387275695801],[-81.26750183105469,68.63304328918457],[-82.63890075683594,68.4972095489502],[-81.24305725097656,67.4749927520752],[-81.50306701660156,66.99971199035645],[-83.4022216796875,66.34749031066895],[-83.97749328613281,66.58221626281738],[-83.91639709472656,66.88109016418457],[-84.14028930664062,66.70193672180176],[-84.43638610839844,66.81833076477051],[-84.37083435058594,66.97137641906738],[-84.91500854492188,67.0608081817627],[-84.63972473144531,66.9780445098877],[-85.22833251953125,66.8783130645752],[-84.60221862792969,66.9358081817627],[-84.74638366699219,66.89749336242676],[-84.50584411621094,66.8277759552002],[-84.6905517578125,66.8399829864502],[-84.46694946289062,66.78776741027832],[-84.44248962402344,66.71081733703613],[-84.14445495605469,66.68136787414551],[-83.69305419921875,66.1908130645752],[-86.77528381347656,66.52609443664551],[-85.89723205566406,66.16832160949707],[-87.39584350585938,65.32138252258301],[-89.67166137695312,65.93942451477051],[-91.42916870117188,65.95109748840332],[-86.93331909179688,65.13804817199707],[-88.11332702636719,64.13611030578613],[-90.12416076660156,64.12858772277832],[-89.81361389160156,63.937211990356445],[-90.2791748046875,64.00360298156738],[-89.96417236328125,63.81193733215332],[-90.20527458190918,63.61221504211426],[-92.48277282714844,63.81193733215332],[-92.10166931152344,63.69693946838379],[-92.4808349609375,63.5272159576416],[-91.76333618164062,63.713327407836914],[-90.741943359375,63.36082649230957],[-90.62748718261719,63.05943489074707],[-92.42083740234375,62.83138465881348],[-91.885009765625,62.59916114807129],[-92.71000671386719,62.465829849243164],[-92.47001457214355,62.146615982055664],[-93.12222290039062,62.33499336242676],[-92.76472473144531,62.219438552856445],[-93.61610412597656,61.93998908996582],[-93.23777770996094,61.7772159576416],[-93.98472595214844,61.45610237121582],[-94.67332458496094,60.52249336242676],[-94.81916809082031,59.63638496398926],[-94.78971862792969,59.09221839904785],[-94.2288818359375,58.78499794006348],[-94.36332702636719,58.218881607055664],[-94.14389038085938,58.76361274719238],[-93.1522216796875,58.73777198791504],[-92.41888427734375,57.33749580383301],[-92.8760986328125,56.90749549865723],[-90.81527709960938,57.25583076477051],[-85.71444702148438,55.631662368774414],[-85.12193298339844,55.33777046203613],[-85.42388916015625,54.990549087524414],[-85.001953125,55.29666328430176],[-82.30776977539062,55.148881912231445],[-82.29666137695312,53.01860237121582],[-81.54998779296875,52.44110298156738],[-81.88362121582031,52.1874942779541],[-80.99444580078125,52.01138496398926],[-80.43638610839844,51.46415901184082],[-81.0150146484375,51.028329849243164],[-80.12026977539062,51.29638862609863],[-79.33222961425781,50.72387886047363],[-79.75222778320312,51.18443489074707],[-79.32223510742188,51.66276741027832],[-78.85333251953125,51.165544509887695],[-79.03555297851562,51.770273208618164],[-78.5069580078125,52.46055030822754],[-79.11027526855469,53.50249671936035],[-79.04888916015625,54.18332862854004],[-79.76445007324219,54.6522159576416],[-77.74861145019531,55.30082893371582],[-77.13722229003906,55.65416145324707],[-76.538330078125,56.29777717590332],[-76.52972412109375,57.1058292388916],[-76.8619384765625,57.71915626525879],[-78.57472229003906,58.635271072387695],[-78.570556640625,58.961381912231445],[-77.67721557617188,59.39999580383301],[-77.9102783203125,59.40555000305176],[-77.77389526367188,59.70971870422363],[-77.31388854980469,59.56499671936035],[-77.427490234375,59.91471290588379],[-76.75889587402344,60.15915870666504],[-77.59222412109375,60.064157485961914],[-77.74775695800781,60.40813636779785],[-77.413330078125,60.54416084289551],[-77.83389282226562,60.63943672180176],[-77.51167297363281,60.836381912231445],[-78.19276428222656,60.79083442687988],[-77.47471618652344,61.54166603088379],[-77.99249267578125,61.7147159576416],[-78.15583801269531,62.278329849243164],[-77.50834655761719,62.561662673950195],[-74.57167053222656,62.10305213928223],[-74.75973510742188,62.20638465881348],[-73.67887878417969,62.479990005493164],[-72.01005554199219,61.67527198791504],[-72.30332946777344,61.567216873168945],[-71.57501220703125,61.60860633850098],[-71.88751220703125,61.428049087524414],[-71.38999938964844,61.137773513793945],[-70.1461181640625,61.08471870422363],[-69.927490234375,60.80777168273926],[-69.51972961425781,61.07332801818848],[-69.37193298339844,60.8044376373291],[-69.82611083984375,60.52555274963379],[-69.62471008300781,60.0674991607666],[-70.94583129882812,60.06305122375488],[-69.60055541992188,59.83305549621582],[-69.75834655761719,59.32027626037598],[-69.23472595214844,59.2338809967041],[-69.53056335449219,59.18221473693848],[-69.54750061035156,58.80804634094238],[-69.86915588378906,59.053049087524414],[-69.81582641601562,58.82388496398926],[-70.15361022949219,58.77749061584473],[-69.81889343261719,58.58860206604004],[-69.2791748046875,58.88804817199707],[-68.36054992675781,58.781938552856445],[-68.34416198730469,58.12748908996582],[-69.36904907226562,57.7652530670166],[-68.4041748046875,58.03972053527832],[-68.00334167480469,58.57638740539551],[-67.89389038085938,58.496660232543945],[-67.85749816894531,58.32027626037598],[-68.12832641601562,58.07361030578613],[-67.8013916015625,58.29666328430176],[-67.81332397460938,58.41610145568848],[-67.72389221191406,58.45888710021973],[-67.71389770507812,57.923051834106445],[-66.38861083984375,58.85054969787598],[-65.93582153320312,58.60972023010254],[-66.05888366699219,58.32027626037598],[-65.87998962402344,58.627214431762695],[-66.1038818359375,58.77360725402832],[-65.78944396972656,58.86194038391113],[-65.98860168457031,58.90360450744629],[-65.3175048828125,59.04138374328613],[-65.71806335449219,59.15304756164551],[-65.35722351074219,59.2772159576416],[-65.56138610839844,59.48610877990723],[-64.98332214355469,59.37638282775879],[-65.52778625488281,59.716936111450195],[-64.98388671875,59.762773513793945],[-65.23194885253906,59.88582801818848],[-64.85444641113281,60.36110877990723],[-64.4669189453125,60.27860450744629],[-64.82749938964844,59.98638343811035],[-64.16694641113281,60.02499580383301],[-64.26666259765625,59.77916145324707],[-64.05776977539062,59.62526893615723],[-64.116943359375,59.51749610900879],[-63.722496032714844,59.51388740539551],[-64.06221008300781,59.38249397277832],[-63.35639190673828,59.20499610900879],[-64.04388427734375,59.015275955200195],[-63.13417053222656,59.05832862854004],[-63.32500457763672,58.8558292388916],[-62.847496032714844,58.6905460357666],[-63.589439392089844,58.30082893371582],[-62.55750274658203,58.482492446899414],[-62.82805633544922,58.25222206115723],[-62.584442138671875,58.21444129943848],[-63.34083557128906,57.979990005493164],[-62.452781677246094,58.17527198791504],[-62.30694580078125,58.03110694885254],[-62.67277526855469,57.92999458312988],[-62.12749481201172,57.96805000305176],[-62.059722900390625,57.897775650024414],[-62.13805389404297,57.835824966430664],[-62.125274658203125,57.80694007873535],[-61.88444519042969,57.62693977355957],[-62.54528045654297,57.501108169555664],[-61.35833740234375,57.08749580383301],[-61.90638732910156,56.79527473449707],[-61.67250061035156,56.6199893951416],[-62.573890686035156,56.79277229309082],[-61.65833282470703,56.53750038146973],[-62.14305877685547,56.44915962219238],[-61.66138458251953,56.270273208618164],[-62.01167297363281,56.23582649230957],[-61.35083770751953,56.22221565246582],[-61.45222473144531,56.05694007873535],[-61.23750305175781,56.04277229309082],[-61.50361633300781,56.00694465637207],[-61.117774963378906,55.96610450744629],[-61.07666778564453,55.906938552856445],[-61.20166778564453,55.884164810180664],[-61.10444641113281,55.84554481506348],[-60.72972106933594,55.82943916320801],[-60.87944030761719,55.73276710510254],[-60.60194396972656,55.814714431762695],[-60.668060302734375,55.589433670043945],[-60.328887939453125,55.78166389465332],[-60.47833251953125,55.347490310668945],[-60.19554901123047,55.43138313293457],[-60.683326721191406,54.99499702453613],[-59.77916717529297,55.329721450805664],[-59.96361541748047,55.11027717590332],[-59.42778015136719,55.13582801818848],[-59.93860626220703,54.74638557434082],[-59.16138458251953,55.23694038391113],[-59.38861083984375,54.97665596008301],[-59.02361297607422,55.15665626525879],[-58.90416717529297,54.84471321105957],[-57.347496032714844,54.57943916320801],[-59.5755615234375,54.04944038391113],[-58.37194061279297,54.228044509887695],[-60.133888244628906,53.528329849243164],[-60.85694885253906,53.79277229309082],[-60.103614807128906,53.50055122375488],[-60.4183349609375,53.26944160461426],[-57.78639221191406,54.071664810180664],[-58.4183349609375,54.139719009399414],[-58.17778015136719,54.23694038391113],[-57.38417053222656,54.15054512023926],[-57.076393127441406,53.82305335998535],[-57.54999542236328,53.591936111450195],[-57.336944580078125,53.44027137756348],[-56.464691162109375,53.78227424621582],[-56.68028259277344,53.67276954650879],[-55.80805206298828,53.34054756164551],[-56.16694641113281,53.029436111450195],[-55.75750732421875,52.61444282531738],[-56.49687194824219,52.59414863586426],[-55.64861297607422,52.439714431762695],[-56.19694519042969,52.43998908996582],[-55.70166778564453,52.08221626281738],[-56.94972229003906,51.42471504211426],[-58.6280517578125,51.27555274963379],[-60.0050048828125,50.24888038635254],[-66.4697265625,50.26194190979004],[-67.375,49.327219009399414],[-69.06082153320312,48.76749610900879],[-71.29916381835938,46.74221992492676],[-68.21112060546875,48.63665962219238],[-66.30610656738281,49.18693733215332],[-64.9969482421875,49.22027015686035],[-64.22166442871094,48.898332595825195],[-64.54888916015625,48.87832832336426],[-64.24638366699219,48.488046646118164],[-65.30583190917969,48.00555610656738],[-65.9041748046875,48.205827713012695],[-66.84249877929688,47.99221992492676],[-66.35665893554688,48.07332801818848],[-65.63473510742188,47.62082862854004],[-64.79722595214844,47.80638313293457],[-65.3699951171875,47.08665657043457],[-64.79861450195312,47.07999610900879],[-64.50418090820312,46.24027442932129],[-62.461944580078125,45.612497329711914],[-61.917503356933594,45.88555335998535],[-61.26000213623047,45.51027870178223],[-61.463890075683594,45.346940994262695],[-60.9647216796875,45.31305122375488],[-63.65833282470703,44.71499824523926],[-63.63111114501953,44.43582344055176],[-64.20083618164062,44.57638740539551],[-65.48138427734375,43.46444129943848],[-66.16694641113281,43.85860633850098],[-65.84445190429688,44.57833290100098],[-66.19110107421875,44.42332649230957],[-64.48916625976562,45.33526802062988],[-64.15638732910156,44.97832679748535],[-63.36083221435547,45.36082649230957],[-64.93721008300781,45.32694435119629],[-64.27555847167969,45.799997329711914],[-64.74749755859375,46.09054756164551],[-64.77833557128906,45.60721778869629],[-65.90361022949219,45.20555305480957],[-66.00250244140625,45.4616641998291],[-66.42778015136719,45.08499336242676],[-67.20654296875,45.18303871154785],[-67.79916381835938,45.70110511779785],[-67.79499816894531,47.06999397277832],[-69.23249816894531,47.47137641906738],[-70.87860107421875,45.238603591918945],[-74.99082946777344,44.98665809631348],[-76.80194091796875,43.63360786437988],[-78.72471618652344,43.62943458557129],[-79.18472290039062,43.46554756164551],[-78.9869384765625,42.81999397277832],[-82.6966552734375,41.68387794494629],[-83.16860961914062,42.04610633850098],[-82.52139282226562,42.61888313293457],[-82.13027954101562,43.58526802062988],[-82.54306030273438,45.3558292388916],[-83.5977783203125,45.827219009399414],[-83.57749938964844,46.10527229309082],[-83.95889282226562,46.071664810180664],[-84.12638854980469,46.531938552856445],[-84.56500244140625,46.466386795043945],[-84.85694885253906,46.9022159576416],[-88.36805725097656,48.312211990356445],[-89.35665893554688,47.97971534729004],[-90.86860656738281,48.237497329711914],[-91.4183349609375,48.04110908508301],[-92.95306396484375,48.62332344055176],[-94.6058349609375,48.724435806274414],[-95.07806396484375,49.35916328430176],[-95.1541748046875,48.99943733215332],[-122.76029968261719,48.99943733215332],[-123.03431701660156,48.99943733215332],[-123.09375,48.99943733215332],[-123.24889373779297,49.27360725402832],[-122.852783203125,49.436105728149414],[-123.23638916015625,49.338884353637695],[-123.15972900390625,49.69915962219238],[-123.49249267578125,49.509721755981445],[-123.53555297851562,49.38138008117676],[-124.06806945800781,49.63388252258301],[-123.53362274169922,49.689714431762695],[-123.93499755859375,49.768327713012695],[-123.82140350341797,50.1522159576416],[-123.9263916015625,49.82583045959473],[-124.41361999511719,49.76361274719238],[-124.82972717285156,50.06193733215332],[-124.70333862304688,49.99554634094238],[-124.60138702392578,50.2388858795166],[-124.71501159667969,50.32749366760254],[-124.3477783203125,50.50249671936035],[-125.07833862304688,50.32249641418457],[-124.80583190917969,50.92083168029785],[-125.11945343017578,50.43277168273926],[-125.54811096191406,50.49205207824707],[-125.443603515625,50.71415901184082],[-125.70584106445312,50.42777442932129],[-126.27471923828125,50.631662368774414],[-125.62249755859375,50.75000190734863],[-125.63390350341797,51.096940994262695],[-125.73110961914062,50.735551834106445],[-126.1310043334961,50.678659439086914],[-126.19888305664062,50.8558292388916],[-126.55972290039062,50.843881607055664],[-126.17778015136719,50.95138740539551],[-127.538330078125,51.00555610656738],[-126.66251373291016,51.19499397277832],[-127.78999328613281,51.165544509887695],[-127.133056640625,51.3255558013916],[-127.77887725830078,51.324716567993164],[-127.48805236816406,51.61944007873535],[-126.62000274658203,51.67999458312988],[-127.43222045898438,51.6683292388916],[-127.3510971069336,51.86361122131348],[-127.70639038085938,51.45638465881348],[-127.8780517578125,51.67388343811035],[-127.17166137695312,52.3124942779541],[-126.66944885253906,51.98360633850098],[-126.94082641601562,52.30388069152832],[-126.73249816894531,52.37388038635254],[-127.18639373779297,52.38082313537598],[-127.01777458190918,52.84554481506348],[-127.61833190917969,52.291940689086914],[-128.01251220703125,52.34110450744629],[-127.87970733642578,52.579721450805664],[-128.39389038085938,52.29138374328613],[-128.221923828125,52.46527290344238],[-128.13165283203125,52.87638282775879],[-128.44110107421875,52.822771072387695],[-128.53973388671875,53.13193702697754],[-128.85888671875,53.28360939025879],[-128.8879852294922,53.42496681213379],[-128.9727783203125,53.553049087524414],[-127.86776733398438,53.23971748352051],[-128.81304931640625,53.619157791137695],[-128.47137451171875,53.83249855041504],[-128.60055541992188,54.03166389465332],[-129.23248291015625,53.62582588195801],[-129.27279663085938,53.379159927368164],[-130.05029296875,53.88694190979004],[-130.04666137695312,54.15332221984863],[-129.47000122070312,54.23721504211426],[-130.48110961914062,54.36471748352051],[-130.416654586792,54.63027381896973],[-129.95916557312012,54.31610298156738],[-130.3741455078125,54.65499305725098],[-129.9102783203125,54.60555458068848],[-130.17388916015625,54.84665870666504],[-129.62249755859375,54.99777412414551],[-129.99636840820312,55.0241641998291],[-129.47164916992188,55.46721076965332],[-129.78695678710938,55.566667556762695],[-129.8175048828125,55.283334732055664],[-130.11361694335938,54.99638557434082],[-129.94387817382812,55.28221321105957],[-130.12887573242188,55.72221565246582],[-130.01507568359375,55.90918159484863],[-131.82415771484375,56.596940994262695],[-133.42999267578125,58.45916175842285],[-135.47360229492188,59.80193519592285],[-137.47805786132812,58.90721321105957],[-137.5908203125,59.238603591918945],[-139.18890380859375,60.088884353637695],[-139.06805419921875,60.35222053527832],[-140.99554443359375,60.30721473693848],[-141.00299072265625,69.64236640930176],[-139.14306640625,69.51082038879395],[-138.60498046875,69.24748420715332],[-135.40695190429688,68.67997932434082],[-135.14639282226562,68.66388130187988],[-135.50613403320312,68.83249092102051],[-135.33804321289062,68.83499336242676],[-135.62359619140625,68.88611030578613],[-135.24166870117188,68.92692756652832],[-135.18695068359375,68.90027046203613],[-134.97747802734375,68.8783130645752],[-134.84555053710938,68.92943000793457],[-134.49554443359375,68.7522144317627]],[[-89.00556945800781,65.38554573059082],[-89.03195190429688,65.40721321105957],[-89.09999084472656,65.40582466125488],[-89.00556945800781,65.38554573059082]],[[-93.51972961425781,63.839433670043945],[-92.50750732421875,63.81638526916504],[-93.77972412109375,64.18969917297363],[-93.51972961425781,63.839433670043945]],[[-70.78306579589844,48.38054847717285],[-69.82833862304688,48.16638374328613],[-71.04861450195312,48.445268630981445],[-70.78306579589844,48.38054847717285]],[[-71.11111450195312,46.85054969787598],[-70.9041748046875,46.91360664367676],[-70.80915832519531,47.015275955200195],[-71.11111450195312,46.85054969787598]],[[-77.67832946777344,58.235551834106445],[-77.8074951171875,58.30526924133301],[-77.95083618164062,58.324167251586914],[-77.67832946777344,58.235551834106445]],[[-91.32917785644531,63.55971717834473],[-91.54055786132812,63.60666084289551],[-91.43638610839844,63.55193519592285],[-91.32917785644531,63.55971717834473]],[[-84.80804443359375,68.76388740539551],[-84.8558349609375,68.8108081817627],[-84.93916320800781,68.7935962677002],[-84.80804443359375,68.76388740539551]]],[[[-108.13890075683594,71.98166084289551],[-108.19972229003906,72.05053901672363],[-108.06416320800781,72.03027534484863],[-108.13890075683594,71.98166084289551]]],[[[-85.84722900390625,72.29414558410645],[-85.88917541503906,72.21805000305176],[-86.11000061035156,72.28970527648926],[-85.84722900390625,72.29414558410645]]],[[[-78.73500061035156,72.36554145812988],[-78.95028686523438,72.33499336242676],[-79.07501220703125,72.40971565246582],[-78.73500061035156,72.36554145812988]]],[[[-79.508056640625,72.34860420227051],[-79.68331909179688,72.43054389953613],[-79.42971801757812,72.41165351867676],[-79.508056640625,72.34860420227051]]],[[[-79.99360656738281,72.41331672668457],[-80.13333129882812,72.51944160461426],[-79.91639709472656,72.45804023742676],[-79.99360656738281,72.41331672668457]]],[[[-110.46916198730469,72.56915473937988],[-110.54415893554688,72.56915473937988],[-110.59388732910156,72.59414863586426],[-110.46916198730469,72.56915473937988]]],[[[-110.35582733154297,72.60193061828613],[-110.49472045898438,72.61914253234863],[-110.34500122070312,72.61192512512207],[-110.35582733154297,72.60193061828613]]],[[[-108.51055908203125,72.60276985168457],[-108.61361694335938,72.63665962219238],[-108.49665832519531,72.6413745880127],[-108.51055908203125,72.60276985168457]]],[[[-110.30722045898438,72.63081550598145],[-110.41082763671875,72.63943672180176],[-110.28083801269531,72.64221382141113],[-110.30722045898438,72.63081550598145]]],[[[-95.73500061035156,72.79887580871582],[-95.85417175292969,72.85359382629395],[-95.7691650390625,72.87803840637207],[-95.73500061035156,72.79887580871582]]],[[[-96.75418090820312,72.72137641906738],[-97.01112365722656,72.77581977844238],[-96.71333312988281,72.8933277130127],[-96.75418090820312,72.72137641906738]]],[[[-95.7569580078125,72.89248847961426],[-95.78666687011719,73.01249885559082],[-95.70249938964844,72.93359565734863],[-95.7569580078125,72.89248847961426]]],[[[-96.80833435058594,72.92637825012207],[-97.14111328125,73.08554267883301],[-96.57501220703125,73.07499885559082],[-96.80833435058594,72.92637825012207]]],[[[-95.73388671875,73.12886238098145],[-95.74554443359375,73.04942512512207],[-95.89334106445312,73.09582710266113],[-95.73388671875,73.12886238098145]]],[[[-96.90583801269531,73.22082710266113],[-97.11776733398438,73.24914741516113],[-96.9677734375,73.27331733703613],[-96.90583801269531,73.22082710266113]]],[[[-113.99749755859375,72.79942512512207],[-114.60472106933594,72.60165596008301],[-113.65750122070312,72.61137580871582],[-113.02806091308594,73.00943183898926],[-111.22000122070312,72.71832466125488],[-111.90556335449219,72.34971809387207],[-111.66388702392578,72.2763843536377],[-110.70140075683594,72.57554817199707],[-109.78278350830078,72.42943000793457],[-110.29110717773438,72.67109870910645],[-109.77027893066406,72.72221565246582],[-110.75666809082031,72.97137641906738],[-109.65943908691406,72.92498970031738],[-109.75473022460938,72.87858772277832],[-109.227783203125,72.76165962219238],[-109.04332733154297,72.56749153137207],[-108.62138366699219,72.54998970031738],[-108.24276733398438,71.71859931945801],[-107.82888793945312,71.60443305969238],[-107.25250244140625,71.89554023742676],[-107.77887725830078,72.13665962219238],[-108.29194641113281,73.15359687805176],[-106.76139831542969,73.29304695129395],[-105.32611083984375,72.74637031555176],[-104.35527038574219,71.57443428039551],[-104.58583068847656,71.0666675567627],[-103.55638122558594,70.60081672668457],[-100.9997329711914,70.17276191711426],[-100.87000274658203,69.78831672668457],[-103.47693634033203,69.69359016418457],[-103.02333068847656,69.49386787414551],[-103.19499206542969,69.11442756652832],[-102.31304931640625,69.49832344055176],[-101.75473022460938,69.17581367492676],[-102.89472961425781,68.79998970031738],[-105.14472961425781,68.89915657043457],[-104.91500854492188,69.07054328918457],[-106.40611267089844,69.18054389953613],[-106.60221862792969,69.49887275695801],[-107.34221458435059,69.01887702941895],[-109.10472106933594,68.71054267883301],[-113.26944732666016,68.4538745880127],[-113.03388977050781,68.49498176574707],[-113.67694091796875,68.81109809875488],[-113.5211181640625,69.17859077453613],[-116.52583312988281,69.4074878692627],[-117.43611145019531,69.99304389953613],[-115.1675033569336,70.27777290344238],[-112.56471252441406,70.19832038879395],[-111.48721313476562,70.3369312286377],[-113.93831634521484,70.71527290344238],[-117.55943298339844,70.59721565246582],[-118.41944885253906,70.99193000793457],[-115.05750274658203,71.52304267883301],[-118.11221313476562,71.37359809875488],[-118.30943298339844,71.46582221984863],[-117.69638061523438,71.66609382629395],[-119.13445281982422,71.7652759552002],[-118.10804557800293,72.23776435852051],[-118.53694152832031,72.49386787414551],[-117.35360717773438,72.91638374328613],[-114.56166076660156,73.37553596496582],[-113.961669921875,73.15304756164551],[-113.99749755859375,72.79942512512207]]],[[[-107.89555358886719,73.54136848449707],[-108.08332824707031,73.59721565246582],[-107.5824966430664,73.59776496887207],[-107.89555358886719,73.54136848449707]]],[[[-95.66972351074219,73.60498237609863],[-95.711669921875,73.6121997833252],[-95.65556335449219,73.61665534973145],[-95.66972351074219,73.60498237609863]]],[[[-124.30750274658203,73.55636787414551],[-124.35861206054688,73.6302661895752],[-124.1138916015625,73.56414985656738],[-124.30750274658203,73.55636787414551]]],[[[-124.58473205566406,73.67915534973145],[-124.73361206054688,73.70054817199707],[-124.56443786621094,73.68719673156738],[-124.58473205566406,73.67915534973145]]],[[[-105.08944702148438,73.73526191711426],[-104.48306274414062,73.53442573547363],[-105.27555847167969,72.84553718566895],[-107.03555297851562,73.48082160949707],[-105.08944702148438,73.73526191711426]]],[[[-80.14222717285156,73.69664192199707],[-77.4244384765625,73.5547046661377],[-76.05943298339844,72.90081977844238],[-79.42916870117188,72.73581123352051],[-80.8760986328125,73.3277759552002],[-80.85777282714844,73.74193000793457],[-80.14222717285156,73.69664192199707]]],[[[-73.35467529296875,68.3292179107666],[-73.211669921875,68.37692451477051],[-73.31806945800781,68.39305305480957],[-73.35467529296875,68.3292179107666],[-73.85166931152344,68.34221076965332],[-73.76139831542969,68.68637275695801],[-74.09416198730469,68.7199878692627],[-73.99028015136719,68.49275398254395],[-74.91777038574219,68.80137825012207],[-74.82084655761719,69.08221626281738],[-76.66082763671875,68.69941902160645],[-76.62554931640625,69.0183277130127],[-75.5916748046875,69.22165107727051],[-76.64111328125,69.55415534973145],[-76.18777465820312,69.66526985168457],[-77.2005615234375,69.64610481262207],[-76.79388427734375,69.71859931945801],[-77.310546875,69.83581733703613],[-76.98056030273438,69.93803596496582],[-77.62638854980469,69.74498176574707],[-77.67832946777344,70.1877613067627],[-78.40167236328125,70.21249580383301],[-79.070556640625,70.46971321105957],[-78.71888732910156,70.54776191711426],[-79.00944519042969,70.6797046661377],[-79.58889770507812,70.3994312286377],[-78.92166137695312,70.30081367492676],[-78.79194641113281,69.89109992980957],[-81.76333618164062,70.12303352355957],[-80.95249938964844,69.7138843536377],[-82.10110473632812,70.10803413391113],[-83.0069580078125,70.3047046661377],[-81.71083068847656,69.93414497375488],[-82.14334106445312,69.78137397766113],[-83.06666564941406,70.01082038879395],[-85.66639709472656,70.10470771789551],[-85.8780517578125,70.07693672180176],[-85.23611450195312,69.9891529083252],[-85.82333374023438,70.00027656555176],[-86.55194091796875,70.23498725891113],[-86.37471008300781,70.52527046203613],[-87.92304992675781,70.24275398254395],[-89.54972839355469,71.08859443664551],[-87.00279235839844,70.99414253234863],[-89.83000183105469,71.3288745880127],[-90.04861450195312,71.9538745880127],[-89.57472229003906,72.16360664367676],[-89.9566650390625,72.32165718078613],[-89.22833251953125,73.12581062316895],[-88.40916442871094,73.52360725402832],[-85.0694580078125,73.80192756652832],[-84.83778381347656,73.74165534973145],[-86.73277282714844,72.71609687805176],[-86.24082946777344,72.42025947570801],[-86.42054557800293,72.01277351379395],[-84.83389282226562,71.27415657043457],[-86.82000732421875,70.98858833312988],[-84.961669921875,71.18858528137207],[-85.14695739746094,71.08276557922363],[-84.79888916015625,70.9216480255127],[-84.625,71.66581916809082],[-86.05082702636719,72.01111030578613],[-85.48721313476562,72.2602710723877],[-84.16471862792969,72.02110481262207],[-84.93527221679688,72.28943061828613],[-84.44221496582031,72.38304328918457],[-85.5352783203125,72.46971321105957],[-85.68804931640625,72.89360237121582],[-83.95306396484375,72.75248908996582],[-85.44776916503906,73.1202564239502],[-83.63444519042969,72.98248481750488],[-85.1885986328125,73.22886848449707],[-81.55387878417969,73.71721076965332],[-80.24749755859375,72.73054695129395],[-81.37944030761719,72.24165534973145],[-80.51640319824219,72.50387763977051],[-80.90556335449219,72.18054389953613],[-80.56723022460938,72.0727710723877],[-81.08029174804688,72.0516529083252],[-80.79277038574219,72.02777290344238],[-80.97166442871094,71.88165473937988],[-80.385009765625,72.04832649230957],[-80.48666381835938,72.18942451477051],[-80.26083374023438,72.29498481750488],[-79.6744384765625,72.12664985656738],[-80.16639709472656,72.32222175598145],[-79.79916381835938,72.50139045715332],[-79.75,72.21554756164551],[-79.01278686523438,72.27388191223145],[-79.20306396484375,71.9619312286377],[-78.50361633300781,71.86886787414551],[-78.85444641113281,72.17303657531738],[-77.78555297851562,71.7874927520752],[-78.87083435058594,72.22665596008301],[-76.99583435058594,72.12886238098145],[-78.55915832519531,72.43803596496582],[-77.6138916015625,72.75166511535645],[-75.19248962402344,72.49193000793457],[-74.94749450683594,72.24971199035645],[-76.34805297851562,71.89166450500488],[-75.21945190429688,72.07443428039551],[-76.08528137207031,71.69192695617676],[-75.03582763671875,72.12581062316895],[-74.12222290039062,71.98359870910645],[-75.38999938964844,71.68109321594238],[-74.63194274902344,71.6624927520752],[-75.15194702148438,71.47165107727051],[-74.69943237304688,71.39082527160645],[-75.08139038085938,71.17943000793457],[-73.748046875,71.77693367004395],[-74.24082946777344,71.2008228302002],[-73.62193298339844,71.58333015441895],[-73.38027954101562,71.3852710723877],[-73.89834594726562,71.05748176574707],[-73.0494384765625,71.2683277130127],[-73.37748718261719,70.98054695129395],[-72.53805541992188,71.66081428527832],[-71.11972045898438,71.26416206359863],[-72.65361022949219,70.8277759552002],[-72.16361999511719,70.83638191223145],[-72.5694580078125,70.60998725891113],[-70.60166931152344,71.05386543273926],[-70.7469482421875,70.74553108215332],[-71.80305480957031,70.42831611633301],[-71.16250610351562,70.52527046203613],[-71.53582763671875,70.01971626281738],[-70.99722290039062,70.62581062316895],[-69.90472412109375,70.8813648223877],[-70.49610900878906,70.47943305969238],[-69.45140075683594,70.79193305969238],[-68.31388854980469,70.56303596496582],[-70.46861267089844,69.84276008605957],[-68.64250183105469,70.1494312286377],[-69.99055480957031,69.61499214172363],[-67.79472351074219,70.25888252258301],[-67.12777709960938,69.72693061828613],[-67.99610900878906,69.7744312286377],[-68.32945251464844,69.62776374816895],[-70.03083801269531,69.53610420227051],[-66.79554557800293,69.34109687805176],[-66.75862121582031,69.12803840637207],[-69.0150146484375,69.35498237609863],[-69.25778198242188,69.27026557922363],[-68.07749938964844,69.21748542785645],[-68.9677734375,69.22110176086426],[-68.50250244140625,69.19859504699707],[-69.02583312988281,68.96859931945801],[-68.17832946777344,69.14665412902832],[-67.70584106445312,69.01638984680176],[-68.55610656738281,68.96415901184082],[-67.77139282226562,68.78137397766113],[-69.39805603027344,68.8621997833252],[-67.61250305175781,68.37942695617676],[-66.70695495605469,68.44470405578613],[-67.87832641601562,68.2652759552002],[-67.23249816894531,68.35748481750488],[-67.01167297363281,68.31608772277832],[-67.59834289550781,68.16276741027832],[-67.01139831542969,68.29498481750488],[-66.76583862304688,68.23858833312988],[-66.9466552734375,68.01361274719238],[-66.69444274902344,68.14305305480957],[-66.69721984863281,67.98748970031738],[-66.54194641113281,68.1483325958252],[-66.18415832519531,68.01887702941895],[-66.73222351074219,67.8672046661377],[-66.35665893554688,67.82138252258301],[-65.91194152832031,68.15887641906738],[-66.00862121582031,67.62553596496582],[-65.80776977539062,67.97110176086426],[-65.443603515625,67.9922046661377],[-65.61582946777344,67.78610420227051],[-65.34638977050781,67.59332466125488],[-65.42361450195312,67.89804267883301],[-64.72361755371094,67.99054145812988],[-65.20417785644531,67.6483325958252],[-64.5069580078125,67.80720710754395],[-64.03860473632812,67.52859687805176],[-64.4405517578125,67.4749927520752],[-63.90416717529297,67.30581855773926],[-64.79750061035156,67.35664558410645],[-63.96277618408203,67.27249336242676],[-64.69194030761719,67.00055122375488],[-63.45055389404297,67.22249031066895],[-63.772499084472656,66.9588794708252],[-63.11028289794922,67.32998847961426],[-63.24083709716797,66.96165657043457],[-63.771385192871094,66.81109809875488],[-62.846946716308594,66.9619312286377],[-62.89972686767578,66.63665962219238],[-62.10139465332031,67.0547046661377],[-61.26250457763672,66.62942695617676],[-62.12388610839844,66.62637519836426],[-61.462501525878906,66.36914253234863],[-61.87749481201172,66.28332710266113],[-62.89500427246094,66.32971382141113],[-61.954444885253906,66.01915168762207],[-62.970550537109375,66.14804267883301],[-62.317222595214844,65.80803108215332],[-63.723609924316406,65.68026924133301],[-63.31999969482422,65.59332466125488],[-63.655555725097656,65.47082710266113],[-63.33555603027344,65.30053901672363],[-63.54695129394531,64.88720893859863],[-64.38082885742188,65.18109321594238],[-64.23721313476562,65.42997932434082],[-64.55555725097656,65.09221076965332],[-64.91221618652344,65.33804512023926],[-64.4183349609375,65.48275947570801],[-65.14999389648438,65.43414497375488],[-64.71000671386719,65.65220832824707],[-65.33860778808594,65.57554817199707],[-64.79499816894531,65.7280445098877],[-65.50556945800781,65.74331855773926],[-64.35638427734375,66.34971809387207],[-65.91610717773438,65.95109748840332],[-65.47361755371094,66.38582038879395],[-66.07362365722656,66.12053108215332],[-67.04888916015625,66.64471626281738],[-67.74276733398438,66.56833076477051],[-67.14862060546875,66.4438648223877],[-67.2822265625,66.27527046203613],[-67.99276733398438,66.50694465637207],[-67.19444274902344,65.90971565246582],[-67.82417297363281,65.88081550598145],[-67.9385986328125,65.90803718566895],[-68.03056335449219,65.99803352355957],[-68.02583312988281,66.0658130645752],[-68.24472045898438,66.1827564239502],[-68.85139465332031,66.18997383117676],[-68.41471862792969,66.15942573547363],[-68.23777770996094,66.06999397277832],[-68.2469482421875,66.11276435852051],[-68.15750122070312,66.11747932434082],[-68.04722595214844,66.06498908996582],[-68.05360412597656,65.99109077453613],[-68.12388610839844,65.96304512023926],[-68.304443359375,66.02804756164551],[-68.3336181640625,65.93193244934082],[-67.82112121582031,65.76805305480957],[-68.02583312988281,65.4810962677002],[-67.28056335449219,65.64248847961426],[-67.45889282226562,65.49803352355957],[-67.05833435058594,65.4266529083252],[-67.41610717773438,65.33915901184082],[-66.92887878417969,65.22970771789551],[-67.09611511230469,65.05609321594238],[-66.72610473632812,65.18026924133301],[-66.69804382324219,64.76193428039551],[-66.68865966796875,65.03877449035645],[-66.21221923828125,64.68553352355957],[-65.7177734375,64.84027290344238],[-65.72166442871094,64.49414253234863],[-65.07167053222656,64.4408130645752],[-65.65834045410156,64.30276679992676],[-65.0494384765625,64.07222175598145],[-65.21417236328125,64.02554512023926],[-64.66111755371094,64.02859687805176],[-64.98750305175781,63.82305335998535],[-64.52250671386719,63.67276954650879],[-64.53111267089844,63.24971961975098],[-65.30387878417969,63.80694007873535],[-64.62721252441406,62.90416145324707],[-65.25473022460938,62.98526954650879],[-64.94888305664062,62.64860725402832],[-65.1875,62.562211990356445],[-65.83833312988281,63.033334732055664],[-66.44444274902344,63.02054786682129],[-66.64277458190918,63.37249183654785],[-66.54666137695312,62.99138069152832],[-67.91471862792969,63.75943946838379],[-67.68527221679688,63.36888313293457],[-68.54277038574219,63.732492446899414],[-68.9969482421875,63.753610610961914],[-68.1461181640625,63.15027046203613],[-67.59999084472656,63.08443641662598],[-67.76972961425781,62.958330154418945],[-67.55305480957031,63.04860877990723],[-67.67277526855469,62.92332649230957],[-67.39805603027344,62.96721076965332],[-66.35166931152344,62.44499397277832],[-66.47000122070312,62.33221626281738],[-65.99305725097656,62.244157791137695],[-66.13249206542969,62.089433670043945],[-65.9466552734375,61.8991641998291],[-66.06610107421875,61.868600845336914],[-71.15666198730469,62.98916053771973],[-70.90888977050781,63.17083168029785],[-71.40055847167969,63.05166053771973],[-72.14555358886719,63.44610023498535],[-71.22972106933594,63.60471534729004],[-71.57695007324219,63.58166694641113],[-71.58111572265625,63.71499824523926],[-71.90444946289062,63.80999183654785],[-71.93388366699219,63.64943885803223],[-72.32417297363281,63.67666053771973],[-72.2388916015625,63.95249366760254],[-72.52639770507812,63.78777503967285],[-72.66471862792969,64.08055305480957],[-72.72000122070312,63.96110725402832],[-72.91166687011719,64.16887092590332],[-73.38055419921875,64.26860237121582],[-73.30278015136719,64.65887641906738],[-73.46333312988281,64.50248908996582],[-73.46722412109375,64.61276435852051],[-73.929443359375,64.60220527648926],[-73.8447265625,64.50193977355957],[-74.06277465820312,64.33442878723145],[-74.05387878417969,64.72859382629395],[-74.39028930664062,64.5697193145752],[-74.63999938964844,64.90359687805176],[-74.98527526855469,64.79582405090332],[-74.47000122070312,64.55748176574707],[-74.68582153320312,64.37109565734863],[-75.82417297363281,64.61165046691895],[-75.72694396972656,64.3672046661377],[-76.67054557800293,64.18414497375488],[-78.18331909179688,64.57249641418457],[-78.14527893066406,64.95749092102051],[-77.31582641601562,65.19053840637207],[-77.42166137695312,65.46138191223145],[-75.7691650390625,65.21887397766113],[-75.4244384765625,65.04387092590332],[-75.66749572753906,64.9408130645752],[-75.373046875,64.71499824523926],[-75.5675048828125,64.88360786437988],[-75.18693542480469,65.10165596008301],[-75.95028686523438,65.31833076477051],[-73.50056457519531,65.47442817687988],[-74.46611022949219,66.15193367004395],[-72.25834655761719,67.24803352355957],[-73.35467529296875,68.3292179107666]]],[[[-99.80455780029297,73.88910102844238],[-99.23500061035156,73.73776435852051],[-97.76194763183594,73.91192817687988],[-96.96221923828125,73.73858833312988],[-97.6683349609375,73.48332405090332],[-97.17193603515625,73.35276985168457],[-98.4505615234375,72.87498664855957],[-97.84695434570312,73.0486011505127],[-97.22500610351562,72.93997383117676],[-97.1966552734375,72.60443305969238],[-96.51750183105469,72.71470832824707],[-96.29833984375,72.41581916809082],[-96.87193298339844,72.32110786437988],[-96.48306274414062,72.11303901672363],[-96.866943359375,72.04109382629395],[-96.49305725097656,71.91415596008301],[-97.5050048828125,71.61165046691895],[-98.21806335449219,71.64972114562988],[-98.26722717285156,71.90416145324707],[-98.49388122558594,71.7138843536377],[-98.03750610351562,71.52665901184082],[-98.72972106933594,71.27054023742676],[-100.63445281982422,72.18553352355957],[-102.74166870117188,72.72415351867676],[-102.13722229003906,73.0869312286377],[-101.29750061035156,72.70999336242676],[-100.41221618652344,72.74193000793457],[-100.45195007324219,73.02054023742676],[-100.03138732910156,72.93498420715332],[-100.58000183105469,73.17303657531738],[-99.77166557312012,73.20804023742676],[-101.62138366699219,73.49026679992676],[-100.43055725097656,73.40693855285645],[-101.12000274658203,73.72720527648926],[-99.80455780029297,73.88910102844238]]],[[[-124.43055725097656,73.87858772277832],[-124.55278015136719,73.91693305969238],[-124.42027282714844,73.90915107727051],[-124.43055725097656,73.87858772277832]]],[[[-89.9888916015625,73.98831367492676],[-90.28500366210938,74.02971076965332],[-89.90194702148438,74.03776741027832],[-89.9888916015625,73.98831367492676]]],[[[-98.91860961914062,73.80609321594238],[-99.4375,73.89694404602051],[-97.63778686523438,74.07554817199707],[-98.91860961914062,73.80609321594238]]],[[[-92.6380615234375,74.1030445098877],[-90.19444274902344,73.89972114562988],[-92.09584045410156,72.74304389953613],[-94.3155517578125,72.76304817199707],[-93.46333312988281,72.46220588684082],[-94.06304931640625,71.97831916809082],[-95.21333312988281,71.99443244934082],[-94.75222778320312,72.15332221984863],[-95.17111206054688,72.13916206359863],[-95.13333129882812,72.46026802062988],[-95.67361450195312,72.81387519836426],[-95.68331909179688,73.0758228302002],[-95.57501220703125,73.16499519348145],[-95.68388366699219,73.45027351379395],[-95.70028686523438,73.55386543273926],[-95.61256408691406,73.6109790802002],[-95.67304992675781,73.72331428527832],[-94.61805725097656,73.6513843536377],[-95.32778930664062,73.90915107727051],[-94.73222351074219,74.09526252746582],[-92.6380615234375,74.1030445098877]]],[[[-98.6572265625,74.29942512512207],[-98.86471557617188,74.3047046661377],[-98.51112365722656,74.31833076477051],[-98.6572265625,74.29942512512207]]],[[[-120.14998626708984,74.27249336242676],[-119.60916137695312,74.23332405090332],[-119.74481201171875,74.02551460266113],[-119.14862060546875,74.21220588684082],[-119.1675033569336,73.9871997833252],[-117.42223358154297,74.22693061828613],[-115.31500244140625,73.47970771789551],[-119.13751220703125,72.63247871398926],[-119.31111145019531,72.35220527648926],[-120.25110626220703,72.25860786437988],[-120.54332733154297,71.51666450500488],[-122.78111267089844,71.08610725402832],[-125.25361633300781,71.95025825500488],[-124.94833374023438,71.96110725402832],[-125.99777221679688,71.97360420227051],[-125.02610778808594,72.82109260559082],[-124.475830078125,72.92720222473145],[-124.86888122558594,73.08055305480957],[-123.77471923828125,73.76443672180176],[-124.77084350585938,74.34027290344238],[-121.56416320800781,74.55108833312988],[-120.14998626708984,74.27249336242676]]],[[[-97.65278625488281,74.4558277130127],[-97.79249572753906,74.48581123352051],[-97.2569580078125,74.59054756164551],[-97.65278625488281,74.4558277130127]]],[[[-95.31111145019531,74.49775886535645],[-95.86639404296875,74.57415962219238],[-95.51750183105469,74.6302661895752],[-95.31111145019531,74.49775886535645]]],[[[-97.17582702636719,75.24414253234863],[-97.27528381347656,75.34749031066895],[-97.15306091308594,75.31526374816895],[-97.17582702636719,75.24414253234863]]],[[[-103.9175033569336,75.05497932434082],[-104.85722351074219,75.16470527648926],[-104.18222045898438,75.43553352355957],[-103.58306884765625,75.16470527648926],[-103.9175033569336,75.05497932434082]]],[[[-95.91000366210938,75.56025886535645],[-96.85110473632812,75.35026741027832],[-97.05305480957031,75.4922046661377],[-95.91000366210938,75.56025886535645]]],[[[-94.3638916015625,75.59082221984863],[-93.48750305175781,75.25665473937988],[-93.4677734375,74.70305061340332],[-96.616943359375,74.99109077453613],[-95.74972534179688,75.5133228302002],[-94.3638916015625,75.59082221984863]]],[[[-100.17223358154297,75.60138130187988],[-100.45417785644531,75.54637336730957],[-101.03943634033203,75.56721687316895],[-100.17223358154297,75.60138130187988]]],[[[-96.95445251464844,75.59553718566895],[-97.0050048828125,75.60443305969238],[-96.71583557128906,75.65999031066895],[-96.95445251464844,75.59553718566895]]],[[[-96.57917785644531,75.73692512512207],[-96.71722412109375,75.73970222473145],[-96.45584106445312,75.8177661895752],[-96.57917785644531,75.73692512512207]]],[[[-111.79998779296875,75.83915901184082],[-111.92250061035156,75.85276985168457],[-111.57861328125,75.87997627258301],[-111.79998779296875,75.83915901184082]]],[[[-122.3408432006836,75.86276435852051],[-122.69554138183594,75.90803718566895],[-122.35305786132812,75.91443061828613],[-122.3408432006836,75.86276435852051]]],[[[-121.09306335449219,75.7260913848877],[-121.288330078125,75.75277900695801],[-120.87777709960938,75.93609809875488],[-121.09306335449219,75.7260913848877]]],[[[-103.13778686523438,75.74275398254395],[-103.38276672363281,75.76555061340332],[-101.98332214355469,75.9458179473877],[-103.13778686523438,75.74275398254395]]],[[[-95.79277038574219,75.89972114562988],[-95.89999389648438,75.9538745880127],[-95.73582458496094,75.96832466125488],[-95.79277038574219,75.89972114562988]]],[[[-94.40556335449219,75.75082588195801],[-94.90444946289062,75.93692207336426],[-94.48194885253906,75.97442817687988],[-94.40556335449219,75.75082588195801]]],[[[-122.81916809082031,76.06053352355957],[-122.63082885742188,76.0466480255127],[-122.89250183105469,76.01361274719238],[-122.81916809082031,76.06053352355957]]],[[[-118.31639099121094,75.57249641418457],[-119.40805053710938,75.60582160949707],[-117.46389770507812,76.08305549621582],[-118.31639099121094,75.57249641418457]]],[[[-102.38999938964844,76.08360481262207],[-102.3194580078125,76.02470588684082],[-103.9716567993164,75.93831062316895],[-102.38999938964844,76.08360481262207]]],[[[-78.9263916015625,75.87581062316895],[-79.75222778320312,75.87858772277832],[-78.80583190917969,76.09305000305176],[-79.1763916015625,75.9527759552002],[-78.9263916015625,75.87581062316895]]],[[[-94.84361267089844,76.1222095489502],[-95.00666809082031,76.04748725891113],[-95.14723205566406,76.11693000793457],[-94.84361267089844,76.1222095489502]]],[[[-81.32778930664062,76.14721870422363],[-81.46250915527344,76.15887641906738],[-81.20140075683594,76.17776679992676],[-81.32778930664062,76.14721870422363]]],[[[-102.53083801269531,76.22331428527832],[-103.34221458435059,76.03665351867676],[-104.48277282714844,76.14221382141113],[-102.53083801269531,76.22331428527832]]],[[[-89.39889526367188,76.43553352355957],[-89.62554931640625,76.44497871398926],[-89.53306579589844,76.47665596008301],[-89.39889526367188,76.43553352355957]]],[[[-83.96278381347656,76.42637825012207],[-84.13945007324219,76.5072193145752],[-83.90805053710938,76.46499824523926],[-83.96278381347656,76.42637825012207]]],[[[-104.05387878417969,76.56303596496582],[-103.00446319580078,76.42997932434082],[-104.33500671386719,76.31860542297363],[-104.66583251953125,76.5516529083252],[-104.05387878417969,76.56303596496582]]],[[[-98.41806030273438,76.66832160949707],[-97.50917053222656,76.18887519836426],[-97.9385986328125,75.74136543273926],[-97.38667297363281,75.6827564239502],[-97.28083801269531,75.39694404602051],[-97.74415588378906,75.57110786437988],[-98.165283203125,75.33415412902832],[-97.58250427246094,75.13749885559082],[-100.14584350585938,74.99109077453613],[-100.54695129394531,75.19941902160645],[-99.98777770996094,75.2361011505127],[-100.77887725830078,75.35054206848145],[-98.95028686523438,75.70999336242676],[-102.88390350341797,75.61914253234863],[-101.18222045898438,75.77971076965332],[-101.9072265625,76.07859992980957],[-101.38778686523438,76.25193977355957],[-102.16583251953125,76.23831367492676],[-101.88583374023438,76.44497871398926],[-99.88833618164062,75.88638496398926],[-99.43943786621094,75.97053718566895],[-100.15278625488281,76.13247871398926],[-99.41444396972656,76.15832710266113],[-100.98249816894531,76.50499153137207],[-99.68443298339844,76.63333320617676],[-99.07972717285156,76.39721870422363],[-98.41806030273438,76.66832160949707]]],[[[-99.9969482421875,76.73442268371582],[-99.43055725097656,76.69941902160645],[-100.12860107421875,76.72192573547363],[-99.9969482421875,76.73442268371582]]],[[[-101.38054656982422,76.55359077453613],[-101.68831634521484,76.58638191223145],[-100.24889373779297,76.73471260070801],[-101.38054656982422,76.55359077453613]]],[[[-120.88362121582031,76.73970222473145],[-120.97000122070312,76.71666145324707],[-121.18472290039062,76.7310962677002],[-120.88362121582031,76.73970222473145]]],[[[-89.93443298339844,76.47665596008301],[-90.59999084472656,76.74664497375488],[-89.67388916015625,76.73748970031738],[-89.93443298339844,76.47665596008301]]],[[[-108.65110778808594,76.81360054016113],[-108.55803680419922,76.40860176086426],[-108.07749938964844,76.28055000305176],[-108.3961181640625,76.04609870910645],[-107.63249206542969,75.99109077453613],[-108.02027893066406,75.78082466125488],[-106.89666557312012,75.72026252746582],[-106.336669921875,76.0547046661377],[-105.39195251464844,75.63888740539551],[-106.01112365722656,75.05081367492676],[-108.8324966430664,75.06999397277832],[-112.75306701660156,74.4013843536377],[-114.44776916503906,74.6746997833252],[-110.91278076171875,75.23387336730957],[-113.9175033569336,75.05359077453613],[-113.34056091308594,75.41331672668457],[-114.06500244140625,75.46609687805176],[-115.05082702636719,74.96110725402832],[-117.68388366699219,75.25305366516113],[-114.9997329711914,75.6908130645752],[-117.25110626220703,75.59749031066895],[-114.81749725341797,75.88081550598145],[-116.73416137695312,75.92248725891113],[-116.29611206054688,76.18858528137207],[-114.66251373291016,76.1605396270752],[-115.92500305175781,76.28665351867676],[-114.89972686767578,76.51693916320801],[-112.45388793945312,76.17637825012207],[-111.727783203125,75.9216480255127],[-112.2255630493164,75.81109809875488],[-111.45195007324219,75.83665657043457],[-111.24722290039062,75.51805305480957],[-108.8994369506836,75.47638130187988],[-108.82695007324219,75.68664741516113],[-110.05555725097656,75.89055061340332],[-109.31360626220703,76.1091480255127],[-110.39306640625,76.39193916320801],[-108.65110778808594,76.81360054016113]]],[[[-97.04527282714844,76.79776191711426],[-97.20083618164062,76.85748481750488],[-96.99722290039062,76.81331062316895],[-97.04527282714844,76.79776191711426]]],[[[-113.46611022949219,76.76638984680176],[-114.87581634521484,76.77083015441895],[-113.88555908203125,76.89166450500488],[-113.46611022949219,76.76638984680176]]],[[[-109.06610107421875,76.90054512023926],[-109.30776977539062,76.92804145812988],[-109.179443359375,76.93248176574707],[-109.06610107421875,76.90054512023926]]],[[[-97.25639343261719,76.96748542785645],[-97.47305297851562,76.98054695129395],[-97.09222412109375,77.01082038879395],[-97.25639343261719,76.96748542785645]]],[[[-95.65972900390625,77.05887031555176],[-93.17971801757812,76.74109077453613],[-93.54833984375,76.38611030578613],[-91.41055297851562,76.68914985656738],[-90.46806335449219,76.4730396270752],[-91.56666564941406,76.49887275695801],[-89.29249572753906,76.29609870910645],[-91.61361694335938,76.26220893859863],[-90.1905517578125,76.06109809875488],[-91.12998962402344,75.83915901184082],[-90.0150146484375,76.0102710723877],[-89.17277526855469,75.78055000305176],[-89.76528930664062,75.57554817199707],[-88.9505615234375,75.4297046661377],[-88.7388916015625,75.67943000793457],[-86.54472351074219,75.3591480255127],[-83.8781509399414,75.8189640045166],[-81.53694152832031,75.80941963195801],[-79.57472229003906,75.44999885559082],[-79.57112121582031,75.19914436340332],[-80.4405517578125,75.03804206848145],[-79.3336181640625,74.89444160461426],[-80.32167053222656,74.9377613067627],[-80.23167419433594,74.57805061340332],[-81.81082153320312,74.45694160461426],[-83.51139831542969,74.90165901184082],[-83.47444152832031,74.57971382141113],[-84.28555297851562,74.50360298156738],[-88.4969482421875,74.49775886535645],[-88.54777526855469,74.90776252746582],[-89.48971557617188,74.54553413391113],[-91.02471923828125,74.7027759552002],[-90.77223205566406,74.88499641418457],[-91.53999328613281,74.6463794708252],[-92.49082946777344,75.21360969543457],[-92.0050048828125,75.5949878692627],[-92.10861206054688,75.85887336730957],[-93.0836181640625,76.35803413391113],[-95.3760986328125,76.23442268371582],[-94.80082702636719,76.32165718078613],[-96.96444702148438,76.73332405090332],[-96.30555725097656,76.75387763977051],[-96.81027221679688,76.97915840148926],[-95.65972900390625,77.05887031555176]]],[[[-113.32888793945312,77.07998847961426],[-113.49749755859375,77.08831977844238],[-113.3447265625,77.12776374816895],[-113.32888793945312,77.07998847961426]]],[[[-113.77861022949219,77.10415840148926],[-113.93138122558594,77.12970161437988],[-113.65778350830078,77.12915229797363],[-113.77861022949219,77.10415840148926]]],[[[-104.25250244140625,77.0727710723877],[-104.43167114257812,77.09887886047363],[-104.00110626220703,77.13582038879395],[-104.25250244140625,77.0727710723877]]],[[[-95.22444152832031,77.16720771789551],[-95.63999938964844,77.23776435852051],[-95.35610961914062,77.23637580871582],[-95.22444152832031,77.16720771789551]]],[[[-90.93305969238281,77.25444221496582],[-90.713623046875,77.2008228302002],[-91.29916381835938,77.21776008605957],[-90.93305969238281,77.25444221496582]]],[[[-116.3510971069336,77.53915596008301],[-115.39028930664062,77.30636787414551],[-116.28056335449219,77.18359565734863],[-115.73137664794922,76.94970893859863],[-116.36528015136719,76.92637825012207],[-115.89666557312012,76.69165229797363],[-117.05387878417969,76.53305244445801],[-117.09555053710938,76.29525947570801],[-118.05999755859375,76.40915107727051],[-117.84221458435059,76.82388496398926],[-118.96806335449219,76.5052661895752],[-118.56749725341797,76.33665657043457],[-119.07584381103516,76.08333015441895],[-119.65499877929688,76.30304145812988],[-119.80499267578125,76.10887336730957],[-119.48110961914062,75.97082710266113],[-119.87000274658203,75.85748481750488],[-120.45445251464844,75.8158130645752],[-120.85722351074219,76.19664192199707],[-120.99944305419922,75.93969917297363],[-123.03778076171875,76.08471870422363],[-122.59889221191406,76.34832954406738],[-121.53307342529297,76.43719673156738],[-121.21250915527344,76.64972114562988],[-120.40167236328125,76.79721260070801],[-119.1533432006836,77.3258228302002],[-116.3510971069336,77.53915596008301]]],[[[-85.2852783203125,77.58749580383301],[-84.81388854980469,77.4972095489502],[-85.538330078125,77.53997993469238],[-85.2852783203125,77.58749580383301]]],[[[-90.60305786132812,77.6283130645752],[-89.63612365722656,77.33915901184082],[-91.20889282226562,77.41499519348145],[-90.60305786132812,77.6283130645752]]],[[[-105.0102767944336,77.40803718566895],[-104.36554718017578,77.23027229309082],[-105.2469482421875,77.1938648223877],[-106.0947265625,77.72415351867676],[-105.0102767944336,77.40803718566895]]],[[[-95.40583801269531,77.76388740539551],[-93.10194396972656,77.6624927520752],[-93.570556640625,77.4377613067627],[-96.32888793945312,77.60498237609863],[-95.40583801269531,77.76388740539551]]],[[[-77.85194396972656,77.7744312286377],[-77.95500183105469,77.83027839660645],[-77.56861877441406,77.84971809387207],[-77.85194396972656,77.7744312286377]]],[[[-101.7114028930664,77.90165901184082],[-100.92555236816406,77.7371997833252],[-102.52971458435059,77.83415412902832],[-101.7114028930664,77.90165901184082]]],[[[-114.07305908203125,77.98166084289551],[-113.57611083984375,77.81414985656738],[-115.1160945892334,77.95833015441895],[-114.07305908203125,77.98166084289551]]],[[[-109.58805847167969,78.06469917297363],[-110.90471458435059,77.84387397766113],[-110.09028625488281,77.76915168762207],[-110.20333862304688,77.51138496398926],[-112.03111267089844,77.32470893859863],[-113.19803619384766,77.52388191223145],[-113.31973266601562,77.79553413391113],[-109.58805847167969,78.06469917297363]]],[[[-103.05695343017578,78.11970710754395],[-103.2822265625,78.15776252746582],[-102.7822265625,78.23858833312988],[-103.05695343017578,78.11970710754395]]],[[[-94.36665344238281,78.15915107727051],[-94.69415283203125,78.25860786437988],[-94.48194885253906,78.2683277130127],[-94.36665344238281,78.15915107727051]]],[[[-88.28721618652344,78.24331855773926],[-88.40972900390625,78.29220771789551],[-88.0433349609375,78.43664741516113],[-88.28721618652344,78.24331855773926]]],[[[-74.30694580078125,78.6766529083252],[-74.71028137207031,78.7310962677002],[-74.16361999511719,78.71609687805176],[-74.30694580078125,78.6766529083252]]],[[[-109.64806365966797,78.58804512023926],[-109.26055908203125,78.4558277130127],[-113.33416557312012,78.33276557922363],[-110.63751220703125,78.74859809875488],[-109.64806365966797,78.58804512023926]]],[[[-96.76806640625,78.68414497375488],[-94.87777709960938,78.3913745880127],[-95.399169921875,78.2310962677002],[-94.88694763183594,78.10276985168457],[-97.09695434570312,77.80331611633301],[-97.77555847167969,78.03499031066895],[-96.87054443359375,78.13333320617676],[-98.41139221191406,78.4952564239502],[-98.02223205566406,78.53637886047363],[-98.37165832519531,78.7199878692627],[-98.14445495605469,78.8166675567627],[-96.76806640625,78.68414497375488]]],[[[-86.3194580078125,78.88360786437988],[-86.48443603515625,78.89276313781738],[-85.16722106933594,79.02083015441895],[-86.3194580078125,78.88360786437988]]],[[[-103.59388732910156,79.3258228302002],[-102.56082153320312,78.86970710754395],[-101.6489028930664,79.0758228302002],[-99.95249938964844,78.72554206848145],[-99.52972412109375,78.57805061340332],[-99.79388427734375,78.29721260070801],[-98.94583129882812,78.05581855773926],[-99.90695190429688,77.77859687805176],[-101.03555297851562,78.19609260559082],[-102.61860656738281,78.24136543273926],[-102.80610656738281,78.37776374816895],[-104.46749877929688,78.2652759552002],[-105.0513916015625,78.49443244934082],[-103.52362060546875,78.49609565734863],[-104.04222106933594,78.62997627258301],[-103.31639099121094,78.73442268371582],[-104.19888305664062,78.77026557922363],[-103.82167053222656,78.8983325958252],[-104.20361328125,78.99165534973145],[-104.98832702636719,78.79832649230957],[-104.68110656738281,79.01666450500488],[-105.62860107421875,79.16137886047363],[-103.59388732910156,79.3258228302002]]],[[[-99.47166442871094,80.10971260070801],[-98.6441650390625,79.79414558410645],[-100.177490234375,79.90999031066895],[-99.47166442871094,80.10971260070801]]],[[[-99.15556335449219,80.1746997833252],[-99.1138916015625,80.16388130187988],[-99.41806030273438,80.15721321105957],[-99.15556335449219,80.1746997833252]]],[[[-95.03083801269531,80.67025947570801],[-94.97055053710938,80.6352710723877],[-96.149169921875,80.66470527648926],[-95.03083801269531,80.67025947570801]]],[[[-92.727783203125,81.30554389953613],[-90.76640319824219,80.56553840637207],[-89.2449951171875,80.51721382141113],[-88.77667236328125,80.1313648223877],[-88.14555358886719,80.09387397766113],[-88.61528015136719,80.40387153625488],[-87.68388366699219,80.41026496887207],[-87.56277465820312,80.17915534973145],[-88.0655517578125,80.12082099914551],[-86.95777893066406,79.90359687805176],[-87.46250915527344,79.53471565246582],[-86.33416557312012,79.64554023742676],[-86.04611206054688,79.56888008117676],[-86.07084655761719,79.43414497375488],[-85.68194580078125,79.61331367492676],[-84.9041748046875,79.26776313781738],[-86.98332214355469,79.05664253234863],[-87.61582946777344,78.64526557922363],[-88.00334167480469,78.80720710754395],[-87.72471618652344,79.0758228302002],[-88.16250610351562,78.99054145812988],[-87.90834045410156,78.5486011505127],[-88.80416870117188,78.60971260070801],[-88.53555297851562,78.41304206848145],[-88.81777954101562,78.1544361114502],[-89.98056030273438,78.60971260070801],[-89.45249938964844,78.1624927520752],[-92.05833435058594,78.2088794708252],[-92.98750305175781,78.46554756164551],[-91.63528442382812,78.54609870910645],[-93.2711181640625,78.58415412902832],[-93.81361389160156,78.76582527160645],[-93.03778076171875,78.76582527160645],[-94.28860473632812,78.98637580871582],[-90.36326599121094,79.24681282043457],[-92.2388916015625,79.20555305480957],[-92.69471740722656,79.2572193145752],[-91.1199951171875,79.38638496398926],[-93.09056091308594,79.48221015930176],[-95.08755493164062,79.27075386047363],[-95.77944946289062,79.42581367492676],[-94.28277587890625,79.75749397277832],[-95.85333251953125,79.64610481262207],[-96.80278015136719,80.09082221984863],[-94.38362121582031,79.98248481750488],[-94.74888610839844,80.07998847961426],[-94.08389282226562,80.17553901672363],[-96.68167114257812,80.34221076965332],[-93.78639221191406,80.52554512023926],[-95.53416442871094,80.81888008117676],[-93.0916748046875,81.15999031066895],[-94.26861572265625,81.34610176086426],[-92.727783203125,81.30554389953613]]],[[[-91.71833801269531,81.54915046691895],[-91.96055603027344,81.5949878692627],[-91.58222961425781,81.57805061340332],[-91.71833801269531,81.54915046691895]]],[[[-78.36582946777344,82.88360786437988],[-78.41471862792969,82.94192695617676],[-78.116943359375,82.94220161437988],[-78.36582946777344,82.88360786437988]]],[[[-70.1119384765625,83.10942268371582],[-66.2994384765625,82.92943000793457],[-68.64250183105469,82.62858772277832],[-64.72972106933594,82.90416145324707],[-64.93693542480469,82.87137031555176],[-62.926109313964844,82.57609748840332],[-63.3699951171875,82.43887519836426],[-61.076393127441406,82.32083320617676],[-64.35527038574219,81.72638130187988],[-69.2913818359375,81.71887397766113],[-66.60861206054688,81.51277351379395],[-70.21000671386719,81.17387580871582],[-64.43638610839844,81.47943305969238],[-69.427490234375,80.38275337219238],[-70.82528686523438,80.55859565734863],[-70.14555358886719,80.19359016418457],[-72.42083740234375,80.21110725402832],[-70.49749755859375,80.08276557922363],[-71.46055603027344,79.9013843536377],[-70.9102783203125,79.88582038879395],[-71.18388366699219,79.7774829864502],[-74.2388916015625,79.88720893859863],[-74.84638977050781,79.84721565246582],[-73.12582397460938,79.55832099914551],[-78.0513916015625,79.35470771789551],[-74.43666076660156,79.0577564239502],[-78.89138793945312,79.06331062316895],[-77.70333862304688,79.00694465637207],[-78.248046875,78.77026557922363],[-76.71055603027344,79.02832221984863],[-74.7197265625,78.70749092102051],[-76.693603515625,78.50972175598145],[-75.0625,78.3097095489502],[-76.91221618652344,78.20109748840332],[-75.5755615234375,78.10775947570801],[-75.92277526855469,77.95665168762207],[-78.26083374023438,77.9952564239502],[-77.71861267089844,77.60582160949707],[-78.6905517578125,77.31553840637207],[-80.45611572265625,77.29609870910645],[-81.93028259277344,77.68498420715332],[-81.16583251953125,77.33720588684082],[-82.16610717773438,77.29248237609863],[-81.83416557312012,77.1624927520752],[-79.2550048828125,77.21859931945801],[-79.0050048828125,77.0969409942627],[-79.38694763183594,76.92747688293457],[-77.77944946289062,76.79136848449707],[-78.37748718261719,76.45804023742676],[-81.05332946777344,76.12803840637207],[-80.77166557312012,76.41914558410645],[-82.72500610351562,76.81915473937988],[-82.12721252441406,76.44165229797363],[-83.00361633300781,76.42915534973145],[-83.40083312988281,76.75999641418457],[-83.18832397460938,76.41943550109863],[-84.31082153320312,76.65832710266113],[-84.19554138183594,76.45637702941895],[-85.02833557128906,76.57499885559082],[-84.3760986328125,76.3177661895752],[-84.92832946777344,76.28637886047363],[-86.59416198730469,76.63499641418457],[-86.34222412109375,76.51220893859863],[-88.38999938964844,76.38971138000488],[-88.49472045898438,76.81721687316895],[-88.60804557800293,76.39999580383301],[-89.679443359375,76.57165718078613],[-88.54583740234375,77.10026741027832],[-86.739990234375,77.17415046691895],[-87.71194458007812,77.35998725891113],[-88.2147216796875,77.65054512023926],[-88.06806945800781,77.82026863098145],[-86.42222595214844,77.8308277130127],[-85.79444885253906,77.41971015930176],[-84.47944641113281,77.29443550109863],[-83.4647216796875,77.34832954406738],[-83.83555603027344,77.45526313781738],[-82.31861877441406,78.07083320617676],[-83.89834594726562,77.49054145812988],[-85.40249633789062,77.81999397277832],[-84.32501220703125,77.89610481262207],[-85.67887878417969,77.92943000793457],[-84.12777709960938,78.17109870910645],[-84.96861267089844,78.20248603820801],[-84.5755615234375,78.34637641906738],[-84.866943359375,78.36914253234863],[-84.63861083984375,78.59414863586426],[-85.48611450195312,78.10247993469238],[-86.288330078125,78.07638740539551],[-85.83306884765625,78.37997627258301],[-87.53860473632812,78.13804817199707],[-87.08944702148438,78.20193672180176],[-87.52471923828125,78.41638374328613],[-86.85694885253906,78.73498725891113],[-85.06416320800781,78.91914558410645],[-82.33778381347656,78.5666675567627],[-82.59445190429688,78.70305061340332],[-82.22055053710938,78.73221015930176],[-83.25473022460938,78.83499336242676],[-81.47721862792969,79.04721260070801],[-84.748046875,79.03193855285645],[-83.35861206054688,79.05081367492676],[-84.32695007324219,79.18858528137207],[-84.48472595214844,79.40637397766113],[-85.06889343261719,79.62608528137207],[-86.48638916015625,79.76361274719238],[-85.2550048828125,79.92082405090332],[-86.48277282714844,80.00860786437988],[-86.51472473144531,80.29915046691895],[-83.78195190429688,80.24582099914551],[-81.7066650390625,79.58665657043457],[-79.90472412109375,79.64694404602051],[-81.51972961425781,79.73082160949707],[-81.66305541992188,79.90304756164551],[-81.40028381347656,79.9377613067627],[-83.20388793945312,80.31805610656738],[-78.03805541992188,80.56721687316895],[-79.96055603027344,80.60803413391113],[-76.48472595214844,80.86554145812988],[-78.93499755859375,80.87553596496582],[-76.74526977539062,81.43914985656738],[-79.50167846679688,81.19359016418457],[-79.06361389160156,81.08554267883301],[-80.91944885253906,80.65555000305176],[-83.5694580078125,80.7391529083252],[-83.2569580078125,80.83859443664551],[-85.06695556640625,80.5052661895752],[-86.7449951171875,80.6030445098877],[-85.6058349609375,80.97581672668457],[-82.36444091796875,81.17943000793457],[-85.68167114257812,81.04942512512207],[-87.5947265625,80.62858772277832],[-89.46611022949219,80.91415596008301],[-84.73388671875,81.28109931945801],[-89.82084655761719,81.01082038879395],[-90.35194396972656,81.16748237609863],[-87.24472045898438,81.49026679992676],[-90.44305419921875,81.36665534973145],[-90.85665893554688,81.44413948059082],[-89.58500671386719,81.62581062316895],[-91.9566650390625,81.65860176086426],[-88.0755615234375,82.10498237609863],[-84.60499572753906,81.88998603820801],[-86.8760986328125,82.20221138000488],[-85.04695129394531,82.48193550109863],[-79.22917175292969,81.81608772277832],[-82.73222351074219,82.40165901184082],[-81.54167175292969,82.49609565734863],[-82.21528625488281,82.6685962677002],[-80.57806396484375,82.54609870910645],[-81.47305297851562,82.82499885559082],[-78.50279235839844,82.68109321594238],[-80.43028259277344,82.88749885559082],[-79.7933349609375,82.95749092102051],[-75.89222717285156,82.5919361114502],[-76.2308349609375,82.44470405578613],[-75.3961181640625,82.61470222473145],[-77.38137817382812,82.99443244934082],[-74.43582153320312,83.02720832824707],[-72.63389587402344,82.69442939758301],[-73.65055847167969,82.92581367492676],[-70.1119384765625,83.10942268371582]]],[[[-92.95417785644531,63.871103286743164],[-93.09445190429688,63.90499305725098],[-92.97833251953125,63.90832710266113],[-92.95417785644531,63.871103286743164]]]]}},{"type":"Feature","properties":{"name":"Cambodia","iso2":"KH","iso3":"KHM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[103.77525520324707,10.442499160766602],[103.74858283996582,10.476388931274414],[103.75581550598145,10.511667251586914],[103.79886054992676,10.500001907348633],[103.77525520324707,10.442499160766602]]],[[[103.31414985656738,10.723054885864258],[103.26970863342285,10.669721603393555],[103.19331550598145,10.756387710571289],[103.31414985656738,10.723054885864258]]],[[[107.4891529083252,14.448610305786133],[107.54749488830566,12.353609085083008],[106.42024421691895,11.973608016967773],[106.45821571350098,11.665864944458008],[105.8510684967041,11.659997940063477],[106.20331001281738,10.77055549621582],[105.10191535949707,10.95555305480957],[104.4453296661377,10.422739028930664],[104.24774360656738,10.567499160766602],[103.92691230773926,10.590276718139648],[103.6233081817627,10.495553970336914],[103.55523872375488,11.156942367553711],[103.12970161437988,10.883054733276367],[102.91609382629395,11.63585090637207],[102.37719917297363,13.573888778686523],[103.18054389953613,14.329721450805664],[105.21060371398926,14.349649429321289],[106.05664253234863,13.929998397827148],[106.00470924377441,14.373052597045898],[106.54074287414551,14.598726272583008],[106.85359382629395,14.30305290222168],[107.54660224914551,14.708620071411133],[107.4891529083252,14.448610305786133]],[[103.03275489807129,11.431943893432617],[103.04551887512207,11.469720840454102],[103.00940895080566,11.524999618530273],[103.03275489807129,11.431943893432617]],[[103.02803230285645,11.24638557434082],[103.04192543029785,11.375555038452148],[102.98636054992676,11.422220230102539],[103.02803230285645,11.24638557434082]]]]}},{"type":"Feature","properties":{"name":"Sri Lanka","iso2":"LK","iso3":"LKA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[81.71499600000018,7.681388],[81.708328,7.674166],[81.70166,7.68111],[81.71276900000012,7.704999],[81.71499600000018,7.681388]]],[[[81.80693100000022,7.477777],[81.7233120000001,7.738610000000122],[81.804153,7.600554],[81.80693100000022,7.477777]]],[[[79.91249100000013,9.018055],[79.85054000000017,9.00111000000011],[79.693039,9.092497],[79.91249100000013,9.018055]]],[[[79.716385,9.477221],[79.658035,9.499165],[79.657486,9.555832000000152],[79.716385,9.477221]]],[[[79.974426,9.615274],[79.871918,9.634443],[79.854706,9.750832],[79.974426,9.615274]]],[[[80.27470400000013,9.775],[80.824432,9.261944],[80.91470300000017,8.94305400000016],[81.231094,8.65111],[81.130539,8.5],[81.361374,8.487219],[81.391937,8.149443],[81.881653,7.288054000000102],[81.66110200000017,6.439999000000128],[80.587204,5.9177770000001],[80.04609700000012,6.239721],[79.702484,8.079443],[80.051926,9.594442000000157],[80.61219800000012,9.443054],[79.925812,9.74472],[80.44413800000015,9.57166500000011],[80.27470400000013,9.775]]]]}},{"type":"Feature","properties":{"name":"Congo","iso2":"CG","iso3":"COG"},"geometry":{"type":"MultiPolygon","coordinates":[[[[12.779047,-4.388991],[12.026131,-5.014997],[11.140661000000108,-3.925277],[11.496944,-3.506945],[11.925833,-3.636945],[11.574165,-2.333333],[12.478054000000128,-2.327222],[12.65,-1.8225],[13.001507,-2.367672],[13.482777000000112,-2.4375],[13.76222,-2.088889],[14.110832,-2.493056],[14.429722000000112,-1.891667],[14.51861,-0.609167],[13.848331000000144,-0.198611],[14.487221,0.913611000000117],[14.188889,1.391389],[13.186785,1.222476],[13.293888,2.163611],[14.564999,2.169444],[16.07222000000013,1.654166],[16.207222,2.220833],[16.659721,3.533333],[17.475277,3.713055],[18.624958,3.479444],[18.09194200000013,2.224166],[17.714996,-0.537222],[16.195831,-2.175834],[16.226944,-3.328333],[15.890505000000132,-3.943009],[14.661388,-4.909445],[14.418888000000152,-4.887222],[14.400833,-4.2775],[13.729443,-4.445834],[13.413887000000102,-4.882501],[13.091389,-4.633056],[12.779047,-4.388991]]]]}},{"type":"Feature","properties":{"name":"Democratic Republic of the Congo","iso2":"CD","iso3":"COD"},"geometry":{"type":"MultiPolygon","coordinates":[[[[25.89166831970215,5.192499160766602],[27.455278396606445,5.016389846801758],[28.363054275512695,4.290002822875977],[29.64333152770996,4.643613815307617],[30.85881996154785,3.49339485168457],[30.72972297668457,2.448057174682617],[31.302778244018555,2.121389389038086],[29.960554122924805,0.825555801391602],[29.59694480895996,-1.385833740234375],[28.86833381652832,-2.394443511962891],[29.024442672729492,-2.744722366333008],[29.22989845275879,-3.75096321105957],[29.423887252807617,-4.448055267333984],[29.55027961730957,-6.295278549194336],[30.771242141723633,-8.19224739074707],[28.90166664123535,-8.478612899780273],[28.372220993041992,-9.260833740234375],[28.69972038269043,-10.65333366394043],[28.363332748413086,-11.550834655761719],[29.031389236450195,-12.383056640625],[29.49361228942871,-12.458057403564453],[29.805051803588867,-12.15524673461914],[29.801389694213867,-13.454168319702148],[29.589445114135742,-13.221944808959961],[29.015832901000977,-13.39777946472168],[28.441946029663086,-12.519723892211914],[27.660001754760742,-12.296667098999023],[27.199251174926758,-11.56790542602539],[26.86861228942871,-11.973611831665039],[26.00472068786621,-11.90250015258789],[25.359724044799805,-11.641668319702148],[25.332223892211914,-11.193334579467773],[24.448331832885742,-11.463611602783203],[23.986207962036133,-10.870460510253906],[22.253889083862305,-11.209722518920898],[22.312223434448242,-10.364444732666016],[21.790555953979492,-9.405555725097656],[21.782960891723633,-7.280841827392578],[20.548715591430664,-7.283615112304688],[20.62974739074707,-6.913881301879883],[19.538949966430664,-6.996614456176758],[19.373056411743164,-7.996110916137695],[17.62416648864746,-8.09805679321289],[16.941667556762695,-7.198610305786133],[16.579721450805664,-5.900833129882813],[13.997499465942383,-5.848611831665039],[13.17888069152832,-5.856328964233398],[12.435834884643555,-6.016666412353516],[12.21455192565918,-5.7685546875],[12.526666641235352,-5.724166870117188],[12.565553665161133,-5.025554656982422],[13.088888168334961,-4.662500381469727],[13.091390609741211,-4.633054733276367],[13.413888931274414,-4.882499694824219],[13.72944450378418,-4.445833206176758],[14.400835037231445,-4.277500152587891],[14.418889999389648,-4.887222290039063],[14.66139030456543,-4.909444808959961],[15.890504837036133,-3.943008422851563],[16.226945877075195,-3.328332901000977],[16.195833206176758,-2.175832748413086],[17.714998245239258,-0.537221908569336],[18.091943740844727,2.22416877746582],[18.62495994567871,3.47944450378418],[18.54194450378418,4.335554122924805],[19.421388626098633,5.13416862487793],[20.585554122924805,4.410001754760742],[22.379167556762695,4.127500534057617],[22.89583396911621,4.821111679077148],[23.420278549194336,4.59111213684082],[24.394166946411133,5.115556716918945],[24.734445571899414,4.910833358764648],[25.54222297668457,5.381391525268555],[25.89166831970215,5.192499160766602]],[[12.953054428100586,-5.87611198425293],[12.844167709350586,-5.850555419921875],[12.737222671508789,-5.943611145019531],[12.953054428100586,-5.87611198425293]]]]}},{"type":"Feature","properties":{"name":"Burundi","iso2":"BI","iso3":"BDI"},"geometry":{"type":"MultiPolygon","coordinates":[[[[29.229897,-3.750964],[29.024441,-2.744722],[29.85083,-2.759722],[29.952221,-2.309445],[30.57333,-2.399167],[30.4175,-2.861945],[30.843662,-2.978794],[30.83499900000018,-3.256945],[30.026108000000107,-4.269444],[29.423885,-4.448056],[29.229897,-3.750964]]]]}},{"type":"Feature","properties":{"name":"China","iso2":"CN","iso3":"CHN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[110.72054481506348,20.06333351135254],[111.03109931945801,19.639997482299805],[110.04776191711426,18.380552291870117],[109.56667518615723,18.168886184692383],[108.68553352355957,18.505277633666992],[108.6283130645752,19.2802791595459],[109.25943183898926,19.901662826538086],[110.72054481506348,20.06333351135254]],[[110.52414894104004,19.134443283081055],[110.5102710723877,19.1391658782959],[110.51500129699707,19.132776260375977],[110.52414894104004,19.134443283081055]]],[[[116.71887397766113,20.709440231323242],[116.70526313781738,20.71138572692871],[116.70192909240723,20.719995498657227],[116.71887397766113,20.709440231323242]]],[[[110.59721565246582,20.87944221496582],[110.54802894592285,20.91388511657715],[110.59665107727051,20.958330154418945],[110.59721565246582,20.87944221496582]]],[[[109.12191963195801,21.05527687072754],[109.0727710723877,21.010278701782227],[109.07193183898926,21.050275802612305],[109.12191963195801,21.05527687072754]]],[[[110.54886817932129,21.05916404724121],[110.49803352355957,20.95583152770996],[110.24887275695801,20.97722053527832],[110.54886817932129,21.05916404724121]]],[[[110.49942207336426,21.193330764770508],[110.6141529083252,21.193330764770508],[110.53665351867676,21.09694480895996],[110.49942207336426,21.193330764770508]]],[[[111.83611488342285,21.565275192260742],[111.84055519104004,21.64305305480957],[112.00248908996582,21.651941299438477],[111.83611488342285,21.565275192260742]]],[[[112.53386878967285,21.59083366394043],[112.64804267883301,21.702775955200195],[112.64694404602051,21.638608932495117],[112.53386878967285,21.59083366394043]]],[[[112.80581855773926,21.653329849243164],[112.70332527160645,21.687776565551758],[112.86887550354004,21.766389846801758],[112.80581855773926,21.653329849243164]]],[[[113.38333320617676,22.00889015197754],[113.30748176574707,22.01972007751465],[113.37803840637207,22.0847225189209],[113.38333320617676,22.00889015197754]]],[[[113.29665565490723,22.063886642456055],[113.26776313781738,22.113611221313477],[113.36026191711426,22.153608322143555],[113.29665565490723,22.063886642456055]]],[[[113.59499549865723,22.652219772338867],[113.4861011505127,22.720273971557617],[113.54358863830566,22.73638343811035],[113.59499549865723,22.652219772338867]]],[[[113.58804512023926,22.75055503845215],[113.38720893859863,22.897497177124023],[113.48387336730957,22.90083122253418],[113.58804512023926,22.75055503845215]]],[[[117.11804389953613,23.3991641998291],[116.94470405578613,23.438886642456055],[117.0980396270752,23.49055290222168],[117.11804389953613,23.3991641998291]]],[[[117.40471076965332,23.7711124420166],[117.50749397277832,23.72638511657715],[117.31165504455566,23.579721450805664],[117.40471076965332,23.7711124420166]]],[[[118.12692451477051,24.42582893371582],[118.06218910217285,24.45722007751465],[118.09108924865723,24.54972267150879],[118.18887519836426,24.493886947631836],[118.12692451477051,24.42582893371582]]],[[[119.3016529083252,25.419443130493164],[119.2774829864502,25.503053665161133],[119.3338794708252,25.570276260375977],[119.3016529083252,25.419443130493164]]],[[[119.82666206359863,25.58277702331543],[119.69637489318848,25.42805290222168],[119.7230396270752,25.638887405395508],[119.82666206359863,25.58277702331543]]],[[[119.27777290344238,26.035276412963867],[119.21132850646973,26.071931838989258],[119.40833473205566,25.983606338500977],[119.27777290344238,26.035276412963867]]],[[[121.17082405090332,28.046945571899414],[121.11914253234863,28.133886337280273],[121.24193000793457,28.200551986694336],[121.17082405090332,28.046945571899414]]],[[[121.94109535217285,29.052778244018555],[121.87359809875488,29.1491641998291],[121.94136238098145,29.16499900817871],[121.94109535217285,29.052778244018555]]],[[[122.11192512512207,29.787778854370117],[122.16609382629395,29.652498245239258],[122.03082466125488,29.716108322143555],[122.11192512512207,29.787778854370117]]],[[[122.41137886047363,29.933053970336914],[122.39082527160645,29.829442977905273],[122.31860542297363,29.94166374206543],[122.41137886047363,29.933053970336914]]],[[[121.86580848693848,29.969995498657227],[121.8611011505127,30.081666946411133],[121.90664863586426,30.0322208404541],[121.86580848693848,29.969995498657227]]],[[[122.32527351379395,30.01861000061035],[122.00804328918457,30.004446029663086],[121.96164894104004,30.1391658782959],[122.32527351379395,30.01861000061035]]],[[[122.21111488342285,30.241106033325195],[122.07470893859863,30.287221908569336],[122.21219825744629,30.33916664123535],[122.21111488342285,30.241106033325195]]],[[[122.42025947570801,30.413610458374023],[122.27554512023926,30.432218551635742],[122.27277565002441,30.47499656677246],[122.42025947570801,30.413610458374023]]],[[[121.84499549865723,31.288053512573242],[121.79193305969238,31.369997024536133],[121.87886238098145,31.356664657592773],[121.84499549865723,31.288053512573242]]],[[[121.48776435852051,31.717775344848633],[121.86831855773926,31.489164352416992],[121.20385932922363,31.800539016723633],[121.48776435852051,31.717775344848633]]],[[[119.8994312286377,32.07110786437988],[119.71608924865723,32.27193641662598],[119.82388496398926,32.26805305480957],[119.8994312286377,32.07110786437988]]],[[[121.43609809875488,39.39166450500488],[121.25583076477051,39.409433364868164],[121.39305305480957,39.47915840148926],[121.43609809875488,39.39166450500488]]],[[[123.38220405578613,53.52665901184082],[126.09554481506348,52.76444435119629],[127.58606910705566,50.208566665649414],[127.52942848205566,49.78916358947754],[130.67163276672363,48.864999771118164],[130.52163887023926,48.60777473449707],[130.98855781555176,47.68860054016113],[132.521089553833,47.710275650024414],[133.08856391906738,48.10166358947754],[134.74075508117676,48.26712989807129],[134.76721382141113,47.70749855041504],[134.182466506958,47.32332801818848],[133.90017890930176,46.250314712524414],[133.12219429016113,45.12860298156738],[131.86468696594238,45.34554481506348],[130.94998359680176,44.84110450744629],[131.311372756958,43.392221450805664],[131.12329292297363,42.91082191467285],[130.4052448272705,42.71805000305176],[130.60437202453613,42.42186164855957],[129.90753364562988,43.00582313537598],[129.71191596984863,42.44415473937988],[128.92581367492676,42.02443885803223],[128.05887031555176,42.00332832336426],[128.15582466125488,41.38249397277832],[126.91304206848145,41.79610633850098],[126.01693916320801,40.89999580383301],[124.37359809875488,40.0936222076416],[121.14694404602051,38.72276496887207],[121.75110054016113,39.35166358947754],[121.22886848449707,39.53833198547363],[122.29971504211426,40.511667251586914],[121.17746925354004,40.92193794250488],[120.45526313781738,40.20054817199707],[119.51970863342285,39.868051528930664],[118.92442512512207,39.1280460357666],[117.74387550354004,39.104997634887695],[117.67221260070801,38.38665962219238],[118.84192848205566,38.15054512023926],[118.95665168762207,37.300546646118164],[119.23275947570801,37.14361000061035],[119.76721382141113,37.151384353637695],[120.74054145812988,37.83526802062988],[121.57054328918457,37.42471504211426],[122.56218910217285,37.39638710021973],[122.50470924377441,36.89361000061035],[121.94914436340332,37.00000190734863],[120.78333473205566,36.62193489074707],[120.68081855773926,36.12748146057129],[120.08885383605957,36.19998359680176],[120.23776435852051,35.95943641662598],[119.17608833312988,34.88499641418457],[120.25388526916504,34.30999183654785],[120.83582496643066,32.64083290100098],[121.89554023742676,31.7469425201416],[120.60193061828613,32.09360694885254],[120.10608863830566,31.94388771057129],[119.82666206359863,32.30638313293457],[119.62970161437988,32.26082801818848],[120.12915229797363,31.905553817749023],[120.71443367004395,31.983606338500977],[121.88472175598145,30.97499656677246],[120.14610481262207,30.194719314575195],[121.2844181060791,30.304445266723633],[121.67775917053223,29.96305274963379],[122.12664985656738,29.888887405395508],[121.44832038879395,29.511667251586914],[121.97971534729004,29.585275650024414],[121.93359565734863,29.195276260375977],[121.41192817687988,29.163331985473633],[121.61026191711426,28.72499656677246],[121.13860511779785,28.84055519104004],[121.57859992980957,28.269166946411133],[120.59082221984863,28.079442977905273],[120.84305000305176,27.876943588256836],[120.47747993469238,27.1774959564209],[120.19359016418457,27.2902774810791],[120.42221260070801,27.14527702331543],[120.03386878967285,26.899721145629883],[120.12719917297363,26.641664505004883],[119.54915046691895,26.753610610961914],[119.65804481506348,26.33860969543457],[119.93942451477051,26.35416603088379],[119.42526435852051,25.9969425201416],[119.09276008605957,26.14249610900879],[119.34499549865723,25.938329696655273],[119.70555305480957,25.993608474731445],[119.45110511779785,25.68027687072754],[119.65220832824707,25.357221603393555],[119.30887031555176,25.606943130493164],[119.10220527648926,25.408052444458008],[119.3530445098877,25.250276565551758],[118.87191963195801,25.243886947631836],[119.01609992980957,24.954164505004883],[118.57388496398926,24.884164810180664],[118.62275886535645,24.54388999938965],[118.23970222473145,24.536386489868164],[118.1605396270752,24.688608169555664],[118.01805305480957,24.436384201049805],[117.79202461242676,24.461320877075195],[118.1233081817627,24.2561092376709],[116.5213794708252,23.42083168029785],[116.7874927520752,23.233884811401367],[116.48082160949707,22.938051223754883],[114.22259712219238,22.55055046081543],[114.0333309173584,22.509138107299805],[113.5244312286377,23.011110305786133],[113.82971382141113,23.117219924926758],[113.47747993469238,23.052778244018555],[113.35915565490723,22.883333206176758],[113.5658130645752,22.550275802612305],[113.55443000793457,22.212732315063477],[113.53166389465332,22.194738388061523],[113.16526985168457,22.571386337280273],[113.38804817199707,22.176664352416992],[113.29915046691895,22.175554275512695],[113.22415351867676,22.037500381469727],[113.08638191223145,22.206941604614258],[112.93914985656738,21.868608474731445],[111.89248847961426,21.92027473449707],[111.63720893859863,21.5211124420166],[110.39824867248535,21.38067054748535],[110.15804481506348,20.845552444458008],[110.52916145324707,20.473329544067383],[110.27887153625488,20.24610710144043],[109.92442512512207,20.233606338500977],[109.66192817687988,20.918886184692383],[109.94109535217285,21.446943283081055],[109.57332038879395,21.723329544067383],[109.14276313781738,21.396665573120117],[108.47580909729004,21.940275192260742],[108.51138496398926,21.58916664123535],[107.99002265930176,21.54241371154785],[106.69331550598145,22.030832290649414],[106.70720863342285,22.864999771118164],[105.57747840881348,23.05916404724121],[105.35386848449707,23.3347225189209],[103.96443367004395,22.499113082885742],[103.33638191223145,22.796388626098633],[103.03055000305176,22.4355525970459],[102.47971534729004,22.773889541625977],[102.14074897766113,22.39628791809082],[101.73803901672363,22.4969425201416],[101.57443428039551,22.20916175842285],[101.78720283508301,21.144163131713867],[101.28193855285645,21.18027687072754],[101.14824104309082,21.5726375579834],[101.10526466369629,21.771387100219727],[100.21275520324707,21.432554244995117],[99.96443367004395,22.048887252807617],[99.16276741027832,22.159162521362305],[99.56637763977051,22.938051223754883],[98.92747688293457,23.189165115356445],[98.67720222473145,23.968053817749023],[98.89073371887207,24.160070419311523],[97.5355396270752,23.93971824645996],[97.75999641418457,24.257497787475586],[97.55247688293457,24.743051528930664],[98.71081733703613,25.855554580688477],[98.77832221984863,26.636384963989258],[98.69970893859863,27.539167404174805],[98.31637763977051,27.54194450378418],[97.80664253234863,28.34416389465332],[97.55525398254395,28.54805564880371],[97.34887886047363,28.2227725982666],[96.40193367004395,28.351110458374023],[96.61581611633301,28.7902774810791],[96.47082710266113,29.056665420532227],[96.16914558410645,28.903608322143555],[96.39526557922363,29.255277633666992],[96.07748603820801,29.46860694885254],[95.38777351379395,29.035276412963867],[94.64750862121582,29.333459854125977],[92.54498481750488,27.861940383911133],[91.65776252746582,27.76472282409668],[91.30137825012207,28.08111000061035],[90.46638679504395,28.071664810180664],[90.01748847961426,28.32527732849121],[89.59027290344238,28.14333152770996],[88.91772651672363,27.32032585144043],[88.83166694641113,28.013334274291992],[88.14279365539551,27.866056442260742],[87.19275093078613,27.82305335998535],[86.68637275695801,28.112218856811523],[86.44497871398926,27.908052444458008],[86.18359565734863,28.16388511657715],[86.01443672180176,27.882776260375977],[85.72137641906738,28.279165267944336],[85.10664558410645,28.3094425201416],[85.18997383117676,28.603330612182617],[84.4810962677002,28.736661911010742],[84.11914253234863,29.260000228881836],[83.55276679992676,29.18583106994629],[82.10054206848145,30.342222213745117],[81.42109870910645,30.38527488708496],[81.22360420227051,30.010278701782227],[81.02536201477051,30.204355239868164],[79.09248542785645,31.437498092651367],[78.76721382141113,31.309999465942383],[78.39776802062988,32.54860877990723],[78.76054573059082,32.63555335998535],[78.97110176086426,32.35083198547363],[79.53027534484863,32.754167556762695],[78.81164741516113,33.525827407836914],[78.98535346984863,34.35001564025879],[78.30914497375488,34.64249610900879],[78.07554817199707,35.44582557678223],[77.82393074035645,35.50132942199707],[76.16638374328613,35.819719314575195],[75.86442756652832,36.659677505493164],[74.81749153137207,37.02176856994629],[74.56543159484863,37.02781867980957],[74.39221382141113,37.17507362365723],[74.91574287414551,37.23732948303223],[75.18748664855957,37.40658760070801],[74.90277290344238,37.64715766906738],[74.85664558410645,38.47048377990723],[73.8177661895752,38.60771369934082],[73.65568733215332,39.4548282623291],[73.99443244934082,40.04604530334473],[74.86026191711426,40.51938819885254],[75.57805061340332,40.64799690246582],[75.69720649719238,40.29911231994629],[76.34582710266113,40.35022163391113],[76.87387275695801,41.014108657836914],[78.0808277130127,41.040788650512695],[80.2340259552002,42.19622230529785],[80.17192268371582,42.66050910949707],[80.57859992980957,42.89107704162598],[80.37664985656738,43.02523994445801],[80.81721687316895,43.15606880187988],[80.36276435852051,44.12524604797363],[80.52083015441895,44.73247718811035],[79.87109565734863,44.904977798461914],[81.68831062316895,45.35081672668457],[82.56164741516113,45.12941932678223],[82.6494312286377,45.43026161193848],[82.3177661895752,45.57053565979004],[83.0405445098877,47.21221351623535],[84.75943183898926,46.82638740539551],[85.5293140411377,47.06016731262207],[85.75915718078613,48.387773513793945],[86.59610176086426,48.53611183166504],[86.87469673156738,49.11082649230957],[87.34820747375488,49.09262275695801],[87.84070014953613,49.17295265197754],[87.97331428527832,48.57694435119629],[88.65332221984863,48.18277168273926],[90.07443428039551,47.88638496398926],[91.02025032043457,46.60011100769043],[90.68193244934082,45.579721450805664],[90.89694404602051,45.25305366516113],[93.5547046661377,44.95721626281738],[95.41665840148926,44.29388618469238],[95.33610725402832,44.020830154418945],[96.38304328918457,42.73110389709473],[100.83554267883301,42.678049087524414],[105.01220893859863,41.58138465881348],[107.4719181060791,42.46610450744629],[109.31360054016113,42.42999458312988],[110.44053840637207,42.77777290344238],[111.95833015441895,43.692216873168945],[111.42137336730957,44.38249397277832],[111.98082160949707,45.09166145324707],[113.63804817199707,44.74527168273926],[114.54525947570801,45.38943672180176],[115.70192909240723,45.45860481262207],[116.58554267883301,46.29583168029785],[117.42109870910645,46.57833290100098],[119.89749336242676,46.675554275512695],[119.72998237609863,47.16415596008301],[118.53933906555176,47.99475288391113],[117.80108833312988,48.01055335998535],[117.37219429016113,47.65359687805176],[115.59219551086426,47.919443130493164],[116.71138191223145,49.83046913146973],[117.87471199035645,49.520578384399414],[119.21415901184082,50.015275955200195],[119.36136817932129,50.33693885803223],[119.13860511779785,50.39471626281738],[120.77665901184082,52.114999771118164],[120.71360969543457,52.54471778869629],[120.02916145324707,52.76805305480957],[120.86387825012207,53.27971839904785],[123.38220405578613,53.52665901184082]],[[108.32971382141113,21.654165267944336],[108.3288745880127,21.67860984802246],[108.32083320617676,21.665830612182617],[108.32971382141113,21.654165267944336]]]]}},{"type":"Feature","properties":{"name":"Afghanistan","iso2":"AF","iso3":"AFG"},"geometry":{"type":"MultiPolygon","coordinates":[[[[74.915741,37.237328],[74.392212,37.175072],[74.56543,37.027817],[72.556641,36.821266],[71.2435760000001,36.129715],[71.64942900000014,35.424995],[70.987488,34.551102000000114],[71.08194000000012,34.05582400000013],[69.90637200000018,34.035271],[70.326935,33.33194],[69.505264,33.034164],[69.32824700000012,31.940365000000114],[68.833054,31.603886],[68.166092,31.833054000000104],[67.575546,31.53194000000012],[67.778046,31.33221800000014],[66.72303800000012,31.212215],[66.395538,30.94083],[66.256653,29.851940000000113],[62.4844360000001,29.406105],[60.86859900000016,29.863884],[61.8511050000001,31.021111],[61.713608,31.383331],[60.84388,31.498329],[60.582497,33.06610100000013],[60.94304700000012,33.51944],[60.527771,33.64415700000011],[60.50833100000014,34.140274],[60.87887600000013,34.319717],[60.721657,34.522217],[61.27655800000011,35.60724600000013],[62.30915800000011,35.141663],[62.722214,35.254715],[63.10527000000016,35.45082900000013],[63.1194380000002,35.861938],[64.503601,36.280548],[64.798035,37.12499200000015],[65.70887800000011,37.538605],[66.537735,37.366379],[67.779877,37.185822],[68.058014,36.932526],[68.887772,37.3386],[69.315262,37.115273],[69.515823,37.580826],[70.155823,37.536232],[70.161377,37.933372],[70.967209,38.472115],[71.363037,38.248497],[71.252777,37.922035],[71.591934,37.902618],[71.429428,37.075829],[71.6772,36.67601],[73.307205,37.462753],[74.915741,37.237328]]]]}},{"type":"Feature","properties":{"name":"Bhutan","iso2":"BT","iso3":"BTN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[90.466385,28.071663],[91.301376,28.081108],[91.657761,27.764721],[92.113602,27.29749700000012],[92.069992,26.861942],[89.643051,26.715271],[88.89387500000012,26.975552],[88.9177250000001,27.320324],[89.59027100000012,28.14333],[90.017487,28.325275],[90.466385,28.071663]]]]}},{"type":"Feature","properties":{"name":"Chile","iso2":"CL","iso3":"CHL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-67.49305725097656,-55.82917022705078],[-67.61195373535156,-55.90222930908203],[-67.85751342773438,-55.84916687011719],[-67.49305725097656,-55.82917022705078]]],[[[-67.21278381347656,-55.89361572265625],[-67.41389465332031,-55.83222961425781],[-67.2469482421875,-55.82805633544922],[-67.21278381347656,-55.89361572265625]]],[[[-67.08528137207031,-55.917503356933594],[-67.17167663574219,-55.874168395996094],[-67.1058349609375,-55.80194854736328],[-67.08528137207031,-55.917503356933594]]],[[[-67.167236328125,-55.78639221191406],[-67.24139404296875,-55.790283203125],[-67.17388916015625,-55.75972557067871],[-67.167236328125,-55.78639221191406]]],[[[-67.26806640625,-55.72138977050781],[-67.55639457702637,-55.71222686767578],[-67.35667419433594,-55.57472229003906],[-67.26806640625,-55.72138977050781]]],[[[-67.72862243652344,-55.62445068359375],[-67.68806457519531,-55.501670837402344],[-67.58973693847656,-55.540557861328125],[-67.72862243652344,-55.62445068359375]]],[[[-69.69056701660156,-55.412506103515625],[-69.76472473144531,-55.33778381347656],[-69.63751220703125,-55.38250732421875],[-69.69056701660156,-55.412506103515625]]],[[[-69.98529052734375,-55.364173889160156],[-70.10612487792969,-55.29583740234375],[-69.94223022460938,-55.28722381591797],[-69.98529052734375,-55.364173889160156]]],[[[-66.87472534179688,-55.33222961425781],[-67.07362365722656,-55.27611541748047],[-66.87861633300781,-55.22888946533203],[-66.87472534179688,-55.33222961425781]]],[[[-66.57139587402344,-55.28472900390625],[-66.62611389160156,-55.19972229003906],[-66.42056274414062,-55.194725036621094],[-66.57139587402344,-55.28472900390625]]],[[[-66.81668090820312,-55.118614196777344],[-67.07223510742188,-55.002784729003906],[-66.86222839355469,-55.026390075683594],[-66.81668090820312,-55.118614196777344]]],[[[-68.39666557312012,-54.959449768066406],[-69.06111145019531,-55.057228088378906],[-68.21055603027344,-55.26500701904297],[-68.74501037597656,-55.2711181640625],[-68.15945434570312,-55.39861297607422],[-68.05361938476562,-55.712501525878906],[-68.93917846679688,-55.45972442626953],[-68.80361938476562,-55.18861389160156],[-69.43000793457031,-55.161949157714844],[-69.17417907714844,-55.51222229003906],[-70.03334045410156,-55.156394958496094],[-68.39666557312012,-54.959449768066406]]],[[[-67.78056335449219,-54.91944885253906],[-67.05361938476562,-55.136390686035156],[-68.09529113769531,-55.23694610595703],[-68.36445617675781,-54.94445037841797],[-67.78056335449219,-54.91944885253906]]],[[[-70.50875854492188,-54.970054626464844],[-70.73417663574219,-55.015281677246094],[-70.26445007324219,-55.116111755371094],[-71.01583862304688,-54.96666717529297],[-70.31167602539062,-54.90472412109375],[-70.50875854492188,-54.970054626464844]]],[[[-69.76222229003906,-55.038612365722656],[-69.93194580078125,-54.899169921875],[-69.16639709472656,-54.958335876464844],[-69.76222229003906,-55.038612365722656]]],[[[-71.10694885253906,-54.8719482421875],[-70.9122314453125,-54.92444610595703],[-71.45668029785156,-54.88500213623047],[-71.10694885253906,-54.8719482421875]]],[[[-70.60917663574219,-54.90472412109375],[-70.74555969238281,-54.87445068359375],[-70.39361572265625,-54.871673583984375],[-70.60917663574219,-54.90472412109375]]],[[[-72.0211181640625,-54.63472557067871],[-71.93112182617188,-54.744728088378906],[-72.10139465332031,-54.656394958496094],[-72.0211181640625,-54.63472557067871]]],[[[-72.30833435058594,-54.369171142578125],[-72.46334838867188,-54.43000030517578],[-72.54055786132812,-54.341392517089844],[-72.30833435058594,-54.369171142578125]]],[[[-70.28140258789062,-54.27555847167969],[-70.51112365722656,-54.16083526611328],[-70.21890258789062,-54.22666931152344],[-70.28140258789062,-54.27555847167969]]],[[[-71.25750732421875,-54.07611846923828],[-71.00973510742188,-54.102783203125],[-71.11639404296875,-54.38472557067871],[-71.69944763183594,-54.16111755371094],[-71.25750732421875,-54.07611846923828]]],[[[-72.32223510742188,-54.258056640625],[-72.51112365722656,-54.202781677246094],[-72.30168151855469,-54.07167053222656],[-72.20695495605469,-54.148338317871094],[-72.32223510742188,-54.258056640625]]],[[[-73.19416809082031,-54.12889099121094],[-73.47056579589844,-54.072784423828125],[-73.24667358398438,-54.03583526611328],[-73.19416809082031,-54.12889099121094]]],[[[-71.67111206054688,-53.94389343261719],[-71.95361328125,-54.019447326660156],[-71.8466796875,-54.33972930908203],[-72.25750732421875,-53.94111633300781],[-71.67111206054688,-53.94389343261719]]],[[[-70.44195556640625,-53.860557556152344],[-70.67445373535156,-53.926673889160156],[-70.52444458007812,-54.228614807128906],[-70.87861633300781,-54.05083465576172],[-70.53445434570312,-53.56083679199219],[-70.44195556640625,-53.860557556152344]]],[[[-73.83195495605469,-53.59027862548828],[-73.85722351074219,-53.453338623046875],[-73.6875,-53.52166557312012],[-73.83195495605469,-53.59027862548828]]],[[[-72.91111755371094,-53.42945098876953],[-72.87834167480469,-53.68194580078125],[-72.84390258789062,-53.45806121826172],[-72.13945007324219,-53.801673889160156],[-72.87083435058594,-54.13667297363281],[-72.73222351074219,-53.83972930908203],[-73.13250732421875,-54.01167297363281],[-73.25,-53.70722961425781],[-73.58778381347656,-53.75556182861328],[-72.91111755371094,-53.42945098876953]]],[[[-73.46389770507812,-53.475006103515625],[-73.49473571777344,-53.57444763183594],[-73.80195617675781,-53.429168701171875],[-73.46389770507812,-53.475006103515625]]],[[[-74.19168090820312,-53.331947326660156],[-74.24362182617188,-53.29972839355469],[-74.0594482421875,-53.24305725097656],[-74.19168090820312,-53.331947326660156]]],[[[-73.41307067871094,-52.87861633300781],[-73.39111328125,-52.95361328125],[-73.75222778320312,-52.893333435058594],[-73.41307067871094,-52.87861633300781]]],[[[-70.72584533691406,-52.89361572265625],[-70.78083801269531,-52.877784729003906],[-70.61889457702637,-52.82139587402344],[-70.72584533691406,-52.89361572265625]]],[[[-74.36056518554688,-52.948890686035156],[-74.74501037597656,-52.75666809082031],[-73.09001159667969,-53.35472869873047],[-74.36056518554688,-52.948890686035156]]],[[[-70.917236328125,-54.7086181640625],[-70.77139282226562,-54.681114196777344],[-70.87028503417969,-54.68639373779297],[-70.917236328125,-54.7086181640625],[-72.00306701660156,-54.46361541748047],[-70.13084411621094,-54.54888916015625],[-70.88027954101562,-54.13389587402344],[-70.14279174804688,-54.42833709716797],[-70.20083618164062,-54.31611633300781],[-70.05528259277344,-54.249168395996094],[-69.77000427246094,-54.55750274658203],[-69.85917663574219,-54.283058166503906],[-69.24111938476562,-54.44639587402344],[-69.37640380859375,-54.686668395996094],[-69.17750358581543,-54.580833435058594],[-68.99166870117188,-54.43194580078125],[-70.1844482421875,-53.81361389160156],[-69.35639953613281,-53.351112365722656],[-70.44667053222656,-53.36805725097656],[-70.4444580078125,-53.012779235839844],[-70.0997314453125,-52.90416717529297],[-70.42472839355469,-52.77305603027344],[-69.917236328125,-52.825836181640625],[-69.42056274414062,-52.45806121826172],[-68.61758422851562,-52.641510009765625],[-68.63583374023438,-54.78833770751953],[-68.63612365722656,-54.804771423339844],[-68.64311218261719,-54.88861083984375],[-70.917236328125,-54.7086181640625]]],[[[-73.80751037597656,-52.698333740234375],[-74.07778930664062,-52.60667419433594],[-73.74223327636719,-52.40361785888672],[-73.80751037597656,-52.698333740234375]]],[[[-74.73945617675781,-52.31694793701172],[-74.820556640625,-52.22944641113281],[-74.62001037597656,-52.20777893066406],[-74.73945617675781,-52.31694793701172]]],[[[-73.80805969238281,-52.39722442626953],[-74.09278869628906,-52.161949157714844],[-73.78916931152344,-52.26416778564453],[-73.80805969238281,-52.39722442626953]]],[[[-74.19416809082031,-52.13667297363281],[-73.93501281738281,-52.33722686767578],[-74.41862487792969,-52.13972473144531],[-74.19416809082031,-52.13667297363281]]],[[[-74.76251220703125,-52.18833923339844],[-74.7852783203125,-52.12139129638672],[-74.59611511230469,-52.07361602783203],[-74.76251220703125,-52.18833923339844]]],[[[-74.36056518554688,-52.07722473144531],[-74.40583801269531,-52.04722595214844],[-74.35417175292969,-52.056114196777344],[-74.36056518554688,-52.07722473144531]]],[[[-74.71722412109375,-52.08722686767578],[-74.55195617675781,-51.92750358581543],[-74.48779296875,-51.95722961425781],[-74.71722412109375,-52.08722686767578]]],[[[-73.69473266601562,-52.241668701171875],[-74.09529113769531,-51.92278289794922],[-73.76806640625,-52.06833457946777],[-73.69473266601562,-52.241668701171875]]],[[[-74.86361694335938,-52.13916778564453],[-74.7469482421875,-51.833892822265625],[-74.59916687011719,-51.84056091308594],[-74.86361694335938,-52.13916778564453]]],[[[-75.08973693847656,-51.90167236328125],[-75.07084655761719,-51.74028015136719],[-74.97250366210938,-51.72361755371094],[-75.08973693847656,-51.90167236328125]]],[[[-74.14472961425781,-51.951393127441406],[-74.50527954101562,-51.71417236328125],[-74.09222412109375,-51.875],[-74.14472961425781,-51.951393127441406]]],[[[-73.79667663574219,-51.81916809082031],[-73.94000244140625,-51.663063049316406],[-73.7933349609375,-51.728614807128906],[-73.79667663574219,-51.81916809082031]]],[[[-74.78111267089844,-51.82167053222656],[-74.9697265625,-52.11805725097656],[-74.93251037597656,-51.64361572265625],[-74.78111267089844,-51.82167053222656]]],[[[-74.05500793457031,-51.553611755371094],[-73.94000244140625,-51.78583526611328],[-74.23806762695312,-51.701393127441406],[-74.05500793457031,-51.553611755371094]]],[[[-75.00028991699219,-51.39556121826172],[-75.31028747558594,-51.63417053222656],[-75.20529174804688,-51.299171447753906],[-75.00028991699219,-51.39556121826172]]],[[[-74.11778259277344,-51.454444885253906],[-74.26139831542969,-51.300559997558594],[-74.17111206054688,-51.28583526611328],[-74.11778259277344,-51.454444885253906]]],[[[-73.78140258789062,-51.37139129638672],[-73.91445922851562,-51.30000305175781],[-73.79139709472656,-51.26111602783203],[-73.78140258789062,-51.37139129638672]]],[[[-74.04583740234375,-51.379173278808594],[-74.09722900390625,-51.22583770751953],[-73.96806335449219,-51.244171142578125],[-74.04583740234375,-51.379173278808594]]],[[[-74.53611755371094,-51.27916717529297],[-75.0211181640625,-51.46833801269531],[-74.79389953613281,-51.209449768066406],[-74.53611755371094,-51.27916717529297]]],[[[-74.99555969238281,-51.177223205566406],[-74.94000244140625,-51.09861755371094],[-74.85722351074219,-51.135284423828125],[-74.99555969238281,-51.177223205566406]]],[[[-74.41166687011719,-51.208335876464844],[-74.60305786132812,-51.07750701904297],[-74.4666748046875,-51.02833557128906],[-74.41166687011719,-51.208335876464844]]],[[[-74.26333618164062,-51.247779846191406],[-74.32223510742188,-50.91972351074219],[-74.19139099121094,-51.195556640625],[-74.26333618164062,-51.247779846191406]]],[[[-74.39666557312012,-50.860557556152344],[-74.40556335449219,-51.08972930908203],[-74.48222351074219,-50.997779846191406],[-74.72056579589844,-51.11194610595703],[-74.96473693847656,-50.96583557128906],[-74.39666557312012,-50.860557556152344]]],[[[-74.68917846679688,-50.890838623046875],[-74.95472717285156,-50.731117248535156],[-74.7489013671875,-50.70195007324219],[-74.68917846679688,-50.890838623046875]]],[[[-74.99389457702637,-50.81389617919922],[-75.07084655761719,-50.65222930908203],[-74.979736328125,-50.664451599121094],[-74.99389457702637,-50.81389617919922]]],[[[-74.65139770507812,-50.58861541748047],[-74.68583679199219,-50.52166557312012],[-74.58168029785156,-50.5322265625],[-74.65139770507812,-50.58861541748047]]],[[[-75.09638977050781,-50.516395568847656],[-75.28889465332031,-50.78583526611328],[-75.5150146484375,-50.663063049316406],[-75.09638977050781,-50.516395568847656]]],[[[-74.3638916015625,-50.49139404296875],[-74.19334411621094,-50.84833526611328],[-74.5150146484375,-50.733062744140625],[-74.42361450195312,-50.52361297607422],[-74.67001342773438,-50.47944641113281],[-74.3638916015625,-50.49139404296875]]],[[[-74.73834228515625,-50.5],[-74.75306701660156,-50.388336181640625],[-74.54362487792969,-50.38139343261719],[-74.73834228515625,-50.5]]],[[[-75.04861450195312,-50.16694641113281],[-74.78973388671875,-50.149444580078125],[-75.4586181640625,-50.364173889160156],[-75.14361572265625,-50.24639129638672],[-75.39973258972168,-50.03666687011719],[-75.04861450195312,-50.16694641113281]]],[[[-75.30694580078125,-49.67195129394531],[-75.17388916015625,-49.90306091308594],[-75.59194946289062,-49.78388977050781],[-75.30694580078125,-49.67195129394531]]],[[[-75.48056030273438,-49.54722595214844],[-75.57890319824219,-49.46472930908203],[-75.48445129394531,-49.481117248535156],[-75.48056030273438,-49.54722595214844]]],[[[-74.29417419433594,-49.56056213378906],[-74.41944885253906,-49.627784729003906],[-74.43583679199219,-49.42750358581543],[-74.29417419433594,-49.56056213378906]]],[[[-74.92056274414062,-49.295005798339844],[-75.24028015136719,-49.15028381347656],[-74.97250366210938,-49.03111267089844],[-74.92056274414062,-49.295005798339844]]],[[[-75.28584289550781,-49.10028076171875],[-75.65640258789062,-49.216949462890625],[-75.35890197753906,-48.985557556152344],[-75.28584289550781,-49.10028076171875]]],[[[-75.28140258789062,-48.89000701904297],[-75.25778198242188,-49.081947326660156],[-75.322509765625,-48.954444885253906],[-75.5,-49.04639434814453],[-75.65667724609375,-48.93889617919922],[-75.28140258789062,-48.89000701904297]]],[[[-75.17611694335938,-48.999725341796875],[-75.3125,-48.80000305175781],[-75.08222961425781,-48.88916778564453],[-75.17611694335938,-48.999725341796875]]],[[[-74.97944641113281,-48.74250030517578],[-74.99139404296875,-48.648895263671875],[-74.8255615234375,-48.66166687011719],[-74.97944641113281,-48.74250030517578]]],[[[-75.28167724609375,-48.713340759277344],[-75.65472412109375,-48.76805877685547],[-75.34806823730469,-48.63555908203125],[-75.28167724609375,-48.713340759277344]]],[[[-75.12055969238281,-48.8336181640625],[-75.24833679199219,-48.771392822265625],[-75.07139587402344,-48.63444519042969],[-75.12055969238281,-48.8336181640625]]],[[[-75.322509765625,-48.60417175292969],[-75.60111999511719,-48.69194793701172],[-75.65055847167969,-48.48194885253906],[-75.322509765625,-48.60417175292969]]],[[[-74.41139221191406,-48.530006408691406],[-74.49778747558594,-48.399169921875],[-74.30195617675781,-48.47583770751953],[-74.41139221191406,-48.530006408691406]]],[[[-74.04917907714844,-48.44611358642578],[-74.07417297363281,-48.491111755371094],[-74.2489013671875,-48.37639617919922],[-74.04917907714844,-48.44611358642578]]],[[[-74.26445007324219,-48.466949462890625],[-74.49166870117188,-48.351112365722656],[-74.30639457702637,-48.28666687011719],[-74.26445007324219,-48.466949462890625]]],[[[-74.41889953613281,-48.304725646972656],[-74.5372314453125,-48.333892822265625],[-74.5997314453125,-48.15167236328125],[-74.41889953613281,-48.304725646972656]]],[[[-74.60833740234375,-48.455833435058594],[-74.41278076171875,-49.732505798339844],[-74.7711181640625,-50.05500030517578],[-74.92001342773438,-49.68305969238281],[-74.64639282226562,-49.355560302734375],[-75.0050048828125,-49.508056640625],[-75.01722717285156,-49.899444580078125],[-75.47111511230469,-49.33167266845703],[-74.91806030273438,-49.33611297607422],[-74.82722473144531,-49.09584045410156],[-75.0513916015625,-48.79833984375],[-74.61111450195312,-48.69667053222656],[-75.02862358093262,-48.49500274658203],[-74.7086181640625,-48.45417022705078],[-74.73500061035156,-48.12306213378906],[-74.60833740234375,-48.455833435058594]]],[[[-75.23945617675781,-48.27056121826172],[-75.23445129394531,-48.711395263671875],[-75.58250427246094,-48.086669921875],[-75.23945617675781,-48.27056121826172]]],[[[-74.92500305175781,-48.15583801269531],[-75.04417419433594,-48.44361114501953],[-75.2569580078125,-48.073333740234375],[-74.92500305175781,-48.15583801269531]]],[[[-74.80528259277344,-47.89805603027344],[-74.86973571777344,-48.06916809082031],[-75.26667785644531,-48.031951904296875],[-74.80528259277344,-47.89805603027344]]],[[[-73.92445373535156,-47.88611602783203],[-73.79972839355469,-47.887779235839844],[-74.4989013671875,-47.923057556152344],[-73.92445373535156,-47.88611602783203]]],[[[-75.1319580078125,-47.84889221191406],[-75.30361938476562,-47.773338317871094],[-75.13444519042969,-47.698333740234375],[-75.1319580078125,-47.84889221191406]]],[[[-74.95472717285156,-47.783058166503906],[-75.07528686523438,-47.69445037841797],[-74.95140075683594,-47.706390380859375],[-74.95472717285156,-47.783058166503906]]],[[[-74.45529174804688,-47.17694854736328],[-74.48417663574219,-47.083335876464844],[-74.31306457519531,-47.062782287597656],[-74.45529174804688,-47.17694854736328]]],[[[-74.15444946289062,-47.17250061035156],[-74.18362426757812,-47.02528381347656],[-73.97528076171875,-47.04750061035156],[-74.15444946289062,-47.17250061035156]]],[[[-73.7650146484375,-46.21111297607422],[-73.9122314453125,-46.02027893066406],[-73.68333435058594,-46.07666778564453],[-73.7650146484375,-46.21111297607422]]],[[[-73.68112182617188,-46.02833557128906],[-73.8194580078125,-45.99889373779297],[-73.77806091308594,-45.905006408691406],[-73.68112182617188,-46.02833557128906]]],[[[-74.71556091308594,-45.851951599121094],[-75.08306884765625,-46.08861541748047],[-75.10195922851562,-45.874168395996094],[-74.71556091308594,-45.851951599121094]]],[[[-73.70390319824219,-45.84278106689453],[-73.92889404296875,-45.97583770751953],[-73.88417053222656,-45.858612060546875],[-73.70390319824219,-45.84278106689453]]],[[[-74.0150146484375,-45.91777801513672],[-74.10694885253906,-45.78833770751953],[-74.03861999511719,-45.73638916015625],[-74.0150146484375,-45.91777801513672]]],[[[-74.75279235839844,-45.70777893066406],[-74.87667846679688,-45.64972686767578],[-74.86917114257812,-45.6058349609375],[-74.75279235839844,-45.70777893066406]]],[[[-74.62028503417969,-45.75695037841797],[-74.68251037597656,-45.63694763183594],[-74.54861450195312,-45.57750701904297],[-74.62028503417969,-45.75695037841797]]],[[[-73.98695373535156,-45.72472381591797],[-74.11000061035156,-45.59278106689453],[-74.01194763183594,-45.537506103515625],[-73.8961181640625,-45.62055969238281],[-73.98695373535156,-45.72472381591797]]],[[[-74.4586181640625,-45.77916717529297],[-74.39028930664062,-45.44389343261719],[-74.21000671386719,-45.63611602783203],[-74.4586181640625,-45.77916717529297]]],[[[-73.64556884765625,-45.75944519042969],[-73.78195190429688,-45.67028045654297],[-73.7005615234375,-45.44389343261719],[-73.64556884765625,-45.75944519042969]]],[[[-74.01779174804688,-45.43305969238281],[-73.81584167480469,-45.47583770751953],[-74.14472961425781,-45.576393127441406],[-74.01779174804688,-45.43305969238281]]],[[[-74.50445556640625,-45.539451599121094],[-74.57000732421875,-45.52916717529297],[-74.43806457519531,-45.42388916015625],[-74.50445556640625,-45.539451599121094]]],[[[-73.89695739746094,-45.434173583984375],[-74.024169921875,-45.40028381347656],[-73.8255615234375,-45.37306213378906],[-73.89695739746094,-45.434173583984375]]],[[[-74.34140014648438,-45.40611267089844],[-74.52778625488281,-45.30528259277344],[-74.38722229003906,-45.288063049316406],[-74.34140014648438,-45.40611267089844]]],[[[-73.97666931152344,-45.26750183105469],[-73.78306579589844,-45.33528137207031],[-74.16612243652344,-45.25055694580078],[-73.97666931152344,-45.26750183105469]]],[[[-74.30889892578125,-45.30583953857422],[-74.39472961425781,-45.154449462890625],[-74.27056884765625,-45.21417236328125],[-74.30889892578125,-45.30583953857422]]],[[[-73.8466796875,-45.002784729003906],[-73.73139953613281,-45.284446716308594],[-74.23583984375,-45.1602783203125],[-73.8466796875,-45.002784729003906]]],[[[-73.98028564453125,-44.98445129394531],[-74.36666870117188,-45.01055908203125],[-74.1683349609375,-44.866668701171875],[-73.98028564453125,-44.98445129394531]]],[[[-74.026123046875,-44.85694885253906],[-74.18667602539062,-44.8125],[-73.95777893066406,-44.78361511230469],[-74.026123046875,-44.85694885253906]]],[[[-73.79362487792969,-44.965003967285156],[-73.92417907714844,-44.89222717285156],[-73.91778564453125,-44.78166961669922],[-73.79362487792969,-44.965003967285156]]],[[[-75.0694580078125,-44.925559997558594],[-75.11167907714844,-44.77833557128906],[-75.02305603027344,-44.84638977050781],[-75.0694580078125,-44.925559997558594]]],[[[-73.651123046875,-44.844451904296875],[-73.7489013671875,-44.75639343261719],[-73.60833740234375,-44.741111755371094],[-73.651123046875,-44.844451904296875]]],[[[-74.376953125,-44.85945129394531],[-74.52639770507812,-44.74195098876953],[-74.42945861816406,-44.719451904296875],[-74.376953125,-44.85945129394531]]],[[[-74.20973205566406,-44.784446716308594],[-74.40972900390625,-44.63444519042969],[-73.87333679199219,-44.68695068359375],[-74.20973205566406,-44.784446716308594]]],[[[-74.45556640625,-44.69389343261719],[-74.67361450195312,-44.668617248535156],[-74.57833862304688,-44.62000274658203],[-74.45556640625,-44.69389343261719]]],[[[-74.77723693847656,-44.6875],[-74.80416870117188,-44.549171447753906],[-74.72611999511719,-44.5977783203125],[-74.77723693847656,-44.6875]]],[[[-73.74555969238281,-44.743614196777344],[-73.68861389160156,-44.54444885253906],[-73.58973693847656,-44.70972442626953],[-73.74555969238281,-44.743614196777344]]],[[[-74.2952880859375,-44.57722473144531],[-74.36834716796875,-44.53278350830078],[-74.13917541503906,-44.550559997558594],[-74.2952880859375,-44.57722473144531]]],[[[-74.41250610351562,-44.512779235839844],[-74.54750061035156,-44.468055725097656],[-74.21778869628906,-44.468055725097656],[-74.41250610351562,-44.512779235839844]]],[[[-74.01972961425781,-44.556671142578125],[-74.12945556640625,-44.448333740234375],[-73.95945739746094,-44.48278045654297],[-74.01972961425781,-44.556671142578125]]],[[[-73.84417724609375,-44.464447021484375],[-73.89889526367188,-44.371673583984375],[-73.78861999511719,-44.42250061035156],[-73.84417724609375,-44.464447021484375]]],[[[-72.7227783203125,-44.549171447753906],[-72.81916809082031,-44.64055633544922],[-72.98333740234375,-44.606117248535156],[-72.82833862304688,-44.69055938720703],[-73.13833618164062,-44.913063049316406],[-73.28028869628906,-44.94000244140625],[-73.40779113769531,-44.820556640625],[-73.20722961425781,-44.798614501953125],[-73.46473693847656,-44.644447326660156],[-72.99806213378906,-44.367225646972656],[-72.7227783203125,-44.549171447753906]]],[[[-73.68890380859375,-44.439727783203125],[-73.78807067871094,-44.38195037841797],[-73.65278625488281,-44.352783203125],[-73.68890380859375,-44.439727783203125]]],[[[-73.92945861816406,-44.44805908203125],[-74.10556030273438,-44.322784423828125],[-73.93084716796875,-44.355560302734375],[-73.92945861816406,-44.44805908203125]]],[[[-73.24195861816406,-44.388336181640625],[-73.3033447265625,-44.36333465576172],[-73.24972534179688,-44.31083679199219],[-73.16889953613281,-44.37000274658203],[-73.24195861816406,-44.388336181640625]]],[[[-73.84695434570312,-44.33805847167969],[-73.97389221191406,-44.281951904296875],[-73.80223083496094,-44.270835876464844],[-73.84695434570312,-44.33805847167969]]],[[[-73.71139526367188,-44.304168701171875],[-73.76112365722656,-44.25389099121094],[-73.66555786132812,-44.25139617919922],[-73.71139526367188,-44.304168701171875]]],[[[-74.29167175292969,-44.30639457702637],[-74.42140197753906,-44.262779235839844],[-74.32722473144531,-44.24639129638672],[-74.29167175292969,-44.30639457702637]]],[[[-74.32000732421875,-44.19500732421875],[-74.38555908203125,-44.154449462890625],[-74.25917053222656,-44.159446716308594],[-74.32000732421875,-44.19500732421875]]],[[[-74.01167297363281,-44.28417205810547],[-74.12611389160156,-44.20777893066406],[-74.06723022460938,-44.151947021484375],[-74.01167297363281,-44.28417205810547]]],[[[-73.852783203125,-44.195838928222656],[-74.01112365722656,-44.141944885253906],[-73.92222595214844,-44.09889221191406],[-73.852783203125,-44.195838928222656]]],[[[-74.2933349609375,-44.031951904296875],[-74.3194580078125,-44.01722717285156],[-74.20472717285156,-44.01917266845703],[-74.2933349609375,-44.031951904296875]]],[[[-73.6461181640625,-44.13139343261719],[-73.72862243652344,-43.93889617919922],[-73.63444519042969,-44.01000213623047],[-73.6461181640625,-44.13139343261719]]],[[[-73.15501403808594,-44.02278137207031],[-73.26945495605469,-43.92083740234375],[-73.14805603027344,-43.888336181640625],[-73.15501403808594,-44.02278137207031]]],[[[-73.85556030273438,-43.765838623046875],[-73.7650146484375,-43.893333435058594],[-74.17250061035156,-43.877784729003906],[-73.85556030273438,-43.765838623046875]]],[[[-74.6461181640625,-43.61250305175781],[-74.79389953613281,-43.64778137207031],[-74.86250305175781,-43.5625],[-74.6461181640625,-43.61250305175781]]],[[[-73.59750366210938,-42.61805725097656],[-73.75140380859375,-42.617225646972656],[-73.61889457702637,-42.570281982421875],[-73.59750366210938,-42.61805725097656]]],[[[-73.41667175292969,-42.55639457702637],[-73.6541748046875,-42.38750457763672],[-73.53584289550781,-42.38500213623047],[-73.41667175292969,-42.55639457702637]]],[[[-73.10612487792969,-42.31139373779297],[-73.18972778320312,-42.25139617919922],[-73.06916809082031,-42.260284423828125],[-73.10612487792969,-42.31139373779297]]],[[[-72.5130615234375,-42.152503967285156],[-72.61695861816406,-42.0977783203125],[-72.50944519042969,-42.06083679199219],[-72.5130615234375,-42.152503967285156]]],[[[-73.88528442382812,-41.81555938720703],[-73.50111389160156,-41.84333801269531],[-73.36862182617188,-42.25055694580078],[-73.67222595214844,-42.36194610595703],[-73.61805725097656,-42.51722717285156],[-73.82028198242188,-42.50750732421875],[-73.80029296875,-42.61778259277344],[-73.4989013671875,-42.80083465576172],[-73.65390014648438,-42.93333435058594],[-73.48945617675781,-43.114723205566406],[-73.85917663574219,-43.400001525878906],[-74.40779113769531,-43.243614196777344],[-73.88528442382812,-41.81555938720703]]],[[[-73.01583862304688,-41.86444854736328],[-73.08973693847656,-41.84416961669922],[-73.0775146484375,-41.74000358581543],[-73.01583862304688,-41.86444854736328]]],[[[-80.73779296875,-33.779449462890625],[-80.77473258972168,-33.74195098876953],[-80.73529052734375,-33.689443588256836],[-80.73779296875,-33.779449462890625]]],[[[-78.77250671386719,-33.62361145019531],[-78.99166870117188,-33.668060302734375],[-78.88833618164062,-33.58055877685547],[-78.77250671386719,-33.62361145019531]]],[[[-109.24138641357422,-27.133056640625],[-109.44917297363281,-27.193058013916016],[-109.39083862304688,-27.066669464111328],[-109.24138641357422,-27.133056640625]]],[[[-105.45639038085938,-26.460556030273438],[-105.45945739746094,-26.464723587036133],[-105.47416687011719,-26.45305633544922],[-105.45639038085938,-26.460556030273438]]],[[[-79.88250732421875,-26.346946716308594],[-79.90695190429688,-26.346389770507812],[-79.86944580078125,-26.340835571289062],[-79.88250732421875,-26.346946716308594]]],[[[-80.07695007324219,-26.261669158935547],[-80.0997314453125,-26.261390686035156],[-80.08056640625,-26.251392364501953],[-80.07695007324219,-26.261669158935547]]],[[[-69.48361206054688,-17.63555908203125],[-69.07167053222656,-18.038890838623047],[-68.90779113769531,-19.055278778076172],[-68.4375,-19.430278778076172],[-68.7569580078125,-20.40694808959961],[-68.18861389160156,-21.296945571899414],[-67.87640380859375,-22.82805633544922],[-67.18362426757812,-22.821666717529297],[-67.00083923339844,-23.00278091430664],[-67.33584594726562,-24.021665573120117],[-68.56500244140625,-24.774444580078125],[-68.35195922851562,-25.117225646972656],[-68.5836181640625,-26.505279541015625],[-68.2872314453125,-26.915279388427734],[-68.81083679199219,-27.120555877685547],[-69.65538024902344,-28.40093231201172],[-70.03140258789062,-29.306392669677734],[-69.83168029785156,-30.190555572509766],[-70.53306579589844,-31.18805694580078],[-70.09889221191406,-33.17250061035156],[-69.77444458007812,-33.38111114501953],[-69.8125,-34.235557556152344],[-70.5675048828125,-35.247779846191406],[-70.42431640625,-36.13603973388672],[-71.18528747558594,-36.84222412109375],[-70.82417297363281,-38.56806182861328],[-71.40139770507812,-38.92028045654297],[-71.695556640625,-39.584449768066406],[-71.9505615234375,-40.73278045654297],[-71.72611999511719,-42.09667205810547],[-72.1319580078125,-42.28889465332031],[-72.13694763183594,-43.00917053222656],[-71.7327880859375,-43.18805694580078],[-71.85501098632812,-44.371673583984375],[-71.10806274414062,-44.53972625732422],[-71.2822265625,-44.80028533935547],[-72.07861328125,-44.769447326660156],[-71.29779052734375,-45.2933349609375],[-71.78056335449219,-45.648895263671875],[-71.66944885253906,-46.679168701171875],[-71.94029235839844,-46.81555938720703],[-71.86862182617188,-47.22167205810547],[-72.36029052734375,-47.470001220703125],[-72.53639221191406,-47.92139434814453],[-72.2872314453125,-48.341949462890625],[-72.56417846679688,-48.80445098876953],[-73.5836181640625,-49.538063049316406],[-73.16612243652344,-50.753334045410156],[-72.29417419433594,-50.64972686767578],[-72.40055847167969,-51.51361846923828],[-71.91056823730469,-51.99583435058594],[-69.99833679199219,-51.99639129638672],[-68.44175720214844,-52.377777099609375],[-69.26112365722656,-52.206390380859375],[-70.81167602539062,-52.732505798339844],[-70.97361755371094,-53.75556182861328],[-71.28472900390625,-53.886390686035156],[-72.45390319824219,-53.401390075683594],[-71.86445617675781,-53.22167205810547],[-72.00723266601562,-53.56305694580078],[-71.80307006835938,-53.516395568847656],[-71.17056274414062,-52.80805969238281],[-72.55278015136719,-53.07472229003906],[-72.18861389160156,-53.18389129638672],[-72.6541748046875,-53.323890686035156],[-72.40028381347656,-53.540283203125],[-73.21778869628906,-53.231117248535156],[-72.70611572265625,-53.293060302734375],[-72.79306030273438,-53.17833709716797],[-72.65306091308594,-53.146949768066406],[-72.93695068359375,-53.10667419433594],[-72.95834350585938,-52.857505798339844],[-72.71945190429688,-52.746116638183594],[-71.47528076171875,-52.633338928222656],[-72.79917907714844,-52.53972625732422],[-72.89889526367188,-52.62555694580078],[-72.67529296875,-52.65888977050781],[-73.00584411621094,-52.85417175292969],[-72.9808349609375,-53.06611633300781],[-73.45112609863281,-53.00666809082031],[-73.23500061035156,-52.88972473144531],[-73.56278991699219,-52.793617248535156],[-72.885009765625,-52.51555633544922],[-73.69000244140625,-52.725006103515625],[-73.54779052734375,-52.53889465332031],[-73.72334289550781,-52.02472686767578],[-73.3275146484375,-52.22361755371094],[-72.98861694335938,-52.06861114501953],[-72.86195373535156,-52.26416778564453],[-72.69833374023438,-51.98333740234375],[-72.570556640625,-52.315834045410156],[-72.89944458007812,-52.4586181640625],[-72.4908447265625,-52.31889343261719],[-72.46890258789062,-51.78916931152344],[-73.24362182617188,-51.46222686767578],[-72.56083679199219,-51.78166961669922],[-73.28140258789062,-51.61028289794922],[-72.92417907714844,-51.86333465576172],[-73.23695373535156,-52.090003967285156],[-73.38667297363281,-51.655555725097656],[-73.28361511230469,-52.155006408691406],[-73.5452880859375,-52.05639457702637],[-73.461669921875,-51.687225341796875],[-73.90583801269531,-51.62250518798828],[-73.89418029785156,-51.37000274658203],[-73.59806823730469,-51.61833953857422],[-73.711669921875,-51.15972900390625],[-74.25279235839844,-50.940834045410156],[-73.52862358093262,-50.714447021484375],[-73.56639099121094,-50.40167236328125],[-74.04833984375,-50.82750701904297],[-74.29306030273438,-50.48222351074219],[-73.88473510742188,-50.53889465332031],[-74.69361877441406,-50.203338623046875],[-73.8658447265625,-50.29389190673828],[-74.37251281738281,-49.99139404296875],[-73.885009765625,-50.06945037841797],[-74.32528686523438,-49.627227783203125],[-73.71250915527344,-49.757225036621094],[-74.11167907714844,-49.48027801513672],[-73.83416557312012,-49.02916717529297],[-74.3739013671875,-49.42750358581543],[-74.44972229003906,-48.812225341796875],[-74.06083679199219,-48.74139404296875],[-74.40028381347656,-48.61444854736328],[-74.04667663574219,-48.54778289794922],[-74.0211181640625,-48.413612365722656],[-74.65444946289062,-48.023895263671875],[-73.5533447265625,-48.24583435058594],[-73.274169921875,-48.08722686767578],[-73.6541748046875,-47.90361785888672],[-73.22084045410156,-48.00111389160156],[-73.71917724609375,-47.52833557128906],[-73.9344482421875,-47.846946716308594],[-74.74166870117188,-47.71583557128906],[-74.04112243652344,-47.61805725097656],[-74.5291748046875,-47.437782287597656],[-73.9344482421875,-47.03611755371094],[-74.2650146484375,-46.785560607910156],[-75.01390075683594,-46.750282287597656],[-74.94223022460938,-46.44000244140625],[-75.65472412109375,-46.76500701904297],[-75.41307067871094,-46.93389129638672],[-75.71751403808594,-46.72528076171875],[-74.36111450195312,-45.791114807128906],[-74.14083862304688,-45.80583953857422],[-73.97445678710938,-46.0947265625],[-74.0836181640625,-46.18611145019531],[-74.31167602539062,-46.249168395996094],[-74.49444580078125,-46.190284729003906],[-74.34083557128906,-46.266395568847656],[-74.04972839355469,-46.195556640625],[-73.85389709472656,-46.34722900390625],[-73.88278198242188,-46.14111328125],[-73.76806640625,-46.30278015136719],[-73.99501037597656,-46.56139373779297],[-73.84112358093262,-46.588890075683594],[-73.42556762695312,-46.07444763183594],[-73.69084167480469,-46.31916809082031],[-73.66334533691406,-45.97333526611328],[-73.18223571777344,-45.667503356933594],[-73.58723258972168,-45.77972412109375],[-73.51556396484375,-45.45500183105469],[-72.82722473144531,-45.42250061035156],[-73.44694519042969,-45.2852783203125],[-73.39167785644531,-44.980560302734375],[-73.14250183105469,-44.94445037841797],[-72.76611328125,-44.753334045410156],[-72.6138916015625,-44.4727783203125],[-73.28945922851562,-44.14361572265625],[-72.84584045410156,-43.77667236328125],[-73.11639404296875,-43.439727783203125],[-72.74528503417969,-43.04833984375],[-72.86083984375,-42.57444763183594],[-72.53500366210938,-42.559173583984375],[-72.84750366210938,-42.280006408691406],[-72.42140197753906,-42.45305633544922],[-72.46278381347656,-41.97111511230469],[-72.85945129394531,-41.906951904296875],[-72.35057067871094,-41.652503967285156],[-72.31001281738281,-41.43583679199219],[-72.57139587402344,-41.70777893066406],[-72.94667053222656,-41.48333740234375],[-73.20361328125,-41.792503356933594],[-73.75028991699219,-41.754722595214844],[-73.49195861816406,-41.520835876464844],[-73.86889457702637,-41.482505798339844],[-73.99501037597656,-40.970001220703125],[-73.22250366210938,-39.41472625732422],[-73.64334106445312,-37.2086181640625],[-73.19000244140625,-37.1380615234375],[-71.4425048828125,-32.64000701904297],[-71.70333862304688,-30.761669158935547],[-71.28779602050781,-29.89694595336914],[-71.52166557312012,-28.970001220703125],[-70.91084289550781,-27.6219482421875],[-70.44917297363281,-25.364723205566406],[-70.39111328125,-23.561946868896484],[-70.62251281738281,-23.492778778076172],[-70.0533447265625,-21.42565155029297],[-70.40548706054688,-18.34854507446289],[-69.95112609863281,-18.242778778076172],[-69.49972534179688,-17.505279541015625],[-69.48361206054688,-17.63555908203125]],[[-74.0694580078125,-46.00611114501953],[-74.16445922851562,-46.13667297363281],[-74.07223510742188,-46.0977783203125],[-74.0694580078125,-46.00611114501953]],[[-73.38528442382812,-52.74000358581543],[-73.32806396484375,-52.69944763183594],[-73.39805603027344,-52.732505798339844],[-73.38528442382812,-52.74000358581543]]]]}},{"type":"Feature","properties":{"name":"Cayman Islands","iso2":"KY","iso3":"CYM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-81.09722899999988,19.308887000000155],[-81.401123,19.28833],[-81.254456,19.353886],[-81.09722899999988,19.308887000000155]]],[[[-80.097504,19.654163],[-80.0758359999999,19.697498],[-79.966675,19.707222],[-80.097504,19.654163]]],[[[-79.866394,19.686943],[-79.893341,19.693333],[-79.732788,19.748608],[-79.866394,19.686943]]]]}},{"type":"Feature","properties":{"name":"Cameroon","iso2":"CM","iso3":"CMR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[9.687222,3.574722],[9.62611,3.551111000000105],[9.6425,3.578611000000123],[9.687222,3.574722]]],[[[14.577221,12.73860900000011],[15.042597,12.078888],[15.061666,10.789999000000108],[15.68185,9.989649],[14.194769000000122,9.98175],[13.957499000000155,9.638611],[15.201944,8.485832],[15.499008,7.526609],[14.41916700000013,6.035277],[14.732777,4.623055],[16.103054,2.898333],[16.207222,2.220833],[16.07222000000013,1.654166],[14.564999,2.169444],[13.293888,2.163611],[12.523611000000102,2.283333],[11.339764,2.168611],[10.02611,2.168056],[9.811764000000153,2.343698],[9.7225,3.865278],[8.975832000000139,4.09666600000017],[8.845833,4.638055000000151],[8.504166000000168,4.527778],[8.591738000000134,4.810932000000122],[8.865276,5.841944],[9.795555,6.801666],[10.615000000000123,7.06861],[11.340277,6.440833],[11.864166,7.084722],[12.253887000000134,8.408054],[12.79694400000011,8.769722],[13.80722,11.055832],[14.646387,11.575832],[14.645277,12.188332000000145],[14.174444,12.396666],[14.07472,13.0816650000001],[14.500875,13.001314],[14.577221,12.73860900000011]]]]}},{"type":"Feature","properties":{"name":"Chad","iso2":"TD","iso3":"TCD"},"geometry":{"type":"MultiPolygon","coordinates":[[[[14.500875,13.001314],[14.07472,13.0816650000001],[13.62512,13.718338],[13.468887,14.461111],[15.489166,16.914165],[15.996666,20.353054],[15.202499,21.495831],[14.997889,23.000591],[16.000832,23.450554],[24.002747,19.499065],[23.999603,15.698709],[22.937222000000105,15.561943],[22.935833,15.11611],[22.384163,14.55416500000014],[22.55499600000013,14.125555000000148],[22.084442,13.779165],[22.294167,13.35861],[21.827774,12.797499000000144],[22.46694200000013,12.621666],[22.866505,10.922447],[21.719444,10.639444],[21.715553,10.290554],[20.371666,9.108332],[18.988888,8.964167],[19.058792,8.578382],[18.588886,8.040277],[15.499008,7.526609],[15.201944,8.485832],[13.957499000000155,9.638611],[14.194769000000122,9.98175],[15.68185,9.989649],[15.061666,10.789999000000108],[15.042597,12.078888],[14.577221,12.73860900000011],[14.500875,13.001314]]]]}},{"type":"Feature","properties":{"name":"Comoros","iso2":"KM","iso3":"COM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[43.86055000000013,-12.356112],[43.66861,-12.3575],[43.622772,-12.258335],[43.86055000000013,-12.356112]]],[[[44.487495,-12.093056],[44.513611,-12.38028],[44.206665,-12.161945],[44.487495,-12.093056]]],[[[43.459717000000154,-11.935556],[43.219162000000125,-11.761112],[43.281387,-11.379723],[43.459717000000154,-11.935556]]]]}},{"type":"Feature","properties":{"name":"Colombia","iso2":"CO","iso3":"COL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-78.12139892578125,2.500833511352539],[-78.21556091308594,2.577779769897461],[-78.18917846679688,2.640554428100586],[-78.12779235839844,2.643056869506836],[-78.0916748046875,2.539445877075195],[-78.12139892578125,2.500833511352539]]],[[[-77.98638916015625,2.542501449584961],[-78.04556274414062,2.58305549621582],[-77.97750854492188,2.651945114135742],[-77.94833374023438,2.627779006958008],[-77.96028137207031,2.557222366333008],[-77.98638916015625,2.542501449584961]]],[[[-77.85751342773438,2.573335647583008],[-77.92111206054688,2.693891525268555],[-77.78695678710938,2.592779159545898],[-77.85751342773438,2.573335647583008]]],[[[-77.76972961425781,2.591390609741211],[-77.83973693847656,2.640279769897461],[-77.88473510742188,2.717222213745117],[-77.82778930664062,2.703889846801758],[-77.74972534179688,2.614999771118164],[-77.76972961425781,2.591390609741211]]],[[[-77.56889343261719,3.06916618347168],[-77.66278076171875,3.075834274291992],[-77.53056335449219,3.209444046020508],[-77.56889343261719,3.06916618347168]]],[[[-77.44833374023438,4.074167251586914],[-77.53556823730469,4.16722297668457],[-77.49417114257812,4.204168319702148],[-77.44833374023438,4.074167251586914]]],[[[-77.54306030273438,4.193334579467773],[-77.42611694335938,4.334722518920898],[-77.31973266601562,4.251665115356445],[-77.54306030273438,4.193334579467773]]],[[[-71.56361389160156,12.453611373901367],[-71.1158447265625,12.101110458374023],[-71.32472229003906,11.853055953979492],[-71.97723388671875,11.664999008178711],[-72.2093505859375,11.250001907348633],[-72.49305725097656,11.121110916137695],[-73.37806701660156,9.171388626098633],[-72.77972412109375,9.080278396606445],[-72.32528686523438,8.095556259155273],[-72.4716796875,7.491945266723633],[-72,7.018888473510742],[-70.11917114257812,6.975835800170898],[-69.24528503417969,6.081388473510742],[-67.45445251464844,6.193056106567383],[-67.85972595214844,4.558610916137695],[-67.29055786132812,3.397500991821289],[-67.82833862304688,2.825002670288086],[-67.1925048828125,2.392499923706055],[-66.87188720703125,1.221643447875977],[-67.07667541503906,1.173334121704102],[-67.42417907714844,2.143888473510742],[-67.91473388671875,1.745279312133789],[-68.19639587402344,1.977502822875977],[-68.15306091308594,1.72416877746582],[-69.84609985351562,1.710454940795898],[-69.84222412109375,1.072221755981445],[-69.27000427246094,1.038335800170898],[-69.12472534179688,0.645002365112305],[-70.04417419433594,0.59083366394043],[-70.05805969238281,-0.157499313354492],[-69.60751342773438,-0.517499923706055],[-69.37806701660156,-1.338054656982422],[-69.95692443847656,-4.236873626708984],[-70.72416687011719,-3.779722213745117],[-70.0675048828125,-2.755556106567383],[-70.28834533691406,-2.504999160766602],[-71.69805908203125,-2.146944046020508],[-72.8819580078125,-2.506387710571289],[-73.55639457702637,-1.370832443237305],[-74.22723388671875,-1.027776718139648],[-74.77694702148438,-0.204166412353516],[-75.28584289550781,-0.119722366333008],[-76.24305725097656,0.39555549621582],[-77.37945556640625,0.384721755981445],[-78.5916748046875,1.24305534362793],[-78.80972290039062,1.437780380249023],[-79.0533447265625,1.628332138061523],[-78.58416557312012,1.768888473510742],[-78.56529235839844,2.429166793823242],[-78.44056701660156,2.509443283081055],[-78.34361267089844,2.436666488647461],[-78.2650146484375,2.519166946411133],[-78.12556457519531,2.486944198608398],[-77.98695373535156,2.522500991821289],[-77.94862365722656,2.559446334838867],[-77.94000244140625,2.655000686645508],[-77.86723327636719,2.560277938842773],[-77.79251098632812,2.567499160766602],[-77.7408447265625,2.60472297668457],[-77.02862358093262,3.917779922485352],[-77.43417358398438,4.02833366394043],[-77.23918151855469,4.260000228881836],[-77.38417053222656,4.341943740844727],[-77.3477783203125,5.240556716918945],[-77.5322265625,5.518888473510742],[-77.2408447265625,5.75139045715332],[-77.49028015136719,6.190832138061523],[-77.34001159667969,6.567777633666992],[-77.88972473144531,7.228891372680664],[-77.74667358398438,7.722223281860352],[-77.57389831542969,7.525278091430664],[-77.21556091308594,7.937223434448242],[-77.36666870117188,8.67500114440918],[-76.75527954101562,7.918889999389648],[-76.9283447265625,8.568334579467773],[-75.62945556640625,9.453611373901367],[-75.26972961425781,10.798334121704102],[-74.86080932617188,11.125486373901367],[-74.28861999511719,11.002500534057617],[-74.59222412109375,10.878053665161133],[-74.39056396484375,10.74305534362793],[-74.15501403808594,11.331388473510742],[-73.28445434570312,11.295557022094727],[-71.56361389160156,12.453611373901367]],[[-78.5452880859375,2.416112899780273],[-78.54417419433594,2.432500839233398],[-78.55029296875,2.433332443237305],[-78.55361938476562,2.406667709350586],[-78.5452880859375,2.416112899780273]]],[[[-81.71028137207031,12.490835189819336],[-81.7197265625,12.55000114440918],[-81.68833923339844,12.59111213684082],[-81.71028137207031,12.490835189819336]]],[[[-81.36557006835938,13.323057174682617],[-81.38945007324219,13.335000991821289],[-81.35389709472656,13.378610610961914],[-81.36557006835938,13.323057174682617]]]]}},{"type":"Feature","properties":{"name":"Costa Rica","iso2":"CR","iso3":"CRI"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-85.115845,10.07361],[-85.17611699999989,10.077499],[-85.198059,10.110554],[-85.161957,10.122499],[-85.109177,10.105833],[-85.115845,10.07361]]],[[[-85.087784,11.009998],[-83.915558,10.708611],[-83.645798,10.924847],[-82.563568,9.562876000000145],[-82.934723,9.471666],[-82.71084599999989,8.93111],[-82.898849,8.025669],[-83.341675,8.726944000000117],[-83.291122,8.370277],[-83.730835,8.583055],[-83.624176,9.035276000000124],[-84.61527999999987,9.575832000000105],[-84.74028,9.966665],[-85.243057,10.204166],[-85.228622,10.088888],[-84.897232,9.807499],[-85.142227,9.589443],[-85.664459,9.908609000000126],[-85.861679,10.368332000000123],[-85.631958,10.626389],[-85.91139199999986,10.891109],[-85.692383,11.076061],[-85.087784,11.009998]]]]}},{"type":"Feature","properties":{"name":"Central African Republic","iso2":"CF","iso3":"CAF"},"geometry":{"type":"MultiPolygon","coordinates":[[[[19.058792,8.578382],[18.988888,8.964167],[20.371666,9.108332],[21.715553,10.290554],[21.719444,10.639444],[22.866505,10.922447],[23.669167,9.866943],[23.517776,8.714167],[24.201111,8.686943],[24.192497000000117,8.30361],[25.25333,7.850555],[25.206944000000135,7.497499],[26.404999,6.646388],[26.437496000000124,6.077777],[27.142776,5.771944],[27.455276,5.016388],[25.891666,5.192499],[25.542221,5.381389],[24.734444,4.910832000000141],[24.394165,5.115555],[23.420277,4.59111],[22.895832,4.821111],[22.37916600000014,4.1275],[20.585552,4.410000000000139],[19.421387,5.134166],[18.541943,4.335555],[18.624958,3.479444],[17.475277,3.713055],[16.659721,3.533333],[16.207222,2.220833],[16.103054,2.898333],[14.732777,4.623055],[14.41916700000013,6.035277],[15.499008,7.526609],[18.588886,8.040277],[19.058792,8.578382]]]]}},{"type":"Feature","properties":{"name":"Cuba","iso2":"CU","iso3":"CUB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-78.32778930664062,20.513612747192383],[-78.45834350585938,20.605554580688477],[-78.34584045410156,20.56944465637207],[-78.32778930664062,20.513612747192383]]],[[[-78.3819580078125,20.63777732849121],[-78.4122314453125,20.6472225189209],[-78.40278625488281,20.675832748413086],[-78.3819580078125,20.63777732849121]]],[[[-78.44168090820312,20.710554122924805],[-78.54750061035156,20.703611373901367],[-78.4586181640625,20.73166847229004],[-78.44168090820312,20.710554122924805]]],[[[-78.76750183105469,20.70611000061035],[-78.82194519042969,20.75694465637207],[-78.76362609863281,20.730554580688477],[-78.76750183105469,20.70611000061035]]],[[[-75.48722839355469,20.7288875579834],[-75.57806396484375,20.781110763549805],[-75.5150146484375,20.79194450378418],[-75.48722839355469,20.7288875579834]]],[[[-78.84750366210938,20.771665573120117],[-78.96583557128906,20.809999465942383],[-78.93167114257812,20.834165573120117],[-78.84750366210938,20.771665573120117]]],[[[-78.977783203125,20.839445114135742],[-79.0775146484375,20.893888473510742],[-78.9697265625,20.87416648864746],[-78.977783203125,20.839445114135742]]],[[[-79.08445739746094,20.898332595825195],[-79.22557067871094,21.00055503845215],[-79.17668151855469,21.00861167907715],[-79.08445739746094,20.898332595825195]]],[[[-79.30223083496094,21.064443588256836],[-79.38417053222656,21.119722366333008],[-79.34140014648438,21.121110916137695],[-79.30223083496094,21.064443588256836]]],[[[-79.40640258789062,21.10472297668457],[-79.45112609863281,21.122777938842773],[-79.40251159667969,21.121110916137695],[-79.40640258789062,21.10472297668457]]],[[[-81.53083801269531,21.600278854370117],[-81.55694580078125,21.622777938842773],[-81.36695861816406,21.711942672729492],[-81.53083801269531,21.600278854370117]]],[[[-82.5452880859375,21.57111167907715],[-82.89723205566406,21.43277931213379],[-83.19306945800781,21.621389389038086],[-82.93722534179688,21.579999923706055],[-83.08944702148438,21.785554885864258],[-82.97445678710938,21.942777633666992],[-82.5452880859375,21.57111167907715]]],[[[-77.91505432128906,22.094697952270508],[-77.65333557128906,22.06972312927246],[-77.63833618164062,21.953054428100586],[-77.91505432128906,22.094697952270508]]],[[[-77.84638977050781,22.10638999938965],[-78.04417419433594,22.18666648864746],[-77.99751281738281,22.285276412963867],[-77.84638977050781,22.10638999938965]]],[[[-77.77723693847656,22.19500160217285],[-77.77166557312012,22.168054580688477],[-77.85000610351562,22.294721603393555],[-77.77723693847656,22.19500160217285]]],[[[-78.11862182617188,22.413888931274414],[-78.01945495605469,22.261945724487305],[-78.3114013671875,22.40389060974121],[-78.11862182617188,22.413888931274414]]],[[[-78.34140014648438,22.53388786315918],[-78.42529296875,22.412500381469727],[-78.69667053222656,22.51472282409668],[-78.34140014648438,22.53388786315918]]],[[[-78.97639465332031,22.63749885559082],[-79.05445861816406,22.6652774810791],[-78.96890258789062,22.66916847229004],[-78.97639465332031,22.63749885559082]]],[[[-79.32305908203125,22.614721298217773],[-79.63250732421875,22.80000114440918],[-79.57612609863281,22.809999465942383],[-79.32305908203125,22.614721298217773]]],[[[-79.89195251464844,22.928335189819336],[-79.9586181640625,22.947500228881836],[-79.883056640625,22.96527671813965],[-79.89195251464844,22.928335189819336]]],[[[-80.2327880859375,22.9950008392334],[-80.23417663574219,22.956388473510742],[-80.34945678710938,22.98166847229004],[-80.2327880859375,22.9950008392334]]],[[[-80.04945373535156,23.02610969543457],[-80.07722473144531,23.04194450378418],[-80.07667541503906,23.074445724487305],[-80.04945373535156,23.02610969543457]]],[[[-80.14639282226562,23.070276260375977],[-80.22416687011719,23.099443435668945],[-80.19944763183594,23.121946334838867],[-80.14639282226562,23.070276260375977]]],[[[-80.92750358581543,23.12555503845215],[-80.79722595214844,23.150556564331055],[-80.97361755371094,23.107500076293945],[-80.92750358581543,23.12555503845215]]],[[[-82.00389099121094,23.18638801574707],[-81.58056640625,23.155553817749023],[-81.50083923339844,23.05555534362793],[-81.22695922851562,23.161664962768555],[-81.28556823730469,23.119722366333008],[-81.13473510742188,23.023054122924805],[-80.633056640625,23.09833335876465],[-80.54444885253906,22.99110984802246],[-80.27862358093262,22.9052791595459],[-80.03334045410156,22.951112747192383],[-77.34112358093262,21.636110305786133],[-77.54306030273438,21.918611526489258],[-76.8961181640625,21.3063907623291],[-75.70722961425781,21.121946334838867],[-75.73667907714844,20.696943283081055],[-74.14140319824219,20.252222061157227],[-75.08528137207031,19.893041610717773],[-75.13973999023438,19.962873458862305],[-75.1591796875,19.960695266723633],[-75.22372436523438,19.90155601501465],[-77.72250366210938,19.83277702331543],[-77.1158447265625,20.364999771118164],[-77.23638916015625,20.663057327270508],[-78.05029296875,20.69972038269043],[-78.75028991699219,21.6391658782959],[-79.98779296875,21.72361183166504],[-80.49195861816406,22.177221298217773],[-81.82305908203125,22.183610916137695],[-82.16307067871094,22.398332595825195],[-81.64889526367188,22.49138832092285],[-81.885009765625,22.68083381652832],[-82.76390075683594,22.7005558013916],[-84.026123046875,21.91499900817871],[-84.95333862304688,21.85999870300293],[-84.33805847167969,22.01222038269043],[-84.07695007324219,22.660554885864258],[-82.00389099121094,23.18638801574707]]],[[[-80.49305725097656,23.18805503845215],[-80.57972717285156,23.176111221313477],[-80.55862426757812,23.203611373901367],[-80.49305725097656,23.18805503845215]]]]}},{"type":"Feature","properties":{"name":"Cape Verde","iso2":"CV","iso3":"CPV"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-24.368336,14.812222],[-24.52528,14.92111],[-24.381668,15.047499],[-24.368336,14.812222]]],[[[-23.446667,14.982777000000112],[-23.681393,14.935555],[-23.76667,15.253054],[-23.446667,14.982777000000112]]],[[[-22.706112,16.036388],[-22.957779,16.089443],[-22.79861499999987,16.23527500000013],[-22.706112,16.036388]]],[[[-24.034168,16.594166],[-24.32139199999989,16.482777],[-24.432224,16.644165],[-24.034168,16.594166]]],[[[-24.926113,16.799999000000142],[-25.093334,16.83083],[-24.933056,16.921387],[-24.926113,16.799999000000142]]],[[[-25.28139099999987,16.91333],[-25.33028,17.096386],[-24.97444499999989,17.112778],[-25.28139099999987,16.91333]]]]}},{"type":"Feature","properties":{"name":"Cook Islands","iso2":"CK","iso3":"COK"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-157.890564,-21.938053],[-157.962799,-21.904167],[-157.921967,-21.880283],[-157.890564,-21.938053]]],[[[-159.741119,-21.254169],[-159.833893,-21.195831],[-159.752502,-21.193054],[-159.741119,-21.254169]]],[[[-157.316437,-20.188053],[-157.332214,-20.13306],[-157.309174,-20.147781],[-157.316437,-20.188053]]],[[[-158.098358,-20.016113],[-158.118591,-19.973057],[-158.08197,-19.986942],[-158.098358,-20.016113]]],[[[-158.27948,-19.817783],[-158.262512,-19.836666],[-158.291382,-19.833332],[-158.27948,-19.817783]]],[[[-157.708649,-19.853054],[-157.741364,-19.814167],[-157.713928,-19.770283],[-157.708649,-19.853054]]],[[[-158.92865,-19.270283],[-158.943909,-19.27195],[-158.951935,-19.242496],[-158.92865,-19.270283]]],[[[-159.78833,-18.890556],[-159.803345,-18.861389],[-159.78421,-18.841393],[-159.78833,-18.890556]]],[[[-163.16333,-18.089443],[-163.170319,-18.079449],[-163.154724,-18.056667],[-163.16333,-18.089443]]],[[[-165.422241,-11.548334],[-165.435028,-11.5375],[-165.414185,-11.537781],[-165.422241,-11.548334]]],[[[-165.82666,-10.888334],[-165.850281,-10.884169],[-165.831146,-10.876945],[-165.82666,-10.888334]]],[[[-161.022827,-10.431391],[-161.043335,-10.419724],[-161.048615,-10.392778],[-161.022827,-10.431391]]],[[[-160.975586,-10.395555],[-161.012512,-10.352777],[-160.973602,-10.378057],[-160.975586,-10.395555]]],[[[-161.084442,-10.041945],[-161.090576,-10.018333],[-161.072266,-10.008059],[-161.084442,-10.041945]]],[[[-157.941681,-8.982502],[-157.97226,-8.981943],[-158.008362,-8.951389],[-157.941681,-8.982502]]]]}},{"type":"Feature","properties":{"name":"Cyprus","iso2":"CY","iso3":"CYP"},"geometry":{"type":"MultiPolygon","coordinates":[[[[33.652618,35.354103],[34.590271,35.690277],[33.921387,35.272774],[34.083328,34.959442],[33.030838,34.56255],[32.274162,35.043884],[33.652618,35.354103]]]]}},{"type":"Feature","properties":{"name":"Denmark","iso2":"DK","iso3":"DNK"},"geometry":{"type":"MultiPolygon","coordinates":[[[[11.513887,54.829720000000165],[11.85611,54.683327000000176],[10.98989100000017,54.790848],[11.513887,54.829720000000165]]],[[[12.038055,54.892494],[11.964443,54.561661],[11.708611,54.936661000000115],[12.038055,54.892494]]],[[[10.432777000000101,54.84166],[10.248333000000173,54.90416],[10.184166,54.97361],[10.432777000000101,54.84166]]],[[[12.557499,54.96416500000011],[12.11583300000018,54.90416],[12.311943,55.03527100000015],[12.557499,54.96416500000011]]],[[[10.615000000000123,54.950272],[10.49861,55.006386],[10.631943,55.043327],[10.615000000000123,54.950272]]],[[[9.79250000000016,55.074997000000124],[10.071110000000147,54.87471000000012],[9.630554000000103,55.04943800000011],[9.79250000000016,55.074997000000124]]],[[[10.756943000000149,54.777222],[10.681944,54.908607],[10.949165,55.16111],[10.756943000000149,54.777222]]],[[[15.051666,54.994995000000145],[14.679722,55.099716],[14.746387,55.295555000000135],[15.051666,54.994995000000145]]],[[[8.46361,55.33416],[8.360277,55.457771],[8.458332,55.426384],[8.46361,55.33416]]],[[[10.745277000000101,55.482216],[10.782776,55.122498],[10.497776,55.028885],[10.152777,55.084442],[10.11861,55.178886],[10.005833,55.193329],[9.896944,55.279716],[9.810833,55.436661],[9.675554,55.499161000000115],[9.74861,55.540276000000105],[9.813055,55.547493],[9.904999,55.505829000000105],[10.309721000000138,55.616943],[10.478611,55.438049000000106],[10.619165000000123,55.619164],[10.745277000000101,55.482216]]],[[[12.579443,55.551384],[12.606110000000115,55.696106],[12.67861,55.590553],[12.579443,55.551384]]],[[[10.630554,55.865555],[10.527498,55.765831],[10.523611,55.981384],[10.630554,55.865555]]],[[[12.567221,55.992218],[12.190832,55.478607],[12.461666,55.286385],[12.071943,54.968605000000125],[11.246666,55.199715],[10.873610000000156,55.732498],[11.763887,55.964722],[12.057220000000143,55.653328000000116],[11.859444,55.96666000000012],[12.567221,55.992218]]],[[[11.565832,56.67083000000012],[11.503332000000114,56.707771],[11.648054000000116,56.72332800000011],[11.565832,56.67083000000012]]],[[[8.924721,56.91861],[8.766943,56.692215000000104],[8.509722,56.74166100000015],[8.924721,56.91861]]],[[[9.974274,57.071732000000125],[10.311891,56.981304],[10.305277,56.748055],[9.866388000000171,56.650276],[10.963055,56.439438],[10.24679,56.17855100000013],[9.992777,55.704994],[9.549999,55.7058260000001],[9.81916600000011,55.604721],[9.704166,55.53110500000015],[9.588333,55.421661],[9.68861,55.196938],[9.459166,55.123886],[9.768055,54.89110600000011],[9.445358,54.825401],[8.664545,54.913094],[8.623888,55.427498],[8.087221,55.548882],[8.127222,55.98555],[8.397221,55.897499],[8.108332,56.017776000000126],[8.165277,56.653328],[8.728333,56.482216],[9.075567,56.807449],[9.321665,56.525551000000135],[9.178200000000118,56.916031],[9.309444000000155,57.001938],[9.974274,57.071732000000125]]],[[[11.195833,57.31082900000017],[10.997499000000118,57.223328],[10.854443000000117,57.263054],[11.195833,57.31082900000017]]],[[[10.43249900000012,57.592216],[10.336616,56.991665],[10.006666,57.0899890000001],[9.24388900000011,56.995552],[9.115549,57.05277300000013],[8.670832000000132,56.945274],[8.415797,56.67812700000012],[8.591389,56.686104],[8.554998,56.582497],[8.240276,56.70722200000013],[8.617222,57.121666],[10.645953000000134,57.736267],[10.43249900000012,57.592216]]]]}},{"type":"Feature","properties":{"name":"Djibouti","iso2":"DJ","iso3":"DJI"},"geometry":{"type":"MultiPolygon","coordinates":[[[[42.866806,11.585428],[43.249222,11.469534],[42.944092,11.002438],[41.789719,11.008055],[41.828606,11.74],[42.399719,12.469721],[43.12138400000018,12.708332],[43.413887,12.056944],[42.508606,11.567221],[42.866806,11.585428]]]]}},{"type":"Feature","properties":{"name":"Dominica","iso2":"DM","iso3":"DMA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-61.363617,15.198055],[-61.452225,15.631943],[-61.253334,15.461388],[-61.363617,15.198055]]]]}},{"type":"Feature","properties":{"name":"Dominican Republic","iso2":"DO","iso3":"DOM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-71.532227,17.540276],[-71.522232,17.615276],[-71.46305799999988,17.581944],[-71.532227,17.540276]]],[[[-68.574448,18.129444],[-68.731949,18.119999],[-68.78389,18.195],[-68.574448,18.129444]]],[[[-70.783615,19.846664],[-69.936401,19.67110800000013],[-69.75361599999985,19.289444000000103],[-69.22167999999988,19.362221],[-69.631668,19.101665],[-68.729172,18.952774],[-68.32556199999988,18.616665],[-68.4497219999999,18.35583100000015],[-69.881668,18.469444],[-70.510834,18.194721],[-70.690002,18.433887],[-71.079727,18.301109],[-71.4225009999999,17.601944],[-71.767868,18.038502],[-72.003067,18.60083],[-71.715836,18.749722],[-71.754181,19.70583000000012],[-70.783615,19.846664]]]]}},{"type":"Feature","properties":{"name":"Ecuador","iso2":"EC","iso3":"ECU"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-80.19334411621094,-3.034721374511719],[-80.20668029785156,-2.724166870117188],[-79.90306091308594,-2.719720840454102],[-80.19334411621094,-3.034721374511719]]],[[[-79.838623046875,-2.641944885253906],[-79.88694763183594,-2.626943588256836],[-79.85667419433594,-2.466667175292969],[-79.838623046875,-2.641944885253906]]],[[[-89.62112426757812,-1.406665802001953],[-89.751953125,-1.360832214355469],[-89.64834594726562,-1.343889236450195],[-89.62112426757812,-1.406665802001953]]],[[[-90.4344482421875,-1.355278015136719],[-90.48167419433594,-1.219165802001953],[-90.3658447265625,-1.269166946411133],[-90.4344482421875,-1.355278015136719]]],[[[-90.0433349609375,-0.838888168334961],[-90.08222961425781,-0.801111221313477],[-90.03973388671875,-0.809444427490234],[-90.0433349609375,-0.838888168334961]]],[[[-89.44361877441406,-0.936666488647461],[-89.62945556640625,-0.927221298217773],[-89.25862121582031,-0.6875],[-89.44361877441406,-0.936666488647461]]],[[[-90.26055908203125,-0.751110076904297],[-90.5352783203125,-0.583889007568359],[-90.19056701660156,-0.542778015136719],[-90.26055908203125,-0.751110076904297]]],[[[-91.4989013671875,-0.496110916137695],[-91.66389465332031,-0.316110610961914],[-91.47111511230469,-0.248056411743164],[-91.4989013671875,-0.496110916137695]]],[[[-90.54750061035156,-0.305000305175781],[-90.87445068359375,-0.270000457763672],[-90.7933349609375,-0.149442672729492],[-90.54750061035156,-0.305000305175781]]],[[[-91.21890258789062,-0.011110305786133],[-90.81083679199219,-0.732500076293945],[-91.37611389160156,-1.026666641235352],[-91.08056640625,-0.587221145629883],[-91.6058349609375,-0.004999160766602],[-91.21890258789062,-0.011110305786133]]],[[[-90.45916557312012,0.266389846801758],[-90.53250122070312,0.34666633605957],[-90.40834045410156,0.326944351196289],[-90.45916557312012,0.266389846801758]]],[[[-90.75111389160156,0.547502517700195],[-90.79972839355469,0.563333511352539],[-90.792236328125,0.651666641235352],[-90.75111389160156,0.547502517700195]]],[[[-78.5916748046875,1.24305534362793],[-77.37945556640625,0.384721755981445],[-76.24305725097656,0.39555549621582],[-75.28584289550781,-0.119722366333008],[-75.62796020507812,-0.108858108520508],[-75.21607971191406,-0.965335845947266],[-75.55917358398438,-1.53416633605957],[-76.66062927246094,-2.572134017944336],[-78.33750915527344,-3.42277717590332],[-78.70903015136719,-4.584787368774414],[-79.05482482910156,-5.009132385253906],[-79.64973258972168,-4.432777404785156],[-80.46778869628906,-4.43889045715332],[-80.46722412109375,-3.986944198608398],[-80.15333557128906,-3.884227752685547],[-80.34042358398438,-3.380516052246094],[-79.94805908203125,-3.198333740234375],[-79.72750854492188,-2.602777481079102],[-79.84584045410156,-2.376388549804688],[-79.76362609863281,-2.009166717529297],[-80.25639343261719,-2.73638916015625],[-80.8900146484375,-2.320554733276367],[-80.91111755371094,-1.031110763549805],[-80.26472473144531,-0.627222061157227],[-80.501953125,-0.367500305175781],[-80.06834411621094,0.062780380249023],[-80.05972290039062,0.828611373901367],[-78.80972290039062,1.437780380249023],[-78.5916748046875,1.24305534362793]],[[-78.9122314453125,1.239168167114258],[-78.90333557128906,1.367780685424805],[-78.9989013671875,1.274999618530273],[-78.9122314453125,1.239168167114258]]]]}},{"type":"Feature","properties":{"name":"Egypt","iso2":"EG","iso3":"EGY"},"geometry":{"type":"MultiPolygon","coordinates":[[[[34.026384353637695,27.498334884643555],[34.041940689086914,27.44222068786621],[33.917497634887695,27.52638816833496],[34.026384353637695,27.498334884643555]]],[[[32.04722023010254,31.14333152770996],[32.04277229309082,31.158056259155273],[32.049997329711914,31.15333366394043],[32.04722023010254,31.14333152770996]]],[[[33.47666358947754,31.13749885559082],[33.26666450500488,31.21527671813965],[33.40055274963379,31.181665420532227],[33.47666358947754,31.13749885559082]]],[[[33.19527626037598,31.232778549194336],[33.26138496398926,31.214998245239258],[33.10166358947754,31.22722053527832],[32.97666358947754,31.168333053588867],[33.09610939025879,31.232500076293945],[33.19527626037598,31.232778549194336]]],[[[25.316667556762695,31.50111198425293],[27.33111000061035,31.374998092651367],[29.06944465637207,30.821664810180664],[31.02777671813965,31.600557327270508],[31.921480178833008,31.52988624572754],[32.20499610900879,31.28999900817871],[31.899999618530273,31.531110763549805],[31.773889541625977,31.271665573120117],[32.14306831359863,31.074167251586914],[32.21055030822754,31.288057327270508],[32.71721839904785,31.032499313354492],[33.11166572570801,31.193056106567383],[33.14972114562988,31.101667404174805],[33.14361000061035,31.058332443237305],[33.41055488586426,31.154722213745117],[33.53277778625488,31.116945266723633],[33.7438907623291,31.133333206176758],[34.21666145324707,31.323331832885742],[34.26758003234863,31.216543197631836],[34.9038028717041,29.48670768737793],[34.25444221496582,27.728612899780273],[33.24277687072754,28.554445266723633],[32.57499885559082,30.005277633666992],[32.340829849243164,29.59694480895996],[33.55888557434082,27.883054733276367],[35.13861274719238,24.517499923706055],[35.81305122375488,23.916112899780273],[35.48305702209473,23.93833351135254],[35.67055702209473,22.96583366394043],[36.88846778869629,22.000112533569336],[31.453889846801758,21.998334884643555],[31.455556869506836,22.232221603393555],[31.2711124420166,21.998334884643555],[25.00142478942871,21.999696731567383],[24.997777938842773,29.24888801574707],[24.706666946411133,30.168611526489258],[25.15166664123535,31.646944046020508],[25.316667556762695,31.50111198425293]],[[34.00139045715332,26.707223892211914],[33.99472236633301,26.749723434448242],[33.96000099182129,26.788331985473633],[34.00139045715332,26.707223892211914]]]]}},{"type":"Feature","properties":{"name":"Ireland","iso2":"IE","iso3":"IRL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-9.656389236450195,53.22222328186035],[-9.724723815917969,53.26805305480957],[-9.660833358764648,53.28000068664551],[-9.656389236450195,53.22222328186035]]],[[[-9.964168548583984,54.01861000061035],[-9.955001831054688,53.876665115356445],[-10.268611907958984,53.97500038146973],[-9.964168548583984,54.01861000061035]]],[[[-8.518611907958984,54.96416664123535],[-8.546945571899414,55.01194190979004],[-8.490556716918945,54.99472236633301],[-8.518611907958984,54.96416664123535]]],[[[-7.406389236450195,54.95333290100098],[-8.159444808959961,54.44194221496582],[-7.559444427490234,54.12693977355957],[-7.030834197998047,54.41777229309082],[-6.266975402832031,54.09983253479004],[-6.013055801391602,52.94500160217285],[-6.361110687255859,52.177499771118164],[-6.994722366333008,52.28277778625488],[-9.234167098999023,51.48055458068848],[-9.817501068115234,51.4455509185791],[-9.53555679321289,51.75000190734863],[-10.132501602172852,51.593332290649414],[-9.57750129699707,51.87221717834473],[-10.338592529296875,51.78292274475098],[-9.75777816772461,52.14860725402832],[-10.460834503173828,52.18222236633301],[-8.818334579467773,52.66555213928223],[-9.936389923095703,52.55583381652832],[-8.941112518310547,53.26416206359863],[-10.175834655761719,53.40777778625488],[-9.561389923095703,53.85972023010254],[-9.940555572509766,53.86694526672363],[-9.787778854370117,53.94194221496582],[-10.006111145019531,54.218889236450195],[-10.124444961547852,54.096384048461914],[-10.112222671508789,54.229997634887695],[-8.471668243408203,54.27388954162598],[-8.6683349609375,54.349443435668945],[-8.188333511352539,54.63360786437988],[-8.800834655761719,54.691667556762695],[-8.317501068115234,55.10888862609863],[-7.657499313354492,55.27443885803223],[-7.681388854980469,54.94832801818848],[-7.393888473510742,55.37944221496582],[-6.931667327880859,55.2358341217041],[-7.252506256103516,55.07059669494629],[-7.406389236450195,54.95333290100098]],[[-8.436944961547852,54.94444465637207],[-8.43861198425293,54.955278396606445],[-8.453889846801758,54.95499610900879],[-8.436944961547852,54.94444465637207]]]]}},{"type":"Feature","properties":{"name":"Equatorial Guinea","iso2":"GQ","iso3":"GNQ"},"geometry":{"type":"MultiPolygon","coordinates":[[[[5.641388,-1.474722],[5.615277,-1.469167],[5.633888000000184,-1.420556],[5.641388,-1.474722]]],[[[10.02611,2.168056],[11.339764,2.168611],[11.353888,1.001944],[9.803976,1.002608],[9.356943,1.167222],[9.811764000000153,2.343698],[10.02611,2.168056]]],[[[8.856667,3.499444],[8.44611,3.27444400000013],[8.68611,3.741666000000109],[8.958887000000175,3.703888],[8.856667,3.499444]]]]}},{"type":"Feature","properties":{"name":"Estonia","iso2":"EE","iso3":"EST"},"geometry":{"type":"MultiPolygon","coordinates":[[[[23.990829,58.099998],[23.947773,58.147217],[24.022186,58.142746],[23.990829,58.099998]]],[[[22.990829,58.597771],[23.332775,58.441658],[21.994160000000193,57.922768],[22.201385,58.144714],[21.83194,58.5049970000001],[22.990829,58.597771]]],[[[23.364998,58.529991],[23.05777400000011,58.60833000000015],[23.247459,58.671051],[23.364998,58.529991]]],[[[23.27722200000011,58.963051],[23.110828,59.024712],[23.391663,58.998047],[23.27722200000011,58.963051]]],[[[22.7497180000002,59],[23.045277000000112,58.83638],[22.042221,58.939987],[22.7497180000002,59]]],[[[25.780277000000126,59.62887600000012],[28.015831,59.4786],[28.170359,59.30978],[27.426105,58.81360600000012],[27.82305100000019,57.87387800000012],[27.372059,57.535637],[26.511387,57.5261],[25.294998000000106,58.084435],[24.314980000000105,57.871826],[24.555553,58.327217],[23.728607,58.370827],[23.495548,58.694153],[23.874996,58.7686],[23.483051000000103,58.80999],[23.464161,59.206383],[25.780277000000126,59.62887600000012]]]]}},{"type":"Feature","properties":{"name":"Eritrea","iso2":"ER","iso3":"ERI"},"geometry":{"type":"MultiPolygon","coordinates":[[[[40.087219,15.851665],[40.419441,15.573889000000136],[39.977776,15.605],[40.087219,15.851665]]],[[[40.113327,16.05583200000011],[39.979721,16.012218000000118],[40.030273,16.095276],[40.113327,16.05583200000011]]],[[[38.797775,17.653332],[39.7211070000001,15.084166],[39.881386,15.489443],[40.17083,14.973610000000136],[41.170555,14.6325],[43.12138400000018,12.708332],[42.399719,12.469721],[40.228058,14.443506],[39.024021,14.655162000000146],[38.44944000000012,14.4175],[37.91138500000014,14.88361],[37.572212,14.102253],[37.291664,14.451944],[36.5428160000001,14.262053],[36.44328300000021,15.149952],[36.97305300000019,16.269444],[36.995827,17.073887],[37.423286000000104,17.034214],[38.600693,17.994881],[38.797775,17.653332]]]]}},{"type":"Feature","properties":{"name":"El Salvador","iso2":"SV","iso3":"SLV"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-87.686401,13.168333],[-87.72168,13.168055],[-87.723068,13.214722],[-87.686401,13.168333]]],[[[-89.339737,14.416111],[-88.47084,13.855276],[-87.75029,13.864166],[-87.815582,13.405386000000107],[-87.93779,13.156387],[-88.53862,13.194166],[-90.09639,13.745832],[-89.348312,14.431982],[-89.339737,14.416111]]]]}},{"type":"Feature","properties":{"name":"Ethiopia","iso2":"ET","iso3":"ETH"},"geometry":{"type":"MultiPolygon","coordinates":[[[[36.5428160000001,14.262053],[37.291664,14.451944],[37.572212,14.102253],[37.91138500000014,14.88361],[38.44944000000012,14.4175],[39.024021,14.655162000000146],[40.228058,14.443506],[42.399719,12.469721],[41.828606,11.74],[41.789719,11.008055],[42.944092,11.002438],[42.663055,10.6325],[42.848053,10.22361],[44.010551,9.007221],[47.01194,8.00111],[47.988243,8.004107],[44.950829,4.902499],[43.686386,4.891944],[41.905167,3.980322],[41.171387,3.9425],[40.783768,4.287975],[39.524437,3.406389],[38.121109,3.611666],[37.039719,4.375555000000134],[35.940552,4.622499],[35.821663,5.32861],[35.30194100000014,5.378055],[34.70472,6.677777000000106],[33.711388,7.660277],[32.991104,7.924999],[33.252777,8.458611000000118],[34.120552,8.577221000000122],[34.28611,10.554165],[34.594444,10.887777],[34.864441,10.734999],[35.096939000000106,11.826944],[35.70108,12.666115],[36.142693,12.706923000000117],[36.5428160000001,14.262053]]]]}},{"type":"Feature","properties":{"name":"Austria","iso2":"AT","iso3":"AUT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[13.833611,48.773605],[14.70028,48.581379],[15.025833,49.018883],[16.946182,48.619064],[17.166386,48.012497],[17.053886,47.709442],[16.450554,47.698051],[16.713886,47.543884],[16.510555,47.00666],[16.111805,46.86972],[14.544998,46.407494],[13.718655,46.526611],[12.440554000000134,46.69082600000014],[12.127777,47.00166300000011],[10.471235,46.871353],[9.598635,47.063835],[9.533569,47.274544],[9.566724,47.540451],[10.173332,47.274719000000104],[10.478054,47.591942000000145],[11.095554,47.396111],[12.735554,47.684166000000104],[13.016666,47.470276],[12.758333,48.123886],[13.833611,48.773605]]]]}},{"type":"Feature","properties":{"name":"Czech Republic","iso2":"CZ","iso3":"CZE"},"geometry":{"type":"MultiPolygon","coordinates":[[[[14.70028,48.581379],[13.833611,48.773605],[12.674444,49.42499500000015],[12.093704000000116,50.322533],[14.309721,51.05360400000011],[14.828333,50.865829],[16.341942,50.66111],[16.20583,50.423882],[16.641941,50.10833],[17.00222,50.216942],[16.890274,50.439438],[17.722775,50.319717],[17.657776,50.108055],[18.577221,49.914444],[18.851246,49.517357],[16.946182,48.619064],[15.025833,49.018883],[14.70028,48.581379]]]]}},{"type":"Feature","properties":{"name":"French Guiana","iso2":"GF","iso3":"GUF"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-53.494339,5.572342],[-52.285278,4.937499],[-52.040001,4.331388],[-51.850563,4.653333],[-51.684067,4.034163],[-52.909729,2.195833],[-54.603783,2.329195],[-54.001114,3.448333],[-54.477501,4.747777],[-54.166946,5.346944],[-53.939728,5.744721],[-53.494339,5.572342]]]]}},{"type":"Feature","properties":{"name":"Finland","iso2":"FI","iso3":"FIN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[22.8336124420166,59.95638465881348],[23.072500228881836,59.95111274719238],[22.91750144958496,59.898332595825195],[22.8336124420166,59.95638465881348]]],[[[22.438886642456055,59.99582862854004],[22.351945877075195,60.06694221496582],[22.440553665161133,60.07249641418457],[22.438886642456055,59.99582862854004]]],[[[21.598054885864258,60.09805488586426],[21.48527717590332,60.1138858795166],[21.655553817749023,60.15555000305176],[21.598054885864258,60.09805488586426]]],[[[21.74888801574707,60.11138343811035],[21.71555519104004,60.183053970336914],[21.885278701782227,60.17721748352051],[21.74888801574707,60.11138343811035]]],[[[21.396665573120117,60.178606033325195],[21.385278701782227,60.15666389465332],[21.26833152770996,60.18805122375488],[21.396665573120117,60.178606033325195]]],[[[22.00083351135254,60.12944221496582],[21.937498092651367,60.170000076293945],[22.060834884643555,60.20388984680176],[22.00083351135254,60.12944221496582]]],[[[25.84861183166504,60.1955509185791],[25.810556411743164,60.20416450500488],[25.874998092651367,60.21110725402832],[25.84861183166504,60.1955509185791]]],[[[22.824445724487305,60.22722053527832],[22.469465255737305,60.00000190734863],[22.44972038269043,60.218332290649414],[22.587778091430664,60.20250129699707],[22.824445724487305,60.22722053527832]]],[[[22.242223739624023,60.181108474731445],[22.2177791595459,60.21860694885254],[22.294443130493164,60.248605728149414],[22.242223739624023,60.181108474731445]]],[[[22.342222213745117,60.28305244445801],[22.06888771057129,60.26861000061035],[22.09610939025879,60.30777931213379],[22.342222213745117,60.28305244445801]]],[[[22.383333206176758,60.28833198547363],[22.32527732849121,60.33471870422363],[22.476945877075195,60.32361030578613],[22.383333206176758,60.28833198547363]]],[[[21.982778549194336,60.324167251586914],[21.78999900817871,60.37249946594238],[21.8075008392334,60.46555519104004],[21.982778549194336,60.324167251586914]]],[[[21.751665115356445,60.49833106994629],[21.684446334838867,60.452775955200195],[21.73000144958496,60.520273208618164],[21.763334274291992,60.52250099182129],[21.751665115356445,60.49833106994629]]],[[[21.48333168029785,60.520273208618164],[21.4325008392334,60.4697208404541],[21.321943283081055,60.54305458068848],[21.48333168029785,60.520273208618164]]],[[[21.328889846801758,60.48111152648926],[21.275835037231445,60.47805213928223],[21.226945877075195,60.552499771118164],[21.328889846801758,60.48111152648926]]],[[[21.2902774810791,60.61222267150879],[21.289167404174805,60.56138801574707],[21.21416664123535,60.61972236633301],[21.2902774810791,60.61222267150879]]],[[[21.32750129699707,60.87722206115723],[21.254167556762695,60.95888710021973],[21.357221603393555,60.921945571899414],[21.32750129699707,60.87722206115723]]],[[[21.080278396606445,63.281389236450195],[21.427221298217773,63.19693946838379],[21.246946334838867,63.144723892211914],[21.080278396606445,63.281389236450195]]],[[[22.18083381652832,63.265275955200195],[22.040834426879883,63.30694007873535],[22.1924991607666,63.32193946838379],[22.18083381652832,63.265275955200195]]],[[[21.323331832885742,63.28916358947754],[21.231943130493164,63.3255558013916],[21.3811092376709,63.34111213684082],[21.323331832885742,63.28916358947754]]],[[[22.87360954284668,63.799997329711914],[22.671388626098633,63.794443130493164],[22.80611228942871,63.87693977355957],[22.87360954284668,63.799997329711914]]],[[[24.73499870300293,64.94444465637207],[24.551668167114258,65.02499580383301],[25.035001754760742,65.03610420227051],[24.73499870300293,64.94444465637207]]],[[[24.462221145629883,65.76388740539551],[24.43694496154785,65.76971626281738],[24.503053665161133,65.78055000305176],[24.462221145629883,65.76388740539551]]],[[[28.165834426879883,69.91221809387207],[29.176111221313477,69.6352710723877],[28.78416633605957,69.16055488586426],[28.95734214782715,69.05162239074707],[28.431943893432617,68.89694404602051],[28.820554733276367,68.84443855285645],[28.45749855041504,68.53193855285645],[28.693334579467773,68.19749641418457],[30.02861213684082,67.6947193145752],[29.07499885559082,66.89583015441895],[30.134164810180664,65.71916389465332],[29.81888771057129,65.65332221984863],[29.636667251586914,64.92805671691895],[30.578054428100586,64.22137641906738],[29.99333381652832,63.743608474731445],[31.588930130004883,62.91441535949707],[27.807832717895508,60.546403884887695],[26.497220993041992,60.44693946838379],[26.65916633605957,60.64750099182129],[25.920000076293945,60.24166297912598],[22.90972328186035,59.80499458312988],[23.338335037231445,60.01999855041504],[22.87444496154785,60.14555549621582],[23.086942672729492,60.346940994262695],[23.05583381652832,60.35333442687988],[22.662778854370117,60.22222328186035],[22.57499885559082,60.21055030822754],[22.447221755981445,60.24444007873535],[22.63222312927246,60.39193916320801],[21.358610153198242,60.65361213684082],[21.668054580688477,61.546945571899414],[21.064722061157227,62.61222267150879],[21.68610954284668,63.02499580383301],[21.497777938842773,63.21000099182129],[22.337221145629883,63.27360725402832],[22.18805503845215,63.46305274963379],[23.31888771057129,63.89666175842285],[24.343332290649414,64.52360725402832],[24.54222297668457,64.80249214172363],[25.447221755981445,64.95471382141113],[25.310834884643555,65.51111030578613],[24.66916847229004,65.65471076965332],[24.689165115356445,65.89610481262207],[24.167009353637695,65.81402778625488],[23.661943435668945,66.31221199035645],[24.007776260375977,66.8005542755127],[23.571664810180664,67.15666389465332],[23.767778396606445,67.41610908508301],[23.43111228942871,67.46554756164551],[23.666112899780273,67.9416675567627],[21.809167861938477,68.57054328918457],[20.580930709838867,69.06030464172363],[21.320833206176758,69.32611274719238],[22.398332595825195,68.71110725402832],[23.976388931274414,68.83249092102051],[24.934919357299805,68.58081245422363],[25.761110305786133,68.98916816711426],[25.945833206176758,69.67332649230957],[26.44999885559082,69.92721748352051],[28.165834426879883,69.91221809387207]],[[25.677221298217773,60.234994888305664],[25.56110954284668,60.26583290100098],[25.598054885864258,60.207773208618164],[25.677221298217773,60.234994888305664]],[[23.705827713012695,59.92721748352051],[23.538328170776367,59.960275650024414],[23.3700008392334,59.911386489868164],[23.705827713012695,59.92721748352051]]]]}},{"type":"Feature","properties":{"name":"Fiji","iso2":"FJ","iso3":"FJI"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-178.707764,-20.674442],[-178.737213,-20.666115],[-178.73056,-20.646114],[-178.707764,-20.674442]]],[[[-178.211426,-19.852505],[-178.209747,-19.826389],[-178.19809,-19.835838],[-178.211426,-19.852505]]],[[[-178.396698,-19.185001],[-178.425049,-19.177502],[-178.398621,-19.129169],[-178.396698,-19.185001]]],[[[179.779694,-19.195278],[179.740234,-19.188053],[179.773041,-19.123333],[179.779694,-19.195278]]],[[[-178.538605,-19.181946],[-178.596954,-19.155834],[-178.585846,-19.113613],[-178.538605,-19.181946]]],[[[178.498291,-18.989998],[177.95108,-19.13139],[178.306915,-18.935555],[178.498291,-18.989998]]],[[[-178.936707,-18.989445],[-178.967224,-18.978336],[-178.949432,-18.925835],[-178.936707,-18.989445]]],[[[-179.78363,-18.946388],[-179.868896,-19.005283],[-179.845001,-18.922504],[-179.78363,-18.946388]]],[[[178.528046,-18.910831],[178.4766240000002,-18.883057],[178.521637,-18.859722],[178.528046,-18.910831]]],[[[-178.498627,-18.674725],[-178.506683,-18.635281],[-178.473053,-18.650558],[-178.498627,-18.674725]]],[[[179.91275,-18.641945],[179.837463,-18.576389],[179.963867,-18.540558],[179.91275,-18.641945]]],[[[177.66330000000013,-18.590279],[177.6191099999999,-18.538334],[177.6307980000001,-18.491943],[177.66330000000013,-18.590279]]],[[[178.13272100000015,-18.4175],[178.109406,-18.407501],[178.13970900000012,-18.351944],[178.13272100000015,-18.4175]]],[[[-178.778351,-18.249725],[-178.828613,-18.190002],[-178.747528,-18.201389],[-178.778351,-18.249725]]],[[[179.351898,-18.121113],[179.245789,-18.036388],[179.266663,-17.936111],[179.351898,-18.121113]]],[[[-179.011719,-17.995277],[-179.068359,-17.932503],[-178.991119,-17.950832],[-179.011719,-17.995277]]],[[[-178.286987,-17.96611],[-178.347809,-17.894165],[-178.244476,-17.917778],[-178.286987,-17.96611]]],[[[179.421906,-17.848335],[179.392761,-17.786388],[179.42108199999987,-17.797222],[179.421906,-17.848335]]],[[[-179.292511,-17.783897],[-179.331146,-17.771954],[-179.319153,-17.727509],[-179.292511,-17.783897]]],[[[178.820251,-17.742775],[178.7477420000001,-17.719719],[178.791931,-17.621113],[178.820251,-17.742775]]],[[[-179.141998,-17.476952],[-179.178894,-17.433064],[-179.143341,-17.431114],[-179.141998,-17.476952]]],[[[178.280823,-17.403053],[178.67804,-18.078335],[177.299133,-18.078613],[177.510254,-17.509445],[178.280823,-17.403053]]],[[[177.112457,-17.314445],[177.10025,-17.271114],[177.1419369999999,-17.247776],[177.112457,-17.314445]]],[[[-179.128632,-17.283611],[-179.162811,-17.250835],[-179.121429,-17.258617],[-179.128632,-17.283611]]],[[[179.399414,-17.394444],[179.357178,-17.259445],[179.4330440000002,-17.242222],[179.399414,-17.394444]]],[[[-178.925293,-17.257225],[-178.98584,-17.318058],[-179.02005,-17.153053],[-178.925293,-17.257225]]],[[[177.263611,-17.123611],[177.177185,-17.163612],[177.281097,-17.051945],[177.263611,-17.123611]]],[[[178.333038,-16.835835],[178.282196,-16.833889],[178.277191,-16.789444],[178.333038,-16.835835]]],[[[179.947479,-17.002781],[179.882446,-16.964165],[180,-16.787395],[179.947479,-17.002781]]],[[[-179.993317,-16.955276],[-179.861633,-16.680321],[-179.821106,-16.781094],[-179.993317,-16.955276]]],[[[177.443024,-16.83778],[177.559967,-16.677498],[177.593018,-16.687778],[177.443024,-16.83778]]],[[[179.929413,-16.659164],[179.914154,-16.661945],[179.88443,-16.657501],[179.916656,-16.625832],[179.947754,-16.613056],[179.929413,-16.659164]]],[[[180,-16.537918],[179.9810790000001,-16.524445],[180,-16.494274],[180,-16.537918]]],[[[-179.976166,-16.535278],[-179.988617,-16.476952],[-179.896423,-16.43111],[-179.976166,-16.535278]]],[[[179.958008,-16.197498],[179.478577,-16.701111],[179.932465,-16.460831],[179.950256,-16.513058],[179.87133800000012,-16.665001],[179.951904,-16.741943],[179.9021910000001,-16.769447],[179.265808,-16.690556],[178.747192,-17.011948],[178.478851,-16.78167],[179.958008,-16.197498]]],[[[-179.968872,-16.16761],[-180,-16.154732],[-179.941132,-16.128345],[-179.968872,-16.16761]]],[[[177.119415,-12.514446],[177.026917,-12.507223],[177.11911000000018,-12.484722],[177.119415,-12.514446]]]]}},{"type":"Feature","properties":{"name":"Falkland Islands (Malvinas)","iso2":"FK","iso3":"FLK"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-59.691673,-52.242783],[-59.761116,-52.273613],[-59.753334,-52.170006],[-59.683891,-52.172783],[-59.691673,-52.242783]]],[[[-58.435005,-52.093895],[-58.53389,-52.024445],[-58.432503,-51.99028],[-58.435005,-52.093895]]],[[[-61.224449,-51.864723],[-61.313896,-51.824722],[-61.215004,-51.797226],[-61.224449,-51.864723]]],[[[-61.034447,-51.869446],[-60.867783,-51.903336],[-61.149445,-51.848892],[-60.940559,-51.800285],[-61.034447,-51.869446]]],[[[-61.195839,-51.699448],[-61.315834,-51.733612],[-61.305,-51.693062],[-61.195839,-51.699448]]],[[[-59.210556,-51.410561],[-60.368057,-52.159172],[-60.980835,-52.061951],[-60.180557,-51.758896],[-60.638335999999896,-51.722229],[-60.163612,-51.661392],[-60.642227,-51.3555599999999],[-60.132225,-51.494728],[-60.019447,-51.380005],[-59.210556,-51.410561]]],[[[-58.69667099999987,-51.33667],[-58.22695199999987,-51.654449],[-58.279449,-51.417503],[-57.911949,-51.376396],[-57.761673,-51.538338],[-58.142784,-51.553894],[-57.731392,-51.692223],[-58.940559,-51.801949],[-58.64695,-52.067223],[-59.289726,-52.004173],[-59.035278,-52.14389],[-59.449173,-52.140839],[-59.348061,-52.343056],[-59.718056,-52.121117],[-58.69667099999987,-51.33667]]],[[[-59.93556199999989,-51.350838],[-60.025284,-51.297783],[-59.906113,-51.303062],[-59.93556199999989,-51.350838]]],[[[-60.110557999999884,-51.405281],[-60.300285,-51.271393],[-60.068062,-51.307503],[-60.110557999999884,-51.405281]]],[[[-59.508339,-51.337502],[-59.81111099999987,-51.26973],[-59.479172,-51.264725],[-59.508339,-51.337502]]]]}},{"type":"Feature","properties":{"name":"Micronesia, Federated States of","iso2":"FM","iso3":"FSM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[153.674408,5.286943],[153.659973,5.291666],[153.711365,5.319721],[153.674408,5.286943]]],[[[163.007477,5.263055000000108],[162.904144,5.307221],[163.016388,5.378332],[163.007477,5.263055000000108]]],[[[143.063599,6.707222000000115],[143.054688,6.714722],[143.063599,6.719443],[143.063599,6.707222000000115]]],[[[149.320251,6.698332],[149.313293,6.702499],[149.324982,6.721944],[149.320251,6.698332]]],[[[157.94220000000016,6.71861],[157.93191500000015,6.721944],[157.95245400000013,6.734444],[157.94220000000016,6.71861]]],[[[157.973572,6.738332],[157.964142,6.74111],[157.99273700000018,6.751944000000108],[157.973572,6.738332]]],[[[158.29776,6.786110000000122],[158.120789,6.929721],[158.318848,6.930277],[158.29776,6.786110000000122]]],[[[158.253876,6.983333000000101],[158.241638,6.992777],[158.259979,7.000278],[158.253876,6.983333000000101]]],[[[151.860504,7.31861],[151.839966,7.370276],[151.866638,7.358610000000112],[151.860504,7.31861]]],[[[149.20163,7.363333],[149.194702,7.361388000000105],[149.203033,7.376388],[149.20163,7.363333]]],[[[149.191345,7.375554],[149.177765,7.382499],[149.188019,7.384444],[149.191345,7.375554]]],[[[143.920258,7.37972100000016],[143.911926,7.382499],[143.914154,7.391388],[143.920258,7.37972100000016]]],[[[151.6391600000002,7.326666000000102],[151.5672000000002,7.34111],[151.608307,7.395277000000121],[151.6391600000002,7.326666000000102]]],[[[151.911652,7.444999],[151.85495,7.423888],[151.866638,7.463888000000139],[151.911652,7.444999]]],[[[146.1932980000001,7.504167],[146.179688,7.510833],[146.187195,7.515555000000106],[146.1932980000001,7.504167]]],[[[149.67498800000013,8.575554],[149.6594240000002,8.590275],[149.688873,8.617496],[149.67498800000013,8.575554]]],[[[150.378021,8.617496],[150.373291,8.612776000000125],[150.366638,8.626387],[150.378021,8.617496]]],[[[150.130249,8.978331],[150.118286,8.976387],[150.128021,8.992496],[150.130249,8.978331]]],[[[138.209137,9.523888000000127],[138.060242,9.41527600000012],[138.133606,9.571943],[138.209137,9.523888000000127]]]]}},{"type":"Feature","properties":{"name":"French Polynesia","iso2":"PF","iso3":"PYF"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-143.482483,-27.914448],[-143.508911,-27.890839],[-143.483917,-27.900276],[-143.482483,-27.914448]]],[[[-144.307526,-27.642776],[-144.324738,-27.553333],[-144.285553,-27.577499],[-144.307526,-27.642776]]],[[[-147.689758,-23.881668],[-147.720306,-23.865276],[-147.648621,-23.853336],[-147.689758,-23.881668]]],[[[-149.483337,-23.401943],[-149.52533,-23.373894],[-149.457214,-23.361671],[-149.483337,-23.401943]]],[[[-135.051941,-23.163887],[-135.06308,-23.156113],[-135.031708,-23.143333],[-135.051941,-23.163887]]],[[[-134.985535,-23.139442],[-135.015564,-23.12167],[-134.941406,-23.085838],[-134.985535,-23.139442]]],[[[-152.860016,-22.656387],[-152.845551,-22.605003],[-152.826416,-22.634171],[-152.860016,-22.656387]]],[[[-151.36557,-22.518616],[-151.387817,-22.425835],[-151.350281,-22.464725],[-151.36557,-22.518616]]],[[[-138.714722,-22.271667],[-138.796661,-22.22028],[-138.743591,-22.204449],[-138.714722,-22.271667]]],[[[-140.609467,-21.71917],[-140.66864,-21.708332],[-140.666687,-21.655834],[-140.609467,-21.71917]]],[[[-144.956146,-19.923332],[-144.965027,-19.929169],[-144.958344,-19.895283],[-144.956146,-19.923332]]],[[[-150.648071,-17.662498],[-150.669464,-17.645283],[-150.645294,-17.642498],[-150.648071,-17.662498]]],[[[-149.211426,-17.733891],[-149.179199,-17.870834],[-149.632507,-17.549999],[-149.211426,-17.733891]]],[[[-149.848602,-17.573612],[-149.937256,-17.484165],[-149.786133,-17.46917],[-149.848602,-17.573612]]],[[[-149.532257,-16.974445],[-149.54306,-16.974998],[-149.544189,-16.964443],[-149.532257,-16.974445]]],[[[-149.572266,-16.969723],[-149.59198,-16.980003],[-149.586121,-16.956108],[-149.572266,-16.969723]]],[[[-150.998322,-16.824169],[-151.040039,-16.786118],[-150.994476,-16.762505],[-150.998322,-16.824169]]],[[[-151.40033,-16.888332],[-151.476654,-16.895283],[-151.475037,-16.740276],[-151.40033,-16.888332]]],[[[-151.03833,-16.769726],[-151.037537,-16.693054],[-151.007233,-16.74472],[-151.03833,-16.769726]]],[[[-151.458344,-16.673332],[-151.532257,-16.589443],[-151.441101,-16.599171],[-151.458344,-16.673332]]],[[[-151.748627,-16.534451],[-151.775879,-16.473331],[-151.742249,-16.490833],[-151.748627,-16.534451]]],[[[-146.335846,-16.164722],[-146.38446,-16.110279],[-146.334991,-16.113056],[-146.335846,-16.164722]]],[[[-148.23526,-15.848612],[-148.26532,-15.846947],[-148.28363,-15.800835],[-148.23526,-15.848612]]],[[[-144.621948,-15.74861],[-144.646393,-15.73889],[-144.633667,-15.708055],[-144.621948,-15.74861]]],[[[-138.656708,-10.549725],[-138.695587,-10.431112],[-138.618347,-10.465555],[-138.656708,-10.549725]]],[[[-139.107483,-9.978058],[-139.125824,-9.906113],[-139.047791,-9.914167],[-139.107483,-9.978058]]],[[[-138.9552609999999,-9.743055],[-138.809479,-9.744999],[-139.1725459999999,-9.780281],[-138.9552609999999,-9.743055]]],[[[-140.07724,-9.450556],[-140.147827,-9.380556],[-140.086121,-9.324724],[-140.07724,-9.450556]]],[[[-139.58252,-8.87361],[-139.504181,-8.917225],[-139.611969,-8.95639],[-139.58252,-8.87361]]],[[[-140.026428,-8.901112],[-140.189453,-8.954166],[-140.249756,-8.802778],[-140.026428,-8.901112]]],[[[-140.704712,-8.044168],[-140.709747,-7.965556],[-140.637817,-7.959446],[-140.704712,-8.044168]]],[[[-140.584991,-7.92389],[-140.60614,-7.913611],[-140.56308,-7.888333],[-140.584991,-7.92389]]]]}},{"type":"Feature","properties":{"name":"France","iso2":"FR","iso3":"FRA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[9.485832000000187,42.61527300000013],[9.49472,42.60360700000014],[9.457777,42.643326],[9.485832000000187,42.61527300000013]]],[[[9.44666500000011,42.678886],[9.553333000000123,42.1155550000001],[9.18083200000018,41.364716000000115],[8.78916500000011,41.558052],[8.575832,42.383606],[9.293888,42.675552],[9.353054000000128,43.003883],[9.44666500000011,42.678886]]],[[[-1.194445,45.8224950000001],[-1.401667,46.05055200000011],[-1.233056,45.964722],[-1.194445,45.8224950000001]]],[[[-1.260834,46.156387],[-1.553056,46.24499500000012],[-1.474445,46.255829],[-1.260834,46.156387]]],[[[-2.270832999999868,46.69332900000013],[-2.363889,46.698051],[-2.384999999999877,46.725555],[-2.270832999999868,46.69332900000013]]],[[[-2.196945,47.017220000000165],[-2.145,46.90583],[-2.284722,47.02055400000013],[-2.196945,47.017220000000165]]],[[[-3.066666999999882,47.306664],[-3.215834,47.302498000000114],[-3.258610999999888,47.376106],[-3.066666999999882,47.306664]]],[[[-5.055,48.454163],[-5.134723,48.458328],[-5.064723,48.48305500000011],[-5.055,48.454163]]],[[[-3.576667,48.803886],[-3.575556,48.812492],[-3.563334,48.808609],[-3.576667,48.803886]]],[[[2.541667000000103,51.09111],[4.165,50.283051],[4.149238,49.978371],[4.832503,50.16861],[4.873055000000107,49.797218],[5.80788,49.545044],[6.36217,49.459389],[8.226078,48.964417000000125],[7.578888,48.11972000000016],[7.588268,47.58448],[6.990555000000143,47.497215],[5.966666,46.209442],[6.791389000000152,46.434166],[7.038054,45.93193800000013],[6.798970000000168,45.78067],[7.127777,45.257774],[6.61976,45.110138],[7.031666000000115,44.831383000000116],[6.976388,44.284164],[7.662222,44.17083000000012],[7.528055,43.788605],[7.439293000000106,43.75752300000015],[7.416111,43.770554],[7.387777,43.748604],[7.391609,43.727547],[6.165277000000117,43.050552],[5.031388,43.556664],[3.964722,43.540833],[3.081388,43.069443],[3.177655000000158,42.436806],[1.723611,42.509438],[1.78172,42.569962],[1.445833,42.601944],[-0.562222,42.781387],[-1.780876999999862,43.359924],[-1.036110999999892,44.675278],[-1.250278,44.662498],[-1.083888999999886,45.564438],[-0.536667,44.89555400000013],[-0.776667,45.461105],[-1.240834,45.70166],[-1.067778,45.908882000000105],[-1.114635,46.316582],[-2.130834,46.838333000000105],[-1.984167,47.034439],[-2.170834,47.126663],[-2.134167,47.278053],[-1.728610999999887,47.210831],[-2.003334,47.31916000000011],[-2.289167,47.238884],[-2.540278,47.296661],[-2.361111,47.504166],[-2.698056,47.637215],[-3.106388999999865,47.472221],[-4.366389,47.80416100000012],[-4.726142,48.040581],[-4.186111,48.29999500000012],[-4.777779,48.509438],[-3.220834,48.8705520000001],[-2.685277999999869,48.501663],[-1.368889,48.643608],[-1.941667,49.723885],[-1.264167,49.684166],[-1.113889,49.365273],[0.424722,49.45166],[0.074167,49.526665],[1.461111,50.124161],[1.625000000000114,50.87777700000011],[2.541667000000103,51.09111]]]]}},{"type":"Feature","properties":{"name":"Gambia","iso2":"GM","iso3":"GMB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-16.73167,13.44972],[-16.200836,13.251665],[-16.162224,13.425278],[-15.295834,13.491665],[-16.14389,13.454166],[-16.394726,13.330555],[-16.56567,13.589998],[-15.070278,13.826387],[-13.798613,13.406387],[-14.351112,13.237778],[-15.111668,13.595833],[-15.285002,13.374443],[-15.803612,13.347776],[-15.809723,13.159721],[-16.750874,13.059977],[-16.73167,13.44972]]]]}},{"type":"Feature","properties":{"name":"Gabon","iso2":"GA","iso3":"GAB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[9.007776260375977,-0.767778396606445],[8.946664810180664,-0.658332824707031],[9.00666618347168,-0.598888397216797],[9.007776260375977,-0.767778396606445]]],[[[12.523611068725586,2.283334732055664],[13.293889999389648,2.163610458374023],[13.186784744262695,1.222475051879883],[14.18889045715332,1.391389846801758],[14.487222671508789,0.913610458374023],[13.848333358764648,-0.198610305786133],[14.518610000610352,-0.609167098999023],[14.429723739624023,-1.891666412353516],[14.110834121704102,-2.49305534362793],[13.76222038269043,-2.088888168334961],[13.482778549194336,-2.4375],[13.001508712768555,-2.367671966552734],[12.649999618530273,-1.822500228881836],[12.478055953979492,-2.327220916748047],[11.574167251586914,-2.333332061767578],[11.925832748413086,-3.636943817138672],[11.496946334838867,-3.50694465637207],[11.140661239624023,-3.925275802612305],[9.700834274291992,-2.445554733276367],[10.130556106567383,-2.520000457763672],[9.615278244018555,-2.376667022705078],[8.983057022094727,-1.234167098999023],[9.513887405395508,-1.59666633605957],[8.710000991821289,-0.641111373901367],[9.013887405395508,-0.81916618347168],[9.298334121704102,-0.371665954589844],[9.347501754760742,0.363058090209961],[9.921110153198242,0.185277938842773],[9.303609848022461,0.52833366394043],[9.600000381469727,0.481111526489258],[9.564722061157227,0.983057022094727],[9.803976058959961,1.002607345581055],[11.353887557983398,1.001943588256836],[11.339765548706055,2.168611526489258],[12.523611068725586,2.283334732055664]],[[9.554445266723633,0.274446487426758],[9.544443130493164,0.285001754760742],[9.538057327270508,0.270833969116211],[9.554445266723633,0.274446487426758]]]]}},{"type":"Feature","properties":{"name":"Georgia","iso2":"GE","iso3":"GEO"},"geometry":{"type":"MultiPolygon","coordinates":[[[[41.547623,42.405777],[41.428596,42.738045],[40.002968,43.379265],[40.253387,43.582520000000116],[42.849991,43.17915300000011],[43.911934000000116,42.583321],[44.934708,42.76027700000013],[46.451752,41.897057],[46.194427000000104,41.6858220000001],[46.693871,41.312202],[46.520821,41.049988],[45.336655,41.462494],[45.022942,41.29705000000014],[43.46077,41.112961],[42.827492,41.584991],[41.531559,41.523876],[41.776093,41.841927],[41.547623,42.405777]]]]}},{"type":"Feature","properties":{"name":"Ghana","iso2":"GH","iso3":"GHA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[0.63953,5.845486],[0.662222,5.754167],[0.255833,5.757777],[-0.795556,5.208055],[-1.613333,5.020833],[-2.058889,4.730833],[-3.103041,5.085022],[-3.102272,5.109545000000125],[-2.928128,5.100222],[-2.764445,5.579166],[-3.249166999999886,6.611388],[-2.487778,8.197777000000116],[-2.685561,9.481817],[-2.834048,11.002007],[-0.618333,10.911665],[-0.149762,11.13854],[0.368333,10.259443],[0.2175,9.457222],[0.550833,9.411388],[0.382735,8.760756],[0.727222,8.321388],[0.525,6.947778],[1.198891,6.100546],[0.692222,5.748055],[0.634444,5.948055],[0.51209,6.055245],[0.208197,6.089699],[0.488889,6.043611],[0.63953,5.845486]]]]}},{"type":"Feature","properties":{"name":"Grenada","iso2":"GD","iso3":"GRD"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-61.74694799999986,11.997499],[-61.611946,12.23111],[-61.628616,12.048054],[-61.74694799999986,11.997499]]],[[[-61.580002,12.295555],[-61.589172,12.298054],[-61.578896,12.323055],[-61.580002,12.295555]]],[[[-61.428337,12.453609],[-61.496948,12.443609],[-61.434448,12.529165],[-61.428337,12.453609]]]]}},{"type":"Feature","properties":{"name":"Greenland","iso2":"GL","iso3":"GRL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-43.64805603027344,59.847490310668945],[-44.11555480957031,59.82916450500488],[-43.95805358886719,59.97971534729004],[-43.64805603027344,59.847490310668945]]],[[[-43.295005798339844,59.92083168029785],[-43.327781677246094,59.99721717834473],[-43.20417022705078,59.96832466125488],[-43.295005798339844,59.92083168029785]]],[[[-44.31388854980469,59.87193489074707],[-44.244163513183594,60.011667251586914],[-43.992225646972656,60.00833320617676],[-44.31388854980469,59.87193489074707]]],[[[-43.399993896484375,59.926103591918945],[-43.50917053222656,59.912492752075195],[-43.453330993652344,60.03804969787598],[-43.399993896484375,59.926103591918945]]],[[[-43.35417175292969,60.08443641662598],[-43.13111114501953,60.05526924133301],[-44.132774353027344,60.14083290100098],[-43.35417175292969,60.08443641662598]]],[[[-44.40943908691406,59.947771072387695],[-44.49749755859375,60.00860786437988],[-44.43444061279297,60.14138221740723],[-44.20166778564453,60.04610633850098],[-44.40943908691406,59.947771072387695]]],[[[-45.23249816894531,60.143327713012695],[-45.29999542236328,60.145830154418945],[-45.26611328125,60.1874942779541],[-45.23249816894531,60.143327713012695]]],[[[-45.36500358581543,60.18526649475098],[-45.35388946533203,60.38249397277832],[-45.1522216796875,60.37638282775879],[-45.36500358581543,60.18526649475098]]],[[[-45.95471954345703,60.615549087524414],[-45.9969482421875,60.626657485961914],[-45.98277282714844,60.67276954650879],[-45.961387634277344,60.68387794494629],[-45.78333282470703,60.66082191467285],[-45.95471954345703,60.615549087524414]]],[[[-45.88861083984375,60.69582557678223],[-45.98520278930664,60.69222831726074],[-46.091941833496094,60.63555335998535],[-46.20471954345703,60.67276954650879],[-46.00695037841797,60.70638465881348],[-45.88861083984375,60.69582557678223]]],[[[-46.345550537109375,60.66805458068848],[-46.49944305419922,60.69915962219238],[-46.2772216796875,60.77221870422363],[-46.345550537109375,60.66805458068848]]],[[[-47.754173278808594,60.80471229553223],[-47.90277862548828,60.6763858795166],[-48.2388916015625,60.795549392700195],[-47.754173278808594,60.80471229553223]]],[[[-46.98027801513672,60.77276802062988],[-47.04944610595703,60.80526924133301],[-47.01111602783203,60.80804634094238],[-46.98027801513672,60.77276802062988]]],[[[-47.16138458251953,60.798051834106445],[-47.22694396972656,60.81805610656738],[-47.15277862548828,60.816667556762695],[-47.16138458251953,60.798051834106445]]],[[[-47.23138427734375,60.841936111450195],[-47.25861358642578,60.8558292388916],[-47.17833709716797,60.87193489074707],[-47.23138427734375,60.841936111450195]]],[[[-47.10194396972656,60.822771072387695],[-47.19249725341797,60.835824966430664],[-47.08361053466797,60.874711990356445],[-47.10194396972656,60.822771072387695]]],[[[-46.75361633300781,60.75027656555176],[-46.845001220703125,60.76055335998535],[-46.16444396972656,60.922494888305664],[-46.75361633300781,60.75027656555176]]],[[[-47.029441833496094,60.89721870422363],[-47.05027770996094,60.895273208618164],[-46.95805358886719,60.925554275512695],[-47.029441833496094,60.89721870422363]]],[[[-47.140838623046875,60.879159927368164],[-47.171669006347656,60.88360786437988],[-47.073333740234375,60.92666053771973],[-47.140838623046875,60.879159927368164]]],[[[-46.466392517089844,60.92222023010254],[-46.51416778564453,60.930551528930664],[-46.52666473388672,60.9888858795166],[-46.51860809326172,60.993608474731445],[-46.429443359375,60.9758243560791],[-46.466392517089844,60.92222023010254]]],[[[-48.07361602783203,61.05388069152832],[-48.37055206298828,61.0786075592041],[-48.24333190917969,61.09860420227051],[-48.07361602783203,61.05388069152832]]],[[[-48.93444061279297,61.249162673950195],[-48.874168395996094,61.3013858795166],[-48.72416687011719,61.29138374328613],[-48.93444061279297,61.249162673950195]]],[[[-48.58332824707031,61.31276893615723],[-48.83306121826172,61.33499336242676],[-48.52333068847656,61.36110877990723],[-48.58332824707031,61.31276893615723]]],[[[-42.45305633544922,61.44137763977051],[-42.496665954589844,61.45499610900879],[-42.38972473144531,61.4888858795166],[-42.45305633544922,61.44137763977051]]],[[[-49.0897216796875,61.63333320617676],[-49.19444274902344,61.66221046447754],[-49.149444580078125,61.70054817199707],[-49.0897216796875,61.63333320617676]]],[[[-49.39222717285156,61.70694160461426],[-49.48527526855469,61.75139045715332],[-49.349998474121094,61.743051528930664],[-49.39222717285156,61.70694160461426]]],[[[-42.2691650390625,61.75027656555176],[-42.084442138671875,61.8749942779541],[-42.12110900878906,61.77276802062988],[-42.2691650390625,61.75027656555176]]],[[[-49.4405517578125,61.874711990356445],[-49.63417053222656,61.93082618713379],[-49.41944885253906,61.930551528930664],[-49.4405517578125,61.874711990356445]]],[[[-49.663330078125,62.18027687072754],[-49.79833984375,62.213884353637695],[-49.65027618408203,62.23777198791504],[-49.663330078125,62.18027687072754]]],[[[-42.2772216796875,62.577219009399414],[-42.13111114501953,62.564714431762695],[-42.12555694580078,62.49638557434082],[-42.2772216796875,62.577219009399414]]],[[[-41.99610900878906,62.77499580383301],[-41.86194610595703,62.73472023010254],[-42.447776794433594,62.75139045715332],[-41.99610900878906,62.77499580383301]]],[[[-41.56138610839844,62.873605728149414],[-41.58860778808594,63.00249671936035],[-41.458335876464844,63.01638984680176],[-41.56138610839844,62.873605728149414]]],[[[-50.63666534423828,63.07388496398926],[-50.67028045654297,63.02527046203613],[-50.7550048828125,63.06193733215332],[-50.63666534423828,63.07388496398926]]],[[[-41.333885192871094,63.05027198791504],[-41.526390075683594,63.08138465881348],[-41.373329162597656,63.109994888305664],[-41.333885192871094,63.05027198791504]]],[[[-41.209442138671875,63.15777015686035],[-41.18444061279297,63.12276649475098],[-41.466392517089844,63.1713809967041],[-41.209442138671875,63.15777015686035]]],[[[-50.79972839355469,63.08166694641113],[-50.788055419921875,63.186655044555664],[-50.682777404785156,63.11666297912598],[-50.79972839355469,63.08166694641113]]],[[[-50.61805725097656,63.11471748352051],[-50.612220764160156,63.20166206359863],[-50.468605041503906,63.15332221984863],[-50.61805725097656,63.11471748352051]]],[[[-41.09583282470703,63.22110176086426],[-41.43083190917969,63.23137855529785],[-41.87194061279297,63.46666145324707],[-41.09583282470703,63.22110176086426]]],[[[-51.27361297607422,63.476938247680664],[-51.358055114746094,63.48333168029785],[-51.20471954345703,63.499162673950195],[-51.27361297607422,63.476938247680664]]],[[[-52.00083923339844,64.12776374816895],[-52.06361389160156,64.16388130187988],[-51.90583038330078,64.18887519836426],[-52.00083923339844,64.12776374816895]]],[[[-40.674171447753906,64.29136848449707],[-40.679443359375,64.20860481262207],[-41.05278015136719,64.23275947570801],[-40.674171447753906,64.29136848449707]]],[[[-41.12555694580078,64.28831672668457],[-41.374168395996094,64.28499031066895],[-41.29695129394531,64.31721687316895],[-41.12555694580078,64.28831672668457]]],[[[-51.567222595214844,64.25610542297363],[-51.439720153808594,64.36248970031738],[-51.321388244628906,64.32638740539551],[-51.567222595214844,64.25610542297363]]],[[[-51.239723205566406,64.21470832824707],[-51.341941833496094,64.25332832336426],[-51.025001525878906,64.54942512512207],[-50.81916809082031,64.54165840148926],[-51.239723205566406,64.21470832824707]]],[[[-51.32361602783203,64.37359809875488],[-51.42138671875,64.41331672668457],[-51.091941833496094,64.5666675567627],[-51.32361602783203,64.37359809875488]]],[[[-52.08306121826172,64.59137153625488],[-52.141944885253906,64.59776496887207],[-52.149169921875,64.62719917297363],[-52.1199951171875,64.62915229797363],[-52.08306121826172,64.59137153625488]]],[[[-40.18000030517578,64.43109321594238],[-40.864723205566406,64.90860176086426],[-40.54277801513672,64.84414863586426],[-40.18000030517578,64.43109321594238]]],[[[-40.49583435058594,65.0152759552002],[-40.625274658203125,65.0385913848877],[-40.55638885498047,65.07388496398926],[-40.49583435058594,65.0152759552002]]],[[[-52.39666557312012,65.10942268371582],[-52.36138916015625,65.18692207336426],[-52.24500274658203,65.1816577911377],[-52.39666557312012,65.10942268371582]]],[[[-39.49444580078125,65.31999397277832],[-39.564443588256836,65.26582527160645],[-39.804443359375,65.3338794708252],[-39.49444580078125,65.31999397277832]]],[[[-39.27777862548828,65.46138191223145],[-39.38694763183594,65.50193977355957],[-39.2388916015625,65.50860786437988],[-39.27777862548828,65.46138191223145]]],[[[-52.92833709716797,65.42526435852051],[-53.08777618408203,65.49247932434082],[-52.87194061279297,65.51361274719238],[-52.92833709716797,65.42526435852051]]],[[[-38.84916687011719,65.51860237121582],[-38.95861053466797,65.51776313781738],[-38.76111602783203,65.54165840148926],[-38.84916687011719,65.51860237121582]]],[[[-37.037506103515625,65.53276252746582],[-37.19153594970703,65.53262519836426],[-37.21333312988281,65.57805061340332],[-37.037506103515625,65.53276252746582]]],[[[-52.99500274658203,65.54887580871582],[-53.23249816894531,65.59832954406738],[-52.848052978515625,65.64415168762207],[-52.99500274658203,65.54887580871582]]],[[[-36.99555206298828,65.58442878723145],[-37.212501525878906,65.68441963195801],[-36.992225646972656,65.70109748840332],[-36.99555206298828,65.58442878723145]]],[[[-37.3941650390625,65.81360054016113],[-37.48500061035156,65.60721015930176],[-37.989166259765625,65.69832038879395],[-37.3941650390625,65.81360054016113]]],[[[-36.79833984375,65.75055122375488],[-36.942771911621094,65.8197193145752],[-36.776947021484375,65.86387825012207],[-36.79833984375,65.75055122375488]]],[[[-36.319725036621094,65.82193183898926],[-36.37110900878906,65.87747383117676],[-36.18305969238281,65.87803840637207],[-36.319725036621094,65.82193183898926]]],[[[-36.6199951171875,65.79525947570801],[-36.736663818359375,65.8016529083252],[-36.74833679199219,65.90971565246582],[-36.507225036621094,65.95694160461426],[-36.6199951171875,65.79525947570801]]],[[[-53.52527618408203,66.04248237609863],[-53.679725646972656,66.08194160461426],[-53.423057556152344,66.08442878723145],[-53.52527618408203,66.04248237609863]]],[[[-35.499725341796875,66.17415046691895],[-35.537506103515625,66.22554206848145],[-35.38500213623047,66.24081611633301],[-35.499725341796875,66.17415046691895]]],[[[-33.86194610595703,66.79387092590332],[-33.970550537109375,66.83970832824707],[-33.88444519042969,66.87248420715332],[-33.86194610595703,66.79387092590332]]],[[[-53.070838928222656,66.86609077453613],[-52.86823272705078,66.89721870422363],[-53.46416473388672,66.79887580871582],[-53.070838928222656,66.86609077453613]]],[[[-33.431114196777344,67.14221382141113],[-33.476104736328125,67.18054389953613],[-33.34222412109375,67.20471382141113],[-33.431114196777344,67.14221382141113]]],[[[-33.252227783203125,67.29525947570801],[-33.327781677246094,67.33610725402832],[-33.25695037841797,67.37608528137207],[-33.252227783203125,67.29525947570801]]],[[[-53.65888977050781,67.67581367492676],[-53.7630615234375,67.77693367004395],[-53.58777618408203,67.73359870910645],[-53.65888977050781,67.67581367492676]]],[[[-53.34722137451172,68.00999641418457],[-53.473052978515625,68.06915473937988],[-53.22527313232422,68.05859565734863],[-53.34722137451172,68.00999641418457]]],[[[-51.2933349609375,68.10081672668457],[-52.00750732421875,68.07666206359863],[-51.20527458190918,68.12164497375488],[-51.2933349609375,68.10081672668457]]],[[[-29.838054656982422,68.14082527160645],[-30.011669158935547,68.20749092102051],[-29.694721221923828,68.20860481262207],[-29.838054656982422,68.14082527160645]]],[[[-52.070838928222656,68.11526679992676],[-52.315834045410156,68.16887092590332],[-51.45417022705078,68.25776863098145],[-52.070838928222656,68.11526679992676]]],[[[-52.9888916015625,68.35775947570801],[-53.211944580078125,68.4013843536377],[-53.01972198486328,68.49443244934082],[-52.85417175292969,68.43332099914551],[-52.9888916015625,68.35775947570801]]],[[[-52.64167022705078,68.52998542785645],[-52.69471740722656,68.54609870910645],[-52.43943786621094,68.5608081817627],[-52.64167022705078,68.52998542785645]]],[[[-52.749725341796875,68.48471260070801],[-52.88417053222656,68.54887580871582],[-52.80944061279297,68.56860542297363],[-52.749725341796875,68.48471260070801]]],[[[-51.94194030761719,68.59443855285645],[-52.42138671875,68.57138252258301],[-51.80332946777344,68.62719917297363],[-51.94194030761719,68.59443855285645]]],[[[-51.0352783203125,68.63943672180176],[-51.23277282714844,68.66665840148926],[-51.12944030761719,68.6827564239502],[-51.0352783203125,68.63943672180176]]],[[[-52.13472557067871,68.70109748840332],[-53.12055206298828,68.56414985656738],[-52.63417053222656,68.71026802062988],[-52.13472557067871,68.70109748840332]]],[[[-23.286666870117188,69.64109992980957],[-23.593055725097656,69.71304512023926],[-23.289443969726562,69.73831367492676],[-23.286666870117188,69.64109992980957]]],[[[-50.505279541015625,69.81053352355957],[-50.60639190673828,69.85637092590332],[-50.40972137451172,69.8611011505127],[-50.505279541015625,69.81053352355957]]],[[[-50.92333221435547,69.89276313781738],[-50.65388488769531,69.83665657043457],[-50.958335876464844,69.55053901672363],[-51.38805389404297,69.70526313781738],[-50.92333221435547,69.89276313781738]]],[[[-52.69305419921875,69.91748237609863],[-51.83332824707031,69.62608528137207],[-53.57472229003906,69.22943305969238],[-54.2691650390625,69.40220832824707],[-53.347496032714844,69.57971382141113],[-54.99444580078125,69.69470405578613],[-54.389442443847656,69.67526435852051],[-54.93611145019531,69.84553718566895],[-54.22943878173828,69.91304206848145],[-54.82972717285156,70.07832527160645],[-54.429168701171875,70.3097095489502],[-52.69305419921875,69.91748237609863]]],[[[-54.66138458251953,70.37248420715332],[-54.934722900390625,70.37553596496582],[-55.02777862548828,70.4830493927002],[-54.66138458251953,70.37248420715332]]],[[[-51.512779235839844,70.65387153625488],[-51.861671447753906,70.72221565246582],[-51.69249725341797,70.72776985168457],[-51.512779235839844,70.65387153625488]]],[[[-27.68527603149414,70.73387336730957],[-27.736942291259766,70.88220405578613],[-27.276111602783203,70.87498664855957],[-27.68527603149414,70.73387336730957]]],[[[-25.39472198486328,70.91165351867676],[-25.294445037841797,70.65971565246582],[-26.02972412109375,70.52110481262207],[-28.13666534423828,70.45471382141113],[-27.14958953857422,70.87439155578613],[-25.39472198486328,70.91165351867676]]],[[[-51.565834045410156,70.86470222473145],[-52.16221618652344,70.88665962219238],[-52.02305603027344,70.97915840148926],[-51.565834045410156,70.86470222473145]]],[[[-25.30889129638672,71.01443672180176],[-25.579166412353516,71.10220527648926],[-25.460556030273438,71.10415840148926],[-25.30889129638672,71.01443672180176]]],[[[-25.282501220703125,71.13192939758301],[-25.472774505615234,71.15054512023926],[-25.359722137451172,71.20526313781738],[-25.282501220703125,71.13192939758301]]],[[[-53.649169921875,71.02415657043457],[-53.99028015136719,71.1313648223877],[-53.598052978515625,71.31331062316895],[-53.37638854980469,71.11499214172363],[-53.649169921875,71.02415657043457]]],[[[-52.571388244628906,71.34610176086426],[-52.328338623046875,71.28776741027832],[-53.18444061279297,71.32138252258301],[-52.571388244628906,71.34610176086426]]],[[[-53.13361358642578,71.66192817687988],[-52.75611114501953,71.66026496887207],[-53.47444152832031,71.6524829864502],[-53.13361358642578,71.66192817687988]]],[[[-55.559165954589844,71.81915473937988],[-55.80555725097656,71.87886238098145],[-55.409996032714844,71.8902759552002],[-55.559165954589844,71.81915473937988]]],[[[-55.796112060546875,72.07054328918457],[-55.93860626220703,72.07943916320801],[-55.72527313232422,72.12608528137207],[-55.796112060546875,72.07054328918457]]],[[[-55.374168395996094,72.15971565246582],[-55.68888854980469,72.19859504699707],[-55.015281677246094,72.37719917297363],[-55.374168395996094,72.15971565246582]]],[[[-55.06500244140625,72.52527046203613],[-55.383331298828125,72.54525947570801],[-55.030555725097656,72.5888843536377],[-55.06500244140625,72.52527046203613]]],[[[-55.65027618408203,72.58249092102051],[-55.994720458984375,72.55748176574707],[-55.94305419921875,72.59359931945801],[-55.65027618408203,72.58249092102051]]],[[[-55.13194274902344,72.60081672668457],[-55.26222229003906,72.59776496887207],[-54.94666290283203,72.67221260070801],[-55.13194274902344,72.60081672668457]]],[[[-54.83250427246094,72.69552803039551],[-55.0625,72.71832466125488],[-54.87249755859375,72.75694465637207],[-54.83250427246094,72.69552803039551]]],[[[-55.70417022705078,72.71499824523926],[-56.226104736328125,72.70610237121582],[-55.639442443847656,72.77777290344238],[-55.70417022705078,72.71499824523926]]],[[[-55.285560607910156,72.68109321594238],[-55.84944152832031,72.61137580871582],[-54.9647216796875,72.81137275695801],[-55.285560607910156,72.68109321594238]]],[[[-55.94666290283203,72.82361030578613],[-55.801666259765625,72.79248237609863],[-55.992225646972656,72.78665351867676],[-55.94666290283203,72.82361030578613]]],[[[-23.608612060546875,72.83499336242676],[-21.932498931884766,72.39915657043457],[-22.756946563720703,72.44136238098145],[-22.134166717529297,72.27165412902832],[-22.56277847290039,72.13888740539551],[-24.48444366455078,72.8258228302002],[-23.608612060546875,72.83499336242676]]],[[[-55.586387634277344,72.8902759552002],[-55.352500915527344,72.85220527648926],[-55.53666687011719,72.82249641418457],[-55.586387634277344,72.8902759552002]]],[[[-24.896665573120117,72.77777290344238],[-25.210830688476562,72.85165596008301],[-24.77138900756836,72.91081428527832],[-24.896665573120117,72.77777290344238]]],[[[-22.54916763305664,73.0072193145752],[-21.865833282470703,72.7138843536377],[-24.588890075683594,72.95749092102051],[-22.54916763305664,73.0072193145752]]],[[[-55.753334045410156,73.01138496398926],[-55.88972473144531,73.02581977844238],[-55.693885803222656,73.03221321105957],[-55.753334045410156,73.01138496398926]]],[[[-55.0755615234375,72.96554756164551],[-55.68916320800781,72.99359321594238],[-55.51860809326172,73.04582405090332],[-55.0755615234375,72.96554756164551]]],[[[-21.35333251953125,73.09137153625488],[-21.46277618408203,73.11859321594238],[-21.173053741455078,73.13443183898926],[-21.35333251953125,73.09137153625488]]],[[[-56.201942443847656,73.15555000305176],[-56.33167266845703,73.17221260070801],[-56.27333068847656,73.21887397766113],[-56.201942443847656,73.15555000305176]]],[[[-56.0977783203125,73.08638191223145],[-56.01721954345703,73.22859382629395],[-55.8155517578125,73.22470283508301],[-56.0977783203125,73.08638191223145]]],[[[-55.68638610839844,73.28276252746582],[-55.871665954589844,73.3277759552002],[-55.65416717529297,73.35637092590332],[-55.68638610839844,73.28276252746582]]],[[[-55.953887939453125,73.29915046691895],[-56.15332794189453,73.30415534973145],[-55.830833435058594,73.3733081817627],[-55.953887939453125,73.29915046691895]]],[[[-55.53166961669922,73.31805610656738],[-55.59388732910156,73.34414863586426],[-55.328338623046875,73.39499092102051],[-55.53166961669922,73.31805610656738]]],[[[-24.360000610351562,73.41192817687988],[-23.209999084472656,73.23359870910645],[-25.01028060913086,73.30941963195801],[-22.938610076904297,73.13472175598145],[-25.71277618408203,73.18637275695801],[-25.290836334228516,73.3277759552002],[-25.243053436279297,73.40582466125488],[-24.360000610351562,73.41192817687988]]],[[[-55.5897216796875,73.38109016418457],[-56.11583709716797,73.55664253234863],[-55.47083282470703,73.43193244934082],[-55.5897216796875,73.38109016418457]]],[[[-56.4102783203125,73.54193305969238],[-56.55860900878906,73.55636787414551],[-56.18860626220703,73.62747383117676],[-56.4102783203125,73.54193305969238]]],[[[-56.34416198730469,73.67248725891113],[-56.83332824707031,73.61137580871582],[-56.965553283691406,73.65803718566895],[-56.34416198730469,73.67248725891113]]],[[[-56.36860656738281,73.76609992980957],[-56.20555877685547,73.71832466125488],[-56.43694305419922,73.76805305480957],[-56.36860656738281,73.76609992980957]]],[[[-55.9566650390625,73.83471870422363],[-56.323333740234375,73.78332710266113],[-56.7772216796875,73.87581062316895],[-55.9566650390625,73.83471870422363]]],[[[-20.01611328125,73.88443183898926],[-20.234722137451172,73.92637825012207],[-20.11361312866211,73.9327564239502],[-20.01611328125,73.88443183898926]]],[[[-20.926944732666016,74.41998481750488],[-20.123889923095703,74.20109748840332],[-21.990833282470703,74.22720527648926],[-20.926944732666016,74.41998481750488]]],[[[-56.53083038330078,74.53055000305176],[-56.46277618408203,74.5041675567627],[-57.556663513183594,74.48831367492676],[-56.53083038330078,74.53055000305176]]],[[[-56.98277282714844,74.55359077453613],[-57.095550537109375,74.55748176574707],[-56.83860778808594,74.59166145324707],[-56.98277282714844,74.55359077453613]]],[[[-57.185272216796875,74.57609748840332],[-57.281944274902344,74.58166694641113],[-57.08306121826172,74.61303901672363],[-57.185272216796875,74.57609748840332]]],[[[-18.838611602783203,74.53831672668457],[-19.21999740600586,74.58110237121582],[-18.75278091430664,74.65609931945801],[-18.838611602783203,74.53831672668457]]],[[[-18.53000259399414,74.71220588684082],[-18.300556182861328,74.70526313781738],[-18.383056640625,74.6202564239502],[-18.53000259399414,74.71220588684082]]],[[[-57.47638702392578,74.70610237121582],[-57.72721862792969,74.72192573547363],[-57.431114196777344,74.71748542785645],[-57.47638702392578,74.70610237121582]]],[[[-20.166942596435547,74.89749336242676],[-19.729164123535156,74.85859870910645],[-20.08444595336914,74.7027759552002],[-20.68777847290039,74.81164741516113],[-20.493053436279297,75.03082466125488],[-19.960556030273438,74.99247932434082],[-20.166942596435547,74.89749336242676]]],[[[-17.808334350585938,75.30609321594238],[-18.215274810791016,75.22526741027832],[-17.319721221923828,75.13109016418457],[-18.91555404663086,75.0041675567627],[-18.839168548583984,75.32832527160645],[-17.808334350585938,75.30609321594238]]],[[[-65.0494384765625,76.01388740539551],[-65.22111511230469,76.04553413391113],[-64.95556640625,76.05497932434082],[-65.0494384765625,76.01388740539551]]],[[[-64.05555725097656,76.05941963195801],[-64.1461181640625,76.09305000305176],[-64.01472473144531,76.11053657531738],[-64.05555725097656,76.05941963195801]]],[[[-61.899444580078125,76.12970161437988],[-61.96221923828125,76.17859077453613],[-61.88166809082031,76.18664741516113],[-61.899444580078125,76.12970161437988]]],[[[-20.343055725097656,76.26416206359863],[-20.660831451416016,76.3388843536377],[-20.158611297607422,76.3469409942627],[-20.343055725097656,76.26416206359863]]],[[[-69.97610473632812,76.39415168762207],[-70.18832397460938,76.43914985656738],[-69.89445495605469,76.43692207336426],[-69.97610473632812,76.39415168762207]]],[[[-20.38805389404297,76.45166206359863],[-20.496109008789062,76.4749927520752],[-20.267780303955078,76.4952564239502],[-20.38805389404297,76.45166206359863]]],[[[-21.35305404663086,76.47249031066895],[-21.48971939086914,76.48970222473145],[-21.24944305419922,76.49971199035645],[-21.35305404663086,76.47249031066895]]],[[[-20.7933349609375,76.38998603820801],[-21.141109466552734,76.44748115539551],[-20.72083282470703,76.51388740539551],[-20.7933349609375,76.38998603820801]]],[[[-69.66944885253906,76.53055000305176],[-70.03639221191406,76.56331062316895],[-69.4647216796875,76.57943916320801],[-69.66944885253906,76.53055000305176]]],[[[-20.71277618408203,76.5608081817627],[-20.939441680908203,76.52331733703613],[-20.62555694580078,76.57943916320801],[-20.71277618408203,76.5608081817627]]],[[[-21.083057403564453,76.56915473937988],[-21.547500610351562,76.61526679992676],[-20.963886260986328,76.62915229797363],[-21.083057403564453,76.56915473937988]]],[[[-19.648056030273438,76.69832038879395],[-19.857223510742188,76.73193550109863],[-19.605554580688477,76.72638130187988],[-19.648056030273438,76.69832038879395]]],[[[-18.653053283691406,76.60165596008301],[-18.635276794433594,75.88998603820801],[-19.141944885253906,76.5294361114502],[-18.763057708740234,76.58777046203613],[-19.019168853759766,76.75943183898926],[-18.653053283691406,76.60165596008301]]],[[[-19.691944122314453,76.78193855285645],[-19.809165954589844,76.7885913848877],[-19.59000015258789,76.81164741516113],[-19.691944122314453,76.78193855285645]]],[[[-20.19277572631836,76.82249641418457],[-20.389442443847656,76.84721565246582],[-20.210556030273438,76.86859321594238],[-20.19277572631836,76.82249641418457]]],[[[-71.94221496582031,77.30443000793457],[-72.57389831542969,77.41388130187988],[-71.34584045410156,77.37581062316895],[-71.94221496582031,77.30443000793457]]],[[[-70.66777038574219,77.45776557922363],[-70.05638122558594,77.39915657043457],[-71.2994384765625,77.44775581359863],[-70.66777038574219,77.45776557922363]]],[[[-66.19638061523438,77.50444221496582],[-66.66082763671875,77.48858833312988],[-66.73138427734375,77.5072193145752],[-66.19638061523438,77.50444221496582]]],[[[-19.83444595336914,77.50555610656738],[-20.041667938232422,77.5658130645752],[-19.830280303955078,77.5547046661377],[-19.83444595336914,77.50555610656738]]],[[[-66.90055847167969,77.59166145324707],[-66.97084045410156,77.59942817687988],[-66.62582397460938,77.63638496398926],[-66.90055847167969,77.59166145324707]]],[[[-18.03722381591797,77.66609382629395],[-18.24222183227539,77.67997932434082],[-17.584165573120117,77.83777046203613],[-18.03722381591797,77.66609382629395]]],[[[-19.940555572509766,77.96666145324707],[-19.229164123535156,77.82971382141113],[-19.775833129882812,77.83055305480957],[-20.490833282470703,77.95471382141113],[-19.940555572509766,77.96666145324707]]],[[[-19.542224884033203,77.91609382629395],[-19.699722290039062,77.96499824523926],[-19.61361312866211,77.97192573547363],[-19.542224884033203,77.91609382629395]]],[[[-21.310279846191406,77.88554573059082],[-21.428054809570312,77.9236011505127],[-21.11111068725586,78.01220893859863],[-21.310279846191406,77.88554573059082]]],[[[-20.536113739013672,78.01582527160645],[-20.631942749023438,78.0324878692627],[-20.362777709960938,78.0516529083252],[-20.536113739013672,78.01582527160645]]],[[[-19.276668548583984,78.11775398254395],[-19.383331298828125,78.12719917297363],[-19.29888916015625,78.17581367492676],[-19.276668548583984,78.11775398254395]]],[[[-19.0433349609375,78.07693672180176],[-19.191944122314453,78.11775398254395],[-18.829723358154297,78.17637825012207],[-19.0433349609375,78.07693672180176]]],[[[-20.91583251953125,78.14610481262207],[-21.043054580688477,78.18136787414551],[-20.855554580688477,78.16526985168457],[-20.91583251953125,78.14610481262207]]],[[[-20.526668548583984,78.16137886047363],[-20.78333282470703,78.19136238098145],[-20.302223205566406,78.21331977844238],[-20.526668548583984,78.16137886047363]]],[[[-19.490554809570312,78.24136543273926],[-19.595001220703125,78.2472095489502],[-19.422775268554688,78.27665901184082],[-19.490554809570312,78.24136543273926]]],[[[-19.158889770507812,78.24026679992676],[-19.35333251953125,78.28332710266113],[-18.885555267333984,78.29525947570801],[-19.158889770507812,78.24026679992676]]],[[[-19.633331298828125,78.27665901184082],[-19.67749786376953,78.38638496398926],[-19.490554809570312,78.33055305480957],[-19.633331298828125,78.27665901184082]]],[[[-19.288333892822266,78.31387519836426],[-19.40250015258789,78.39444160461426],[-19.08194351196289,78.36303901672363],[-19.288333892822266,78.31387519836426]]],[[[-18.96999740600586,78.39248847961426],[-19.0977783203125,78.42526435852051],[-18.88111114501953,78.42886543273926],[-18.96999740600586,78.39248847961426]]],[[[-19.126110076904297,78.45526313781738],[-19.254169464111328,78.4458179473877],[-18.96416473388672,78.4749927520752],[-19.126110076904297,78.45526313781738]]],[[[-18.571945190429688,78.57805061340332],[-18.738887786865234,78.6060962677002],[-18.31472396850586,78.6736011505127],[-18.571945190429688,78.57805061340332]]],[[[-18.243053436279297,78.75082588195801],[-18.297222137451172,78.8560962677002],[-18.075557708740234,78.8177661895752],[-18.243053436279297,78.75082588195801]]],[[[-19.346946716308594,78.81137275695801],[-19.756668090820312,78.79525947570801],[-19.190834045410156,78.95305061340332],[-19.346946716308594,78.81137275695801]]],[[[-18.03722381591797,78.99275398254395],[-17.849998474121094,79.21554756164551],[-17.55638885498047,79.16415596008301],[-18.03722381591797,78.99275398254395]]],[[[-19.375,79.12637519836426],[-19.496665954589844,79.1958179473877],[-19.314443588256836,79.23137092590332],[-19.375,79.12637519836426]]],[[[-19.90833282470703,80.05914497375488],[-20.01416778564453,80.09665107727051],[-19.756946563720703,80.24136543273926],[-19.018890380859375,80.16360664367676],[-19.90833282470703,80.05914497375488]]],[[[-66.59527587890625,80.60859870910645],[-66.8961181640625,80.67109870910645],[-66.53167724609375,80.61693000793457],[-66.59527587890625,80.60859870910645]]],[[[-20.59722137451172,81.67248725891113],[-20.971111297607422,81.71443367004395],[-20.164443969726562,81.68193244934082],[-20.59722137451172,81.67248725891113]]],[[[-18.585556030273438,81.64665412902832],[-19.245830535888672,81.77777290344238],[-18.304447174072266,81.66220283508301],[-18.585556030273438,81.64665412902832]]],[[[-19.77777862548828,81.8702564239502],[-20.781944274902344,82.13388252258301],[-20.30666732788086,82.13054084777832],[-19.77777862548828,81.8702564239502]]],[[[-18.858333587646484,81.97442817687988],[-19.41388702392578,82.20555305480957],[-18.792224884033203,81.99193000793457],[-18.858333587646484,81.97442817687988]]],[[[-51.46888732910156,81.96832466125488],[-53.357505798339844,82.2249927520752],[-51.19194030761719,81.99359321594238],[-51.46888732910156,81.96832466125488]]],[[[-51.88861083984375,82.2088794708252],[-52.29389190673828,82.2774829864502],[-51.79528045654297,82.21415901184082],[-51.88861083984375,82.2088794708252]]],[[[-48.212501525878906,82.39583015441895],[-48.86444854736328,82.53915596008301],[-48.03472900390625,82.46443367004395],[-48.212501525878906,82.39583015441895]]],[[[-46.00305938720703,82.64444160461426],[-44.41889190673828,82.36609077453613],[-45.067222595214844,82.21666145324707],[-44.737220764160156,82.09582710266113],[-45.07666778564453,82.05581855773926],[-47.749168395996094,82.62498664855957],[-46.00305938720703,82.64444160461426]]],[[[-40.17444610595703,82.66026496887207],[-40.472496032714844,82.68637275695801],[-40.28916931152344,82.69803047180176],[-40.17444610595703,82.66026496887207]]],[[[-49.95471954345703,82.76999092102051],[-50.067222595214844,82.77554512023926],[-49.723052978515625,82.77998542785645],[-49.95471954345703,82.76999092102051]]],[[[-47.56861114501953,82.7824878692627],[-48.415550231933594,82.8480396270752],[-47.44249725341797,82.80386543273926],[-47.56861114501953,82.7824878692627]]],[[[-46.443885803222656,82.83249092102051],[-47.26250457763672,82.93081855773926],[-46.407501220703125,82.83610725402832],[-46.443885803222656,82.83249092102051]]],[[[-39.570556640625,82.99664497375488],[-40.546112060546875,83.15332221984863],[-39.277496337890625,83.08137702941895],[-39.570556640625,82.99664497375488]]],[[[-38.31861114501953,83.13360786437988],[-38.65972137451172,83.16470527648926],[-38.00917053222656,83.1524829864502],[-38.31861114501953,83.13360786437988]]],[[[-39.904998779296875,82.99887275695801],[-41.48277282714844,83.16499519348145],[-40.836944580078125,83.16360664367676],[-39.904998779296875,82.99887275695801]]],[[[-40.15777587890625,83.20332527160645],[-40.57917022705078,83.21971321105957],[-40.086944580078125,83.21165657043457],[-40.15777587890625,83.20332527160645]]],[[[-41.03722381591797,83.20860481262207],[-41.60639190673828,83.22442817687988],[-41.001670837402344,83.21220588684082],[-41.03722381591797,83.20860481262207]]],[[[-42.0977783203125,83.2422046661377],[-42.418060302734375,83.25387763977051],[-41.959442138671875,83.25166511535645],[-42.0977783203125,83.2422046661377]]],[[[-39.64611053466797,83.26220893859863],[-38.63972473144531,83.11581611633301],[-40.67333221435547,83.28027534484863],[-39.64611053466797,83.26220893859863]]],[[[-41.24444580078125,83.28776741027832],[-41.68444061279297,83.31360054016113],[-41.456390380859375,83.32721138000488],[-41.24444580078125,83.28776741027832]]],[[[-38.90277862548828,83.2905445098877],[-39.62194061279297,83.3369312286377],[-39.22388458251953,83.39694404602051],[-38.90277862548828,83.2905445098877]]],[[[-32.30027770996094,83.57026863098145],[-25.650554656982422,83.29165840148926],[-35.617774963378906,82.90109443664551],[-25.142223358154297,83.16276741027832],[-24.751113891601562,83.00082588195801],[-25.901111602783203,82.7774829864502],[-23.992774963378906,82.91165351867676],[-21.314167022705078,82.60803413391113],[-25.068889617919922,82.1524829864502],[-31.61888885498047,82.20749092102051],[-29.904720306396484,82.09332466125488],[-33.09833526611328,81.77388191223145],[-25.202499389648438,81.98942756652832],[-27.63083267211914,81.4861011505127],[-27.32861328125,81.38081550598145],[-24.210556030273438,81.70833015441895],[-24.00222396850586,82.00972175598145],[-22.016944885253906,81.93304634094238],[-22.231109619140625,81.46582221984863],[-24.511669158935547,80.54081916809082],[-19.940834045410156,81.68304634094238],[-20.305557250976562,81.45109748840332],[-18.017223358154297,81.46805000305176],[-17.35388946533203,81.70193672180176],[-17.534725189208984,81.85359382629395],[-16.70055389404297,81.93193244934082],[-12.155000686645508,81.60331916809082],[-16.005001068115234,80.72859382629395],[-21.24749755859375,80.57554817199707],[-16.113887786865234,80.50248908996582],[-17.113887786865234,80.23692512512207],[-19.70083236694336,80.28581428527832],[-20.55472183227539,80.10582160949707],[-20.755001068115234,79.86499214172363],[-20.326946258544922,79.76054573059082],[-19.289443969726562,80.10331916809082],[-17.44916534423828,80.05581855773926],[-19.631389617919922,79.66137886047363],[-19.86888885498047,79.15304756164551],[-19.573612213134766,79.33110237121582],[-19.078887939453125,79.20054817199707],[-19.378334045410156,79.27499580383301],[-20.091110229492188,79.06360054016113],[-19.914722442626953,78.96415901184082],[-20.01805877685547,78.87719917297363],[-21.182498931884766,78.80998420715332],[-20.926387786865234,78.68997383117676],[-21.426944732666016,78.64444160461426],[-20.906387329101562,78.62414741516113],[-22.039443969726562,77.68831062316895],[-21.57833480834961,77.56414985656738],[-20.866390228271484,78.0152759552002],[-20.311946868896484,77.87082099914551],[-19.23999786376953,77.76304817199707],[-18.9566650390625,77.62886238098145],[-21.053611755371094,77.54387092590332],[-18.395832061767578,77.34276008605957],[-18.120555877685547,76.94832038879395],[-18.305278778076172,76.80609321594238],[-20.723052978515625,76.98831367492676],[-21.728885650634766,76.88360786437988],[-20.939441680908203,76.84248542785645],[-21.604999542236328,76.64471626281738],[-22.738887786865234,76.70443916320801],[-21.814443588256836,76.59027290344238],[-22.506946563720703,76.44803047180176],[-21.573055267333984,76.43664741516113],[-21.682220458984375,76.2391529083252],[-19.805835723876953,76.22859382629395],[-21.982219696044922,75.99193000793457],[-19.825000762939453,75.90915107727051],[-19.335556030273438,75.40498542785645],[-19.88277816772461,75.14583015441895],[-22.251113891601562,75.66415596008301],[-21.406387329101562,75.45555305480957],[-22.511390686035156,75.53082466125488],[-20.515003204345703,75.14082527160645],[-22.43555450439453,75.16388130187988],[-20.63888931274414,75.06192207336426],[-20.762779235839844,74.8469409942627],[-20.606109619140625,74.73692512512207],[-21.119720458984375,74.66165351867676],[-18.97777557373047,74.48166084289551],[-19.68499755859375,74.23748970031738],[-22.082778930664062,74.59832954406738],[-21.765003204345703,74.41943550109863],[-22.479164123535156,74.31192207336426],[-22.053054809570312,74.28387641906738],[-22.492494583129883,74.07443428039551],[-21.980552673339844,73.99803352355957],[-21.821666717529297,73.65109443664551],[-21.748607635498047,74.05832099914551],[-20.283058166503906,73.87997627258301],[-20.501113891601562,73.4527759552002],[-22.379165649414062,73.25055122375488],[-24.032222747802734,73.70248603820801],[-22.178333282470703,73.62469673156738],[-24.044166564941406,73.81469917297363],[-24.463054656982422,73.53581428527832],[-25.68694305419922,73.95248603820801],[-24.67416763305664,73.5133228302002],[-25.31500244140625,73.46165657043457],[-25.721385955810547,73.26361274719238],[-26.012500762939453,73.2422046661377],[-27.337501525878906,73.49247932434082],[-26.387500762939453,73.24136543273926],[-27.72861099243164,73.12970161437988],[-27.49749755859375,72.92442512512207],[-26.44916534423828,73.19359016418457],[-25.053890228271484,73.08276557922363],[-27.38833236694336,72.83665657043457],[-26.30472183227539,72.72776985168457],[-26.46277618408203,72.57222175598145],[-24.842498779296875,72.71943855285645],[-24.60944366455078,72.52331733703613],[-25.90833282470703,72.41388130187988],[-25.289169311523438,72.38443183898926],[-25.526668548583984,72.12137031555176],[-24.588333129882812,72.42109870910645],[-22.494441986083984,71.89276313781738],[-23.12555694580078,71.62608528137207],[-21.895832061767578,71.74081611633301],[-22.506389617919922,71.54971504211426],[-22.473331451416016,71.26304817199707],[-21.805557250976562,71.50943183898926],[-21.60361099243164,71.32304573059082],[-21.961666107177734,71.26388740539551],[-21.6875,71.14915657043457],[-22.33388900756836,71.05359077453613],[-21.681110382080078,71.06833076477051],[-21.92916488647461,70.80220222473145],[-21.474720001220703,70.53997993469238],[-22.37722396850586,70.44165229797363],[-22.506946563720703,70.85054206848145],[-22.62277603149414,70.44664192199707],[-23.34583282470703,70.43914985656738],[-24.73999786376953,71.33221626281738],[-28.639720916748047,72.12442207336426],[-27.325000762939453,71.70971870422363],[-28.466941833496094,71.55247688293457],[-25.411388397216797,71.34915351867676],[-26.478885650634766,70.96026802062988],[-28.409164428710938,70.97581672668457],[-27.91416358947754,70.8672046661377],[-29.20694351196289,70.39415168762207],[-26.322223663330078,70.37303352355957],[-28.54277801513672,70.04471015930176],[-27.34194564819336,69.96249580383301],[-25.229164123535156,70.41443061828613],[-22.079166412353516,70.12970161437988],[-23.930553436279297,69.7552661895752],[-23.579166412353516,69.62359809875488],[-24.343334197998047,69.60443305969238],[-24.072776794433594,69.4780445098877],[-26.36333465576172,68.66748237609863],[-29.378055572509766,68.1988697052002],[-29.862220764160156,68.41360664367676],[-30.196945190429688,68.24247932434082],[-30.03028106689453,68.11165046691895],[-31.571666717529297,68.06694221496582],[-31.745830535888672,68.21081733703613],[-31.53583526611328,68.23942756652832],[-32.007225036621094,68.26193428039551],[-32.48500061035156,68.61998176574707],[-32.133331298828125,68.19609260559082],[-32.40027618408203,68.19941902160645],[-31.999164581298828,68.09526252746582],[-32.122772216796875,67.85775947570801],[-33.1986083984375,67.68803596496582],[-33.600555419921875,67.37137031555176],[-33.36583709716797,67.24693489074707],[-33.973052978515625,66.99054145812988],[-34.26721954345703,66.5758228302002],[-34.429725646972656,66.74136543273926],[-34.406944274902344,66.54081916809082],[-34.719993591308594,66.33831977844238],[-35.85166931152344,66.43359565734863],[-35.587501525878906,66.11026191711426],[-36.331947326660156,65.90721321105957],[-36.343055725097656,66.07998847961426],[-36.56666564941406,66.07666206359863],[-36.52111053466797,65.98471260070801],[-36.98027801513672,65.83749580383301],[-37.07749938964844,66.06219673156738],[-37.19305419921875,65.76915168762207],[-37.81138610839844,66.03055000305176],[-37.184722900390625,66.34166145324707],[-38.106109619140625,66.38693428039551],[-37.69166564941406,66.25972175598145],[-38.05194091796875,65.9124927520752],[-38.483612060546875,66.0102710723877],[-38.10083770751953,65.80304145812988],[-38.241943359375,65.62942695617676],[-40.09638977050781,65.56721687316895],[-39.75556182861328,65.24275398254395],[-41.155555725097656,64.96443367004395],[-40.35889434814453,64.34832954406738],[-40.788055419921875,64.38443183898926],[-41.09166717529297,64.30220222473145],[-41.325836181640625,64.34137153625488],[-41.50695037841797,64.3258228302002],[-41.56945037841797,64.26555061340332],[-40.567779541015625,64.1091480255127],[-40.83860778808594,63.94554328918457],[-40.51805877685547,63.697214126586914],[-41.617774963378906,63.79222297668457],[-40.74833679199219,63.509164810180664],[-41.17066955566406,63.51360511779785],[-40.99888610839844,63.40749549865723],[-41.11333465576172,63.385271072387695],[-41.3941650390625,63.55221748352051],[-41.23833465576172,63.404436111450195],[-41.580833435058594,63.48777198791504],[-41.11333465576172,63.30721473693848],[-41.687217712402344,63.52499580383301],[-41.907501220703125,63.4647159576416],[-41.429168701171875,63.12638282775879],[-42.17444610595703,63.20166206359863],[-41.61528015136719,62.987497329711914],[-41.75556182861328,62.839433670043945],[-43.14722442626953,62.75777626037598],[-42.16221618652344,62.38388252258301],[-42.979164123535156,62.515275955200195],[-42.26111602783203,62.24249458312988],[-42.54084014892578,61.94360542297363],[-42.11583709716797,62.006662368774414],[-42.86944580078125,61.77305030822754],[-42.434722900390625,61.55721473693848],[-43.07917022705078,61.59360694885254],[-42.50750732421875,61.35527229309082],[-43.24610900878906,61.33915901184082],[-42.62999725341797,61.09832954406738],[-43.61277770996094,61.12777137756348],[-42.70471954345703,61.05777168273926],[-43.48444366455078,60.93332862854004],[-42.79084014892578,60.801103591918945],[-43.52666473388672,60.83721351623535],[-42.74944305419922,60.683603286743164],[-44.20249938964844,60.59332466125488],[-43.168609619140625,60.39749336242676],[-43.13750457763672,60.07943916320801],[-44.10083770751953,60.384164810180664],[-44.08055877685547,60.286386489868164],[-44.4566650390625,60.148332595825195],[-44.60417175292969,59.982492446899414],[-45.15277862548828,60.074167251586914],[-44.47083282470703,60.55721473693848],[-45.18999481201172,60.129159927368164],[-44.62610626220703,60.73333168029785],[-45.203330993652344,60.43526649475098],[-45.09916687011719,60.645830154418945],[-45.491943359375,60.48999214172363],[-45.313331604003906,60.69999885559082],[-45.97833251953125,60.57388496398926],[-45.671775817871094,60.67632865905762],[-45.84972381591797,60.69748878479004],[-45.25305938720703,60.901933670043945],[-46.22138214111328,60.753610610961914],[-45.19972229003906,61.18998908996582],[-46.0655517578125,60.92110633850098],[-45.65361022949219,61.142221450805664],[-45.76972198486328,61.33360481262207],[-46.00972557067871,61.22304725646973],[-45.839996337890625,61.164995193481445],[-45.915000915527344,61.09027290344238],[-46.22943878173828,60.97471046447754],[-46.406105041503906,61.08416175842285],[-46.380279541015625,61.04110908508301],[-46.442222595214844,60.999162673950195],[-46.52333068847656,61.015275955200195],[-46.58167266845703,60.90582466125488],[-46.83527374267578,60.93027687072754],[-46.70527458190918,60.88138008117676],[-46.85722351074219,60.797494888305664],[-46.95861053466797,60.86332893371582],[-46.91444396972656,60.93332862854004],[-47.02305603027344,60.97609901428223],[-47.80944061279297,60.879159927368164],[-47.31945037841797,60.86776924133301],[-47.447776794433594,60.82027626037598],[-48.2388916015625,60.819719314575195],[-47.68943786621094,61.0049991607666],[-48.40638732910156,60.98832893371582],[-47.83361053466797,61.041940689086914],[-48.21888732910156,61.18499183654785],[-47.91722106933594,61.324167251586914],[-48.4102783203125,61.132211685180664],[-48.63722229003906,61.238046646118164],[-48.37860870361328,61.3638858795166],[-49.06610870361328,61.39805030822754],[-48.34416198730469,61.604997634887695],[-49.29750061035156,61.55749702453613],[-48.599212646484375,61.63633918762207],[-49.148887634277344,61.71859931945801],[-48.7630615234375,61.98472023010254],[-49.440277099609375,61.84221839904785],[-48.840553283691406,62.07694435119629],[-49.66944885253906,61.99554634094238],[-49.29389190673828,62.17222023010254],[-50.317779541015625,62.49527168273926],[-49.94749450683594,62.827219009399414],[-50.28028106689453,62.70471382141113],[-50.317222595214844,62.743051528930664],[-50.15083312988281,62.93082618713379],[-49.701393127441406,63.05749702453613],[-50.19150161743164,62.93366050720215],[-50.37999725341797,62.784440994262695],[-50.149993896484375,63.015275955200195],[-50.60639190673828,63.094438552856445],[-50.059844970703125,63.2287540435791],[-51.10778045654297,63.339433670043945],[-50.27610778808594,63.401384353637695],[-51.22138214111328,63.43943214416504],[-50.504722595214844,63.66721534729004],[-51.55944061279297,63.70916175842285],[-50.924171447753906,63.93249702453613],[-51.443328857421875,63.80499458312988],[-51.60194396972656,64.03471565246582],[-50.04833984375,64.19413948059082],[-51.761390686035156,64.18193244934082],[-50.950836181640625,64.21805000305176],[-50.843055725097656,64.2541675567627],[-51.04194641113281,64.27554512023926],[-50.85639190673828,64.4155445098877],[-50.35222625732422,64.38275337219238],[-50.173057556152344,64.44832038879395],[-50.856666564941406,64.63304328918457],[-49.58429718017578,64.33764839172363],[-50.0655517578125,64.52916145324707],[-49.99888610839844,64.86914253234863],[-50.56055450439453,64.76805305480957],[-50.978607177734375,65.21971321105957],[-50.63666534423828,64.75305366516113],[-51.22416687011719,64.76220893859863],[-52.00695037841797,64.20359992980957],[-52.03916931152344,64.39915657043457],[-52.105560302734375,64.38720893859863],[-52.05750274658203,64.59908485412598],[-52.120277404785156,64.72026252746582],[-51.2469482421875,65.01748847961426],[-52.211387634277344,64.80664253234863],[-52.09972381591797,65.2391529083252],[-52.55889129638672,65.32748603820801],[-51.72083282470703,65.58221626281738],[-51.90110778808594,65.62387275695801],[-51.69444274902344,65.69859504699707],[-51.24388885498047,65.75972175598145],[-50.54583740234375,65.70694160461426],[-51.20916557312012,65.79609870910645],[-51.48472595214844,65.76304817199707],[-51.94805145263672,65.65887641906738],[-51.93444061279297,65.54637336730957],[-52.497779846191406,65.38720893859863],[-52.46916198730469,65.64082527160645],[-52.80194091796875,65.53888130187988],[-52.68888854980469,65.80554389953613],[-53.268333435058594,65.74693489074707],[-51.831947326660156,66.05581855773926],[-53.46221923828125,66.03415107727051],[-51.271385192871094,66.84387397766113],[-50.32917022705078,66.83305549621582],[-50.956390380859375,66.9347095489502],[-49.997779846191406,66.98082160949707],[-50.63221740722656,67.01582527160645],[-50.33472442626953,67.07193183898926],[-51.18943786621094,66.91775703430176],[-53.476661682128906,66.09887886047363],[-53.11833190917969,66.28581428527832],[-53.619720458984375,66.24331855773926],[-53.633331298828125,66.50444221496582],[-52.41638946533203,66.54637336730957],[-53.451942443847656,66.63749885559082],[-52.2288818359375,66.8399829864502],[-53.965553283691406,67.07470893859863],[-53.81666564941406,67.17886543273926],[-53.37999725341797,67.20221138000488],[-53.588890075683594,67.21499824523926],[-53.47721862792969,67.2391529083252],[-52.151390075683594,67.36998176574707],[-51.52471923828125,67.32304573059082],[-51.18943786621094,67.12359809875488],[-50.351112365722656,67.18054389953613],[-51.52583312988281,67.3510913848877],[-51.15166473388672,67.42331123352051],[-53.252227783203125,67.32054328918457],[-53.79833984375,67.2027759552002],[-53.88111114501953,67.26388740539551],[-52.49610900878906,67.76971626281738],[-51.80944061279297,67.62581062316895],[-51.330284118652344,67.67581367492676],[-50.70055389404297,67.49165534973145],[-50.07194519042969,67.50999641418457],[-50.85222625732422,67.59082221984863],[-50.274444580078125,67.7310962677002],[-49.93666076660156,67.6938648223877],[-50.288612365722656,67.74498176574707],[-50.65027618408203,67.65165901184082],[-50.96971893310547,67.6222095489502],[-51.23082733154297,67.69720649719238],[-50.417503356933594,67.84443855285645],[-51.33111572265625,67.86886787414551],[-51.05999755859375,67.97415351867676],[-53.75361633300781,67.6010913848877],[-52.954559326171875,67.97898292541504],[-53.187217712402344,68.04332160949707],[-52.05999755859375,67.97526741027832],[-53.32111358642578,68.18441963195801],[-52.41444396972656,68.0627613067627],[-52.802223205566406,68.16887092590332],[-51.85778045654297,68.04193305969238],[-51.18860626220703,68.06360054016113],[-50.56945037841797,67.90081977844238],[-50.153053283691406,67.93332099914551],[-51.434165954589844,68.19832038879395],[-50.9566650390625,68.1827564239502],[-51.18360900878906,68.39888191223145],[-50.81999969482422,68.50360298156738],[-52.419166564941406,68.18054389953613],[-53.38916778564453,68.3277759552002],[-53.07972717285156,68.32304573059082],[-52.461669921875,68.54498481750488],[-50.86583709716797,68.61470222473145],[-50.65638732910156,68.82554817199707],[-51.292503356933594,68.74832344055176],[-51.069725036621094,69.13109016418457],[-50.209442138671875,68.96081733703613],[-50.687774658203125,69.11775398254395],[-50.13861083984375,69.17747688293457],[-50.380828857421875,69.3388843536377],[-51.122772216796875,69.20138740539551],[-50.20471954345703,69.52192878723145],[-50.883056640625,69.49136543273926],[-50.19166564941406,69.75749397277832],[-50.31361389160156,69.8733081817627],[-50.58916473388672,69.92192268371582],[-50.21416473388672,70.02165412902832],[-52.312774658203125,70.0466480255127],[-54.62638854980469,70.65193367004395],[-54.063331604003906,70.82971382141113],[-52.72222137451172,70.74470710754395],[-50.6763916015625,70.3227710723877],[-50.49055480957031,70.50972175598145],[-51.03722381591797,70.43081855773926],[-50.939720153808594,70.46776008605957],[-51.345001220703125,70.5666675567627],[-50.61888885498047,70.62858772277832],[-51.43860626220703,70.74775886535645],[-50.633056640625,70.74026679992676],[-51.95249938964844,71.02110481262207],[-50.92888641357422,70.98858833312988],[-51.48527526855469,71.06303596496582],[-51.226661682128906,71.14166450500488],[-52.24944305419922,71.1233081817627],[-51.64555358886719,71.36137580871582],[-52.55555725097656,71.17137336730957],[-51.348052978515625,71.4861011505127],[-52.983612060546875,71.41526985168457],[-51.64055633544922,71.71110725402832],[-53.25055694580078,71.7027759552002],[-52.68444061279297,72.00166511535645],[-53.32194519042969,71.82222175598145],[-53.857505798339844,72.32165718078613],[-53.560279846191406,72.35803413391113],[-53.95500183105469,72.32249641418457],[-53.39666557312012,71.85193061828613],[-54.10028076171875,71.70749092102051],[-53.915550231933594,71.44192695617676],[-55.32361602783203,71.38693428039551],[-55.90583038330078,71.67859077453613],[-54.38444519042969,72.22249031066895],[-55.29833984375,71.92859077453613],[-55.58000183105469,71.99887275695801],[-54.682777404785156,72.36638069152832],[-55.62638854980469,72.45749092102051],[-54.29639434814453,72.47998237609863],[-55.016395568847656,72.51999092102051],[-54.627220153808594,72.62164497375488],[-54.87055206298828,72.64248847961426],[-54.60472106933594,72.82805061340332],[-54.850555419921875,73.01443672180176],[-55.697776794433594,73.0666675567627],[-55.08583068847656,73.36276435852051],[-56.075836181640625,73.64860725402832],[-55.60778045654297,73.72026252746582],[-56.40972137451172,74.06608772277832],[-56.12916564941406,74.27832221984863],[-57.32500457763672,74.10775947570801],[-56.309165954589844,74.28720283508301],[-56.71333312988281,74.34082221984863],[-56.13111114501953,74.38388252258301],[-56.79722595214844,74.44331550598145],[-56.19249725341797,74.5516529083252],[-58.697776794433594,75.34637641906738],[-58.208892822265625,75.44192695617676],[-58.408050537109375,75.71527290344238],[-60.87860870361328,76.1524829864502],[-63.440834045410156,76.3733081817627],[-65.47972106933594,76.01860237121582],[-65.88833618164062,76.09832954406738],[-65.55332946777344,76.23387336730957],[-65.76945495605469,76.27554512023926],[-67.30610656738281,76.16748237609863],[-66.4586181640625,75.90971565246582],[-68.50056457519531,76.0869312286377],[-69.63333129882812,76.38081550598145],[-67.98222351074219,76.67943000793457],[-71.37527465820312,77.05609321594238],[-66.4486083984375,77.13388252258301],[-66.17083740234375,77.19331550598145],[-69.10166931152344,77.27192878723145],[-66.23832702636719,77.24859809875488],[-66.65916442871094,77.41443061828613],[-66.05555725097656,77.49136543273926],[-66.725830078125,77.68081855773926],[-68.3447265625,77.49859809875488],[-68.69943237304688,77.66388130187988],[-69.25028991699219,77.45305061340332],[-70.28999328613281,77.56360054016113],[-69.48361206054688,77.75360298156738],[-70.602783203125,77.67804145812988],[-69.96861267089844,77.83360481262207],[-71.32000732421875,77.76361274719238],[-73.05360412597656,78.15721321105957],[-72.4566650390625,78.28637886047363],[-72.84944152832031,78.31414985656738],[-72.55221557617188,78.52110481262207],[-65.97666931152344,79.10165596008301],[-64.82333374023438,79.53360176086426],[-65.06889343261719,80.00915718078613],[-63.78446960449219,80.1483325958252],[-67.04972839355469,80.05748176574707],[-67.4808349609375,80.32554817199707],[-63.68055725097656,81.14387702941895],[-62.79444885253906,80.75110054016113],[-63.371665954589844,81.15582466125488],[-61.056663513183594,81.11970710754395],[-61.313331604003906,81.35582160949707],[-60.770835876464844,81.50055122375488],[-61.45222473144531,81.75305366516113],[-60.806663513183594,81.87997627258301],[-58.899444580078125,81.86470222473145],[-56.47833251953125,81.33249092102051],[-59.466941833496094,81.99693489074707],[-54.505279541015625,82.36554145812988],[-53.559722900390625,82.11609077453613],[-53.82361602783203,81.69359016418457],[-53.63444519042969,81.5133228302002],[-52.899169921875,82.03415107727051],[-49.614723205566406,81.6402759552002],[-51.0655517578125,81.93220710754395],[-49.432220458984375,81.92776679992676],[-51.11888885498047,82.49414253234863],[-50.3175048828125,82.5183277130127],[-44.63999938964844,81.7541675567627],[-44.183326721191406,81.83415412902832],[-44.92527770996094,81.98970222473145],[-44.50250244140625,82.08970832824707],[-44.79528045654297,82.18997383117676],[-44.1905517578125,82.31248664855957],[-42.299171447753906,82.21666145324707],[-45.765838623046875,82.76443672180176],[-42.14277458190918,82.76165962219238],[-41.682777404785156,82.4780445098877],[-41.89805603027344,82.73275947570801],[-41.55027770996094,82.73665046691895],[-39.752784729003906,82.39888191223145],[-40.135276794433594,82.71443367004395],[-46.88999938964844,82.96110725402832],[-43.38666534423828,82.91443061828613],[-45.52471923828125,83.1222095489502],[-42.69499969482422,83.2744312286377],[-38.57444763183594,82.74414253234863],[-39.15027618408203,82.98027229309082],[-36.87749481201172,83.14721870422363],[-38.85639190673828,83.4316577911377],[-32.30027770996094,83.57026863098145]],[[-20.11333465576172,77.65332221984863],[-20.438331604003906,77.62886238098145],[-20.00833511352539,77.60693550109863],[-20.11333465576172,77.65332221984863]]]]}},{"type":"Feature","properties":{"name":"Germany","iso2":"DE","iso3":"DEU"},"geometry":{"type":"MultiPolygon","coordinates":[[[[8.710256576538086,47.69680976867676],[8.678594589233398,47.69334602355957],[8.670557022094727,47.71110725402832],[8.710256576538086,47.69680976867676]]],[[[6.806390762329102,53.60222053527832],[6.746946334838867,53.56027412414551],[6.658334732055664,53.58610725402832],[6.806390762329102,53.60222053527832]]],[[[6.939443588256836,53.669443130493164],[6.87639045715332,53.67027473449707],[7.088335037231445,53.68416786193848],[6.939443588256836,53.669443130493164]]],[[[7.242498397827148,53.70443916320801],[7.135835647583008,53.70611000061035],[7.346944808959961,53.72110939025879],[7.242498397827148,53.70443916320801]]],[[[8.191110610961914,53.72471809387207],[8.120000839233398,53.71305274963379],[8.142778396606445,53.73360633850098],[8.191110610961914,53.72471809387207]]],[[[7.622224807739258,53.75444221496582],[7.467779159545898,53.73305702209473],[7.485834121704102,53.75750160217285],[7.622224807739258,53.75444221496582]]],[[[7.758890151977539,53.76055335998535],[7.664445877075195,53.761667251586914],[7.812780380249023,53.77555274963379],[7.758890151977539,53.76055335998535]]],[[[8.42527961730957,53.928056716918945],[8.411664962768555,53.95555305480957],[8.454999923706055,53.96305274963379],[8.42527961730957,53.928056716918945]]],[[[13.940279006958008,54.02499580383301],[13.925832748413086,54.018327713012695],[13.934446334838867,54.02777290344238],[13.940279006958008,54.02499580383301]]],[[[8.695554733276367,54.04110908508301],[8.671388626098633,54.077775955200195],[8.693334579467773,54.08249855041504],[8.695554733276367,54.04110908508301]]],[[[14.001317977905273,54.06536293029785],[14.225557327270508,53.928606033325195],[14.218889236450195,53.86902046203613],[13.823431015014648,53.85374641418457],[14.056005477905273,53.98486518859863],[13.759164810180664,54.15999794006348],[14.001317977905273,54.06536293029785]]],[[[10.97944450378418,54.38055610656738],[11.017778396606445,54.38027381896973],[11.003053665161133,54.37693977355957],[10.97944450378418,54.38055610656738]]],[[[8.893056869506836,54.46193885803223],[8.815000534057617,54.50083351135254],[8.960554122924805,54.51916694641113],[8.893056869506836,54.46193885803223]]],[[[11.312776565551758,54.40694618225098],[11.006387710571289,54.4616641998291],[11.184167861938477,54.51999855041504],[11.312776565551758,54.40694618225098]]],[[[8.662778854370117,54.49416542053223],[8.59111213684082,54.52777290344238],[8.710832595825195,54.55166816711426],[8.662778854370117,54.49416542053223]]],[[[13.073610305786133,54.48861122131348],[13.09666633605957,54.59055519104004],[13.151388168334961,54.6027774810791],[13.073610305786133,54.48861122131348]]],[[[13.383054733276367,54.63888740539551],[13.730833053588867,54.275835037231445],[13.11833381652832,54.33388710021973],[13.267499923706055,54.38250160217285],[13.146963119506836,54.54560661315918],[13.503091812133789,54.49309730529785],[13.244722366333008,54.55916786193848],[13.383054733276367,54.63888740539551]]],[[[8.364442825317383,54.61332893371582],[8.294443130493164,54.66666603088379],[8.353887557983398,54.7116641998291],[8.364442825317383,54.61332893371582]]],[[[8.567777633666992,54.68527412414551],[8.396944046020508,54.713884353637695],[8.551111221313477,54.75388526916504],[8.567777633666992,54.68527412414551]]],[[[10.97944450378418,54.38055610656738],[10.818536758422852,53.89005470275879],[12.526945114135742,54.47416114807129],[12.924165725708008,54.42694282531738],[12.369722366333008,54.26500129699707],[13.023889541625977,54.39972114562988],[13.455831527709961,54.09610939025879],[13.718332290649414,54.16971778869629],[13.813055038452148,53.84527778625488],[14.275629043579102,53.69906806945801],[14.149168014526367,52.86277961730957],[14.640275955200195,52.57249641418457],[14.599443435668945,51.81860542297363],[15.03639030456543,51.28555488586426],[14.828332901000977,50.86583137512207],[14.309720993041992,51.053606033325195],[12.093706130981445,50.32253456115723],[12.674444198608398,49.424997329711914],[13.833612442016602,48.77360725402832],[12.758333206176758,48.12388801574707],[13.016668319702148,47.47027778625488],[12.735555648803711,47.68416786193848],[11.095556259155273,47.3961124420166],[10.478055953979492,47.59194374084473],[10.173334121704102,47.27472114562988],[9.56672477722168,47.54045295715332],[8.566110610961914,47.80694007873535],[8.576421737670898,47.59137153625488],[7.697225570678711,47.5433292388916],[7.58827018737793,47.584482192993164],[7.578889846801758,48.11972236633301],[8.226079940795898,48.96441841125488],[6.36216926574707,49.45939064025879],[6.524446487426758,49.808610916137695],[6.134416580200195,50.12784767150879],[6.39820671081543,50.32317543029785],[6.011800765991211,50.757272720336914],[5.864721298217773,51.04610633850098],[6.222223281860352,51.465829849243164],[5.962499618530273,51.80777931213379],[6.828889846801758,51.96555519104004],[7.065557479858398,52.38582801818848],[6.68889045715332,52.54916572570801],[7.051668167114258,52.64361000061035],[7.208364486694336,53.242807388305664],[7.015554428100586,53.41472053527832],[7.295835494995117,53.68527412414551],[8.008333206176758,53.71000099182129],[8.503053665161133,53.35416603088379],[8.665555953979492,53.89388465881348],[9.832498550415039,53.536386489868164],[8.899721145629883,53.94082832336426],[8.883611679077148,54.29416847229004],[8.599443435668945,54.33388710021973],[9.016942977905273,54.49833106994629],[8.580549240112305,54.86787986755371],[8.281110763549805,54.7469425201416],[8.393331527709961,55.053056716918945],[8.664545059204102,54.913095474243164],[9.44536018371582,54.82540321350098],[9.972776412963867,54.76111030578613],[9.870279312133789,54.45443916320801],[10.97944450378418,54.38055610656738]],[[11.459165573120117,53.96110725402832],[11.488611221313477,54.02305030822754],[11.37388801574707,53.98861122131348],[11.459165573120117,53.96110725402832]],[[11.544168472290039,54.06138801574707],[11.612421035766602,54.10458564758301],[11.511110305786133,54.04860877990723],[11.544168472290039,54.06138801574707]],[[12.72972297668457,54.41666603088379],[12.702775955200195,54.42833137512207],[12.68610954284668,54.4183292388916],[12.72972297668457,54.41666603088379]]]]}},{"type":"Feature","properties":{"name":"Guam","iso2":"GU","iso3":"GUM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[144.709412,13.234997],[144.655243,13.427776],[144.875244,13.65361],[144.709412,13.234997]]]]}},{"type":"Feature","properties":{"name":"Greece","iso2":"GR","iso3":"GRC"},"geometry":{"type":"MultiPolygon","coordinates":[[[[24.128609,34.856667000000144],[24.128609,34.808884],[24.04472,34.849998],[24.128609,34.856667000000144]]],[[[26.900555,35.358887],[26.89805200000012,35.419998],[27.019997000000103,35.430832],[26.900555,35.358887]]],[[[23.858608,35.52166],[26.290554,35.131104],[24.752777,34.942215],[23.521111,35.288055000000114],[23.606388000000123,35.613327],[23.858608,35.52166]]],[[[27.15749700000012,35.445831000000126],[27.066109,35.60499600000013],[27.228054,35.826385000000144],[27.15749700000012,35.445831000000126]]],[[[23.332222,35.825272],[23.273052,35.899994],[23.325832,35.872215],[23.332222,35.825272]]],[[[23.049442000000113,36.13694],[22.929443,36.37944],[23.107220000000154,36.243889000000124],[23.049442000000113,36.13694]]],[[[25.838882,36.348053],[25.730270000000104,36.369713],[25.771111,36.401932],[25.838882,36.348053]]],[[[25.399162,36.39444],[25.391388,36.408051],[25.406666,36.410553],[25.399162,36.39444]]],[[[27.786663,35.890549],[27.719719,36.1661000000001],[28.225826,36.45304900000012],[27.786663,35.890549]]],[[[27.400272,36.372498],[27.297771,36.464432000000116],[27.445827,36.4086],[27.400272,36.372498]]],[[[25.457771,36.333611],[25.371941,36.472488],[25.486382,36.408051],[25.457771,36.333611]]],[[[26.342216,36.506386],[26.262497,36.59166],[26.460548000000188,36.598053],[26.342216,36.506386]]],[[[27.854717,36.527222],[27.764996,36.574997],[27.859718,36.650269],[27.854717,36.527222]]],[[[24.950275,36.590553],[24.840832,36.658882],[24.938332,36.632774],[24.950275,36.590553]]],[[[25.089722,36.633881],[25.102219,36.693329],[25.187775,36.71666],[25.089722,36.633881]]],[[[21.785831000000115,36.736938],[21.774998,36.697777],[21.75055300000011,36.71249400000012],[21.76055500000018,36.754997],[21.785831000000115,36.736938]]],[[[24.413609000000122,36.66027100000015],[24.349163,36.746109],[24.548054,36.75943800000012],[24.413609000000122,36.66027100000015]]],[[[25.385551,36.651665],[25.275829,36.78138000000017],[25.407219,36.717766],[25.385551,36.651665]]],[[[24.662777000000148,36.747498],[24.609722,36.778328],[24.665276000000148,36.77638200000017],[24.662777000000148,36.747498]]],[[[21.69860800000015,36.739166],[21.704441000000145,36.7966610000001],[21.728333,36.79277],[21.69860800000015,36.739166]]],[[[24.558609000000132,36.775551000000135],[24.521111000000133,36.823883],[24.562496,36.848610000000136],[24.558609000000132,36.775551000000135]]],[[[25.459995000000106,36.822220000000115],[25.420830000000194,36.83194],[25.4741590000001,36.869164],[25.459995000000106,36.822220000000115]]],[[[25.826664,36.779709],[25.73693800000018,36.784431],[25.976662,36.874161],[25.826664,36.779709]]],[[[26.965832,36.681664],[27.064159000000103,36.838875],[27.35277600000012,36.872208],[26.965832,36.681664]]],[[[25.680832,36.878052],[25.609161,36.886658],[25.651939,36.906097],[25.680832,36.878052]]],[[[25.076664000000108,36.951935],[25.023605000000146,36.999146],[25.083881,37.04248000000014],[25.076664000000108,36.951935]]],[[[24.711941,36.903053],[24.641109000000142,37.042221],[24.765274,36.958328],[24.711941,36.903053]]],[[[26.975552,36.924431],[26.890831,37.076378],[27.04832800000014,36.993607],[26.975552,36.924431]]],[[[25.834438,37.09304],[25.782494,37.11998700000011],[25.825554,37.125542],[25.834438,37.09304]]],[[[25.250275,37.008324],[25.09832800000015,37.027489],[25.268604,37.138611],[25.250275,37.008324]]],[[[26.886662,37.09665700000015],[26.769161000000167,37.17638400000011],[26.85833000000011,37.181107],[26.886662,37.09665700000015]]],[[[25.461388,36.91943400000012],[25.341106,37.074997],[25.54472,37.198044],[25.461388,36.91943400000012]]],[[[24.535000000000196,37.182495],[24.509163,37.11277800000012],[24.414719,37.12722000000012],[24.535000000000196,37.182495]]],[[[26.767494,37.186935],[26.772221,37.206657],[26.787495,37.20694],[26.767494,37.186935]]],[[[23.156666,37.240273],[23.09694300000018,37.277496],[23.150555,37.272774000000126],[23.156666,37.240273]]],[[[23.410831,37.300827],[23.373886,37.299721],[23.583332,37.364166],[23.410831,37.300827]]],[[[24.379444,37.30583200000014],[24.442776,37.481667],[24.48333,37.398048000000145],[24.379444,37.30583200000014]]],[[[25.359161,37.407776],[25.313889,37.488045],[25.463608,37.469719],[25.359161,37.407776]]],[[[24.952499000000103,37.38555100000015],[24.884441,37.363609],[24.889721,37.512497],[24.952499000000103,37.38555100000015]]],[[[23.497776,37.504715],[23.432777,37.526665],[23.522499,37.524162],[23.497776,37.504715]]],[[[25.228333,37.534431],[24.97583,37.675552],[25.238888000000145,37.621941],[25.228333,37.534431]]],[[[24.298611,37.526382],[24.298332,37.654999],[24.394165,37.673332],[24.298611,37.526382]]],[[[26.020828,37.514435],[26.06805,37.631943],[26.361111000000108,37.68666100000017],[26.020828,37.514435]]],[[[23.51305400000018,37.691666],[23.425552,37.762497],[23.563889,37.762772],[23.51305400000018,37.691666]]],[[[27.069443,37.711937],[26.57166300000017,37.730553],[26.748608000000104,37.811378],[27.069443,37.711937]]],[[[20.898052,37.80527500000012],[20.831108000000143,37.646385000000166],[20.621944000000155,37.860832],[20.898052,37.80527500000012]]],[[[24.79166400000014,37.99832900000014],[24.96027800000016,37.68555500000012],[24.713333,37.872772],[24.79166400000014,37.99832900000014]]],[[[23.462498,37.878609],[23.437496,37.985832000000144],[23.538887,37.985832000000144],[23.462498,37.878609]]],[[[20.612499,38.394165],[20.792500000000103,38.060272],[20.341389,38.177216],[20.612499,38.394165]]],[[[20.735554,38.309998],[20.644722000000115,38.39804800000012],[20.648888000000113,38.500275000000116],[20.735554,38.309998]]],[[[26.025555,38.176941],[25.861664000000133,38.583611],[26.159443,38.544434],[26.025555,38.176941]]],[[[20.903053,38.545555],[20.899166,38.566383],[20.93888900000013,38.605270000000175],[20.903053,38.545555]]],[[[25.59999500000012,38.531937],[25.52916,38.59970900000012],[25.613331,38.589989],[25.59999500000012,38.531937]]],[[[20.643608000000114,38.5811080000001],[20.557777,38.683884],[20.701385,38.834717],[20.643608000000114,38.5811080000001]]],[[[24.683052000000117,38.79805],[24.553333,38.768326],[24.458332,38.962776],[24.683052000000117,38.79805]]],[[[23.461941,38.853333],[24.153889000000106,38.64666],[24.564163,37.987221],[22.829998,38.829163],[23.461941,38.853333]]],[[[23.736664,39.074715],[23.590832,39.204437],[23.786663,39.124161],[23.736664,39.074715]]],[[[23.50861,39.159721],[23.392498000000103,39.152222],[23.461388000000113,39.208328],[23.50861,39.159721]]],[[[20.198330000000112,39.174438],[20.136665,39.200554],[20.123608000000104,39.23638200000012],[20.198330000000112,39.174438]]],[[[23.862499,39.13666500000012],[23.953609000000142,39.289719],[23.978054000000157,39.2602770000001],[23.862499,39.13666500000012]]],[[[26.377216,39.273598],[26.614441,39.012497],[25.832222,39.183601],[26.377216,39.273598]]],[[[24.99249600000013,39.466385],[25.006386,39.563309],[25.05360800000014,39.530823],[24.99249600000013,39.466385]]],[[[19.926109,39.794441],[19.846664,39.649162],[20.111664000000133,39.363052],[19.641388,39.744438],[19.926109,39.794441]]],[[[19.404163,39.843605],[19.378887,39.868607000000125],[19.430553,39.86749300000015],[19.404163,39.843605]]],[[[25.441666,40.004715],[25.355827,39.78638500000015],[25.05444,39.86055],[25.441666,40.004715]]],[[[25.601662,40.398041],[25.443886,40.475822],[25.694717000000168,40.4661030000001],[25.601662,40.398041]]],[[[24.773331,40.63166000000014],[24.509441,40.658051],[24.64527500000011,40.797775],[24.773331,40.63166000000014]]],[[[26.294167,41.708054],[26.361095,41.711052],[26.63388400000011,41.35443900000014],[26.044720000000154,40.735825],[25.138054000000125,41.011375],[23.735275000000115,40.7549970000001],[24.398331,40.151939],[23.72777600000012,40.350555],[23.93222000000017,39.943054],[23.353611,40.245277000000115],[23.709999,39.91194200000011],[22.94138700000019,40.63055400000012],[22.59111,40.476662],[22.594997,40.012215],[23.344997,39.17805500000013],[22.9377750000001,39.358604],[23.072777000000144,39.036942],[22.523331,38.857216],[24.073887000000127,38.196938],[24.034443,37.651665],[23.515553000000182,38.040550000000124],[22.991386,37.88055400000012],[23.513611,37.429443],[22.72583,37.568329],[23.19833,36.431938],[22.634163,36.804443],[22.488888,36.386108],[22.152775,37.02166],[21.704441000000145,36.81527700000011],[21.649719000000175,37.44194],[21.106388,37.85443900000011],[21.85833,38.340828],[22.868053,37.938049],[23.226109,38.153053],[22.403332,38.448051],[21.147778,38.304161],[20.989441,38.669998],[20.73222,38.801109],[21.149998,39.00193800000012],[20.731941,38.95249900000012],[20.010029,39.6912],[20.671944,40.09805300000012],[20.98349,40.855888],[22.935604,41.342125],[24.263885,41.570549],[25.28500000000014,41.24305],[26.139996,41.354713],[26.066109,41.69749500000013],[26.294167,41.708054]]]]}},{"type":"Feature","properties":{"name":"Guatemala","iso2":"GT","iso3":"GTM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-90.627625,13.930555],[-91.384735,13.978888],[-92.24677999999989,14.550547],[-91.729172,16.074997],[-90.441956,16.088333],[-90.406403,16.416386],[-91.43749999999989,17.241108],[-90.98390199999989,17.256107],[-90.982422,17.820652],[-89.141953,17.818886],[-89.216171,15.88985100000015],[-88.910568,15.893610000000123],[-88.214737,15.724443],[-89.150375,15.073481],[-89.348312,14.431982],[-90.09639,13.745832],[-90.627625,13.930555]]]]}},{"type":"Feature","properties":{"name":"Guinea","iso2":"GN","iso3":"GIN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-13.602783,9.734441],[-14.664446,10.476665],[-14.693056,11.035276],[-15.016847999999868,10.956451000000143],[-14.686944999999895,11.509722],[-13.709167,11.715277],[-13.971035,12.154758],[-13.713139,12.677221],[-12.345404,12.301748],[-11.373058,12.407774],[-11.315556,12.022774],[-10.92889,12.224442],[-10.652748,11.892609],[-10.323893,12.224997],[-9.701946,12.029163],[-9.155556,12.486111],[-8.53388,11.49391],[-8.357779,11.305555],[-8.680557,10.966389],[-8.289722,11.007776],[-7.973984,10.165611],[-8.143612,9.533888000000104],[-7.732779,9.088055],[-7.957778,8.813332],[-7.646536,8.378416],[-8.198056999999892,8.496666],[-7.946838,8.018505],[-8.469749,7.561325],[-8.660557,7.695],[-9.106945,7.198889],[-9.485161,7.361989],[-9.48365,8.346931],[-10.266651,8.488377],[-10.695835,8.298611],[-10.571526,9.059532],[-11.214444999999898,9.997499],[-12.456112,9.888332],[-13.29561,9.032143],[-13.602783,9.734441]]]]}},{"type":"Feature","properties":{"name":"Guyana","iso2":"GY","iso3":"GUY"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-58.450562,6.896944000000119],[-58.4133379999999,6.969166],[-58.328056,6.956666],[-58.450562,6.896944000000119]]],[[[-59.789169,8.34111],[-58.472778,7.349999000000139],[-58.646118,6.42611],[-58.314728,6.894722000000129],[-57.199722,6.147499],[-57.248505,5.486111],[-57.327225,5.026111],[-57.92333999999988,4.821944],[-58.047226,4.008333000000107],[-57.642227,3.356389000000107],[-57.301392,3.3775],[-56.470634,1.944499000000135],[-57.324721999999895,1.975278],[-58.806946,1.185555000000107],[-59.642784,1.731111],[-59.989448999999865,2.693611],[-59.568611,3.899444],[-59.675835,4.388888],[-60.147507,4.5175],[-60.098335,5.217222],[-60.73037,5.204799],[-61.389725,5.940000000000126],[-61.134026,6.711042],[-60.288612,7.057221000000112],[-60.71917,7.535555],[-59.825562,8.236111],[-59.9902799999999,8.535276],[-59.789169,8.34111]]]]}},{"type":"Feature","properties":{"name":"Haiti","iso2":"HT","iso3":"HTI"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-73.58473205566406,18.056943893432617],[-73.66751098632812,18.057222366333008],[-73.70611572265625,18.101388931274414],[-73.58473205566406,18.056943893432617]]],[[[-72.81556701660156,18.698888778686523],[-73.30000305175781,18.927221298217773],[-72.85722351074219,18.83500099182129],[-72.81556701660156,18.698888778686523]]],[[[-72.67361450195312,19.91666603088379],[-71.75418090820312,19.70583152770996],[-71.71583557128906,18.749723434448242],[-72.00306701660156,18.600831985473633],[-71.76786804199219,18.038503646850586],[-73.38639831542969,18.261945724487305],[-73.88166809082031,18.02277946472168],[-74.44667053222656,18.34193992614746],[-74.26806640625,18.665834426879883],[-72.35000610351562,18.5302791595459],[-72.80029296875,19.033056259155273],[-72.72334289550781,19.454999923706055],[-73.46528625488281,19.687776565551758],[-72.67361450195312,19.91666603088379]],[[-73.73945617675781,18.584165573120117],[-73.71528625488281,18.62444496154785],[-73.79806518554688,18.624723434448242],[-73.73945617675781,18.584165573120117]]],[[[-72.62834167480469,19.9869441986084],[-72.95639038085938,20.056665420532227],[-72.81195068359375,20.092222213745117],[-72.62834167480469,19.9869441986084]]]]}},{"type":"Feature","properties":{"name":"Honduras","iso2":"HN","iso3":"HND"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-87.622513,13.246387000000169],[-87.66972399999986,13.278332],[-87.614731,13.28611],[-87.622513,13.246387000000169]]],[[[-87.571945,13.36861],[-87.58168,13.30361000000012],[-87.65834,13.335833],[-87.571945,13.36861]]],[[[-85.841949,16.010555],[-84.26472499999988,15.828609],[-83.85555999999985,15.459999],[-84.208618,15.549999],[-84.07751499999989,15.351387],[-83.131851,14.992979000000105],[-83.239731,14.98249800000012],[-84.482788,14.617777],[-84.906677,14.808611],[-85.732315,13.829235],[-86.015839,14.065832000000114],[-86.763016,13.751621],[-86.695007,13.296944000000124],[-87.301392,12.986599],[-87.396393,13.410831],[-87.815582,13.405386000000107],[-87.75029,13.864166],[-88.47084,13.855276],[-89.339737,14.416111],[-89.348312,14.431982],[-89.150375,15.073481],[-88.214737,15.724443],[-85.841949,16.010555]]],[[[-86.883621,16.086666000000108],[-86.991669,16.087219],[-86.876114,16.121666],[-86.883621,16.086666000000108]]],[[[-86.599731,16.296108],[-86.410278,16.421665000000147],[-86.263336,16.423332],[-86.599731,16.296108]]],[[[-85.944733,16.409721],[-85.900284,16.494720000000157],[-85.83555599999988,16.498886],[-85.944733,16.409721]]],[[[-83.946671,17.405277],[-83.955292,17.417774],[-83.944458,17.414165],[-83.946671,17.405277]]],[[[-83.910568,17.409721],[-83.926392,17.416664],[-83.910004,17.41861000000013],[-83.910568,17.409721]]]]}},{"type":"Feature","properties":{"name":"Croatia","iso2":"HR","iso3":"HRV"},"geometry":{"type":"MultiPolygon","coordinates":[[[[16.90389060974121,42.72610664367676],[16.81389045715332,42.76805305480957],[16.939722061157227,42.768327713012695],[16.90389060974121,42.72610664367676]]],[[[17.7450008392334,42.69194221496582],[17.321664810180664,42.78805732727051],[17.399442672729492,42.79777717590332],[17.7450008392334,42.69194221496582]]],[[[16.820554733276367,42.96000099182129],[17.183610916137695,42.91861152648926],[16.633054733276367,42.98111152648926],[16.820554733276367,42.96000099182129]]],[[[17.298887252807617,43.00694465637207],[17.649843215942383,42.88907814025879],[18.455556869506836,42.56582832336426],[18.503198623657227,42.44944190979004],[17.004167556762695,43.04666328430176],[17.298887252807617,43.00694465637207]]],[[[16.20833396911621,43.02221870422363],[16.050554275512695,43.06305122375488],[16.251943588256836,43.07249641418457],[16.20833396911621,43.02221870422363]]],[[[16.562036514282227,43.230852127075195],[17.19008445739746,43.126054763793945],[16.373056411743164,43.194162368774414],[16.562036514282227,43.230852127075195]]],[[[16.851667404174805,43.26916694641113],[16.404722213745117,43.329721450805664],[16.753053665161133,43.36277961730957],[16.851667404174805,43.26916694641113]]],[[[16.390554428100586,43.332773208618164],[16.198331832885742,43.41166114807129],[16.326387405395508,43.39416694641113],[16.390554428100586,43.332773208618164]]],[[[15.687498092651367,43.63083076477051],[15.606668472290039,43.674997329711914],[15.662221908569336,43.66583442687988],[15.687498092651367,43.63083076477051]]],[[[15.34638786315918,43.80888557434082],[15.376668930053711,43.77592658996582],[15.225000381469727,43.873056411743164],[15.34638786315918,43.80888557434082]]],[[[15.446664810180664,43.887216567993164],[15.260831832885742,44.006662368774414],[15.376943588256836,43.96805000305176],[15.446664810180664,43.887216567993164]]],[[[15.250555038452148,44.01666450500488],[15.062498092651367,44.1572208404541],[15.24305534362793,44.053056716918945],[15.250555038452148,44.01666450500488]]],[[[14.855276107788086,44.17527961730957],[15.226388931274414,43.90110969543457],[15.13749885559082,43.89638710021973],[14.855276107788086,44.17527961730957]]],[[[14.838655471801758,44.6095027923584],[14.732778549194336,44.69805335998535],[15.24888801574707,44.327775955200195],[14.838655471801758,44.6095027923584]]],[[[14.521944046020508,44.47416114807129],[14.367498397827148,44.59027290344238],[14.337499618530273,44.710275650024414],[14.521944046020508,44.47416114807129]]],[[[14.75731086730957,44.803754806518555],[14.865278244018555,44.70666694641113],[14.65925407409668,44.79473686218262],[14.75731086730957,44.803754806518555]]],[[[14.455076217651367,44.90970039367676],[14.49333381652832,44.60638618469238],[14.294137954711914,44.90724754333496],[14.400278091430664,44.9152774810791],[14.315279006958008,45.174997329711914],[14.455076217651367,44.90970039367676]]],[[[14.755834579467773,44.94138526916504],[14.428888320922852,45.07833290100098],[14.539167404174805,45.23944282531738],[14.755834579467773,44.94138526916504]]],[[[16.572500228881836,46.47527503967285],[16.607873916625977,46.47623634338379],[17.669443130493164,45.83500099182129],[18.8170223236084,45.91296577453613],[18.98032569885254,45.37862586975098],[19.423887252807617,45.22583198547363],[19.03972053527832,44.86138343811035],[18.251943588256836,45.13888740539551],[15.786664962768555,45.171945571899414],[16.143056869506836,44.19944190979004],[17.578527450561523,42.94382667541504],[16.884443283081055,43.40305519104004],[15.988332748413086,43.50444221496582],[14.482778549194336,45.311105728149414],[14.292776107788086,45.32499885559082],[13.899168014526367,44.77443885803223],[13.591741561889648,45.481698989868164],[14.601388931274414,45.67527961730957],[15.174459457397461,45.42582130432129],[15.697778701782227,45.84416389465332],[15.654722213745117,46.21944618225098],[16.572500228881836,46.47527503967285]]]]}},{"type":"Feature","properties":{"name":"Hungary","iso2":"HU","iso3":"HUN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[18.81702,45.912964],[17.669441,45.834999],[16.607872,46.476234],[16.111805,46.86972],[16.510555,47.00666],[16.713886,47.543884],[16.450554,47.698051],[17.053886,47.709442],[17.166386,48.012497],[17.251656,48.024994],[18.655277,47.758606],[20.660553,48.563332],[22.151442,48.411919],[22.894804,47.95454],[22.032497,47.530273],[21.176666,46.295555],[20.726955,46.17556],[20.261024,46.114853],[18.81702,45.912964]]]]}},{"type":"Feature","properties":{"name":"Iceland","iso2":"IS","iso3":"ISL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-15.070835,66.1436],[-14.618891,65.994431],[-14.848333,65.731384],[-14.336668,65.783051],[-14.563612,65.494995],[-13.611389,65.509995],[-13.570278,65.25943],[-14.034723,65.193054],[-13.499445,65.069153],[-14.511112,64.797485],[-14.539167,64.406097],[-14.925001,64.26416],[-15.383335,64.371933],[-18.710003,63.391106],[-21.053612,63.945],[-22.689167,63.80555],[-22.703335,64.080826],[-21.36278,64.384987],[-22.102501,64.314438],[-21.508057,64.645554],[-22.170834,64.453888],[-22.407223,64.812485],[-24.059532,64.890884],[-21.835835,65.030273],[-22.56139,65.171097],[-21.698612,65.449158],[-24.542225,65.497772],[-23.805557,65.530548],[-24.105835,65.806656],[-23.226391,65.741653],[-23.873058,65.866653],[-23.213337,65.837494],[-23.81889,66.013321],[-23.371113,65.986664],[-23.665558,66.111099],[-23.473614,66.199158],[-22.424725,65.847488],[-22.972225,66.221375],[-22.43417,66.267776],[-23.188614,66.349716],[-22.9375,66.466385],[-21.399445,66.027222],[-21.603058,65.953323],[-21.33778,65.733322],[-21.777779,65.765823],[-21.084446,65.159164],[-20.927223,65.588882],[-20.446667,65.494995],[-20.424446,66.083054],[-20.179169,66.12944],[-19.451668,65.72583],[-19.453056,66.056381],[-18.784168,66.191101],[-18.069447,65.643326],[-18.299446,66.174713],[-16.594723,66.09111],[-16.527779,66.508041],[-15.381945,66.142776],[-14.710835,66.367218],[-15.070835,66.1436]]]]}},{"type":"Feature","properties":{"name":"India","iso2":"IN","iso3":"IND"},"geometry":{"type":"MultiPolygon","coordinates":[[[[93.91276741027832,7.02861213684082],[93.8238697052002,6.745553970336914],[93.67109870910645,7.181943893432617],[93.91276741027832,7.02861213684082]]],[[[93.66220283508301,7.405832290649414],[93.6544361114502,7.417501449584961],[93.66415596008301,7.41472053527832],[93.66220283508301,7.405832290649414]]],[[[93.63943672180176,7.247220993041992],[93.69359016418457,7.43889045715332],[93.72831916809082,7.32472038269043],[93.63943672180176,7.247220993041992]]],[[[93.45471382141113,7.868890762329102],[93.34942817687988,7.879999160766602],[93.31749153137207,7.997499465942383],[93.45471382141113,7.868890762329102]]],[[[93.57361030578613,7.927778244018555],[93.50277900695801,7.97722053527832],[93.5405445098877,8.015554428100586],[93.57361030578613,7.927778244018555]]],[[[93.48803901672363,7.988889694213867],[93.44304084777832,8.15361213684082],[93.5133228302002,8.226388931274414],[93.48803901672363,7.988889694213867]]],[[[73.03221321105957,8.246664047241211],[73.02083015441895,8.268610000610352],[73.0788745880127,8.310277938842773],[73.03221321105957,8.246664047241211]]],[[[93.16914558410645,8.201387405395508],[93.05998420715332,8.271665573120117],[93.07388496398926,8.348054885864258],[93.16914558410645,8.201387405395508]]],[[[93.60942268371582,8.429998397827148],[93.60193061828613,8.565275192260742],[93.62608528137207,8.508054733276367],[93.60942268371582,8.429998397827148]]],[[[92.7744312286377,9.124719619750977],[92.7088794708252,9.163610458374023],[92.76165962219238,9.263612747192383],[92.7744312286377,9.124719619750977]]],[[[73.63749885559082,10.052778244018555],[73.6302661895752,10.071111679077148],[73.64554023742676,10.097497940063477],[73.63749885559082,10.052778244018555]]],[[[72.63360786437988,10.550832748413086],[72.62469673156738,10.552778244018555],[72.65054512023926,10.577497482299805],[72.63360786437988,10.550832748413086]]],[[[73.68414497375488,10.823053359985352],[73.66220283508301,10.827775955200195],[73.68525886535645,10.829999923706055],[73.68414497375488,10.823053359985352]]],[[[72.17997932434082,10.817499160766602],[72.17053413391113,10.809720993041992],[72.19748115539551,10.872774124145508],[72.17997932434082,10.817499160766602]]],[[[92.49275398254395,10.518331527709961],[92.34665107727051,10.69416618347168],[92.49498176574707,10.90110969543457],[92.49275398254395,10.518331527709961]]],[[[72.29915046691895,10.938055038452148],[72.28943061828613,10.942777633666992],[72.30137825012207,10.954164505004883],[72.29915046691895,10.938055038452148]]],[[[72.74942207336426,11.108888626098633],[72.73665046691895,11.107221603393555],[72.7472095489502,11.120553970336914],[72.74942207336426,11.108888626098633]]],[[[72.10748481750488,11.202775955200195],[72.09971809387207,11.201108932495117],[72.10803413391113,11.215555191040039],[72.10748481750488,11.202775955200195]]],[[[72.77832221984863,11.188886642456055],[72.77083015441895,11.201108932495117],[72.78915596008301,11.25694465637207],[72.77832221984863,11.188886642456055]]],[[[73.00694465637207,11.476663589477539],[73.00444221496582,11.507501602172852],[73.0133228302002,11.502222061157227],[73.00694465637207,11.476663589477539]]],[[[92.63304328918457,11.354166030883789],[92.64360237121582,11.514165878295898],[92.70332527160645,11.385557174682617],[92.63304328918457,11.354166030883789]]],[[[92.2713794708252,11.524442672729492],[92.2169361114502,11.594720840454102],[92.27581977844238,11.582220077514648],[92.2713794708252,11.524442672729492]]],[[[72.71249580383301,11.68861198425293],[72.7008228302002,11.68638801574707],[72.71527290344238,11.69999885559082],[72.71249580383301,11.68861198425293]]],[[[93.05832099914551,11.888612747192383],[92.94331550598145,11.98277473449707],[92.97859382629395,12.033609390258789],[93.05832099914551,11.888612747192383]]],[[[93.13611030578613,12.131940841674805],[93.12553596496582,12.133890151977539],[93.1313648223877,12.149168014526367],[93.13611030578613,12.131940841674805]]],[[[92.7170581817627,12.182806015014648],[92.71859931945801,11.491109848022461],[92.5244312286377,11.854166030883789],[92.7170581817627,12.182806015014648]]],[[[93.09387397766113,12.088052749633789],[93.0608081817627,12.143888473510742],[93.08665657043457,12.207220077514648],[93.09387397766113,12.088052749633789]]],[[[93.86554145812988,12.259164810180664],[93.84860420227051,12.27583122253418],[93.8733081817627,12.277498245239258],[93.86554145812988,12.259164810180664]]],[[[92.78253364562988,12.287679672241211],[92.77415657043457,12.290555953979492],[92.78332710266113,12.293889999389648],[92.78253364562988,12.287679672241211]]],[[[92.83161354064941,12.316526412963867],[92.90165901184082,12.265832901000977],[92.75427436828613,12.07133674621582],[92.83161354064941,12.316526412963867]]],[[[92.90498542785645,12.380830764770508],[92.87275886535645,12.405832290649414],[92.91081428527832,12.404165267944336],[92.90498542785645,12.380830764770508]]],[[[92.92859077453613,12.90916633605957],[92.98748970031738,12.508611679077148],[92.75888252258301,12.304998397827148],[92.92859077453613,12.90916633605957]]],[[[92.69108772277832,12.796110153198242],[92.66887092590332,12.855276107788086],[92.71443367004395,12.989999771118164],[92.69108772277832,12.796110153198242]]],[[[92.87581062316895,13.391389846801758],[92.86665534973145,13.400556564331055],[92.87608528137207,13.403886795043945],[92.87581062316895,13.391389846801758]]],[[[94.27693367004395,13.413610458374023],[94.26388740539551,13.430276870727539],[94.28415107727051,13.44416618347168],[94.27693367004395,13.413610458374023]]],[[[93.06442451477051,13.237497329711914],[92.81341743469238,12.897920608520508],[93.00387763977051,13.571111679077148],[93.06442451477051,13.237497329711914]]],[[[93.04942512512207,13.639444351196289],[92.99304389953613,13.661664962768555],[93.03637886047363,13.679998397827148],[93.04942512512207,13.639444351196289]]],[[[80.94803047180176,15.736665725708008],[80.87858772277832,15.843332290649414],[80.99193000793457,15.765832901000977],[80.94803047180176,15.736665725708008]]],[[[82.3708667755127,16.86777687072754],[82.37082099914551,16.85833168029785],[82.36886787414551,16.871110916137695],[82.3708667755127,16.86777687072754]]],[[[88.89721870422363,21.524999618530273],[88.8449878692627,21.526945114135742],[88.82554817199707,21.5594425201416],[88.83638191223145,21.605833053588867],[88.90860176086426,21.5686092376709],[88.89721870422363,21.524999618530273]]],[[[72.71805000305176,21.606386184692383],[72.60331916809082,21.64361000061035],[72.76609992980957,21.655275344848633],[72.71805000305176,21.606386184692383]]],[[[88.13472175598145,21.619997024536133],[88.04498481750488,21.660829544067383],[88.13247871398926,21.876108169555664],[88.13472175598145,21.619997024536133]]],[[[88.6463794708252,21.8255558013916],[88.64499092102051,21.78472328186035],[88.59359931945801,21.79777717590332],[88.57916450500488,21.82694435119629],[88.64193916320801,21.921663284301758],[88.6463794708252,21.8255558013916]]],[[[88.08859443664551,21.849443435668945],[88.11303901672363,21.948606491088867],[88.1352710723877,21.907499313354492],[88.08859443664551,21.849443435668945]]],[[[78.07554817199707,35.44582557678223],[78.30914497375488,34.64249610900879],[78.98535346984863,34.35001564025879],[78.81164741516113,33.525827407836914],[79.53027534484863,32.754167556762695],[78.97110176086426,32.35083198547363],[78.76054573059082,32.63555335998535],[78.39776802062988,32.54860877990723],[78.76721382141113,31.309999465942383],[79.09248542785645,31.437498092651367],[81.02536201477051,30.204355239868164],[80.37692451477051,29.748605728149414],[80.05581855773926,28.836111068725586],[82.0664005279541,27.914155960083008],[83.29136848449707,27.337778091430664],[84.14721870422363,27.511388778686523],[85.85554695129395,26.570276260375977],[88.01471138000488,26.364721298217773],[88.14279365539551,27.866056442260742],[88.83166694641113,28.013334274291992],[88.91772651672363,27.32032585144043],[88.89387702941895,26.975553512573242],[89.64305305480957,26.715272903442383],[92.06999397277832,26.8619441986084],[92.11360359191895,27.29749870300293],[91.65776252746582,27.76472282409668],[92.54498481750488,27.861940383911133],[94.64750862121582,29.333459854125977],[95.38777351379395,29.035276412963867],[96.07748603820801,29.46860694885254],[96.39526557922363,29.255277633666992],[96.16914558410645,28.903608322143555],[96.47082710266113,29.056665420532227],[96.61581611633301,28.7902774810791],[96.40193367004395,28.351110458374023],[97.34887886047363,28.2227725982666],[96.88665962219238,27.606107711791992],[97.13665962219238,27.085832595825195],[96.19413948059082,27.27083396911621],[95.1413745880127,26.612497329711914],[95.17804145812988,26.058889389038086],[94.62553596496582,25.397775650024414],[94.73442268371582,25.024721145629883],[94.15109443664551,23.855276107788086],[93.33873176574707,24.077917098999023],[93.19664192199707,22.25638771057129],[92.60081672668457,21.98221778869629],[92.28332710266113,23.70527458190918],[91.94999885559082,23.73221778869629],[91.61360359191895,22.943052291870117],[91.15942573547363,23.640554428100586],[91.37329292297363,24.10194206237793],[92.12137031555176,24.39333152770996],[92.40637397766113,25.030553817749023],[89.84526252746582,25.288610458374023],[89.7391529083252,26.15638542175293],[89.34277534484863,26.017030715942383],[88.43304634094238,26.551389694213867],[88.11053657531738,25.835554122924805],[89.00943183898926,25.288331985473633],[88.4508228302002,25.187776565551758],[88.04332160949707,24.68416404724121],[88.75053596496582,24.220983505249023],[88.56387519836426,23.652219772338867],[88.9861011505127,23.208330154418945],[89.0630054473877,22.115476608276367],[89.00555610656738,21.903608322143555],[89.0888843536377,21.628053665161133],[89.00749397277832,21.600000381469727],[88.85554695129395,21.632776260375977],[88.78442573547363,21.556943893432617],[88.70721626281738,21.566389083862305],[88.66775703430176,22.202219009399414],[88.55693244934082,21.81333351135254],[88.62858772277832,21.749162673950195],[88.57222175598145,21.559999465942383],[88.49609565734863,21.950273513793945],[88.2541675567627,21.548608779907227],[88.19941902160645,22.155275344848633],[87.90776252746582,22.421663284301758],[88.16804695129395,22.091665267944336],[87.79637336730957,21.698884963989258],[86.96331977844238,21.381940841674805],[87.02556037902832,20.674829483032227],[86.42025947570801,19.98277473449707],[85.45138740539551,19.660276412963867],[85.43488502502441,19.88701057434082],[84.10637092590332,18.29222297668457],[82.36442756652832,17.100831985473633],[82.30169868469238,16.58305549621582],[81.3133716583252,16.363332748413086],[81.01727485656738,15.775556564331055],[80.89193916320801,16.02610969543457],[80.82527351379395,15.751943588256836],[80.2794361114502,15.699167251586914],[80.04887580871582,15.048887252807617],[80.31303596496582,13.439165115356445],[80.04942512512207,13.617776870727539],[80.34971809387207,13.334165573120117],[79.76304817199707,11.648889541625977],[79.85971260070801,10.288888931274414],[79.32499885559082,10.280832290649414],[78.90803718566895,9.479719161987305],[79.45138740539551,9.149999618530273],[78.39665412902832,9.089719772338867],[78.06053352355957,8.364164352416992],[77.53610420227051,8.071943283081055],[76.5758228302002,8.876943588256836],[75.68887519836426,11.435277938842773],[74.81025886535645,12.864721298217773],[74.41192817687988,14.483331680297852],[73.44775581359863,16.05583381652832],[72.85386848449707,18.660554885864258],[73.05554389953613,19.011945724487305],[72.76999092102051,18.943052291870117],[72.78055000305176,19.312498092651367],[73.04722785949707,19.217256546020508],[72.66415596008301,19.870832443237305],[72.93441963195801,20.774721145629883],[72.56414985656738,21.378053665161133],[73.13081550598145,21.753610610961914],[72.54165840148926,21.66388511657715],[72.73442268371582,21.98638343811035],[72.50082588195801,21.97666358947754],[72.91914558410645,22.267778396606445],[72.15193367004395,22.28388786315918],[72.11053657531738,21.201940536499023],[70.81888008117676,20.69749641418457],[68.94442939758301,22.294164657592773],[70.1655445098877,22.5483341217041],[70.50694465637207,23.10222053527832],[69.21582221984863,22.84027671813965],[68.43304634094238,23.42999839782715],[68.74136543273926,23.84416389465332],[68.32138252258301,23.58083152770996],[68.19780158996582,23.766687393188477],[68.7472095489502,23.969995498657227],[68.78305244445801,24.33277702331543],[70.01471138000488,24.16971778869629],[71.10582160949707,24.4163875579834],[70.66638374328613,25.698331832885742],[70.08804512023926,25.98277473449707],[70.18359565734863,26.53611183166504],[69.50610542297363,26.754446029663086],[69.58027839660645,27.173330307006836],[70.36831855773926,28.02083396911621],[70.82943916320801,27.706384658813477],[71.89694404602051,27.961942672729492],[73.39749336242676,29.942773818969727],[73.93340492248535,30.136003494262695],[73.87249946594238,30.390100479125977],[74.69458961486816,31.0539608001709],[74.60532569885254,31.877119064331055],[75.38128852844238,32.214242935180664],[74.01638984680176,33.18860054016113],[73.99054145812988,33.74388313293457],[74.29582405090332,33.977487564086914],[73.91331672668457,34.06860542297363],[73.94165229797363,34.64638710021973],[76.86998176574707,34.658884048461914],[77.04248237609863,35.09916114807129],[77.82393074035645,35.50132942199707],[78.07554817199707,35.44582557678223]],[[86.28360176086426,20.038053512573242],[86.27609443664551,20.05000114440918],[86.25139045715332,20.045000076293945],[86.28360176086426,20.038053512573242]]]]}},{"type":"Feature","properties":{"name":"Iran (Islamic Republic of)","iso2":"IR","iso3":"IRN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[54.034439000000106,26.484718],[53.903603,26.536110000000107],[54.0188830000001,26.554165],[54.034439000000106,26.484718]]],[[[53.31805400000016,26.79777500000013],[53.203323,26.802498000000114],[53.151657,26.846386],[53.31805400000016,26.79777500000013]]],[[[56.346657,26.822220000000144],[56.34388,26.884163],[56.4086,26.885551],[56.346657,26.822220000000144]]],[[[55.734993,26.838051000000135],[55.63276700000014,26.794720000000112],[55.688599,26.929161],[55.734993,26.838051000000135]]],[[[56.24527000000015,26.927494],[55.283607,26.558609],[55.769989,26.792774],[55.75222000000011,26.951939],[56.24527000000015,26.927494]]],[[[56.470825,27.037777],[56.434715,27.086941],[56.469986,27.108608000000103],[56.509163,27.071663],[56.470825,27.037777]]],[[[50.32888000000017,29.20805],[50.291382,29.278053],[50.338326,29.268887],[50.32888000000017,29.20805]]],[[[45.004433,39.416382],[46.1782460000002,38.841148],[46.54037500000018,38.875587],[47.976662,39.719231],[48.359787,39.385216],[48.020821,38.835541],[48.88828300000014,38.442406],[49.10248600000014,37.64304400000013],[50.191376,37.38916000000016],[51.10110500000022,36.728874],[53.943321,36.799995],[53.90564,37.35085300000016],[54.681107,37.443604],[55.442764,38.08610500000013],[57.21221200000011,38.28193700000013],[57.45027200000018,37.939156000000125],[59.338882,37.539162],[60.333054000000146,36.656097000000116],[61.1572110000001,36.649994],[61.27655800000011,35.60724600000013],[60.721657,34.522217],[60.87887600000013,34.319717],[60.50833100000014,34.140274],[60.527771,33.64415700000011],[60.94304700000012,33.51944],[60.582497,33.06610100000013],[60.84388,31.498329],[61.713608,31.383331],[61.8511050000001,31.021111],[60.86859900000016,29.863884],[61.90554800000015,28.554996],[62.78138,28.266941],[62.782494000000185,27.260555],[63.34193400000012,27.122498],[63.17638400000013,26.631107],[61.858047,26.234718],[61.61103100000017,25.197647],[57.3180540000001,25.770832],[56.690544,27.148331],[56.132767,27.160275],[54.794716000000136,26.489994],[53.7477720000002,26.70916],[52.440269,27.640831],[51.430275,27.937775000000116],[50.048607,30.207222],[49.551384,30.0075],[48.98499300000017,30.513054000000167],[48.92054700000014,30.043053000000114],[48.545555,29.96303],[48.032494,30.491383],[48.036385,30.997494000000117],[47.693878,31.00111],[47.864441,31.798607000000104],[47.434158,32.397774000000126],[46.107216,32.967491],[46.181938,33.260277],[45.401054,33.9795680000001],[45.797733,34.91404],[46.171364,35.113411],[45.979988,35.584717],[46.346939000000106,35.817215],[45.405823,35.99082900000012],[44.787338,37.149712],[44.61805,37.727768],[44.223969,37.899151],[44.484154,38.345543],[44.034157,39.3849950000001],[44.4161,39.425262],[44.605820000000136,39.78054],[44.813042,39.630814],[45.004433,39.416382]]]]}},{"type":"Feature","properties":{"name":"Israel","iso2":"IL","iso3":"ISR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[35.25972000000016,31.78722000000012],[35.251663,31.788055000000114],[35.24888600000011,31.808887000000155],[35.25972000000016,31.78722000000012]]],[[[35.623634,33.245728],[35.648888,32.685272],[35.552567,32.394196],[35.282494,32.516937],[34.884995,31.391388],[35.47819500000011,31.497322],[34.97998,29.545753000000147],[34.903801,29.486706],[34.26757800000021,31.216541],[34.33416,31.25972],[34.490547,31.596096000000117],[35.10083,33.093605000000125],[35.623634,33.245728]]]]}},{"type":"Feature","properties":{"name":"Italy","iso2":"IT","iso3":"ITA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[12.127777,47.00166300000011],[12.440554000000134,46.69082600000014],[13.718655,46.526611],[13.383055,46.297218],[13.669167,46.177498],[13.480000000000103,46.011108],[13.919167,45.637497],[13.716944,45.596107],[13.193333,45.778053],[12.281387000000166,45.46804800000017],[12.16111,45.263885],[12.539165,44.961105],[12.245554,44.715828000000116],[12.368332000000123,44.246666],[13.621666,43.553886],[14.016666,42.66999800000015],[14.739721,42.085548000000145],[16.141941,41.914162],[15.932499000000178,41.47805],[18.011665,40.6444400000001],[18.512218,40.13666500000012],[18.349442,39.79193900000014],[17.859165000000132,40.283607],[16.913609000000122,40.44554900000013],[16.486664000000133,39.767494],[17.151108000000193,39.389999],[17.16916700000013,38.963333],[16.59499700000015,38.800827000000154],[16.062496,37.92416400000012],[15.631666000000166,38.011665],[16.2225,38.910828],[15.666666,40.03083],[11.098888,42.39305100000011],[10.107498,44.00750000000015],[8.748888000000136,44.42916100000018],[7.528055,43.788605],[7.662222,44.17083000000012],[6.976388,44.284164],[7.031666000000115,44.831383000000116],[6.61976,45.110138],[7.127777,45.257774],[6.798970000000168,45.78067],[7.038054,45.93193800000013],[7.855742,45.91905200000012],[8.436388000000136,46.463333000000105],[9.036665,45.837776],[9.281944000000124,46.49582700000015],[10.129999000000112,46.22721900000015],[10.050278000000105,46.539993],[10.465277000000128,46.546387],[10.471235,46.871353],[12.127777,47.00166300000011]],[[12.459166,43.896111],[12.509998,43.986938],[12.415798,43.957954],[12.459166,43.896111]],[[12.445090330888661,41.90311752178489],[12.456660170953796,41.901426024699205],[12.45165333958056,41.907989033391274],[12.445090330888661,41.90311752178489]]],[[[12.422777,45.420555],[12.323610000000144,45.343887],[12.373333,45.42805500000013],[12.422777,45.420555]]],[[[9.844166,43.03443900000012],[9.80694400000013,43.00972],[9.804165,43.063889],[9.8316650000001,43.07555400000011],[9.844166,43.03443900000012]]],[[[10.441111,42.84444400000011],[10.423054000000121,42.708885],[10.101944000000174,42.772499],[10.441111,42.84444400000011]]],[[[10.088333,42.57222],[10.081944000000135,42.618889],[10.101665,42.593605],[10.088333,42.57222]]],[[[10.915833000000134,42.325272],[10.866388,42.35860400000011],[10.877777000000123,42.388054],[10.915833000000134,42.325272]]],[[[10.316666000000112,42.3174970000001],[10.293055,42.349998],[10.326111,42.34333],[10.316666000000112,42.3174970000001]]],[[[9.513332,41.14666],[9.825832000000105,40.526108],[9.569166000000166,39.15055100000011],[9.018332,39.266388],[8.859165000000132,38.879166],[8.406944,38.958611],[8.556665,39.86610400000016],[8.192499,40.913605],[9.513332,41.14666]]],[[[8.339167,41.06249200000012],[8.215277,40.992493],[8.321110000000147,41.121384],[8.339167,41.06249200000012]]],[[[12.964167000000145,40.883888],[12.950277000000199,40.91777],[12.988054,40.931389000000124],[12.964167000000145,40.883888]]],[[[13.951387000000182,40.701385000000144],[13.853888,40.734718],[13.948055000000181,40.742493],[13.951387000000182,40.701385000000144]]],[[[14.210554,40.560555],[14.261944,40.55555],[14.197222000000124,40.536659000000114],[14.210554,40.560555]]],[[[8.292221,39.09360500000018],[8.223888,39.164719],[8.302776,39.189995],[8.292221,39.09360500000018]]],[[[15.21361,38.770554],[15.190277,38.79055],[15.239166,38.806107],[15.21361,38.770554]]],[[[13.17333200000013,38.690277],[13.162222,38.714439],[13.198332000000136,38.711388],[13.17333200000013,38.690277]]],[[[14.868332000000152,38.531387],[14.794722,38.567772],[14.86861,38.57804900000012],[14.868332000000152,38.531387]]],[[[14.955276,38.445549000000184],[14.912222,38.516663],[14.96388800000011,38.517494],[14.955276,38.445549000000184]]],[[[14.988888,38.36416600000014],[14.941111,38.399437000000106],[14.958887,38.431107],[14.988888,38.36416600000014]]],[[[15.528889,38.13694],[15.086666,37.47943900000011],[15.316666,37.008888],[15.081388000000118,36.649162],[12.422222,37.796104],[13.316666,38.21833],[13.768888,37.970551],[15.528889,38.13694]]],[[[12.073889000000179,37.953606],[12.029999,37.986938],[12.059166,37.98916600000014],[12.073889000000179,37.953606]]],[[[12.354166,37.906105],[12.271387000000175,37.936386],[12.339167,37.934441],[12.354166,37.906105]]],[[[12.015833,36.738327],[11.93083200000018,36.82972],[12.048332,36.796944],[12.015833,36.738327]]]]}},{"type":"Feature","properties":{"name":"Cote d'Ivoire","iso2":"CI","iso3":"CIV"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-3.102272,5.109545000000125],[-3.103041,5.085022],[-3.168334,5.117222],[-3.102272,5.109545000000125]]],[[[-4.787278,5.1683120000001],[-4.146389,5.277222],[-4.004445,5.231667],[-4.787278,5.1683120000001]]],[[[-4.787278,5.1683120000001],[-5.319723,5.230833],[-5.002929,5.129237],[-7.525402,4.352806000000101],[-7.423334,5.839444],[-8.606383999999878,6.507815],[-8.308334,6.860833000000113],[-8.469749,7.561325],[-7.946838,8.018505],[-8.198056999999892,8.496666],[-7.646536,8.378416],[-7.957778,8.813332],[-7.732779,9.088055],[-8.143612,9.533888000000104],[-7.973984,10.165611],[-7.635555999999895,10.448332000000107],[-6.988056,10.147499],[-6.243402,10.735256],[-6.111389,10.197777],[-5.51985,10.436272],[-4.704445,9.698055],[-3.633611,9.954443000000111],[-2.685561,9.481817],[-2.487778,8.197777000000116],[-3.249166999999886,6.611388],[-2.764445,5.579166],[-2.928128,5.100222],[-3.1425,5.367777],[-3.29722299999986,5.118055],[-4.004168,5.253611],[-3.807778,5.375555000000119],[-4.787278,5.1683120000001]]]]}},{"type":"Feature","properties":{"name":"Iraq","iso2":"IQ","iso3":"IRQ"},"geometry":{"type":"MultiPolygon","coordinates":[[[[45.797733,34.91404],[45.401054,33.9795680000001],[46.181938,33.260277],[46.107216,32.967491],[47.434158,32.397774000000126],[47.864441,31.798607000000104],[47.693878,31.00111],[48.036385,30.997494000000117],[48.032494,30.491383],[48.545555,29.96303],[48.54332,29.926662],[48.443047,29.927498],[48.158875,30.038052],[47.943474,30.017555],[47.9310990000001,30.018887],[47.169991,30.015270000000115],[46.546944,29.104198],[44.72166100000018,29.198330000000126],[42.084999,31.11166000000013],[40.41333,31.94833],[39.196743,32.154942],[38.794701,33.377594],[41.003876,34.419434],[41.290276,36.355553],[42.355614,37.106926],[42.790825000000126,37.384720000000144],[44.116379,37.316376],[44.317215,36.970543],[44.787338,37.149712],[45.405823,35.99082900000012],[46.346939000000106,35.817215],[45.979988,35.584717],[46.171364,35.113411],[45.797733,34.91404]]]]}},{"type":"Feature","properties":{"name":"Japan","iso2":"JP","iso3":"JPN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[153.958589553833,24.295000076293945],[153.93969917297363,24.300832748413086],[153.95276069641113,24.321386337280273],[153.958589553833,24.295000076293945]]],[[[123.87082099914551,24.252500534057617],[123.67886543273926,24.316110610961914],[123.92192268371582,24.371110916137695],[123.87082099914551,24.252500534057617]]],[[[122.99693489074707,24.438886642456055],[122.93525886535645,24.458051681518555],[123.00943183898926,24.46693992614746],[122.99693489074707,24.438886642456055]]],[[[131.26416206359863,24.45499610900879],[131.243013381958,24.48444175720215],[131.27359199523926,24.475828170776367],[131.26416206359863,24.45499610900879]]],[[[124.26165962219238,24.45749855041504],[124.21914863586426,24.335275650024414],[124.0758228302002,24.424718856811523],[124.32443428039551,24.587499618530273],[124.26165962219238,24.45749855041504]]],[[[141.30914497375488,24.7480525970459],[141.2902545928955,24.77805519104004],[141.35745429992676,24.788888931274414],[141.30914497375488,24.7480525970459]]],[[[125.35637092590332,24.77666664123535],[125.45110511779785,24.739717483520508],[125.2572193145752,24.729162216186523],[125.2633228302002,24.884164810180664],[125.35637092590332,24.77666664123535]]],[[[141.29358100891113,25.4183292388916],[141.26831245422363,25.445276260375977],[141.29358100891113,25.451387405395508],[141.29358100891113,25.4183292388916]]],[[[131.24383735656738,25.816667556762695],[131.20800971984863,25.83333396911621],[131.250825881958,25.872220993041992],[131.24383735656738,25.816667556762695]]],[[[126.76193428039551,26.38694190979004],[126.78720283508301,26.296945571899414],[126.69220161437988,26.36055564880371],[126.76193428039551,26.38694190979004]]],[[[142.17776679992676,26.622499465942383],[142.11136054992676,26.715272903442383],[142.1530475616455,26.687219619750977],[142.17776679992676,26.622499465942383]]],[[[128.252779006958,26.638887405395508],[127.65277290344238,26.08305549621582],[127.88388252258301,26.667497634887695],[128.287202835083,26.854997634887695],[128.252779006958,26.638887405395508]]],[[[142.23245429992676,27.033334732055664],[142.178316116333,27.07527732849121],[142.23330879211426,27.08916664123535],[142.23245429992676,27.033334732055664]]],[[[142.19470405578613,27.148332595825195],[142.17859077453613,27.15666389465332],[142.19412422180176,27.19110679626465],[142.19470405578613,27.148332595825195]]],[[[140.878023147583,27.225828170776367],[140.86413764953613,27.21944236755371],[140.87219429016113,27.243051528930664],[140.878023147583,27.225828170776367]]],[[[128.60913276672363,27.358888626098633],[128.52359199523926,27.413610458374023],[128.70190620422363,27.445829391479492],[128.60913276672363,27.358888626098633]]],[[[142.1955280303955,27.599164962768555],[142.16998481750488,27.624719619750977],[142.19330024719238,27.61777687072754],[142.1955280303955,27.599164962768555]]],[[[142.08914375305176,27.717775344848633],[142.06884956359863,27.72666358947754],[142.08691596984863,27.73221778869629],[142.08914375305176,27.717775344848633]]],[[[128.95108222961426,27.67582893371582],[128.9474811553955,27.907499313354492],[129.02997016906738,27.774442672729492],[128.95108222961426,27.67582893371582]]],[[[129.33609199523926,28.07527732849121],[129.21911811828613,28.097776412963867],[129.19107246398926,28.188608169555664],[129.33609199523926,28.07527732849121]]],[[[129.99218940734863,28.281667709350586],[129.91497993469238,28.296110153198242],[130.02746772766113,28.36638832092285],[129.99218940734863,28.281667709350586]]],[[[129.71551704406738,28.451108932495117],[129.37552070617676,28.11527442932129],[129.14358711242676,28.250276565551758],[129.71551704406738,28.451108932495117]]],[[[129.73303413391113,29.60972023010254],[129.70608711242676,29.647497177124023],[129.74133491516113,29.663331985473633],[129.73303413391113,29.60972023010254]]],[[[129.89636421203613,29.87416648864746],[129.92190742492676,29.819719314575195],[129.851900100708,29.85222053527832],[129.89636421203613,29.87416648864746]]],[[[129.96301460266113,29.95722007751465],[129.9274616241455,29.97443962097168],[129.92859077453613,30.000001907348633],[129.96301460266113,29.95722007751465]]],[[[130.55859565734863,30.23638343811035],[130.38272285461426,30.393888473510742],[130.66638374328613,30.381940841674805],[130.55859565734863,30.23638343811035]]],[[[140.33026313781738,30.462495803833008],[140.30304145812988,30.47527503967285],[140.32913398742676,30.479162216186523],[140.33026313781738,30.462495803833008]]],[[[130.906099319458,30.354719161987305],[130.86941719055176,30.469717025756836],[131.05359077453613,30.84027671813965],[130.906099319458,30.354719161987305]]],[[[129.72134590148926,31.632219314575195],[129.67053413391113,31.6583309173584],[129.78274726867676,31.793333053588867],[129.72134590148926,31.632219314575195]]],[[[140.02554512023926,31.933053970336914],[139.99939155578613,31.942495346069336],[140.00970649719238,31.946664810180664],[140.02554512023926,31.933053970336914]]],[[[130.15774726867676,32.10888862609863],[130.11636543273926,32.21666145324707],[130.1955280303955,32.17694282531738],[130.15774726867676,32.10888862609863]]],[[[130.36941719055176,32.374711990356445],[130.20941352844238,32.44304847717285],[130.44803047180176,32.50527381896973],[130.36941719055176,32.374711990356445]]],[[[130.02997016906738,32.19499397277832],[130.1571979522705,32.54361152648926],[130.208589553833,32.33499336242676],[130.02997016906738,32.19499397277832]]],[[[128.90081977844238,32.64305305480957],[128.60107612609863,32.618600845336914],[128.66079902648926,32.781938552856445],[128.90081977844238,32.64305305480957]]],[[[139.841646194458,33.03499794006348],[139.74356269836426,33.13804817199707],[139.86413764953613,33.10166358947754],[139.841646194458,33.03499794006348]]],[[[129.10052680969238,32.97860145568848],[129.05554389953613,32.81638526916504],[129.11773872375488,33.14554786682129],[129.10052680969238,32.97860145568848]]],[[[129.39221382141113,33.16471290588379],[129.45413398742676,33.33166694641113],[129.56469917297363,33.38694190979004],[129.39221382141113,33.16471290588379]]],[[[132.2760944366455,33.75943946838379],[132.1855182647705,33.783334732055664],[132.23053169250488,33.79527473449707],[132.2760944366455,33.75943946838379]]],[[[129.75470161437988,33.726938247680664],[129.65887641906738,33.74499702453613],[129.7016315460205,33.856943130493164],[129.75470161437988,33.726938247680664]]],[[[139.61828804016113,33.83221626281738],[139.5827350616455,33.84360694885254],[139.60107612609863,33.887773513793945],[139.61828804016113,33.83221626281738]]],[[[132.32608222961426,33.89471626281738],[132.184419631958,33.90749549865723],[132.4516315460205,33.92276954650879],[132.32608222961426,33.89471626281738]]],[[[131.21414375305176,33.59554481506348],[131.66971015930176,33.64749336242676],[131.51638984680176,33.26555061340332],[131.90277290344238,33.25694465637207],[131.98941230773926,32.83055305480957],[131.34301948547363,31.37388801574707],[130.66638374328613,30.99666404724121],[130.80859565734863,31.68416404724121],[130.53442573547363,31.528886795043945],[130.63553047180176,31.178884506225586],[130.22802925109863,31.248884201049805],[130.16247749328613,32.00694465637207],[130.56970405578613,32.44249153137207],[130.58746528625488,32.63193702697754],[130.44607734680176,32.62054634094238],[130.60553169250488,32.79138374328613],[130.21109199523926,33.17083168029785],[130.34607124328613,32.664438247680664],[129.7460651397705,32.561105728149414],[129.67553901672363,33.06999397277832],[129.94412422180176,32.99249458312988],[129.57885932922363,33.35360908508301],[130.69079780578613,33.93582344055176],[131.21414375305176,33.59554481506348]],[[129.83331489562988,33.34110450744629],[129.86108589172363,33.37555122375488],[129.81360054016113,33.397775650024414],[129.83331489562988,33.34110450744629]]],[[[139.5260944366455,34.03249549865723],[139.48217964172363,34.06999397277832],[139.5605182647705,34.10610389709473],[139.5260944366455,34.03249549865723]]],[[[132.54553413391113,34.11110877990723],[132.557466506958,34.061105728149414],[132.456636428833,34.08693885803223],[132.52887153625488,34.18249702453613],[132.54553413391113,34.11110877990723]]],[[[132.44885444641113,34.115549087524414],[132.38553047180176,34.243608474731445],[132.4819049835205,34.27916145324707],[132.44885444641113,34.115549087524414]]],[[[132.97107124328613,34.18582344055176],[133.02969551086426,34.29110908508301],[133.05053901672363,34.20971870422363],[132.97107124328613,34.18582344055176]]],[[[129.236909866333,34.08221626281738],[129.21747016906738,34.32193946838379],[129.34939765930176,34.27999305725098],[129.236909866333,34.08221626281738]]],[[[134.22357368469238,34.344438552856445],[134.75305366516113,33.82610511779785],[134.18774604797363,33.23832893371582],[133.5988483428955,33.50139045715332],[132.80304145812988,32.735551834106445],[132.37246894836426,33.466386795043945],[132.01581001281738,33.33721351623535],[132.8991413116455,34.10777473449707],[133.5241413116455,33.961381912231445],[134.22357368469238,34.344438552856445]]],[[[139.27887153625488,34.32110786437988],[139.24856758117676,34.35083198547363],[139.29608345031738,34.41971778869629],[139.27887153625488,34.32110786437988]]],[[[134.3508014678955,34.43443489074707],[134.19275093078613,34.50999641418457],[134.36856269836426,34.55027198791504],[134.3508014678955,34.43443489074707]]],[[[134.7902545928955,34.19332313537598],[134.66693305969238,34.296945571899414],[135.0180377960205,34.5927677154541],[134.7902545928955,34.19332313537598]]],[[[129.33996772766113,34.29471778869629],[129.3002643585205,34.55694007873535],[129.46386909484863,34.68943214416504],[129.33996772766113,34.29471778869629]]],[[[139.45331001281738,34.672494888305664],[139.369966506958,34.69249153137207],[139.37161445617676,34.78166389465332],[139.45331001281738,34.672494888305664]]],[[[133.0705280303955,35.99027442932129],[133.02221870422363,35.99138069152832],[133.01080513000488,36.01444435119629],[133.0705280303955,35.99027442932129]]],[[[133.0988483428955,36.02999305725098],[133.0746784210205,36.07999610900879],[133.13189888000488,36.10000038146973],[133.0988483428955,36.02999305725098]]],[[[133.00219917297363,36.03305244445801],[132.95303535461426,36.06638526916504],[133.0866413116455,36.12388038635254],[133.00219917297363,36.03305244445801]]],[[[133.29193305969238,36.32499885559082],[133.37857246398926,36.20054817199707],[133.25247383117676,36.15249061584473],[133.29193305969238,36.32499885559082]]],[[[137.057466506958,37.14305305480957],[136.95413398742676,37.089433670043945],[136.9111042022705,37.143327713012695],[137.057466506958,37.14305305480957]]],[[[138.43524360656738,38.047494888305664],[138.21829414367676,37.80082893371582],[138.51638984680176,38.32027626037598],[138.43524360656738,38.047494888305664]]],[[[141.27081489562988,41.34249305725098],[142.06970405578613,39.54666328430176],[141.52581977844238,38.26638984680176],[140.9535846710205,38.14805030822754],[140.97552680969238,36.98777198791504],[140.565523147583,36.24749183654785],[140.83719062805176,35.74332618713379],[140.3346881866455,35.13138008117676],[139.77026557922363,34.953325271606445],[139.96856880187988,35.66082191467285],[139.67663764953613,35.135271072387695],[139.17108345031738,35.23610877990723],[138.84747505187988,34.59249305725098],[138.744966506958,35.12276649475098],[138.21414375305176,34.59916114807129],[137.0361042022705,34.564714431762695],[137.34747505187988,34.72221565246582],[136.87774848937988,34.72027015686035],[136.84692573547363,35.07833290100098],[136.51944160461426,34.69249153137207],[136.8991413116455,34.26693916320801],[136.343843460083,34.189714431762695],[135.77221870422363,33.45499610900879],[135.06329536437988,33.87777137756348],[135.333589553833,34.71832466125488],[132.36773872375488,34.35860633850098],[132.05053901672363,33.77249336242676],[131.74579048156738,34.053606033325195],[130.89331245422363,33.92166328430176],[130.94635200500488,34.41638374328613],[131.40555000305176,34.419443130493164],[133.08801460266113,35.58166694641113],[136.07275581359863,35.64860725402832],[135.95941352844238,35.97332191467285],[136.71246528625488,36.75139045715332],[136.78692817687988,37.36221504211426],[137.35635566711426,37.504716873168945],[137.35522651672363,37.43138313293457],[137.03747749328613,37.18194007873535],[136.9213581085205,37.197214126586914],[136.86328315734863,37.08777046203613],[137.3024616241455,36.74638557434082],[138.5805377960205,37.39860725402832],[139.424409866333,38.15165901184082],[140.02276802062988,39.37860298156738],[140.0383014678955,39.803049087524414],[139.70245552062988,39.93194007873535],[140.02054023742676,40.23082160949707],[139.8527545928955,40.60110664367676],[140.26886177062988,40.806657791137695],[140.34857368469238,41.24804878234863],[140.72497749328613,40.82916450500488],[141.14941596984863,40.86221504211426],[141.228853225708,41.229990005493164],[140.763032913208,41.17276954650879],[140.91885566711426,41.53027534484863],[141.27081489562988,41.34249305725098]]],[[[139.56302070617676,42.22860145568848],[139.428316116333,42.061662673950195],[139.4333209991455,42.20193672180176],[139.56302070617676,42.22860145568848]]],[[[145.290864944458,43.53866004943848],[145.22000312805176,43.60255241394043],[145.36108589172363,43.555551528930664],[145.290864944458,43.53866004943848]]],[[[143.97024726867676,44.1411075592041],[143.87774848937988,44.147775650024414],[143.81192207336426,44.16805458068848],[143.97024726867676,44.1411075592041]]],[[[141.25943183898926,45.09804725646973],[141.13470649719238,45.213884353637695],[141.3083209991455,45.18888282775879],[141.25943183898926,45.09804725646973]]],[[[142.0483112335205,45.40471076965332],[143.77221870422363,44.09415626525879],[144.77942085266113,43.9133243560791],[145.34247016906738,44.34415626525879],[145.06997871398926,43.77471351623535],[145.25610542297363,43.31499671936035],[145.82220649719238,43.36944007873535],[143.98968696594238,42.90665626525879],[143.2399616241455,41.92416572570801],[141.79052925109863,42.60638618469238],[140.98608589172363,42.295000076293945],[140.4616413116455,42.56777381896973],[140.28497505187988,42.25305366516113],[141.19912910461426,41.7983341217041],[140.06970405578613,41.41916084289551],[139.83636665344238,42.61527442932129],[140.52887153625488,43.00055122375488],[140.4677448272705,43.36721229553223],[141.4071979522705,43.29138374328613],[141.797212600708,44.6249942779541],[141.57803535461426,45.232492446899414],[142.0483112335205,45.40471076965332]]],[[[141.03943061828613,45.26693916320801],[140.97357368469238,45.46527290344238],[141.07440376281738,45.41415596008301],[141.03943061828613,45.26693916320801]]]]}},{"type":"Feature","properties":{"name":"Jamaica","iso2":"JM","iso3":"JAM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-77.131958,17.878887],[-77.733337,17.84861],[-78.339737,18.362499],[-76.945282,18.394444],[-76.221115,17.904163],[-77.131958,17.878887]]]]}},{"type":"Feature","properties":{"name":"Jordan","iso2":"JO","iso3":"JOR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[34.961388,29.360832],[34.97998,29.545753000000147],[35.47819500000011,31.497322],[35.552567,32.394196],[35.648888,32.685272],[36.837776,32.313606],[38.794701,33.377594],[39.196743,32.154942],[37.005272,31.505554],[38.001389,30.504166],[37.502777,30.00222],[36.743607,29.864719],[36.07,29.188889],[34.961388,29.360832]]]]}},{"type":"Feature","properties":{"name":"Kenya","iso2":"KE","iso3":"KEN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[41.13805400000015,-2.124444],[40.950272,-2.173611],[41.0638890000001,-2.044167],[41.13805400000015,-2.124444]]],[[[35.940552,4.622499],[37.039719,4.375555000000134],[38.121109,3.611666],[39.524437,3.406389],[40.783768,4.287975],[41.171387,3.9425],[41.905167,3.980322],[40.98659500000011,2.829956],[40.998329,-0.866111],[41.558159,-1.674868],[41.31527700000018,-1.958056],[40.891663,-2.019167],[40.96360800000011,-2.298889],[40.854996000000114,-2.236111],[40.638054,-2.55],[40.236664000000104,-2.663333],[39.20302600000011,-4.669618],[37.613609,-3.504167],[37.602776,-2.995833],[33.920273,-1.001111],[33.907219,0.103056],[35.0097200000001,1.895278],[34.463333,3.671389],[33.996666,4.222777000000136],[34.388191,4.609682],[35.940552,4.622499]]]]}},{"type":"Feature","properties":{"name":"Kyrgyzstan","iso2":"KG","iso3":"KGZ"},"geometry":{"type":"MultiPolygon","coordinates":[[[[80.23402400000012,42.19622],[78.080826,41.04078700000015],[76.873871,41.014107],[76.345825,40.35022],[75.69720500000014,40.29911],[75.5780490000001,40.647995],[74.86026000000018,40.519386],[73.9944310000001,40.046043],[73.655685,39.454826],[72.248596,39.191856],[71.473038,39.6213],[70.997757,39.40094],[69.306091,39.539436],[69.540817,40.131378],[70.498032,39.90683],[70.98204,40.244843],[71.710541,40.145767],[73.173035,40.822998],[72.19548,41.006592],[71.69136,41.556335],[71.418045,41.118553],[70.187195,41.52829],[71.276382,42.195511],[70.97081,42.254669],[71.17109700000012,42.69135300000015],[71.747208,42.823586],[73.5197140000001,42.408005],[73.583878,43.038574],[74.293594,43.216904],[75.664429,42.807457],[79.194702,42.795792],[80.23402400000012,42.19622]]]]}},{"type":"Feature","properties":{"name":"Korea, Democratic People's Republic of","iso2":"KP","iso3":"PRK"},"geometry":{"type":"MultiPolygon","coordinates":[[[[124.8461,39.497215],[124.8891600000002,39.605553000000114],[124.934143,39.60833],[124.8461,39.497215]]],[[[130.6388850000001,42.406937],[130.697418,42.292206],[129.699402,41.648605],[129.70941200000013,40.829994],[127.506943,39.724709000000175],[127.393051,39.200829],[128.3635560000001,38.62524400000011],[128.07995600000018,38.311935],[127.106087,38.287498000000156],[126.688492,37.83390800000011],[125.589157,38.027214],[125.724426,37.91082],[125.342758,37.67137900000013],[125.512207,37.88694],[124.980553,37.924438],[125.268051,38.072769],[124.66470300000017,38.121101],[124.993591,38.58832600000012],[125.65332000000015,38.62721300000011],[125.139977,38.79638700000014],[125.44831800000011,39.576385],[125.12303200000011,39.557213],[124.744431,39.776939],[124.624153,39.594994],[124.3735960000001,40.09362],[126.016937,40.899994],[126.91304000000022,41.796104],[128.155823,41.382492],[128.05886800000016,42.00332600000014],[128.925812,42.024437],[129.71191400000012,42.444153],[129.907532,43.005821],[130.6043700000001,42.42186],[130.6388850000001,42.406937]]]]}},{"type":"Feature","properties":{"name":"Kiribati","iso2":"KI","iso3":"KIR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-151.78363,-11.466391],[-151.808044,-11.449722],[-151.814453,-11.392502],[-151.78363,-11.466391]]],[[[-152.391418,-10.105278],[-152.406708,-10.097221],[-152.395599,-10.095835],[-152.391418,-10.105278]]],[[[-150.224152,-9.954166],[-150.233063,-9.938614],[-150.220551,-9.923891],[-150.224152,-9.954166]]],[[[-150.225281,-9.915834],[-150.228882,-9.890835],[-150.219177,-9.901392],[-150.225281,-9.915834]]],[[[-155.878052,-5.64],[-155.92807,-5.61889],[-155.85614,-5.619445],[-155.878052,-5.64]]],[[[-172.1875,-4.531668],[-172.231384,-4.504446],[-172.196381,-4.491944],[-172.1875,-4.531668]]],[[[-171.231689,-4.46139],[-171.264496,-4.446388],[-171.235535,-4.438055],[-171.231689,-4.46139]]],[[[-154.939209,-4.045555],[-154.95639,-4.102501],[-155.016113,-4.060834],[-154.939209,-4.045555]]],[[[-171.078064,-3.141667],[-171.089722,-3.137501],[-171.086426,-3.108889],[-171.078064,-3.141667]]],[[[-171.627808,-2.8325],[-171.626373,-2.869445],[-171.725586,-2.772778],[-171.627808,-2.8325]]],[[[176.848297,-2.669445],[176.774139,-2.607778],[176.833313,-2.633889],[176.848297,-2.669445]]],[[[175.971893,-2.505],[175.960236,-2.505834],[175.964417,-2.481111],[175.971893,-2.505]]],[[[175.58609,-1.919722],[175.54776,-1.821667],[175.592743,-1.883333],[175.58609,-1.919722]]],[[[175.53137200000012,-1.806111],[175.493561,-1.769722],[175.519714,-1.777778],[175.53137200000012,-1.806111]]],[[[175.041931,-1.5525],[175.001648,-1.528611],[175.046082,-1.434722],[175.041931,-1.5525]]],[[[174.873291,-1.408056],[174.85745199999988,-1.408611],[174.8535769999999,-1.399167],[174.873291,-1.408056]]],[[[176.46469100000022,-1.435278],[176.390533,-1.324445],[176.421356,-1.348333],[176.46469100000022,-1.435278]]],[[[175.954681,-1.279167],[176.018311,-1.389444],[175.934143,-1.3025],[175.954681,-1.279167]]],[[[174.767761,-1.255833],[174.71637,-1.14],[174.767212,-1.207222],[174.767761,-1.255833]]],[[[174.489685,-0.816667],[174.458008,-0.653611],[174.495789,-0.770278],[174.489685,-0.816667]]],[[[174.458862,-0.651667],[174.377167,-0.5975],[174.392487,-0.594722],[174.458862,-0.651667]]],[[[173.618011,0.133611],[173.604126,0.2125],[173.631622,0.216667],[173.618011,0.133611]]],[[[173.40969800000013,0.203611],[173.402191,0.233056],[173.425537,0.215278],[173.40969800000013,0.203611]]],[[[173.38497900000013,0.244167],[173.371338,0.250278],[173.376617,0.266111000000123],[173.38497900000013,0.244167]]],[[[173.931915,0.298055],[173.923584,0.302222],[173.93942300000012,0.320833],[173.931915,0.298055]]],[[[173.830536,0.448333],[173.921631,0.379722],[173.804962,0.431111],[173.830536,0.448333]]],[[[173.021912,1.006667],[173.084137,0.951944000000125],[172.981354,0.821667],[173.021912,1.006667]]],[[[172.93969700000017,1.336111000000116],[172.914154,1.346389],[172.943573,1.345833],[172.93969700000017,1.336111000000116]]],[[[173.126617,1.349166],[173.09857200000013,1.351389],[173.11911,1.373333],[173.126617,1.349166]]],[[[173.062195,1.410278000000119],[173.039703,1.417778],[173.0346980000002,1.444444],[173.062195,1.410278000000119]]],[[[173.012756,1.472500000000153],[173.016388,1.465],[172.99719200000013,1.500556],[173.012756,1.472500000000153]]],[[[172.981903,1.529444000000112],[172.960785,1.553333000000137],[172.955231,1.619166],[172.981903,1.529444000000112]]],[[[172.88470500000014,1.838333],[172.834137,1.863611],[172.85800200000014,1.861666],[172.88470500000014,1.838333]]],[[[173.014984,1.706111000000135],[172.929962,1.936111],[173.027191,1.821111],[173.014984,1.706111000000135]]],[[[172.891663,1.93],[172.8827210000002,1.932777],[172.8855290000001,1.943889000000112],[172.891663,1.93]]],[[[173.328857,1.940278],[173.311096,1.958055],[173.349396,1.965833],[173.328857,1.940278]]],[[[173.343018,1.982777],[173.313599,1.973889],[173.325256,2.015833],[173.343018,1.982777]]],[[[-157.431671,2.021388000000115],[-157.179443,1.714444],[-157.571381,1.858888],[-157.431671,2.021388000000115]]],[[[172.870239,3.064444],[172.774994,3.002222],[172.749115,3.024166],[172.870239,3.064444]]],[[[172.9682920000001,3.24861],[172.95745800000012,3.281388],[172.97662400000016,3.296389],[172.9682920000001,3.24861]]],[[[-159.340027,3.920833],[-159.271698,3.789722],[-159.40448,3.864166],[-159.340027,3.920833]]],[[[-160.394745,4.685554],[-160.405609,4.725276],[-160.37973,4.718332],[-160.394745,4.685554]]]]}},{"type":"Feature","properties":{"name":"Korea, Republic of","iso2":"KR","iso3":"KOR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[126.622208,33.23999],[126.158333,33.314713],[126.898041,33.52332300000013],[126.622208,33.23999]]],[[[126.7655490000001,34.280823],[126.651382,34.316101],[126.701393,34.38694],[126.7655490000001,34.280823]]],[[[127.213608,34.418884],[127.111366,34.460274],[127.222717,34.48362700000011],[127.213608,34.418884]]],[[[127.790817,34.47637900000011],[127.711929,34.5266570000001],[127.77082800000014,34.5383300000001],[127.790817,34.47637900000011]]],[[[126.186653,34.351387],[126.243317,34.573326],[126.380257,34.494713],[126.186653,34.351387]]],[[[127.803864,34.575554],[127.734421,34.613327],[127.76805100000016,34.66415400000015],[127.803864,34.575554]]],[[[125.991364,34.668053],[125.91499300000012,34.692215],[125.981369,34.716934],[125.991364,34.668053]]],[[[125.993042,34.791939],[126.009163,34.759995],[125.890549,34.728043],[125.993042,34.791939]]],[[[128.085785,34.830276],[127.974152,34.85833],[128.024139,34.913879],[128.085785,34.830276]]],[[[126.063599,34.854439],[125.983597,34.864998],[126.06275900000011,34.928329],[126.063599,34.854439]]],[[[127.9561,34.800827],[128.060791,34.701103],[127.857208,34.723877],[127.879967,34.92943600000011],[127.9561,34.800827]]],[[[128.754425,34.87693800000015],[128.594116,34.697769],[128.488556,34.856384],[128.754425,34.87693800000015]]],[[[126.10608700000014,35.046944],[126.05998200000013,35.090828],[126.162201,35.14332600000016],[126.10608700000014,35.046944]]],[[[126.428307,36.399719],[126.33582300000015,36.438599],[126.346939,36.591103],[126.428307,36.399719]]],[[[126.16943400000017,36.82582900000013],[126.16110200000011,36.838043],[126.172447,36.8368380000001],[126.16943400000017,36.82582900000013]]],[[[130.887482,37.453323],[130.807465,37.51832600000013],[130.919434,37.545273],[130.887482,37.453323]]],[[[126.501389,37.594437],[126.373032,37.621658],[126.400543,37.818886],[126.501389,37.594437]]],[[[124.695534,37.9161000000001],[124.615257,37.968597],[124.72554000000011,37.981659],[124.695534,37.9161000000001]]],[[[128.532471,38.330551],[129.433594,37.058884000000106],[129.43942300000018,35.475822],[129.136932,35.11221300000015],[127.593323,34.941658],[127.640823,34.616936],[127.49387400000015,34.851662000000104],[127.389427,34.4711],[127.124687,34.53721600000013],[127.328598,34.74305],[126.889427,34.412491],[126.772491,34.58277100000011],[126.556374,34.300545],[126.266937,34.683327],[126.659714,34.812767000000136],[126.249153,35.11666100000012],[126.431374,35.023323],[126.68775900000017,35.533333],[126.474701,35.635826000000165],[126.872993,36.054718],[126.544418,36.136406],[126.49720800000014,36.723877000000144],[126.1235960000001,36.709160000000125],[126.50248700000012,37.052773],[126.9922030000001,36.91082],[126.661102,37.156097],[126.865807,37.266937],[126.688492,37.83390800000011],[127.106087,38.287498000000156],[128.07995600000018,38.311935],[128.3635560000001,38.62524400000011],[128.532471,38.330551]]]]}},{"type":"Feature","properties":{"name":"Kuwait","iso2":"KW","iso3":"KWT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[48.362488,29.450272],[48.38832900000014,29.395554],[48.266930000000144,29.441109],[48.362488,29.450272]]],[[[48.224709,29.594719],[48.152222,29.991940000000156],[48.359444,29.744999],[48.224709,29.594719]]],[[[48.032219,29.968052],[48.00860600000013,29.973885],[48.037766,30.011105000000114],[48.11166400000016,30.023048],[48.032219,29.968052]]],[[[47.9310990000001,30.018887],[47.943474,30.017555],[48.167213,29.553055],[47.707222,29.37583200000013],[48.028603,29.344994],[48.416588,28.545277],[47.688880999999895,28.538883],[47.4599910000002,28.999439],[46.546944,29.104198],[47.169991,30.015270000000115],[47.9310990000001,30.018887]]]]}},{"type":"Feature","properties":{"name":"Kazakhstan","iso2":"KZ","iso3":"KAZ"},"geometry":{"type":"MultiPolygon","coordinates":[[[[50.116104,44.838043],[49.978867,44.956383],[50.11277,45.077492],[50.116104,44.838043]]],[[[50.291664,44.949997],[50.26554900000022,45.036659],[50.342766,45.08305400000013],[50.291664,44.949997]]],[[[53.024994,46.2286],[52.96027400000011,46.266388],[53.046387,46.367493],[53.097488,46.296661],[53.024994,46.2286]]],[[[69.185532,55.34388000000014],[70.843323,55.301933],[71.27887,54.690269],[70.99693300000015,54.339157],[71.185532,54.10332500000011],[72.19609100000017,54.137497],[72.05165100000013,54.387772],[72.468597,53.908882000000105],[72.61331200000015,54.145271],[73.763885,54.065544000000116],[73.238586,53.64444000000019],[73.437195,53.43610400000016],[74.42915300000018,53.47860000000016],[76.811646,54.447769],[76.521652,53.993881],[77.908035,53.271103],[80.077957,50.75808700000012],[80.687836,51.31472],[81.468048,50.742218],[83.456375,51.00249500000011],[84.363037,50.212212],[85.014435,50.075829000000155],[85.258606,49.591377],[86.19108600000018,49.472488],[86.77499400000013,49.788887],[86.616653,49.587212],[87.348206,49.092621],[86.874695,49.110825000000105],[86.5961,48.53611],[85.75915500000022,48.387772],[85.529312,47.060165],[84.75943,46.826385],[83.040543,47.212212],[82.317764,45.570534],[82.649429,45.43026],[82.561646,45.129417],[81.688309,45.350815],[79.87109400000011,44.904976],[80.520828,44.73247500000012],[80.362762,44.125244],[80.817215,43.156067],[80.37664800000019,43.025238],[80.578598,42.89107500000013],[80.171921,42.660507],[80.23402400000012,42.19622],[79.194702,42.795792],[75.664429,42.807457],[74.293594,43.216904],[73.583878,43.038574],[73.5197140000001,42.408005],[71.747208,42.823586],[71.17109700000012,42.69135300000015],[70.97081,42.254669],[69.05636600000011,41.379433000000105],[68.455261,40.59777100000012],[67.935532,41.183327],[66.7199860000002,41.174995],[66.526382,42.003052],[66.02916,42.003052],[66.123871,42.99694100000012],[65.82193,42.877213],[64.931366,43.73777],[62.025108,43.484787],[58.569717,45.571106],[55.99749,45.001106],[56.000961,41.32845300000015],[55.45694000000017,41.28665900000014],[54.17305,42.337212],[53.014999,42.138885],[52.440071,41.740936],[52.73832700000011,42.710274000000155],[51.26554900000016,43.153046],[50.839989,44.193047],[50.239433,44.576385],[51.57027400000018,44.513885],[50.953049,44.86193800000014],[51.405266,45.37054400000015],[53.228043000000156,45.33776900000011],[52.733047,45.549438],[53.08582300000015,46.007217],[53.164154,46.317215],[52.99665800000017,46.488045],[53.194153,46.714996],[51.189987,47.114716],[49.222527,46.346306000000155],[48.560547,46.564995],[49.027206,46.776093],[48.20443,47.704987000000116],[47.383324,47.688881],[47.122765,48.27166],[46.499161000000214,48.417496],[47.062767,49.142769000000115],[46.79583,49.339714],[46.929436,49.863609],[47.520828,50.436378],[48.251663,49.86971300000012],[48.796944,49.941933000000134],[48.697487,50.591934],[50.77330000000015,51.76918],[51.303047,51.4797130000001],[52.338326,51.782211],[52.603325,51.45694],[53.428604,51.49166100000015],[54.506386,50.856941000000106],[54.523933,50.528839],[54.647217,51.03694200000011],[55.692490000000106,50.532494],[56.510826,51.08332800000012],[57.481934,50.864716],[58.337769,51.156097],[59.542496,50.478325],[60.04361,50.863327],[61.381378,50.783607],[61.685822,51.265831],[60.00222,51.958328],[61.061935000000204,52.342491],[60.694153000000114,52.680824],[61.09915900000013,52.981659],[62.118324000000115,53.004166000000126],[61.184715,53.3066560000001],[61.57749200000015,53.513329],[60.90554800000021,53.62027],[61.226936,53.811935],[61.01416,53.947487],[62.547493,53.879433000000105],[63.172218,54.18637800000012],[65.216385,54.318886],[65.483322,54.6380460000001],[69.185532,55.34388000000014]]]]}},{"type":"Feature","properties":{"name":"Lao People's Democratic Republic","iso2":"LA","iso3":"LAO"},"geometry":{"type":"MultiPolygon","coordinates":[[[[107.5466,14.708618],[106.853592,14.303053],[106.540741,14.598724000000132],[106.004707,14.373053],[106.056641,13.929998],[105.210602,14.349648],[105.536102,14.563332000000116],[105.637772,15.659721],[104.747208,16.528332],[104.71832300000014,17.50333],[103.985527,18.321663],[103.397217,18.434994],[102.683594,17.819996],[102.089394,18.214983000000146],[101.162773,17.459995],[100.921371,17.56721900000015],[101.281097,19.562218],[100.50360100000015,19.526665],[100.58046,20.157768000000104],[100.09137,20.348606],[101.14823900000013,21.572636],[101.281937,21.180275],[101.78720100000012,21.144161],[101.57443200000014,22.20916],[101.738037,22.49694100000012],[102.14074700000012,22.396286],[102.676651,21.65583],[102.976089,21.739437],[103.170532,20.846664],[103.693588,20.657219],[104.109154,20.977219],[104.6436,20.660275000000112],[104.3819270000001,20.444717],[104.979156,20.004997],[104.640266,19.611942],[104.03724700000012,19.69294400000011],[103.87943300000015,19.29361],[105.193863,18.642494],[105.183319,18.334442],[106.561096,16.996941],[106.685532,16.45805],[107.464706,16.078609000000128],[107.1755370000001,15.784164],[107.695251,15.270832],[107.5466,14.708618]]]]}},{"type":"Feature","properties":{"name":"Lebanon","iso2":"LB","iso3":"LBN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[35.623634,33.245728],[35.10083,33.093605000000125],[35.972771,34.647499],[36.459999,34.635277],[36.623741,34.204994],[35.623634,33.245728]]]]}},{"type":"Feature","properties":{"name":"Latvia","iso2":"LV","iso3":"LVA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[21.068607,56.435547],[21.053608,56.83638],[21.73333,57.576942],[22.610275,57.756386],[23.785831,56.970268],[24.407497,57.25666],[24.314980000000105,57.871826],[25.294998000000106,58.084435],[26.511387,57.5261],[27.372059,57.535637],[27.861107,57.302216],[27.70166,56.914711],[28.168011,56.150154],[26.613209,55.674835],[25,56.295547],[22.139439,56.4236070000001],[21.051685,56.077309],[21.068607,56.435547]]]]}},{"type":"Feature","properties":{"name":"Belarus","iso2":"BY","iso3":"BLR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[26.613209,55.674835],[28.168011,56.150154],[30.926247,55.60257],[31.02972,55.043327],[30.781387,54.79361],[31.844162,54.064438],[31.764225,53.80262],[32.741104,53.463051],[31.266941,53.02471200000015],[31.783886,52.108047],[30.94309600000011,52.073792000000125],[30.551414000000108,51.251846],[25.775829000000158,51.939156],[24.396664,51.886658],[23.604633,51.527695],[23.638607,52.079437],[23.1654,52.282276],[23.94083,52.732208],[23.50404,53.947044],[25.785275000000127,54.160545],[25.547497,54.33277100000011],[25.788887,54.870270000000104],[26.81971700000014,55.281105],[26.45583,55.341377],[26.613209,55.674835]]]]}},{"type":"Feature","properties":{"name":"Lithuania","iso2":"LT","iso3":"LTU"},"geometry":{"type":"MultiPolygon","coordinates":[[[[21.044441,55.32638500000017],[20.984814,55.27655],[20.942833,55.287201],[21.089996,55.719986],[21.044441,55.32638500000017]]],[[[25,56.295547],[26.613209,55.674835],[26.45583,55.341377],[26.81971700000014,55.281105],[25.788887,54.870270000000104],[25.547497,54.33277100000011],[25.785275000000127,54.160545],[23.50404,53.947044],[22.785885,54.363838],[22.842495,54.896942],[21.431385,55.251938],[21.263935000000146,55.248985],[21.051685,56.077309],[22.139439,56.4236070000001],[25,56.295547]]]]}},{"type":"Feature","properties":{"name":"Liberia","iso2":"LR","iso3":"LBR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-10.806074,6.403],[-11.492331,6.927091000000132],[-10.266651,8.488377],[-9.48365,8.346931],[-9.485161,7.361989],[-9.106945,7.198889],[-8.660557,7.695],[-8.469749,7.561325],[-8.308334,6.860833000000113],[-8.606383999999878,6.507815],[-7.423334,5.839444],[-7.525402,4.352806000000101],[-9.142778,5.055555],[-10.806074,6.403]]]]}},{"type":"Feature","properties":{"name":"Slovakia","iso2":"SK","iso3":"SVK"},"geometry":{"type":"MultiPolygon","coordinates":[[[[17.251656,48.024994],[17.166386,48.012497],[16.946182,48.619064],[18.851246,49.517357],[19.475555,49.599998],[20.074444,49.175278],[21.618889,49.436386],[22.558052,49.079437],[22.151442,48.411919],[20.660553,48.563332],[18.655277,47.758606],[17.251656,48.024994]]]]}},{"type":"Feature","properties":{"name":"Liechtenstein","iso2":"LI","iso3":"LIE"},"geometry":{"type":"MultiPolygon","coordinates":[[[[9.533569,47.274544],[9.598635,47.063835],[9.474637,47.057457],[9.533569,47.274544]]]]}},{"type":"Feature","properties":{"name":"Libyan Arab Jamahiriya","iso2":"LY","iso3":"LBY"},"geometry":{"type":"MultiPolygon","coordinates":[[[[9.948332,27.824444],[9.766388,29.427776],[9.303888,30.122498],[9.537113,30.23439],[10.21361,30.730831],[10.287222,31.694164],[11.567499,32.442215],[11.526081,33.171135],[15.165833,32.398605],[15.761665,31.385555],[17.370831,31.081665],[19.001389,30.266941],[20.060555,30.855274],[20.084442,32.184715],[21.621387,32.933609],[23.112499,32.6325],[23.247196,32.216225],[24.973888,31.969997],[25.151665,31.646942],[24.706665,30.16861],[24.997776,29.248886],[25.001423,21.999695],[25.000832,19.999119],[24.000832000000116,20.001942],[24.002747,19.499065],[16.000832,23.450554],[14.997889,23.000591],[14.234999,22.614166],[13.543888,23.16861],[11.986475,23.522305],[11.558887,24.302498],[10.252222,24.605831],[9.398333,26.153332],[9.871666,26.514164],[9.948332,27.824444]]]]}},{"type":"Feature","properties":{"name":"Madagascar","iso2":"MG","iso3":"MDG"},"geometry":{"type":"MultiPolygon","coordinates":[[[[49.8336124420166,-17.089723587036133],[49.860551834106445,-16.913890838623047],[50.01055335998535,-16.72555923461914],[49.8336124420166,-17.089723587036133]]],[[[47.2197208404541,-15.436668395996094],[47.207773208618164,-15.434446334838867],[47.2005558013916,-15.427501678466797],[47.20666694641113,-15.420557022094727],[47.21944618225098,-15.420833587646484],[47.2197208404541,-15.436668395996094]]],[[[48.34250068664551,-13.418054580688477],[48.20555305480957,-13.391389846801758],[48.281389236450195,-13.196666717529297],[48.34250068664551,-13.418054580688477]]],[[[49.356943130493164,-12.09083366394043],[49.94333076477051,-13.039445877075195],[50.433610916137695,-15.580001831054688],[50.17277717590332,-15.97972297668457],[49.866106033325195,-15.432500839233398],[49.63360786437988,-15.557500839233398],[49.78860664367676,-16.830280303955078],[47.1330509185791,-24.928058624267578],[45.21472358703613,-25.588336944580078],[44.017221450805664,-24.985279083251953],[43.2388858795166,-22.282501220703125],[43.50055122375488,-21.33388900756836],[44.48221778869629,-19.970279693603516],[43.93721961975098,-17.479446411132812],[44.45916175842285,-16.1844482421875],[46.151384353637695,-15.703611373901367],[46.47722053527832,-15.96611213684082],[46.338335037231445,-15.624723434448242],[46.947221755981445,-15.198890686035156],[46.95944404602051,-15.558055877685547],[47.22361946105957,-15.448465347290039],[47.235647201538086,-15.412919998168945],[47.11194038391113,-15.305557250976562],[47.05832862854004,-15.185001373291016],[47.45499610900879,-14.665279388427734],[47.42721748352051,-15.110555648803711],[47.81127738952637,-14.603889465332031],[48.001665115356445,-14.765556335449219],[47.69944190979004,-14.420557022094727],[48.0483341217041,-14.155555725097656],[47.90527534484863,-13.596389770507812],[48.28721809387207,-13.808055877685547],[48.73971748352051,-13.427223205566406],[48.95944404602051,-12.822223663330078],[48.7308292388916,-12.434167861938477],[49.356943130493164,-12.09083366394043]],[[49.604440689086914,-12.62639045715332],[49.595834732055664,-12.610000610351562],[49.59444618225098,-12.623611450195312],[49.604440689086914,-12.62639045715332]]]]}},{"type":"Feature","properties":{"name":"Martinique","iso2":"MQ","iso3":"MTQ"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-60.86084,14.402777],[-61.174728,14.876944],[-60.940834,14.740833],[-60.86084,14.402777]]]]}},{"type":"Feature","properties":{"name":"Mongolia","iso2":"MN","iso3":"MNG"},"geometry":{"type":"MultiPolygon","coordinates":[[[[91.020248,46.600109],[90.074432,47.886383],[88.65332,48.18277000000013],[87.9733120000001,48.57694200000016],[87.840698,49.172951],[92.322769,50.81499500000011],[94.274994,50.569443],[94.63526900000014,50.024437],[97.34082,49.734436],[98.28970300000012,50.293884],[97.82777400000012,51.00110600000012],[98.930267,52.143608],[102.218872,51.333603],[102.327766,50.569717],[102.918587,50.315269],[106.66304,50.3386],[107.977127,49.943626],[107.9491420000002,49.678047],[108.57222,49.33360300000011],[110.788589,49.149437000000106],[113.09082,49.59860200000013],[114.313026,50.284164000000104],[116.7113800000001,49.830467],[115.592194,47.919441000000106],[117.372192,47.653595],[117.80108600000014,48.010551],[118.539337,47.994751],[119.72998,47.16415400000015],[119.89749100000014,46.675552],[117.421097,46.578331],[116.585541,46.29583000000015],[115.701927,45.458603],[114.545258,45.389435],[113.638046,44.74527],[111.98082,45.09166],[111.42137100000011,44.382492],[111.958328,43.692215],[110.440536,42.777771],[109.313599,42.429993000000124],[107.471916,42.466103],[105.012207,41.581383],[100.835541,42.678047],[96.38304100000013,42.731102],[95.336105,44.02082800000015],[95.416656,44.29388400000012],[93.5547030000001,44.957214],[90.896942,45.253052],[90.681931,45.57972],[91.020248,46.600109]]]]}},{"type":"Feature","properties":{"name":"Montserrat","iso2":"MS","iso3":"MSR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-62.171394,16.671387],[-62.236671,16.711941],[-62.20195,16.81361],[-62.171394,16.671387]]]]}},{"type":"Feature","properties":{"name":"The former Yugoslav Republic of Macedonia","iso2":"MK","iso3":"MKD"},"geometry":{"type":"MultiPolygon","coordinates":[[[[20.82111,40.908882],[20.492775,41.331108],[20.589642,41.882187],[22.365276,42.323883],[23.014721,41.762215],[22.935604,41.342125],[20.98349,40.855888],[20.82111,40.908882]]]]}},{"type":"Feature","properties":{"name":"Mali","iso2":"ML","iso3":"MLI"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-8.53388,11.49391],[-9.155556,12.486111],[-9.701946,12.029163],[-10.323893,12.224997],[-10.652748,11.892609],[-10.92889,12.224442],[-11.315556,12.022774],[-11.373058,12.407774],[-11.378056,12.988054],[-12.057222,13.664721],[-12.244833,14.764385],[-11.841391,14.863054],[-11.494167,15.646387],[-10.899637,15.106874],[-10.716387,15.438902000000112],[-9.411112,15.443888],[-9.338057,15.704721000000106],[-9.333612,15.499722000000148],[-5.49505,15.498371],[-5.335,16.328053],[-5.601389,16.507774],[-6.577223,24.999165000000133],[-4.806111,25.000275],[1.169662,21.102543],[1.1675,20.741108],[1.795833,20.308331],[3.233055,19.820274],[3.331944,18.976387],[4.245277,19.146664],[4.245,18.645275],[4.200833,16.393887],[3.523981,15.358152],[1.3125,15.286665],[0.235048,14.915068],[-0.725278,15.082777],[-1.980834,14.474722],[-2.006945,14.187777],[-2.474722,14.287498],[-2.879167,13.655554],[-3.2575,13.696665],[-3.437675,13.166498],[-3.964253,13.50383],[-4.337223,13.121666],[-4.4175,12.300831],[-5.273056,11.843887],[-5.51985,10.436272],[-6.111389,10.197777],[-6.243402,10.735256],[-6.988056,10.147499],[-7.635555999999895,10.448332000000107],[-7.973984,10.165611],[-8.289722,11.007776],[-8.680557,10.966389],[-8.357779,11.305555],[-8.53388,11.49391]]]]}},{"type":"Feature","properties":{"name":"Morocco","iso2":"MA","iso3":"MAR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-9.053169,32.734802],[-6.843056,34.018608],[-5.918744,35.790649],[-5.395557,35.91633600000013],[-5.345834,35.84166000000012],[-4.695834,35.208885],[-2.946945,35.329163],[-2.925278,35.266663],[-2.91472199999987,35.273605],[-2.209445,35.085831],[-1.747222,34.747215],[-1.668056,33.261108],[-1.010278,32.508331],[-1.180556,32.11055],[-2.853889,32.088333],[-3.818334,31.695553],[-3.626667,30.970554],[-4.920556,30.508053],[-5.538334,29.902496],[-7.123889,29.636944],[-8.667223,28.709442],[-8.666668,27.666664],[-13.174961,27.666958],[-11.458057,28.334442],[-10.138056,29.428055],[-9.640278,30.168053],[-9.809168,31.446663],[-9.053169,32.734802]]]]}},{"type":"Feature","properties":{"name":"Mauritius","iso2":"MU","iso3":"MUS"},"geometry":{"type":"MultiPolygon","coordinates":[[[[57.572495000000146,-20.514168],[57.304718,-20.449169],[57.624443,-19.986389],[57.572495000000146,-20.514168]]],[[[63.466385,-19.735836],[63.32860600000012,-19.738056],[63.461105,-19.673058],[63.466385,-19.735836]]],[[[56.564438,-10.397223],[56.511665,-10.346668],[56.51361100000011,-10.316668],[56.564438,-10.397223]]]]}},{"type":"Feature","properties":{"name":"Mauritania","iso2":"MR","iso3":"MRT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-16.42750199999989,19.603611],[-16.460003,19.699718000000146],[-16.344448,19.866386000000105],[-16.42750199999989,19.603611]]],[[[-6.662778,26.129166],[-4.806111,25.000275],[-6.577223,24.999165000000133],[-5.601389,16.507774],[-5.335,16.328053],[-5.49505,15.498371],[-9.333612,15.499722000000148],[-9.338057,15.704721000000106],[-9.411112,15.443888],[-10.716387,15.438902000000112],[-10.899637,15.106874],[-11.494167,15.646387],[-11.841391,14.863054],[-12.244833,14.764385],[-14.345278,16.638611],[-16.280834,16.519722],[-16.527679,16.060249],[-16.039448,17.728054000000114],[-16.51166899999987,19.352219],[-16.19639199999989,20.223053],[-16.919724,21.161663000000104],[-17.05233,20.764095000000125],[-16.953056,21.338333],[-15.741997,21.338284],[-12.999723,21.338055000000125],[-13.105278,22.893055],[-12.000278,23.454441000000102],[-12.000557,26],[-8.666944999999885,26.000275000000116],[-8.66679,27.290459],[-6.662778,26.129166]]]]}},{"type":"Feature","properties":{"name":"Malta","iso2":"MT","iso3":"MLT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[14.562222,35.820274],[14.374998,35.847496],[14.326387000000182,35.978882],[14.562222,35.820274]]],[[[14.2675,36.011383],[14.18111000000016,36.06082900000011],[14.34111,36.033882],[14.2675,36.011383]]]]}},{"type":"Feature","properties":{"name":"Oman","iso2":"OM","iso3":"OMN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[55.874718,17.490833],[55.829163,17.493610000000118],[55.859718,17.516666],[55.874718,17.490833]]],[[[56.024162,17.484165],[55.957497,17.519165],[56.09360500000011,17.514721],[56.024162,17.484165]]],[[[58.84277300000011,20.441109],[58.649719,20.168888],[58.899719,20.693054000000117],[58.84277300000011,20.441109]]],[[[56.037498,24.938889],[56.104164,24.734722000000104],[56.373528,24.979382],[57.16499300000012,23.937775],[58.609444000000195,23.633053000000118],[59.811386,22.226665],[58.515831,20.411663],[58.210831,20.612499],[57.829437,20.218887],[57.803886,18.969444000000138],[56.814484,18.747684],[56.353333000000106,17.934166],[55.436943,17.828888000000134],[55.03999300000012,17.018608],[53.114441,16.642778],[51.99929,18.999344000000136],[55,20],[55.666107,21.999722],[55.199165000000136,22.699718],[55.510277000000116,23.97277500000014],[56.024719,24.076111],[55.7794420000001,24.563889000000145],[56.037498,24.938889]]],[[[56.365368,26.382389],[56.269722,25.636015],[56.183331,25.654989],[56.079941,26.065559],[56.365368,26.382389]]]]}},{"type":"Feature","properties":{"name":"Maldives","iso2":"MV","iso3":"MDV"},"geometry":{"type":"MultiPolygon","coordinates":[[[[73.17637600000015,-0.689722],[73.15637200000012,-0.683889],[73.17192100000014,-0.681667],[73.17637600000015,-0.689722]]],[[[73.201385,-0.680833],[73.188309,-0.684722],[73.20193500000013,-0.667222],[73.201385,-0.680833]]],[[[73.12915000000012,-0.668889],[73.12525900000011,-0.668889],[73.121368,-0.653333],[73.12915000000012,-0.668889]]],[[[73.23082,-0.648056],[73.226089,-0.6325],[73.2422030000001,-0.617778],[73.23082,-0.648056]]],[[[73.1163790000002,-0.635833],[73.09082,-0.606667],[73.09137,-0.5825],[73.1163790000002,-0.635833]]],[[[73.248032,-0.605278],[73.23580900000016,-0.585556],[73.249146,-0.576111],[73.248032,-0.605278]]],[[[73.44693,-0.299444],[73.428314,-0.286389],[73.442474,-0.285278],[73.44693,-0.299444]]],[[[73.106934,0.211944],[73.095535,0.228056],[73.10331700000015,0.228889],[73.106934,0.211944]]],[[[73.214706,0.230833000000118],[73.209152,0.24],[73.22026100000014,0.239167],[73.214706,0.230833000000118]]],[[[73.04498300000014,0.259444],[73.034424,0.261389],[73.033051,0.272778],[73.04498300000014,0.259444]]],[[[73.375809,0.28],[73.367203,0.281389],[73.3797,0.291944],[73.375809,0.28]]],[[[73.51304600000012,0.378333],[73.50471500000012,0.383889],[73.508881,0.3925],[73.51304600000012,0.378333]]],[[[72.943039,0.488611],[72.938034,0.485555],[72.937195,0.499722000000105],[72.943039,0.488611]]],[[[73.498032,0.499722000000105],[73.493042,0.496944000000113],[73.487762,0.508055],[73.498032,0.499722000000105]]],[[[73.374695,1.781667000000141],[73.361374,1.788611],[73.374695,1.79527800000011],[73.374695,1.781667000000141]]],[[[73.399155,1.793889000000107],[73.397766,1.806389],[73.40776100000014,1.805833],[73.399155,1.793889000000107]]],[[[73.28720100000012,1.831944],[73.297211,1.819166],[73.284424,1.823055000000139],[73.28720100000012,1.831944]]],[[[73.50694300000012,1.826667],[73.49498,1.823055000000139],[73.516663,1.847222],[73.50694300000012,1.826667]]],[[[73.25054900000012,1.889166],[73.24192800000012,1.886111],[73.247757,1.898333],[73.25054900000012,1.889166]]],[[[73.549988,1.896389000000141],[73.53997800000016,1.891944],[73.549713,1.937222],[73.549988,1.896389000000141]]],[[[73.55304,1.965],[73.548325,1.964166],[73.54721100000015,1.978333],[73.55304,1.965]]],[[[73.323044,1.985000000000113],[73.3138730000002,1.986388],[73.322495,1.995555],[73.323044,1.985000000000113]]],[[[73.588882,2.1075],[73.559143,2.09611],[73.567764,2.11],[73.588882,2.1075]]],[[[73.123871,2.190555],[73.11026000000012,2.196944],[73.12191800000019,2.196944],[73.123871,2.190555]]],[[[72.930817,2.314444],[72.919983,2.322500000000119],[72.92276000000012,2.328888],[72.930817,2.314444]]],[[[73.366653,2.384444],[73.350266,2.440833000000111],[73.3685909999999,2.409721],[73.366653,2.384444]]],[[[73.319717,2.492499],[73.313599,2.491944],[73.311096,2.504722],[73.319717,2.492499]]],[[[72.876083,2.681388],[72.866379,2.684999],[72.866379,2.69611],[72.876083,2.681388]]],[[[73.025269,2.734444],[73.018875,2.736944],[73.034988,2.747499000000118],[73.025269,2.734444]]],[[[73.356644,2.771666],[73.348877,2.770833],[73.349426,2.781944000000124],[73.356644,2.771666]]],[[[73.0177610000002,2.946944],[73.005829,2.946944],[73.012207,2.954722],[73.0177610000002,2.946944]]],[[[73.5799870000001,2.948888],[73.574432,2.950555],[73.585541,2.967499],[73.5799870000001,2.948888]]],[[[72.98220800000016,3.101944],[72.973877,3.108055],[72.982758,3.110833000000156],[72.98220800000016,3.101944]]],[[[73.587204,3.367777],[73.581665,3.372221],[73.59082,3.376944],[73.587204,3.367777]]],[[[73.753326,3.446388],[73.74775700000012,3.451111000000154],[73.751389,3.452499],[73.753326,3.446388]]],[[[72.80276500000011,3.510278],[72.78804000000011,3.511111],[72.798599,3.516944],[72.80276500000011,3.510278]]],[[[72.92276000000012,3.544167],[72.908035,3.537777000000133],[72.9272,3.559721],[72.92276000000012,3.544167]]],[[[72.69747900000013,3.714166],[72.687759,3.724721],[72.699417,3.724166],[72.69747900000013,3.714166]]],[[[73.47387700000016,3.933055],[73.465546,3.932222],[73.4802700000001,3.940555],[73.47387700000016,3.933055]]],[[[72.70971700000021,3.995555000000138],[72.69775400000017,4.000833],[72.707764,4.003611],[72.70971700000021,3.995555000000138]]],[[[73.512207,4.093611],[73.501938,4.096388],[73.50305200000011,4.106943],[73.512207,4.093611]]],[[[73.503601,4.164165],[73.491089,4.174999],[73.505264,4.17861],[73.503601,4.164165]]],[[[73.5186,4.191387000000134],[73.51915,4.176388],[73.51138300000011,4.182221],[73.5186,4.191387000000134]]],[[[72.959717,4.26861],[72.977768,4.261666],[72.962494,4.262221],[72.959717,4.26861]]],[[[72.96971100000016,4.877776],[72.970261,4.898055],[72.9802700000001,4.901111000000157],[72.96971100000016,4.877776]]],[[[73.589706,5.27361],[73.56694,5.277499],[73.589706,5.286943],[73.589706,5.27361]]],[[[73.320267,5.36111],[73.314987,5.365276],[73.333603,5.366666],[73.320267,5.36111]]],[[[73.635269,5.385555],[73.62025500000013,5.420833000000101],[73.63749700000014,5.412777],[73.635269,5.385555]]],[[[73.3841550000001,5.709722],[73.387772,5.741943],[73.3927610000002,5.72861],[73.3841550000001,5.709722]]],[[[72.99136400000012,5.76111],[72.981659,5.758888],[72.981659,5.771666],[72.99136400000012,5.76111]]],[[[73.436371,5.827222],[73.4297030000001,5.827222],[73.45109600000015,5.849166],[73.436371,5.827222]]],[[[72.96887200000012,5.850832],[72.96499600000013,5.847499],[72.961105,5.867777],[72.96887200000012,5.850832]]],[[[73.433044,5.902222],[73.423599,5.903610000000128],[73.422211,5.911666],[73.433044,5.902222]]],[[[73.398331,5.955277],[73.379425,5.971388],[73.393326,5.96861],[73.398331,5.955277]]],[[[72.933319,5.960833],[72.92831400000014,5.954999],[72.9260860000002,5.97194400000015],[72.933319,5.960833]]],[[[73.270538,6.185276],[73.2686,6.175277000000122],[73.269989,6.193054],[73.270538,6.185276]]],[[[73.248032,6.231943],[73.2397,6.227499],[73.234711,6.23611],[73.248032,6.231943]]],[[[73.204437,6.317499],[73.190811,6.324721000000125],[73.20166,6.327499000000117],[73.204437,6.317499]]],[[[73.05026200000012,6.429166000000151],[73.040817,6.429999000000151],[73.041367,6.444165],[73.05026200000012,6.429166000000151]]],[[[73.0674900000001,6.661388],[73.059982,6.657499],[73.068054,6.672776],[73.0674900000001,6.661388]]],[[[73.101089,6.696943],[73.093323,6.697221],[73.1024780000001,6.715555],[73.101089,6.696943]]],[[[73.136932,6.726388],[73.12915000000012,6.733888],[73.161926,6.784165],[73.136932,6.726388]]],[[[73.18136600000011,6.8325],[73.20166,6.828888],[73.184143,6.81861],[73.18136600000011,6.8325]]],[[[73.2052610000002,6.883611],[73.19552600000011,6.889443000000142],[73.209991,6.926388],[73.2052610000002,6.883611]]],[[[73.198868,6.947498],[73.19165,6.951111],[73.193588,6.978610000000117],[73.198868,6.947498]]],[[[72.985535,7.012221],[72.97998000000021,7.011666000000119],[72.974991,7.029444],[72.985535,7.012221]]],[[[72.91609200000019,7.081666],[72.90277100000012,7.093055000000106],[72.911926,7.094999],[72.91609200000019,7.081666]]]]}},{"type":"Feature","properties":{"name":"Mexico","iso2":"MX","iso3":"MEX"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-114.74278259277344,18.322778701782227],[-114.80307006835938,18.33277702331543],[-114.72389221191406,18.353334426879883],[-114.74278259277344,18.322778701782227]]],[[[-87.37278747558594,18.400278091430664],[-87.33168029785156,18.503053665161133],[-87.32695007324219,18.453332901000977],[-87.37278747558594,18.400278091430664]]],[[[-87.25167846679688,18.641389846801758],[-87.25944519042969,18.627779006958008],[-87.2650146484375,18.733888626098633],[-87.25167846679688,18.641389846801758]]],[[[-91.82861328125,18.6391658782959],[-91.6461181640625,18.753610610961914],[-91.52389526367188,18.77055549621582],[-91.82861328125,18.6391658782959]]],[[[-110.92611694335938,18.72110939025879],[-111.07140350341797,18.76833152770996],[-111.00334167480469,18.864999771118164],[-110.92611694335938,18.72110939025879]]],[[[-110.78861999511719,19.308053970336914],[-110.83585357666016,19.271387100219727],[-110.81333923339844,19.341665267944336],[-110.78861999511719,19.308053970336914]]],[[[-86.7327880859375,20.585554122924805],[-87,20.25638771057129],[-86.93890380859375,20.539445877075195],[-86.7327880859375,20.585554122924805]]],[[[-86.70140075683594,21.197221755981445],[-86.7388916015625,21.239999771118164],[-86.74917602539062,21.28639030456543],[-86.70140075683594,21.197221755981445]]],[[[-106.195556640625,21.255277633666992],[-106.26500701904297,21.336668014526367],[-106.197509765625,21.33860969543457],[-106.195556640625,21.255277633666992]]],[[[-106.38667297363281,21.42083168029785],[-106.51139831542969,21.45027732849121],[-106.33556365966797,21.49888801574707],[-106.38667297363281,21.42083168029785]]],[[[-106.51500701904297,21.5130558013916],[-106.64584350585938,21.68833351135254],[-106.5300064086914,21.690832138061523],[-106.51500701904297,21.5130558013916]]],[[[-106.65640258789062,21.752500534057617],[-106.67529296875,21.74138832092285],[-106.67056274414062,21.816389083862305],[-106.65640258789062,21.752500534057617]]],[[[-97.81889343261719,22.6825008392334],[-97.83084106445312,22.697221755981445],[-97.7841796875,22.774168014526367],[-97.81889343261719,22.6825008392334]]],[[[-97.77305603027344,22.7913875579834],[-97.78140258789062,22.80499839782715],[-97.76028442382812,22.834165573120117],[-97.77305603027344,22.7913875579834]]],[[[-109.7844467163086,24.135000228881836],[-109.87139892578125,24.187498092651367],[-109.91555786132812,24.3688907623291],[-109.7844467163086,24.135000228881836]]],[[[-111.53250122070312,24.378053665161133],[-111.49474334716797,24.351388931274414],[-111.6702880859375,24.371946334838867],[-111.53250122070312,24.378053665161133]]],[[[-111.70584106445312,24.331666946411133],[-112.01667785644531,24.532499313354492],[-111.8369369506836,24.541112899780273],[-111.70584106445312,24.331666946411133]]],[[[-110.32805633544922,24.400835037231445],[-110.40194702148438,24.579999923706055],[-110.30000305175781,24.484445571899414],[-110.32805633544922,24.400835037231445]]],[[[-110.53695678710938,24.88222312927246],[-110.70500183105469,25.093889236450195],[-110.57890319824219,25.03388786315918],[-110.53695678710938,24.88222312927246]]],[[[-112.04611206054688,24.519166946411133],[-112.25279235839844,24.809999465942383],[-112.13362121582031,25.281110763549805],[-112.20250701904297,24.844999313354492],[-112.04611206054688,24.519166946411133]]],[[[-108.84278869628906,25.42860984802246],[-108.78916931152344,25.372220993041992],[-109.01112365722656,25.43833351135254],[-108.84278869628906,25.42860984802246]]],[[[-110.79695129394531,25.594999313354492],[-110.82528686523438,25.642499923706055],[-110.8083267211914,25.695833206176758],[-110.79695129394531,25.594999313354492]]],[[[-111.197509765625,25.844999313354492],[-111.19139099121094,26.038888931274414],[-111.086669921875,26.074445724487305],[-111.197509765625,25.844999313354492]]],[[[-110.54611206054688,27.309999465942383],[-110.59750366210938,27.336111068725586],[-110.59028625488281,27.4152774810791],[-110.54611206054688,27.309999465942383]]],[[[-114.22000122070312,27.738332748413086],[-114.32389831542969,27.816667556762695],[-114.24501037597656,27.814443588256836],[-114.22000122070312,27.738332748413086]]],[[[-115.17388916015625,28.027498245239258],[-115.3266830444336,28.138334274291992],[-115.24083709716797,28.370553970336914],[-115.17388916015625,28.027498245239258]]],[[[-112.760009765625,28.593610763549805],[-112.88583374023438,28.683889389038086],[-112.79640197753906,28.644166946411133],[-112.760009765625,28.593610763549805]]],[[[-112.58168029785156,28.670278549194336],[-112.60362243652344,28.72722053527832],[-112.54084777832031,28.7358341217041],[-112.58168029785156,28.670278549194336]]],[[[-118.28916931152344,28.88166618347168],[-118.40416717529297,29.14777946472168],[-118.31001281738281,29.195276260375977],[-118.28916931152344,28.88166618347168]]],[[[-112.26194763183594,28.773332595825195],[-112.56417846679688,28.878332138061523],[-112.34584045410156,29.233610153198242],[-112.26194763183594,28.773332595825195]]],[[[-113.13555908203125,29.019723892211914],[-113.59221458435059,29.425832748413086],[-113.588623046875,29.5836124420166],[-113.13555908203125,29.019723892211914]]],[[[-114.65084838867188,31.690553665161133],[-114.76363372802734,31.712499618530273],[-114.790283203125,31.7994441986084],[-114.65084838867188,31.690553665161133]]],[[[-113.05288696289062,31.971071243286133],[-111.04583740234375,31.33305549621582],[-108.20834350585938,31.33305549621582],[-108.2086181640625,31.783334732055664],[-106.40084838867188,31.750276565551758],[-104.90055847167969,30.572778701782227],[-104.54000854492188,29.671110153198242],[-103.375,29.023611068725586],[-102.30584716796875,29.88944435119629],[-101.40501403808594,29.77277946472168],[-99.5050048828125,27.570276260375977],[-99.104736328125,26.434999465942383],[-97.14073944091797,25.966428756713867],[-97.88972473144531,22.600831985473633],[-97.17611694335938,20.684999465942383],[-95.91139221191406,18.82527732849121],[-94.80223083496094,18.52250099182129],[-94.47889709472656,18.146665573120117],[-91.99501037597656,18.7277774810791],[-91.81472778320312,18.383054733276367],[-91.47500610351562,18.439443588256836],[-90.45472717285156,19.975278854370117],[-90.3275146484375,21.031389236450195],[-88.45140075683594,21.56888771057129],[-87.02778625488281,21.59027671813965],[-86.77278137207031,21.15138816833496],[-87.7388916015625,19.67472267150879],[-87.41166687011719,19.578889846801758],[-87.84750366210938,18.190832138061523],[-88.03750610351562,18.869443893432617],[-88.29949951171875,18.48293113708496],[-88.37779235839844,18.482778549194336],[-89.14195251464844,17.81888771057129],[-90.982421875,17.820653915405273],[-90.98390197753906,17.2561092376709],[-91.4375,17.24110984802246],[-90.40640258789062,16.4163875579834],[-90.44195556640625,16.088335037231445],[-91.72917175292969,16.07499885559082],[-92.24678039550781,14.550546646118164],[-92.77278137207031,15.174444198608398],[-94.36805725097656,16.294443130493164],[-94.05778503417969,16.040834426879883],[-94.7247314453125,16.196664810180664],[-94.57806396484375,16.318334579467773],[-94.78973388671875,16.257776260375977],[-94.86195373535156,16.427499771118164],[-96.47611999511719,15.643610000610352],[-97.78500366210938,15.968610763549805],[-101.01112365722656,17.265275955200195],[-101.95001220703125,17.97749900817871],[-103.45001220703125,18.31361198425293],[-104.98361206054688,19.339445114135742],[-105.68000793457031,20.386388778686523],[-105.24417114257812,20.574167251586914],[-105.54444885253906,20.785001754760742],[-105.189453125,21.437498092651367],[-105.81696319580078,22.660276412963867],[-107.99918365478516,24.652498245239258],[-108.04251098632812,25.073610305786133],[-108.39418029785156,25.141111373901367],[-108.76779174804688,25.54222297668457],[-109.10890197753906,25.52610969543457],[-108.82805633544922,25.7983341217041],[-109.3880615234375,25.7561092376709],[-109.10389709472656,26.28360939025879],[-110.52971458435059,27.371110916137695],[-110.5097427368164,27.86638832092285],[-111.10556030273438,27.93833351135254],[-112.16472625732422,28.972501754760742],[-113.086669921875,31.22722053527832],[-115.03167724609375,31.968053817749023],[-114.5452880859375,30.00111198425293],[-112.86279296875,28.433332443237305],[-111.85861206054688,26.661943435668945],[-111.84221458435059,26.90305519104004],[-111.56083679199219,26.72361183166504],[-110.66056823730469,24.337778091430664],[-110.35417175292969,24.115835189819336],[-110.213623046875,24.351945877075195],[-109.41084289550781,23.468332290649414],[-110.00499725341797,22.886110305786133],[-110.31668090820312,23.5674991607666],[-112.08750915527344,24.7561092376709],[-112.07084655761719,25.613054275512695],[-112.10611724853516,25.51833152770996],[-112.39666557312012,26.27277946472168],[-113.22029113769531,26.705556869506836],[-113.12834167480469,26.958887100219727],[-113.59750366210938,26.7369441986084],[-114.9888916015625,27.72110939025879],[-113.98306274414062,27.70250129699707],[-114.31056213378906,27.865556716918945],[-114.06360626220703,28.527223587036133],[-115.69389343261719,29.76833152770996],[-117.12237358093262,32.53533363342285],[-114.7190933227539,32.71845817565918],[-114.80982971191406,32.50699043273926],[-113.05288696289062,31.971071243286133]],[[-109.94889831542969,27.024442672729492],[-109.98139953613281,27.076387405395508],[-110.0344467163086,27.09139060974121],[-109.94889831542969,27.024442672729492]],[[-97.6077880859375,21.736665725708008],[-97.68556213378906,21.85999870300293],[-97.67417907714844,21.7902774810791],[-97.6077880859375,21.736665725708008]]]]}},{"type":"Feature","properties":{"name":"Malaysia","iso2":"MY","iso3":"MYS"},"geometry":{"type":"MultiPolygon","coordinates":[[[[104.12024116516113,2.318891525268555],[104.15497016906738,2.287778854370117],[104.1010684967041,2.294168472290039],[104.12024116516113,2.318891525268555]]],[[[111.37082099914551,2.36027717590332],[111.30359077453613,2.448057174682617],[111.32747840881348,2.781389236450195],[111.38388252258301,2.680002212524414],[111.37692451477051,2.495279312133789],[111.41388130187988,2.37611198425293],[111.37082099914551,2.36027717590332]]],[[[104.17108345031738,2.705278396606445],[104.17191505432129,2.895002365112305],[104.22162818908691,2.72972297668457],[104.17108345031738,2.705278396606445]]],[[[117.72664833068848,4.169721603393555],[117.9035587310791,4.174043655395508],[117.68692207336426,4.168336868286133],[117.72664833068848,4.169721603393555]]],[[[118.68193244934082,4.499723434448242],[118.76277351379395,4.463613510131836],[118.68942451477051,4.441110610961914],[118.68193244934082,4.499723434448242]]],[[[118.50972175598145,4.554445266723633],[118.51748847961426,4.536111831665039],[118.49942207336426,4.529165267944336],[118.50972175598145,4.554445266723633]]],[[[118.57026863098145,4.600831985473633],[118.34387397766113,4.670553207397461],[118.47886848449707,4.689165115356445],[118.57026863098145,4.600831985473633]]],[[[115.2330493927002,5.259721755981445],[115.15833473205566,5.257776260375977],[115.24193000793457,5.384721755981445],[115.2330493927002,5.259721755981445]]],[[[100.28885841369629,5.256109237670898],[100.1838550567627,5.462499618530273],[100.32025337219238,5.427778244018555],[100.28885841369629,5.256109237670898]]],[[[115.67221260070801,5.707223892211914],[115.62776374816895,5.728334426879883],[115.65442848205566,5.735834121704102],[115.67221260070801,5.707223892211914]]],[[[118.17192268371582,5.812223434448242],[118.17886543273926,5.84889030456543],[118.2330493927002,5.848333358764648],[118.17192268371582,5.812223434448242]]],[[[116.05941963195801,6.003057479858398],[116.01693916320801,6.035833358764648],[116.05664253234863,6.039999008178711],[116.05941963195801,6.003057479858398]]],[[[115.60915565490723,6.195276260375977],[115.59274482727051,6.204721450805664],[115.60775947570801,6.221109390258789],[115.60915565490723,6.195276260375977]]],[[[99.87329292297363,6.416109085083008],[99.81302070617676,6.156667709350586],[99.64082527160645,6.419721603393555],[99.87329292297363,6.416109085083008]]],[[[100.65497016906738,6.448331832885742],[101.11551856994629,6.24888801574707],[101.13968849182129,5.63194465637207],[101.56997871398926,5.916666030883789],[101.83386421203613,5.74333381652832],[102.0952320098877,6.236139297485352],[103.40997505187988,4.858053207397461],[103.43579292297363,2.933889389038086],[104.27580451965332,1.365556716918945],[103.95941352844238,1.646944046020508],[103.51214027404785,1.269529342651367],[101.28497505187988,2.84111213684082],[101.29442024230957,3.268888473510742],[100.69719123840332,3.903890609741211],[100.12711524963379,6.424947738647461],[100.2149829864502,6.711111068725586],[100.65497016906738,6.448331832885742]]],[[[117.49359321594238,6.742498397827148],[117.46692848205566,6.642499923706055],[117.33719825744629,6.651388168334961],[117.49359321594238,6.742498397827148]]],[[[116.78914833068848,6.579168319702148],[117.17830848693848,6.990278244018555],[117.29081916809082,6.635835647583008],[117.73887825012207,6.39000129699707],[117.50305366516113,5.896112442016602],[118.00888252258301,6.061666488647461],[117.96027565002441,5.681390762329102],[118.37359809875488,5.807500839233398],[119.27581977844238,5.344999313354492],[118.14055061340332,4.888334274291992],[118.55220222473145,4.351667404174805],[117.5920581817627,4.169820785522461],[116.04942512512207,4.279443740844727],[115.68525886535645,4.171945571899414],[115.49553108215332,3.040002822875977],[115.13971138000488,2.906110763549805],[115.2371997833252,2.522500991821289],[114.8047046661377,2.24888801574707],[114.5627613067627,1.433610916137695],[113.65833473205566,1.224721908569336],[112.47276496887207,1.568056106567383],[111.82721138000488,0.998613357543945],[110.55525398254395,0.853891372680664],[109.66998481750488,1.613054275512695],[109.64856910705566,2.073408126831055],[109.92830848693848,1.689165115356445],[110.33333015441895,1.802221298217773],[111.37692451477051,1.343889236450195],[111.00000190734863,1.575555801391602],[111.37275886535645,2.150835037231445],[111.16858863830566,2.152223587036133],[111.22331428527832,2.421110153198242],[111.36811256408691,2.339094161987305],[111.45027351379395,2.368612289428711],[111.44470405578613,2.691667556762695],[113.01053810119629,3.160554885864258],[114.09507942199707,4.590539932250977],[114.64109992980957,4.018888473510742],[115.01843452453613,4.895795822143555],[115.02913093566895,4.820211410522461],[115.34332466125488,4.311944961547852],[115.2230396270752,4.804998397827148],[115.14578437805176,4.903242111206055],[115.54609870910645,5.053056716918945],[115.37886238098145,5.398889541625977],[115.84887886047363,5.56389045715332],[116.76249885559082,7.023611068725586],[116.78914833068848,6.579168319702148]]],[[[117.28333473205566,7.314722061157227],[117.06667518615723,7.10194206237793],[117.07415962219238,7.287500381469727],[117.28333473205566,7.314722061157227]]],[[[116.87248420715332,7.219999313354492],[117.00332832336426,7.353334426879883],[117.01888465881348,7.266389846801758],[116.87248420715332,7.219999313354492]]]]}},{"type":"Feature","properties":{"name":"Mozambique","iso2":"MZ","iso3":"MOZ"},"geometry":{"type":"MultiPolygon","coordinates":[[[[32.954437,-26.058613],[32.89527100000012,-26.040836],[32.980553,-25.972778],[32.954437,-26.058613]]],[[[35.48832700000011,-21.685001],[35.435555,-21.783337],[35.47943900000021,-21.523891],[35.48832700000011,-21.685001]]],[[[39.901382,-16.413334],[39.810829000000155,-16.363056],[39.861382,-16.278057],[39.901382,-16.413334]]],[[[40.5008320000002,-11.031946],[40.64694200000022,-12.760834],[40.409996,-12.961945],[40.846107,-14.697779],[40.587776000000105,-15.479723],[39.09444400000021,-16.986389],[36.841385,-17.877224],[36.943886,-18.108612],[36.25277700000012,-18.891392],[34.899162,-19.857224],[34.619164,-19.617779],[35.312492,-22.418056],[35.545273,-22.232502],[35.497215,-24.105278],[35.012215,-24.654167],[32.81388900000016,-25.60778],[32.576111,-25.975559],[32.837494,-26.293056],[32.95249900000013,-26.083889],[32.890427,-26.847145],[32.1334,-26.839626],[31.96851,-25.95784],[32.016106,-24.459446],[31.297504000000146,-22.414764],[32.488876,-21.344448],[32.50222000000011,-20.598614],[33.0188830000001,-19.943336],[32.699165,-18.944447],[33.073051000000106,-18.348892],[32.987808,-17.265003],[32.98114,-16.709053],[31.276665,-16.018612],[30.422775,-16.009167],[30.415756,-15.631872],[30.21301700000018,-14.981716],[33.222229,-14.012566],[33.633331,-14.539722],[34.522217,-14.571667],[34.589722,-15.282778],[34.2555540000001,-15.899168],[35.2900540000002,-17.134266],[35.135300000000115,-16.553375],[35.814438,-16.019447],[35.924164000000104,-14.885557],[34.566383000000116,-13.342224],[34.375275,-12.155834],[34.626106000000135,-11.575834],[34.966728,-11.572111],[35.838333,-11.414722],[36.18972,-11.706667],[37.462044,-11.727329],[37.941383,-11.285002],[39.268051000000156,-11.168056],[40.43681300000017,-10.478174],[40.5008320000002,-11.031946]],[[34.602776000000205,-12.011946],[34.623886,-12.036667],[34.629997,-12.012501],[34.602776000000205,-12.011946]],[[34.723885,-12.032778],[34.732216,-12.095556],[34.754715,-12.044168],[34.723885,-12.032778]]]]}},{"type":"Feature","properties":{"name":"Malawi","iso2":"MW","iso3":"MWI"},"geometry":{"type":"MultiPolygon","coordinates":[[[[34.732216,-12.095556],[34.723885,-12.032778],[34.754715,-12.044168],[34.732216,-12.095556]]],[[[34.623886,-12.036667],[34.602776000000205,-12.011946],[34.629997,-12.012501],[34.623886,-12.036667]]],[[[33.13472000000016,-9.494167],[34.325272,-9.732779],[34.966728,-11.572111],[34.626106000000135,-11.575834],[34.375275,-12.155834],[34.566383000000116,-13.342224],[35.924164000000104,-14.885557],[35.814438,-16.019447],[35.135300000000115,-16.553375],[35.2900540000002,-17.134266],[34.2555540000001,-15.899168],[34.589722,-15.282778],[34.522217,-14.571667],[33.633331,-14.539722],[33.222229,-14.012566],[32.678886,-13.60639],[33.046387,-12.603889],[33.54583,-12.359446],[33.273331,-12.144445],[33.250549,-10.886667],[33.702278,-10.561857],[32.940399,-9.405077],[33.13472000000016,-9.494167]]]]}},{"type":"Feature","properties":{"name":"New Caledonia","iso2":"NC","iso3":"NCL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[167.534424,-22.69389],[167.508026,-22.688332],[167.53137200000018,-22.651112],[167.534424,-22.69389]]],[[[167.5016480000002,-22.672222],[167.434692,-22.543056],[167.553864,-22.612499],[167.5016480000002,-22.672222]]],[[[166.816071,-22.463333],[166.7724910000002,-22.456108],[166.811646,-22.395],[166.816071,-22.463333]]],[[[171.313873,-22.33139],[171.300812,-22.334999],[171.304962,-22.327778],[171.313873,-22.33139]]],[[[166.0505370000001,-22.079445],[166.027191,-22.054722],[166.0505370000001,-22.036667],[166.0505370000001,-22.079445]]],[[[166.450256,-21.704445],[166.415527,-21.691387],[166.440796,-21.68861],[166.450256,-21.704445]]],[[[168.0021970000001,-21.451942],[168.1202390000001,-21.631111],[167.808868,-21.385834],[168.0021970000001,-21.451942]]],[[[167.842743,-21.14389],[167.80136100000013,-21.119446],[167.80246,-21.100277],[167.842743,-21.14389]]],[[[166.4480290000001,-20.734165],[166.38858,-20.72583],[166.459137,-20.719719],[166.4480290000001,-20.734165]]],[[[167.287201,-20.75639],[167.39804100000012,-21.177776],[167.059692,-20.988609],[167.287201,-20.75639]]],[[[166.62466400000014,-20.406109],[166.62579300000013,-20.601665],[166.499115,-20.717777],[166.62466400000014,-20.406109]]],[[[164.288025,-20.255558],[164.275269,-20.248886],[164.27026400000014,-20.219719],[164.288025,-20.255558]]],[[[163.943848,-20.170555],[163.922485,-20.16972],[163.906921,-20.14389],[163.943848,-20.170555]]],[[[164.31665000000012,-20.327225],[167.01470900000012,-22.321388],[166.451904,-22.316666],[166.116364,-21.946388],[165.2599790000002,-21.558056],[163.98941,-20.087223],[164.31665000000012,-20.327225]]],[[[164.234131,-20.161945],[164.161102,-20.113335],[164.16330000000013,-20.065277],[164.234131,-20.161945]]],[[[163.821625,-20.082779],[163.796936,-20.040836],[163.817749,-20.040836],[163.821625,-20.082779]]],[[[163.97717300000014,-20.081669],[163.939972,-20.068058],[163.949402,-20.002224],[163.97717300000014,-20.081669]]],[[[163.671906,-19.785835],[163.61969,-19.625832],[163.700806,-19.766392],[163.671906,-19.785835]]],[[[163.6074520000001,-19.604168],[163.568024,-19.573055],[163.5766300000001,-19.549446],[163.6074520000001,-19.604168]]],[[[159.949402,-19.343334],[159.95108,-19.114445],[159.978851,-19.171665],[159.949402,-19.343334]]]]}},{"type":"Feature","properties":{"name":"Niue","iso2":"NU","iso3":"NIU"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-169.89389,-19.145557],[-169.931671,-19.016666],[-169.817505,-18.96833],[-169.89389,-19.145557]]]]}},{"type":"Feature","properties":{"name":"Niger","iso2":"NE","iso3":"NER"},"geometry":{"type":"MultiPolygon","coordinates":[[[[4.245,18.645275],[4.245277,19.146664],[5.812499,19.44611],[7.450807,20.852863],[11.986475,23.522305],[13.543888,23.16861],[14.234999,22.614166],[14.997889,23.000591],[15.202499,21.495831],[15.996666,20.353054],[15.489166,16.914165],[13.468887,14.461111],[13.62512,13.718338],[12.459166,13.066111],[10.724165,13.386389],[9.634932,12.802435],[7.815,13.352777],[6.933332,12.997221000000124],[6.423055,13.605276000000131],[5.874722,13.749443],[4.1425,13.476944],[3.604459,11.693274],[2.83862,12.396658],[2.378054,12.240274],[2.397925,11.896152],[2.1425,12.694443],[1.578333,12.629999],[0.989167,13.047222],[0.991667,13.371666],[1.285306,13.349957],[0.602222,13.703888],[0.235048,14.915068],[1.3125,15.286665],[3.523981,15.358152],[4.200833,16.393887],[4.245,18.645275]]]]}},{"type":"Feature","properties":{"name":"Aruba","iso2":"AW","iso3":"ABW"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-69.882233,12.41111],[-70.059448,12.538055],[-70.063065,12.628611],[-69.882233,12.41111]]]]}},{"type":"Feature","properties":{"name":"Anguilla","iso2":"AI","iso3":"AIA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-63.167778,18.164444],[-62.970001,18.272221],[-62.993057,18.227219],[-63.167778,18.164444]]]]}},{"type":"Feature","properties":{"name":"Belgium","iso2":"BE","iso3":"BEL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[4.302375,51.263184],[4.252368,51.375145],[5.041389000000152,51.486664],[5.849171,51.15638],[5.640833,50.839722],[6.011798000000113,50.7572710000001],[6.398204,50.323174],[6.134414,50.127846],[6.026256,50.181252],[5.80788,49.545044],[4.873055000000107,49.797218],[4.832503,50.16861],[4.149238,49.978371],[4.165,50.283051],[2.541667000000103,51.09111],[3.370866,51.373856000000146],[4.238898,51.350426],[4.302375,51.263184]]]]}},{"type":"Feature","properties":{"name":"Hong Kong","iso2":"HK","iso3":"HKG"},"geometry":{"type":"MultiPolygon","coordinates":[[[[114.24609400000011,22.203327],[114.124977,22.279999],[114.201103,22.290554],[114.24609400000011,22.203327]]],[[[113.8966520000001,22.195827000000108],[113.82527200000013,22.232216],[114.04776000000012,22.339996000000113],[113.8966520000001,22.195827000000108]]],[[[114.31414800000013,22.342773],[114.295258,22.34582900000011],[114.296097,22.368053],[114.31414800000013,22.342773]]],[[[114.219437,22.474438],[114.296104,22.260561],[114.03333040044393,22.50913814917469],[114.2225957829825,22.550548246897094],[114.219437,22.474438]]]]}},{"type":"Feature","properties":{"name":"Northern Mariana Islands","iso2":"MP","iso3":"MNP"},"geometry":{"type":"MultiPolygon","coordinates":[[[[145.2816470000001,14.158333],[145.11996500000012,14.122498],[145.237183,14.194998],[145.2816470000001,14.158333]]],[[[145.5352480000001,14.82833100000012],[145.529694,14.848331],[145.570251,14.844997],[145.5352480000001,14.82833100000012]]],[[[145.624115,14.908054000000106],[145.5722050000002,15.009998],[145.633026,15.083887],[145.624115,14.908054000000106]]],[[[145.73608400000015,15.133610000000118],[145.679138,15.105276],[145.818024,15.265833],[145.73608400000015,15.133610000000118]]],[[[145.655823,16.334721],[145.63443,16.376106],[145.714691,16.355831],[145.655823,16.334721]]],[[[145.798309,16.680275],[145.774994,16.705273000000105],[145.80163600000012,16.70055000000012],[145.798309,16.680275]]],[[[145.860779,17.28722],[145.84024,17.317219],[145.8674620000002,17.30416500000011],[145.860779,17.28722]]],[[[145.860779,17.567776],[145.824402,17.577496000000124],[145.833862,17.604996000000156],[145.860779,17.567776]]],[[[145.73608400000015,18.043888],[145.77914400000012,18.17083000000015],[145.824402,18.163052],[145.73608400000015,18.043888]]],[[[145.679138,18.721382000000133],[145.6633000000002,18.810276],[145.71051000000014,18.76833],[145.679138,18.721382000000133]]],[[[145.405823,19.652775],[145.3891600000002,19.688885],[145.415253,19.677219],[145.405823,19.652775]]],[[[145.256927,20.010830000000126],[145.242188,20.052219],[145.27359,20.036385],[145.256927,20.010830000000126]]],[[[144.921082,20.51833],[144.899139,20.526108],[144.913605,20.556385],[144.921082,20.51833]]]]}},{"type":"Feature","properties":{"name":"Faroe Islands","iso2":"FO","iso3":"FRO"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-6.655277252197266,61.38944435119629],[-6.962778091430664,61.61916542053223],[-6.724445343017578,61.57332801818848],[-6.655277252197266,61.38944435119629]]],[[[-6.604166030883789,61.821664810180664],[-6.6522216796875,61.74277687072754],[-6.908332824707031,61.90471839904785],[-6.604166030883789,61.821664810180664]]],[[[-7.049722671508789,62.06777381896973],[-7.201665878295898,62.01861000061035],[-7.434999465942383,62.140275955200195],[-7.049722671508789,62.06777381896973]]],[[[-6.706943511962891,61.9374942779541],[-7.232221603393555,62.172494888305664],[-7.210832595825195,62.28472328186035],[-6.706943511962891,61.9374942779541]]],[[[-6.657499313354492,62.09250068664551],[-7.060277938842773,62.313608169555664],[-6.601110458374023,62.19693946838379],[-6.657499313354492,62.09250068664551]]],[[[-6.620000839233398,62.22972297668457],[-6.685832977294922,62.24499702453613],[-6.720832824707031,62.33138465881348],[-6.620000839233398,62.22972297668457]]],[[[-6.418611526489258,62.18388557434082],[-6.572500228881836,62.2116641998291],[-6.57440185546875,62.34987831115723],[-6.418611526489258,62.18388557434082]]],[[[-6.406110763549805,62.284440994262695],[-6.480278015136719,62.29777717590332],[-6.545278549194336,62.38694190979004],[-6.406110763549805,62.284440994262695]]]]}},{"type":"Feature","properties":{"name":"Andorra","iso2":"AD","iso3":"AND"},"geometry":{"type":"MultiPolygon","coordinates":[[[[1.78172,42.569962],[1.723611,42.509438],[1.445833,42.601944],[1.78172,42.569962]]]]}},{"type":"Feature","properties":{"name":"Gibraltar","iso2":"GI","iso3":"GIB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-5.334508,36.16256000000011],[-5.33823,36.112175],[-5.355799,36.1633070000001],[-5.334508,36.16256000000011]]]]}},{"type":"Feature","properties":{"name":"Isle of Man","iso2":"IM","iso3":"IMN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-4.777779,54.05555],[-4.354167,54.410828],[-4.394444,54.186386],[-4.777779,54.05555]]]]}},{"type":"Feature","properties":{"name":"Luxembourg","iso2":"LU","iso3":"LUX"},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.026256,50.181252],[6.134414,50.127846],[6.524444,49.808609],[6.36217,49.459389],[5.80788,49.545044],[6.026256,50.181252]]]]}},{"type":"Feature","properties":{"name":"Macau","iso2":"MO","iso3":"MAC"},"geometry":{"type":"MultiPolygon","coordinates":[[[[113.531662,22.194736],[113.554428,22.21273000000015],[113.552467,22.183052],[113.531662,22.194736]]]]}},{"type":"Feature","properties":{"name":"Monaco","iso2":"MC","iso3":"MCO"},"geometry":{"type":"MultiPolygon","coordinates":[[[[7.439293000000106,43.75752300000015],[7.391609,43.727547],[7.387777,43.748604],[7.416111,43.770554],[7.439293000000106,43.75752300000015]]]]}},{"type":"Feature","properties":{"name":"Palestine","iso2":"PS","iso3":"PSE"},"geometry":{"type":"MultiPolygon","coordinates":[[[[34.33416,31.25972],[34.26757800000021,31.216541],[34.21666,31.323330000000155],[34.490547,31.596096000000117],[34.33416,31.25972]]],[[[35.282494,32.516937],[35.552567,32.394196],[35.47819500000011,31.497322],[34.884995,31.391388],[35.282494,32.516937]],[[35.251663,31.788055000000114],[35.25972000000016,31.78722000000012],[35.24888600000011,31.808887000000155],[35.251663,31.788055000000114]]]]}},{"type":"Feature","properties":{"name":"Montenegro","iso2":"ME","iso3":"MNE"},"geometry":{"type":"MultiPolygon","coordinates":[[[[18.455555,42.565826],[18.699997,43.255554],[19.228809,43.513214],[20.348888,42.886383],[20.071423,42.560913],[19.645832,42.61805],[19.367771,41.848999],[18.503197,42.44944],[18.455555,42.565826]]]]}},{"type":"Feature","properties":{"name":"Mayotte","iso2":"YT","iso3":"MYT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[45.282494,-12.804167],[45.262497,-12.76889],[45.283051,-12.747501],[45.282494,-12.804167]]],[[[45.2049940000002,-12.849724],[45.097496,-12.985834],[45.078888,-12.6625],[45.2049940000002,-12.849724]]]]}},{"type":"Feature","properties":{"name":"Åland Islands","iso2":"AX","iso3":"ALA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[20.210831000000155,59.979996000000156],[19.99916500000012,60.055275],[20.205276,60.063606],[20.210831000000155,59.979996000000156]]],[[[20.270554,60.057495000000145],[20.215553,60.13916],[20.292221,60.125275],[20.270554,60.057495000000145]]],[[[19.676666,60.156944],[19.510555,60.17527800000012],[19.601944,60.255829],[19.676666,60.156944]]],[[[20.397221000000144,60.195],[20.36610800000014,60.26554900000012],[20.441109,60.253052000000125],[20.397221000000144,60.195]]],[[[20.084721,60.350273],[20.277496,60.274162],[19.943886,60.04277],[19.648331,60.25666],[20.084721,60.350273]]]]}},{"type":"Feature","properties":{"name":"Norfolk Island","iso2":"NF","iso3":"NFK"},"geometry":{"type":"MultiPolygon","coordinates":[[[[167.964966,-29.081112],[167.912476,-29.00528],[167.997742,-29.025002],[167.964966,-29.081112]]]]}},{"type":"Feature","properties":{"name":"Cocos (Keeling) Islands","iso2":"CC","iso3":"CCK"},"geometry":{"type":"MultiPolygon","coordinates":[[[[96.914154,-12.198055],[96.902481,-12.199999],[96.91470300000012,-12.151945],[96.914154,-12.198055]]],[[[96.86276200000012,-12.196112],[96.819443,-12.178057],[96.826385,-12.128332],[96.86276200000012,-12.196112]]]]}},{"type":"Feature","properties":{"name":"Antarctica","iso2":"AQ","iso3":"ATA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-60.220001220703125,-80.28584289550781],[-60.90861511230469,-80.74833679199219],[-61.843894958496094,-80.83639526367188],[-67.03195190429688,-80.16639709472656],[-62.55000305175781,-80.25889587402344],[-60.69500732421875,-79.61000061035156],[-60.173614501953125,-79.711669921875],[-60.220001220703125,-80.28584289550781]]],[[[162.15973091125488,-79.06167602539062],[161.94778633117676,-79.03083801269531],[161.92584419250488,-78.98167419433594],[162.15973091125488,-79.06167602539062]]],[[[-162.13336181640625,-78.74111938476562],[-158.53250122070312,-79.71389770507812],[-161.08584594726562,-79.83528137207031],[-163.81640625,-79.20750427246094],[-162.13336181640625,-78.74111938476562]]],[[[-39.972503662109375,-78.55473327636719],[-37.459449768066406,-78.64028930664062],[-41.93055725097656,-78.59194946289062],[-39.972503662109375,-78.55473327636719]]],[[[-70.945556640625,-79.65000915527344],[-71.85528564453125,-79.4202880859375],[-70.30416870117188,-78.80528259277344],[-67.31723022460938,-78.50361633300781],[-70.945556640625,-79.65000915527344]]],[[[167.31555366516113,-78.25361633300781],[166.87164497375488,-78.20808410644531],[167.67749214172363,-78.11752319335938],[167.31555366516113,-78.25361633300781]]],[[[166.35220527648926,-78.31362915039062],[166.06555366516113,-78.11474609375],[166.77417182922363,-78.22111511230469],[166.35220527648926,-78.31362915039062]]],[[[-44.11444854736328,-78.69889831542969],[-45.575279235839844,-78.85195922851562],[-43.7933349609375,-79.00361633300781],[-44.583335876464844,-79.33389282226562],[-43.46611785888672,-79.47029113769531],[-43.35444641113281,-79.77972412109375],[-44.57250213623047,-80.09222412109375],[-44.066673278808594,-80.25750732421875],[-44.28639221191406,-80.33973693847656],[-52.05555725097656,-80.90278625488281],[-54.90888977050781,-80.71861267089844],[-50.666114807128906,-79.588623046875],[-50.183616638183594,-78.65055847167969],[-48.27278137207031,-78.05639457702637],[-44.841949462890625,-78.10139465332031],[-43.89111328125,-78.36195373535156],[-44.11444854736328,-78.69889831542969]]],[[[-148.76113891601562,-77.44223022460938],[-149.0352783203125,-77.41694641113281],[-148.8294677734375,-77.40139770507812],[-148.76113891601562,-77.44223022460938]]],[[[-150.20751953125,-77.37001037597656],[-151.19390869140625,-77.27195739746094],[-150.076416015625,-77.34056091308594],[-150.20751953125,-77.37001037597656]]],[[[-148.85861206054688,-77.354736328125],[-149.51947021484375,-77.29084777832031],[-149.16168212890625,-77.25889587402344],[-148.85861206054688,-77.354736328125]]],[[[167.71695137023926,-77.40583801269531],[169.45111274719238,-77.49668884277344],[166.77664375305176,-77.8577880859375],[166.54776191711426,-77.70668029785156],[166.88250923156738,-77.67195129394531],[166.2133502960205,-77.53863525390625],[166.63165473937988,-77.17280578613281],[167.71695137023926,-77.40583801269531]]],[[[-147.25222778320312,-77.16555786132812],[-147.53280639648438,-77.15194702148438],[-147.0625,-77.17388916015625],[-147.25222778320312,-77.16555786132812]]],[[[-147.89697265625,-77.42973327636719],[-148.86419677734375,-77.27084350585938],[-148.46444702148438,-77.070556640625],[-147.70889282226562,-77.189453125],[-147.59085083007812,-77.33168029785156],[-147.89697265625,-77.42973327636719]]],[[[-147.63363647460938,-77.10334777832031],[-147.83529663085938,-77.03472900390625],[-147.65472412109375,-77.04000854492188],[-147.63363647460938,-77.10334777832031]]],[[[-148.51168823242188,-76.90779113769531],[-148.20669555664062,-76.97805786132812],[-149.19473266601562,-76.9505615234375],[-148.51168823242188,-76.90779113769531]]],[[[-149.47836303710938,-76.89834594726562],[-149.072509765625,-77.10084533691406],[-150.73638916015625,-76.95112609863281],[-149.47836303710938,-76.89834594726562]]],[[[-146.71084594726562,-76.97917175292969],[-146.99166870117188,-76.85139465332031],[-146.22335815429688,-76.89750671386719],[-146.71084594726562,-76.97917175292969]]],[[[-148.53390502929688,-76.72250366210938],[-148.1572265625,-76.76528930664062],[-149.169189453125,-76.73222351074219],[-148.53390502929688,-76.72250366210938]]],[[[-149.83197021484375,-76.66445922851562],[-150.32086181640625,-76.78167724609375],[-150.701416015625,-76.71945190429688],[-149.83197021484375,-76.66445922851562]]],[[[-148.40945434570312,-76.689453125],[-148.77474975585938,-76.65278625488281],[-148.61917114257812,-76.61805725097656],[-148.40945434570312,-76.689453125]]],[[[-147.43362426757812,-76.68861389160156],[-147.95419311523438,-76.59112358093262],[-147.59140014648438,-76.59390258789062],[-147.43362426757812,-76.68861389160156]]],[[[-146.77224731445312,-76.71417236328125],[-147.25140380859375,-76.57695007324219],[-146.76083374023438,-76.570556640625],[-146.77224731445312,-76.71417236328125]]],[[[-147.34722900390625,-76.6138916015625],[-147.61807250976562,-76.55694580078125],[-147.4747314453125,-76.55751037597656],[-147.34722900390625,-76.6138916015625]]],[[[168.60333442687988,-76.2327880859375],[168.36108589172363,-76.16250610351562],[168.490816116333,-76.15861511230469],[168.60333442687988,-76.2327880859375]]],[[[-146.5855712890625,-76.30555725097656],[-147.278076171875,-76.11334228515625],[-146.776123046875,-76.08723258972168],[-146.57305908203125,-76.22029113769531],[-146.5855712890625,-76.30555725097656]]],[[[-146.79055786132812,-75.8558349609375],[-147.00363159179688,-75.8194580078125],[-146.85946655273438,-75.80555725097656],[-146.79055786132812,-75.8558349609375]]],[[[-145.15390014648438,-75.73667907714844],[-145.86727905273438,-75.60455322265625],[-145.57168579101562,-75.55278015136719],[-145.15390014648438,-75.73667907714844]]],[[[-143.00140380859375,-75.526123046875],[-143.28085327148438,-75.49166870117188],[-143.08224487304688,-75.46528625488281],[-143.00140380859375,-75.526123046875]]],[[[-132.3719482421875,-74.46417236328125],[-132.66195678710938,-74.41917419433594],[-132.20529174804688,-74.39250183105469],[-132.3719482421875,-74.46417236328125]]],[[[-131.38973999023438,-74.34695434570312],[-130.7447509765625,-74.41500854492188],[-132.00778198242188,-74.42916870117188],[-131.38973999023438,-74.34695434570312]]],[[[-127.39111328125,-74.58029174804688],[-128.16085815429688,-74.25418090820312],[-127.03611755371094,-74.39222717285156],[-127.39111328125,-74.58029174804688]]],[[[-117.11418151855469,-74.33416557312012],[-117.19833374023438,-74.32833862304688],[-116.75167846679688,-74.24722290039062],[-117.11418151855469,-74.33416557312012]]],[[[-20.46750259399414,-74.33029174804688],[-20.11944580078125,-74.85057067871094],[-21.603614807128906,-74.45083618164062],[-20.36944580078125,-74.12167358398438],[-20.46750259399414,-74.33029174804688]]],[[[-115.93028259277344,-73.96194458007812],[-116.27362060546875,-74.15362358093262],[-117.24111938476562,-74.1875],[-115.93028259277344,-73.96194458007812]]],[[[-122.14972686767578,-73.61445617675781],[-118.54945373535156,-73.92889404296875],[-122.13223266601562,-74.36805725097656],[-122.62999725341797,-74.32084655761719],[-122.41445922851562,-73.87055969238281],[-123.15939331054688,-73.73403930664062],[-122.14972686767578,-73.61445617675781]]],[[[169.8244342803955,-73.5955810546875],[169.388032913208,-73.5330810546875],[169.86859321594238,-73.28916931152344],[169.8244342803955,-73.5955810546875]]],[[[-78.04806518554688,-73.44223022460938],[-78.34611511230469,-73.25279235839844],[-77.63639831542969,-73.30000305175781],[-78.04806518554688,-73.44223022460938]]],[[[-126.11834716796875,-73.24722290039062],[-125.13417053222656,-73.71806335449219],[-124.23056030273438,-73.68917846679688],[-123.72416687011719,-74.10057067871094],[-125.25279235839844,-74.06390380859375],[-127.39250183105469,-73.41778564453125],[-126.11834716796875,-73.24722290039062]]],[[[-73.89111328125,-73.42500305175781],[-74.06417846679688,-73.3255615234375],[-73.4989013671875,-73.15362358093262],[-73.89111328125,-73.42500305175781]]],[[[-104.8650131225586,-73.2388916015625],[-105.24111938476562,-73.05473327636719],[-104.55029296875,-73.18667602539062],[-104.8650131225586,-73.2388916015625]]],[[[-89.74501037597656,-72.87556457519531],[-89.45668029785156,-72.91361999511719],[-90.37945556640625,-73.04779052734375],[-89.74501037597656,-72.87556457519531]]],[[[-74.2227783203125,-72.97611999511719],[-74.46556091308594,-73.64834594726562],[-76.09361267089844,-73.20945739746094],[-75.39527893066406,-73.06001281738281],[-75.72029113769531,-72.945556640625],[-75.38612365722656,-72.81806945800781],[-74.2227783203125,-72.97611999511719]]],[[[-93.75944519042969,-72.91166687011719],[-94.1380615234375,-72.83917236328125],[-93.80584716796875,-72.81500244140625],[-93.75944519042969,-72.91166687011719]]],[[[-98.14805603027344,-72.73001098632812],[-98.34361267089844,-72.69944763183594],[-97.82528686523438,-72.66334533691406],[-98.14805603027344,-72.73001098632812]]],[[[-99.7408447265625,-72.62361145019531],[-98.93028259277344,-72.67361450195312],[-100.85861206054688,-72.66555786132812],[-99.7408447265625,-72.62361145019531]]],[[[-95.33139038085938,-72.67195129394531],[-95.51834106445312,-72.64944458007812],[-94.69676208496094,-72.61419677734375],[-95.33139038085938,-72.67195129394531]]],[[[-91.33723258972168,-73.15695190429688],[-91.61723327636719,-72.604736328125],[-90.80639457702637,-72.59278869628906],[-91.33723258972168,-73.15695190429688]]],[[[-93.36528015136719,-72.65444946289062],[-93.46142578125,-72.58451843261719],[-93.1702880859375,-72.5755615234375],[-93.36528015136719,-72.65444946289062]]],[[[-61.038612365722656,-72.55972290039062],[-61.13500213623047,-72.54501342773438],[-60.970001220703125,-72.52751159667969],[-61.038612365722656,-72.55972290039062]]],[[[-78.42001342773438,-72.56777954101562],[-77.43917846679688,-72.588623046875],[-77.59445190429688,-72.91000366210938],[-78.80636596679688,-73.18165588378906],[-79.42167663574219,-72.96000671386719],[-78.8416748046875,-72.77139282226562],[-79.46139526367188,-72.56639099121094],[-79.24751281738281,-72.40251159667969],[-78.42001342773438,-72.56777954101562]]],[[[-68.81611633300781,-72.47445678710938],[-68.97750854492188,-72.46055603027344],[-68.59806823730469,-72.38583374023438],[-68.81611633300781,-72.47445678710938]]],[[[-60.336944580078125,-72.25750732421875],[-60.501943588256836,-72.19972229003906],[-60.34361267089844,-72.19416809082031],[-60.336944580078125,-72.25750732421875]]],[[[68.48201179504395,-72.27778625488281],[68.6931324005127,-72.08891296386719],[68.82002449035645,-72.165283203125],[68.48201179504395,-72.27778625488281]]],[[[69.79756355285645,-72.0330810546875],[69.7730884552002,-71.92362976074219],[69.9572925567627,-71.91864013671875],[69.79756355285645,-72.0330810546875]]],[[[-98.80307006835938,-71.88667297363281],[-98.29750061035156,-71.8719482421875],[-98.56056213378906,-72.13111877441406],[-98.19667053222656,-72.19917297363281],[-98.13630676269531,-71.89289855957031],[-97.6864013671875,-72.18194580078125],[-97.34945678710938,-71.86250305175781],[-96.65055847167969,-71.87333679199219],[-96.34263610839844,-72.002197265625],[-97.258056640625,-72.22222900390625],[-95.99514770507812,-72.08000183105469],[-95.82167053222656,-72.189453125],[-96.59611511230469,-72.28666687011719],[-95.67584228515625,-72.36056518554688],[-98.61611938476562,-72.56889343261719],[-102.56278991699219,-72.12472534179688],[-100.41445922851562,-71.88139343261719],[-100.06166076660156,-71.93513488769531],[-100.51055908203125,-72.02362060546875],[-100.23500061035156,-72.13084411621094],[-98.83306884765625,-72.13139343261719],[-99.30751037597656,-71.94389343261719],[-98.80307006835938,-71.88667297363281]]],[[[0.452028274536133,-71.1005859375],[0.239809036254883,-71.03361511230469],[0.586732864379883,-71.064453125],[0.452028274536133,-71.1005859375]]],[[[-60.53553009033203,-71.05635070800781],[-60.95916557312012,-70.94528198242188],[-60.624725341796875,-70.885009765625],[-60.53553009033203,-71.05635070800781]]],[[[-7.879444122314453,-70.73390197753906],[-8.043611526489258,-70.70001220703125],[-7.725276947021484,-70.71028137207031],[-7.879444122314453,-70.73390197753906]]],[[[-2.389999389648438,-70.751953125],[-1.982776641845703,-70.81639099121094],[-2.796388626098633,-71.03973388671875],[-3.454999923706055,-70.69306945800781],[-2.389999389648438,-70.751953125]]],[[[-73.68528747558594,-70.68028259277344],[-74.30612182617188,-71.01028442382812],[-76.635009765625,-71.06028747558594],[-73.68528747558594,-70.68028259277344]]],[[[2.050657272338867,-70.69972229003906],[1.895933151245117,-70.6461181640625],[2.216733932495117,-70.63639831542969],[2.050657272338867,-70.69972229003906]]],[[[-60.81945037841797,-70.6622314453125],[-61.15917205810547,-70.57583618164062],[-60.63139343261719,-70.54833984375],[-60.81945037841797,-70.6622314453125]]],[[[2.957578659057617,-70.625],[2.613157272338867,-70.50502014160156],[3.327329635620117,-70.46891784667969],[2.957578659057617,-70.625]]],[[[-6.040277481079102,-70.57917785644531],[-6.376682281494141,-70.47607421875],[-5.969852447509766,-70.4179515838623],[-6.040277481079102,-70.57917785644531]]],[[[-3.128055572509766,-70.50418090820312],[-3.329721450805664,-70.48333740234375],[-2.644166946411133,-70.415283203125],[-3.128055572509766,-70.50418090820312]]],[[[163.38614082336426,-70.38056945800781],[163.30529975891113,-70.34918212890625],[163.48333930969238,-70.35389709472656],[163.38614082336426,-70.38056945800781]]],[[[72.22700691223145,-70.61308288574219],[71.6881275177002,-70.33834838867188],[71.9300708770752,-70.29417419433594],[72.22700691223145,-70.61308288574219]]],[[[-1.790277481079102,-70.23194885253906],[-1.973054885864258,-70.18167114257812],[-1.897220611572266,-70.16889953613281],[-1.790277481079102,-70.23194885253906]]],[[[13.109552383422852,-70.0572509765625],[13.221185684204102,-70.13751220703125],[12.481744766235352,-70.11056518554688],[13.109552383422852,-70.0572509765625]]],[[[15.992849349975586,-70.1722412109375],[15.360345840454102,-70.02890014648438],[16.3620548248291,-70.01751708984375],[15.992849349975586,-70.1722412109375]]],[[[-61.38500213623047,-70.01528930664062],[-61.52806091308594,-69.96528625488281],[-61.292503356933594,-69.93417358398438],[-61.38500213623047,-70.01528930664062]]],[[[-74.84222412109375,-69.81584167480469],[-74.4525146484375,-70.02166557312012],[-75.86138916015625,-70.05528259277344],[-74.84222412109375,-69.81584167480469]]],[[[38.23148536682129,-69.67807006835938],[38.05619239807129,-69.63668823242188],[38.23148536682129,-69.64666557312012],[38.23148536682129,-69.67807006835938]]],[[[-72.35528564453125,-69.75750732421875],[-72.94528198242188,-69.60084533691406],[-72.04444885253906,-69.69306945800781],[-72.35528564453125,-69.75750732421875]]],[[[-62.04222869873047,-69.72000122070312],[-62.32722473144531,-69.10751342773438],[-61.71556091308594,-69.46861267089844],[-62.04222869873047,-69.72000122070312]]],[[[155.873628616333,-69.151123046875],[155.5258502960205,-69.00057983398438],[155.88369941711426,-69.05897521972656],[155.873628616333,-69.151123046875]]],[[[155.20083808898926,-69.04611206054688],[154.95392036437988,-69.01722717285156],[155.30890083312988,-68.98114013671875],[155.20083808898926,-69.04611206054688]]],[[[-70.15695190429688,-68.84861755371094],[-70.08416557312012,-69.26362609863281],[-68.37722778320312,-70.64944458007812],[-68.07139587402344,-71.63833618164062],[-68.39167785644531,-72.23390197753906],[-69.260009765625,-72.56417846679688],[-72.37611389160156,-72.727783203125],[-73.1944580078125,-72.43139457702637],[-70.52195739746094,-72.20777893066406],[-72.04501342773438,-72.1944580078125],[-70.94723510742188,-72.03889465332031],[-72.26750183105469,-71.6461181640625],[-72.86666870117188,-71.93417358398438],[-73.87918090820312,-71.820556640625],[-73.58111572265625,-72.04722595214844],[-74.0433349609375,-72.20889282226562],[-75.46612358093262,-71.85111999511719],[-75.14195251464844,-71.57778930664062],[-74.43583679199219,-71.69306945800781],[-74.38917541503906,-71.43417358398438],[-73.5291748046875,-71.64334106445312],[-73.67916870117188,-71.35806274414062],[-72.41195678710938,-71.33639526367188],[-73.15972900390625,-71.18501281738281],[-72.9263916015625,-71.1158447265625],[-70.6138916015625,-71.16639709472656],[-71.02084350585938,-70.8033447265625],[-72.46084594726562,-70.60195922851562],[-71.38917541503906,-70.23001098632812],[-71.81500244140625,-69.98417663574219],[-71.64584350585938,-69.51750183105469],[-72.25334167480469,-69.20722961425781],[-70.15695190429688,-68.84861755371094]]],[[[-90.59445190429688,-68.92584228515625],[-90.75140380859375,-68.79917907714844],[-90.48695373535156,-68.82778930664062],[-90.59445190429688,-68.92584228515625]]],[[[-63.44694519042969,-68.85139465332031],[-63.627784729003906,-68.79695129394531],[-63.41333770751953,-68.83723258972168],[-63.44694519042969,-68.85139465332031]]],[[[-60.718055725097656,-68.75473022460938],[-61.08167266845703,-68.67945861816406],[-60.82972717285156,-68.66111755371094],[-60.718055725097656,-68.75473022460938]]],[[[-67.50750732421875,-67.81001281738281],[-67.81529235839844,-67.68917846679688],[-67.08416557312012,-67.63139343261719],[-67.50750732421875,-67.81001281738281]]],[[[47.67118263244629,-67.58668518066406],[47.89804267883301,-67.59428405761719],[47.40786933898926,-67.62472534179688],[47.67118263244629,-67.58668518066406]]],[[[59.35531044006348,-67.33168029785156],[59.26925849914551,-67.290283203125],[59.41646766662598,-67.32057189941406],[59.35531044006348,-67.33168029785156]]],[[[164.78723335266113,-67.59529113769531],[164.56167793273926,-67.27166557312012],[164.84002876281738,-67.42362976074219],[164.78723335266113,-67.59529113769531]]],[[[58.64254951477051,-67.12641906738281],[58.52865028381348,-67.1177978515625],[58.67147254943848,-67.12001037597656],[58.64254951477051,-67.12641906738281]]],[[[58.86062049865723,-67.1219482421875],[58.77419471740723,-67.10861206054688],[58.82480049133301,-67.10224914550781],[58.86062049865723,-67.1219482421875]]],[[[50.34646797180176,-67.11639404296875],[50.13064765930176,-67.07418823242188],[50.25009346008301,-67.06779479980469],[50.34646797180176,-67.11639404296875]]],[[[48.79397773742676,-66.75613403320312],[48.39731788635254,-66.89028930664062],[48.29147529602051,-66.82000732421875],[48.79397773742676,-66.75613403320312]]],[[[86.0653247833252,-67.00112915039062],[85.3728199005127,-66.74668884277344],[85.8719654083252,-66.77389526367188],[86.18390083312988,-66.92251586914062],[86.0653247833252,-67.00112915039062]]],[[[86.49279975891113,-66.77473258972168],[86.30169868469238,-66.71113586425781],[86.73201179504395,-66.71223258972168],[86.49279975891113,-66.77473258972168]]],[[[-67.24417114257812,-66.74778747558594],[-67.54194641113281,-66.86973571777344],[-67.45973205566406,-66.69723510742188],[-67.24417114257812,-66.74778747558594]]],[[[-68.10028076171875,-67.39334106445312],[-68.56500244140625,-67.74806213378906],[-69.22889709472656,-67.54139709472656],[-67.58555603027344,-66.6138916015625],[-67.91084289550781,-66.84889221191406],[-67.67472839355469,-67.1591796875],[-68.10028076171875,-67.39334106445312]]],[[[99.29449653625488,-66.74861145019531],[99.21588325500488,-66.72306823730469],[99.52087593078613,-66.59002685546875],[99.29449653625488,-66.74861145019531]]],[[[163.10696601867676,-66.75613403320312],[162.9491901397705,-66.57223510742188],[163.11834907531738,-66.62306213378906],[163.10696601867676,-66.75613403320312]]],[[[85.33284187316895,-66.62861633300781],[85.1519947052002,-66.59028625488281],[85.2841968536377,-66.52029418945312],[85.33284187316895,-66.62861633300781]]],[[[98.77197456359863,-66.49197387695312],[98.60199165344238,-66.43333435058594],[98.86279487609863,-66.4544677734375],[98.77197456359863,-66.49197387695312]]],[[[97.22918891906738,-66.46640014648438],[97.08838081359863,-66.415283203125],[97.35310554504395,-66.42388916015625],[97.22918891906738,-66.46640014648438]]],[[[162.5680866241455,-66.43502807617188],[162.30029487609863,-66.18891906738281],[162.601411819458,-66.3505859375],[162.5680866241455,-66.43502807617188]]],[[[100.27307319641113,-66.19279479980469],[100.22973823547363,-66.14889526367188],[100.3516788482666,-66.14363098144531],[100.27307319641113,-66.19279479980469]]],[[[96.76751899719238,-66.25973510742188],[96.26001167297363,-66.18891906738281],[96.8477954864502,-66.12168884277344],[96.76751899719238,-66.25973510742188]]],[[[-66.73222351074219,-66.31056213378906],[-66.74305725097656,-66.11778259277344],[-66.5755615234375,-66.08805847167969],[-66.73222351074219,-66.31056213378906]]],[[[100.55475044250488,-66.14723205566406],[100.61865425109863,-66.04695129394531],[100.75641059875488,-66.07919311523438],[100.55475044250488,-66.14723205566406]]],[[[100.82141304016113,-66.02694702148438],[100.77282905578613,-66.01333618164062],[100.81726264953613,-65.99752807617188],[100.82141304016113,-66.02694702148438]]],[[[100.92755317687988,-66.00556945800781],[100.84362983703613,-65.98307800292969],[100.95892524719238,-65.96833801269531],[100.92755317687988,-66.00556945800781]]],[[[100.77057075500488,-65.86138916015625],[100.70807075500488,-65.83279418945312],[100.99810981750488,-65.80891418457031],[100.77057075500488,-65.86138916015625]]],[[[92.69893074035645,-65.79835510253906],[92.26892280578613,-65.76417541503906],[92.49505805969238,-65.6722412109375],[92.69893074035645,-65.79835510253906]]],[[[-65.66694641113281,-65.68722534179688],[-66.16111755371094,-65.86889457702637],[-65.9183349609375,-65.52972412109375],[-65.66694641113281,-65.68722534179688]]],[[[100.7549991607666,-65.67861938476562],[100.24695014953613,-65.5836181640625],[101.25665473937988,-65.50376892089844],[100.7549991607666,-65.67861938476562]]],[[[103.24279975891113,-65.29583740234375],[103.4725284576416,-65.45001220703125],[102.77393531799316,-65.14028930664062],[103.24279975891113,-65.29583740234375]]],[[[-59.43611145019531,-65.25584411621094],[-59.81305694580078,-65.10722351074219],[-59.533058166503906,-65.10945129394531],[-59.43611145019531,-65.25584411621094]]],[[[-63.14417266845703,-64.78140258789062],[-63.32444763183594,-64.91195678710938],[-63.55500030517578,-64.89306640625],[-63.14417266845703,-64.78140258789062]]],[[[-57.27916717529297,-64.55250358581543],[-57.488616943359375,-64.49639892578125],[-56.855003356933594,-64.338623046875],[-57.27916717529297,-64.55250358581543]]],[[[-63.306671142578125,-64.42861938476562],[-62.760284423828125,-64.56028747558594],[-63.64000701904297,-64.83389282226562],[-64.22056579589844,-64.67333984375],[-63.089447021484375,-64.29667663574219],[-63.306671142578125,-64.42861938476562]]],[[[-56.81500244140625,-64.31695556640625],[-56.758338928222656,-64.23779296875],[-56.5755615234375,-64.2197265625],[-56.81500244140625,-64.31695556640625]]],[[[-62.30000305175781,-64.4344482421875],[-62.70472717285156,-64.46612358093262],[-62.480560302734375,-64.0433349609375],[-62.01167297363281,-64.21417236328125],[-62.30000305175781,-64.4344482421875]]],[[[-57.815834045410156,-63.961395263671875],[-57.03334045410156,-64.17250061035156],[-57.91278076171875,-64.44528198242188],[-58.23944854736328,-64.32501220703125],[-58.080833435058594,-64.08473205566406],[-58.428611755371094,-64.11334228515625],[-57.815834045410156,-63.961395263671875]]],[[[-57.570556640625,-63.78778076171875],[-57.045562744140625,-63.822784423828125],[-57.694725036621094,-63.81639099121094],[-57.570556640625,-63.78778076171875]]],[[[-60.73833465576172,-63.86833953857422],[-60.76416778564453,-63.660560607910156],[-60.531394958496094,-63.65167236328125],[-60.73833465576172,-63.86833953857422]]],[[[-55.97666931152344,-63.581390380859375],[-56.20555877685547,-63.452781677246094],[-55.70777893066406,-63.45250701904297],[-55.97666931152344,-63.581390380859375]]],[[[-62.15416717529297,-63.32417297363281],[-62.260284423828125,-63.25389099121094],[-61.94333457946777,-63.28166961669922],[-62.15416717529297,-63.32417297363281]]],[[[-56.94639587402344,-63.4505615234375],[-56.72138977050781,-63.5947265625],[-57.3800048828125,-63.46055603027344],[-58.60083770751953,-63.948890686035156],[-58.77864074707031,-64.53581237792969],[-59.49305725097656,-64.31611633300781],[-59.505279541015625,-64.5372314453125],[-59.91889190673828,-64.4122314453125],[-61.959449768066406,-65.18028259277344],[-62.08972930908203,-65.44029235839844],[-61.68305969238281,-65.53861999511719],[-62.45972442626953,-65.90472412109375],[-61.872779846191406,-66.17195129394531],[-60.55750274658203,-65.94528198242188],[-60.93695068359375,-66.260009765625],[-61.41667175292969,-66.12528991699219],[-61.713890075683594,-66.46917724609375],[-62.18139457702637,-66.18028259277344],[-62.885284423828125,-66.26278686523438],[-62.44361114501953,-66.43028259277344],[-62.60889434814453,-66.72834777832031],[-63.675559997558594,-66.21833801269531],[-64.19667053222656,-66.72029113769531],[-63.743614196777344,-66.89167785644531],[-64.83778381347656,-66.95140075683594],[-64.77056884765625,-67.31723022460938],[-65.6138916015625,-67.55917358398438],[-65.290283203125,-67.67333984375],[-65.61778259277344,-67.8800048828125],[-65.32917785644531,-67.9747314453125],[-65.72361755371094,-68.14805603027344],[-64.76834106445312,-68.12278747558594],[-65.5966796875,-68.34750366210938],[-65.0916748046875,-68.44195556640625],[-65.31333923339844,-68.71139526367188],[-63.85778045654297,-68.84278869628906],[-64.3900146484375,-68.51333618164062],[-62.72834014892578,-68.41000366210938],[-63.97416687011719,-68.53639221191406],[-63.21055603027344,-68.78695678710938],[-63.70667266845703,-68.74250793457031],[-63.36805725097656,-69.05000305175781],[-63.638893127441406,-69.22723388671875],[-62.47583770751953,-69.45306396484375],[-62.63500213623047,-69.85334777832031],[-61.940834045410156,-70.22917175292969],[-62.49083709716797,-70.38056945800781],[-61.48445129394531,-70.52027893066406],[-62.12889099121094,-70.86557006835938],[-61.380279541015625,-70.81529235839844],[-60.9425048828125,-71.15834045410156],[-61.929725646972656,-71.65640258789062],[-60.90416717529297,-71.73638916015625],[-62.55250358581543,-72.04750061035156],[-60.86583709716797,-72.00306701660156],[-61.07472229003906,-72.16361999511719],[-60.852500915527344,-72.38890075683594],[-61.54972839355469,-72.42279052734375],[-61.270835876464844,-72.70028686523438],[-60.616111755371094,-72.64334106445312],[-60.617225646972656,-73.02862358093262],[-59.774169921875,-72.90028381347656],[-59.849449157714844,-73.23306274414062],[-60.59972381591797,-73.36029052734375],[-61.91944885253906,-73.14306640625],[-61.43639373779297,-73.34361267089844],[-61.836669921875,-73.36639404296875],[-61.609169006347656,-73.54611206054688],[-60.58778381347656,-73.70611572265625],[-61.76250457763672,-73.91389465332031],[-61.03639221191406,-74.09834289550781],[-61.755279541015625,-74.30639457702637],[-61.88750457763672,-74.83222961425781],[-62.531394958496094,-74.98251342773438],[-63.24583435058594,-74.60417175292969],[-63.0513916015625,-74.89527893066406],[-63.98944854736328,-75.008056640625],[-63.09584045410156,-75.13084411621094],[-64.44778442382812,-75.29779052734375],[-63.0947265625,-75.3255615234375],[-63.429168701171875,-75.4505615234375],[-69.38528442382812,-76.29611206054688],[-70.47639465332031,-76.70777893066406],[-75.4444580078125,-76.54640197753906],[-76.38056945800781,-76.06500244140625],[-77.77166557312012,-75.91889953613281],[-78.47666931152344,-76.4072265625],[-75.63278198242188,-77.50862121582031],[-72.83973693847656,-77.6400146484375],[-74.85334777832031,-78.14111328125],[-81.4969482421875,-77.65779113769531],[-80.60556030273438,-77.88639831542969],[-81.47000122070312,-77.89723205566406],[-77.48750305175781,-78.52667236328125],[-78.95750427246094,-78.81333923339844],[-84.1077880859375,-78.36083984375],[-80.63555908203125,-79.61917114257812],[-80.20278930664062,-79.22889709472656],[-77.02944946289062,-79.27944946289062],[-76.0836181640625,-79.64584350585938],[-77.32194519042969,-80.01139831542969],[-79.84945678710938,-79.95445251464844],[-76.08944702148438,-80.19723510742188],[-74.69389343261719,-80.69723510742188],[-59.64805603027344,-82.43389892578125],[-58.783058166503906,-82.64500427246094],[-59.07972717285156,-82.96583557128906],[-58.210838317871094,-83.03334045410156],[-53.72583770751953,-82.15028381347656],[-43.084449768066406,-81.85139465332031],[-41.4888916015625,-81.38334655761719],[-28.319446563720703,-80.27694702148438],[-28.0625,-80.00473022460938],[-30.210556030273438,-79.66667175292969],[-27.085556030273438,-79.01333618164062],[-33.00111389160156,-79.45390319824219],[-36.30278015136719,-78.7791748046875],[-33.88611602783203,-77.66056823730469],[-28.305278778076172,-76.56529235839844],[-17.758056640625,-75.729736328125],[-18.256389617919922,-75.49583435058594],[-17.14722442626953,-74.78472900390625],[-13.704723358154297,-73.94195556640625],[-16.326114654541016,-74.06390380859375],[-16.919170379638672,-73.97611999511719],[-16.069168090820312,-73.74751281738281],[-16.89889144897461,-73.77305603027344],[-16.02361297607422,-73.32028198242188],[-13.731111526489258,-73.02084350585938],[-14.469167709350586,-72.79667663574219],[-13.406112670898438,-72.82305908203125],[-11.657777786254883,-72.32695007324219],[-11.325834274291992,-71.96501159667969],[-12.276945114135742,-71.37750244140625],[-11.556507110595703,-71.27882385253906],[-11.592779159545898,-71.56195068359375],[-11.019445419311523,-71.6572265625],[-10.048612594604492,-71.11138916015625],[-10.430000305175781,-70.98695373535156],[-9.878713607788086,-70.90097045898438],[-8.93083381652832,-71.23361206054688],[-8.366945266723633,-71.82583618164062],[-7.337778091430664,-71.69195556640625],[-7.723333358764648,-71.42916870117188],[-6.021110534667969,-70.69972229003906],[-5.441110610961914,-70.88250732421875],[-6.103889465332031,-71.14445495605469],[-6.009166717529297,-71.41889953613281],[-2.261667251586914,-71.17083740234375],[-2.093889236450195,-71.48611450195312],[-1.053333282470703,-71.27667236328125],[-0.7772216796875,-71.38917541503906],[-0.923055648803711,-71.58917236328125],[-0.29749870300293,-71.65888977050781],[2.803159713745117,-70.84695434570312],[6.699522018432617,-70.58639526367188],[7.557310104370117,-70.16835021972656],[8.480646133422852,-70.47724914550781],[9.090387344360352,-70.31834411621094],[8.682855606079102,-70.074462890625],[11.270624160766602,-70.71028137207031],[12.046747207641602,-70.71751403808594],[12.740350723266602,-70.2811279296875],[14.165643692016602,-70.15890502929688],[15.705926895141602,-70.27862358093262],[18.036489486694336,-69.96917724609375],[23.246755599975586,-70.54641723632812],[31.08342170715332,-69.77389526367188],[32.90232276916504,-69.27694702148438],[33.44504737854004,-68.95724487304688],[33.42423439025879,-68.65141296386719],[34.14035987854004,-68.4827880859375],[36.41452980041504,-69.314453125],[36.12644386291504,-69.53361511230469],[36.72257423400879,-69.72807312011719],[37.91617774963379,-69.25141906738281],[37.85093116760254,-69.53390502929688],[37.14505958557129,-69.66474914550781],[38.23923683166504,-69.9927978515625],[38.56449317932129,-69.50057983398438],[38.65036964416504,-69.98863220214844],[39.70176124572754,-69.64863586425781],[39.76035499572754,-68.9544677734375],[41.10312843322754,-68.52389526367188],[46.30893135070801,-67.64169311523438],[46.24643135070801,-67.35751342773438],[46.55143165588379,-67.27725219726562],[47.44895362854004,-67.41780090332031],[47.00950050354004,-67.55030822753906],[47.39560890197754,-67.72251892089844],[48.21701240539551,-67.63444519042969],[49.16726875305176,-67.38336181640625],[48.26285743713379,-67.16752624511719],[49.16397285461426,-66.86280822753906],[49.15170478820801,-67.088623046875],[50.68948554992676,-67.18139457702637],[50.16977119445801,-66.74305725097656],[50.41311836242676,-66.44197082519531],[53.77896308898926,-65.84002685546875],[55.61923408508301,-66.0069580078125],[57.31197547912598,-66.56333923339844],[56.72952461242676,-66.901123046875],[59.11062049865723,-67.4122314453125],[69.6447925567627,-67.75390625],[70.10200691223145,-68.52389526367188],[69.2920093536377,-69.102783203125],[69.74312019348145,-69.36308288574219],[68.87117195129395,-69.37947082519531],[69.34004402160645,-69.63862609863281],[69.2053394317627,-69.86390686035156],[68.0947437286377,-69.87947082519531],[67.6461353302002,-70.38639831542969],[68.59395027160645,-70.77058410644531],[68.85029792785645,-70.53224182128906],[68.66169929504395,-70.3677978515625],[69.1447925567627,-70.33139038085938],[69.2439136505127,-70.67057800292969],[67.60530281066895,-71.58308410644531],[67.9011402130127,-71.64447021484375],[67.33755683898926,-72.06333923339844],[68.9364185333252,-72.42500305175781],[70.86494636535645,-71.93014526367188],[71.44978523254395,-71.54611206054688],[71.24812507629395,-71.38945007324219],[71.50447273254395,-70.95390319824219],[72.86311531066895,-70.43278503417969],[72.6156177520752,-70.20361328125],[72.9011402130127,-70.02195739746094],[77.74727058410645,-69.11697387695312],[78.11641120910645,-68.45973205566406],[82.0572681427002,-67.6722412109375],[81.4697437286377,-67.50529479980469],[82.01448249816895,-67.25167846679688],[82.66504096984863,-67.39389038085938],[83.40339851379395,-67.15667724609375],[85.79168891906738,-67.17778015136719],[87.50251960754395,-66.89474487304688],[88.10949897766113,-66.65252685546875],[88.22723579406738,-66.03639221191406],[88.96722602844238,-66.76139831542969],[92.00531196594238,-66.53390502929688],[97.56445503234863,-66.74057006835938],[98.26196479797363,-66.51611328125],[99.28308296203613,-66.88084411621094],[100.95392036437988,-66.08084106445312],[102.62616157531738,-65.901123046875],[107.80478096008301,-66.39836120605469],[108.82422065734863,-66.83113098144531],[110.62976264953613,-66.48667907714844],[110.89172554016113,-66.06362915039062],[113.31534004211426,-65.71334838867188],[114.43142890930176,-66.17947387695312],[114.51835823059082,-66.4727783203125],[116.18004035949707,-66.36668395996094],[117.76700019836426,-66.98974609375],[122.18335914611816,-66.54780578613281],[125.19001960754395,-66.73419189453125],[126.35616493225098,-66.27972412109375],[126.98835945129395,-66.45358276367188],[126.92865180969238,-66.83445739746094],[128.83477973937988,-67.14251708984375],[130.35199165344238,-66.22584533691406],[134.24530220031738,-66.20112609863281],[134.43640327453613,-66.00141906738281],[134.10061836242676,-65.12306213378906],[134.437837600708,-64.92613220214844],[135.27224922180176,-65.4364013671875],[134.94778633117676,-66.09306335449219],[142.56640815734863,-66.99417114257812],[143.40002632141113,-66.85113525390625],[144.58557319641113,-67.24528503417969],[145.40445137023926,-67.01722717285156],[145.87530708312988,-67.19586181640625],[145.31500434875488,-67.61334228515625],[146.6427936553955,-67.70945739746094],[147.1508502960205,-67.99085998535156],[146.9533405303955,-68.14169311523438],[148.02945137023926,-67.84446716308594],[148.64807319641113,-67.98919677734375],[148.21722602844238,-68.12724304199219],[148.81335639953613,-68.33528137207031],[150.992525100708,-68.39085388183594],[151.1850299835205,-68.98002624511719],[153.76861763000488,-68.9222412109375],[153.77835273742676,-68.3436279296875],[154.68585395812988,-68.61500358581543],[154.28668403625488,-68.86308288574219],[154.85669136047363,-69.10252380371094],[156.33612251281738,-69.24057006835938],[157.23639106750488,-68.94252014160156],[160.96890449523926,-70.25556945800781],[162.75390815734863,-70.28030395507812],[163.520845413208,-70.67500305175781],[163.78528022766113,-70.62806701660156],[163.55389595031738,-70.46528625488281],[166.77166938781738,-70.61167907714844],[166.46304512023926,-70.70195007324219],[167.76751899719238,-70.78083801269531],[170.27224922180176,-71.66001892089844],[170.21527290344238,-71.28279113769531],[170.45303535461426,-71.35166931152344],[170.99444770812988,-71.86419677734375],[170.129976272583,-72.05140686035156],[169.87164497375488,-72.37919616699219],[170.3041706085205,-72.30084228515625],[170.3222370147705,-72.58030700683594],[169.26642036437988,-73.08390808105469],[169.07916450500488,-73.52752685546875],[167.56167793273926,-73.40335083007812],[165.54858589172363,-73.93251037597656],[166.12915229797363,-74.12724304199219],[164.780855178833,-74.136962890625],[165.33331489562988,-74.67280578613281],[164.14251899719238,-74.61611938476562],[163.65667915344238,-74.77445983886719],[163.871675491333,-74.95335388183594],[162.53973579406738,-75.10891723632812],[163.13696479797363,-75.93667602539062],[162.33780097961426,-76.167236328125],[162.875581741333,-76.24778747558594],[162.93225288391113,-76.58308410644531],[162.623628616333,-76.61946105957031],[163.06973457336426,-76.73085021972656],[162.33279609680176,-76.951416015625],[163.23834419250488,-77.04139709472656],[163.89697456359863,-77.46669006347656],[163.61084175109863,-77.69612121582031],[164.56500434875488,-77.73638916015625],[164.20669746398926,-78.14389038085938],[165.5400104522705,-78.00335693359375],[165.68359565734863,-78.39169311523438],[167.26944160461426,-78.65583801269531],[164.49444770812988,-78.56974792480469],[160.49417304992676,-79.02085876464844],[160.04055976867676,-79.15583801269531],[160.73806953430176,-79.45307922363281],[159.09280586242676,-79.97111511230469],[160.52444648742676,-80.04139709472656],[158.05725288391113,-80.28056335449219],[160.89196968078613,-80.37750244140625],[159.75695991516113,-80.56974792480469],[161.17447090148926,-80.63555908203125],[160.01556587219238,-80.78030395507812],[160.84390449523926,-80.89306640625],[160.50308418273926,-80.95278930664062],[160.839448928833,-81.07807922363281],[160.62613105773926,-81.20501708984375],[162.19391059875488,-81.29780578613281],[160.39111518859863,-81.52140808105469],[162.2758502960205,-81.6622314453125],[163.859468460083,-82.17417907714844],[163.446138381958,-82.26502990722656],[168.692476272583,-83.14640808105469],[167.46972846984863,-83.43917846679688],[169.250825881958,-83.33001708984375],[172.31860542297363,-83.59722900390625],[171.90503120422363,-83.80169677734375],[180.00000190734863,-84.30224609375],[180.00000190734863,-90],[-180,-90],[-180,-84.30534362792969],[-157.48333740234375,-85.44862365722656],[-150.23947143554688,-85.463623046875],[-148.13833618164062,-85.09083557128906],[-139.66140747070312,-85.24501037597656],[-138.58944702148438,-84.98472595214844],[-149.29473876953125,-84.56195068359375],[-153.05307006835938,-84.01278686523438],[-153.00750732421875,-83.08750915527344],[-151.794189453125,-82.57778930664062],[-154.89141845703125,-81.90501403808594],[-153.98919677734375,-81.62918090820312],[-154.20501708984375,-81.55223083496094],[-156.96002197265625,-81.25167846679688],[-154.92169189453125,-81.001953125],[-148.41336059570312,-81.35751342773438],[-145.524169921875,-80.46055603027344],[-146.81195068359375,-79.88751220703125],[-155.90640258789062,-78.7197265625],[-153.75030517578125,-78.30833435058594],[-157.9102783203125,-78.001953125],[-158.17584228515625,-77.85972595214844],[-157.69696044921875,-77.57139587402344],[-157.75308227539062,-77.10806274414062],[-156.48333740234375,-77.35861206054688],[-155.86138916015625,-77.08445739746094],[-153.790283203125,-77.17472839355469],[-153.0836181640625,-77.28666687011719],[-153.10641479492188,-77.49722290039062],[-152.06112670898438,-77.32528686523438],[-149.6622314453125,-77.76112365722656],[-149.08724975585938,-77.69612121582031],[-149.4141845703125,-77.57084655761719],[-148.7327880859375,-77.62556457519531],[-148.5855712890625,-77.59445190429688],[-148.58111572265625,-77.50445556640625],[-147.59140014648438,-77.42222595214844],[-147.49307250976562,-77.29695129394531],[-147.07168579101562,-77.37278747558594],[-147.0322265625,-77.22084045410156],[-146.26861572265625,-77.46640014648438],[-145.87890625,-77.30639457702637],[-146.22750854492188,-77.16500854492188],[-145.84280395507812,-77.11418151855469],[-146.3013916015625,-76.99917602539062],[-145.29888916015625,-77.0291748046875],[-146.10223388671875,-76.84001159667969],[-145.45639038085938,-76.76028442382812],[-146.9322509765625,-76.45195007324219],[-149.50613403320312,-76.38751220703125],[-148.10128784179688,-76.09565734863281],[-146.49166870117188,-76.36750793457031],[-145.47946166992188,-76.44334411621094],[-146.2952880859375,-76.03973388671875],[-134.30389404296875,-74.53279113769531],[-133.26251220703125,-74.84722900390625],[-121.47834777832031,-74.74250793457031],[-118.53167724609375,-74.61361694335938],[-117.74305725097656,-74.30862426757812],[-117.39695739746094,-74.53083801269531],[-114.6977767944336,-74.46917724609375],[-114.81001281738281,-74.104736328125],[-114.00361633300781,-73.88917541503906],[-113.1864013671875,-74.16889953613281],[-113.4336166381836,-74.47222900390625],[-112.93028259277344,-74.45500183105469],[-113.55555725097656,-74.63444519042969],[-112.65416717529297,-74.85861206054688],[-111.34306335449219,-74.75944519042969],[-111.72445678710938,-74.58723258972168],[-111.38583374023438,-74.46223258972168],[-111.50389099121094,-74.19168090820312],[-110.15471458435059,-74.2841796875],[-109.92888641357422,-74.76139831542969],[-110.961669921875,-75.15779113769531],[-110.383056640625,-75.30612182617188],[-99.51028442382812,-75.09251403808594],[-100.85166931152344,-74.81472778320312],[-100.151123046875,-74.76083374023438],[-100.51555633544922,-74.67111206054688],[-100.24806213378906,-74.4908447265625],[-101.33194732666016,-74.48056030273438],[-101.65834045410156,-73.9989013671875],[-102.90139770507812,-73.87583923339844],[-103.01334381103516,-73.62918090820312],[-99.17556762695312,-73.61917114257812],[-103.03611755371094,-73.32640075683594],[-103.60334777832031,-72.89195251464844],[-103.17611694335938,-72.73333740234375],[-102.09916687011719,-73.08473205566406],[-90.86111450195312,-73.32667541503906],[-89.32112121582031,-73.05416870117188],[-89.5372314453125,-72.63362121582031],[-89.26112365722656,-72.63945007324219],[-88.33584594726562,-72.81611633300781],[-88.70916557312012,-73.17945861816406],[-86.84083557128906,-73.33639526367188],[-85.9666748046875,-73.04139709472656],[-85.47084045410156,-73.3497314453125],[-85.5997314453125,-73.55833435058594],[-82.13417053222656,-73.94334411621094],[-81.04139709472656,-73.71556091308594],[-81.27528381347656,-73.36944580078125],[-80.51918029785156,-73.44639587402344],[-80.695556640625,-73.05056762695312],[-78.95889282226562,-73.39250183105469],[-78.78973388671875,-73.69306945800781],[-76.61834716796875,-73.57667541503906],[-76.96278381347656,-73.87306213378906],[-69.4283447265625,-73.19723510742188],[-66.79722595214844,-72.40779113769531],[-66.85917663574219,-71.89556884765625],[-67.5372314453125,-71.45472717285156],[-67.40028381347656,-71.04000854492188],[-67.70390319824219,-70.59306335449219],[-68.83805847167969,-69.417236328125],[-66.65779113769531,-69.01779174804688],[-67.49444580078125,-68.81556701660156],[-66.93223571777344,-68.77389526367188],[-67.16555786132812,-68.2933349609375],[-66.58973693847656,-68.23806762695312],[-67.1572265625,-68.01055908203125],[-66.42723083496094,-67.53334045410156],[-67.6239013671875,-67.55361938476562],[-67.48583984375,-67.07722473144531],[-66.40472412109375,-66.88555908203125],[-66.49722290039062,-66.62251281738281],[-65.68972778320312,-66.125],[-64.45333862304688,-65.98167419433594],[-64.65972900390625,-65.74028015136719],[-63.71278381347656,-65.50250244140625],[-64.05307006835938,-65.42195129394531],[-63.87944793701172,-65.01834106445312],[-63.09056091308594,-65.13389587402344],[-62.93805694580078,-64.79750061035156],[-62.31945037841797,-64.85890197753906],[-62.61778259277344,-64.7550048828125],[-62.45361328125,-64.58917236328125],[-61.935279846191406,-64.69056701660156],[-60.94194793701172,-64.27751159667969],[-60.991668701171875,-64.03584289550781],[-59.445838928222656,-63.89305877685547],[-58.91083526611328,-63.533058166503906],[-57.20500183105469,-63.20555877685547],[-56.94639587402344,-63.4505615234375]]],[[[-55.470001220703125,-63.143333435058594],[-55.002784729003906,-63.28388977050781],[-56.5433349609375,-63.36444854736328],[-55.470001220703125,-63.143333435058594]]],[[[-56.26500701904297,-63.16944885253906],[-56.58472442626953,-63.035003662109375],[-55.97084045410156,-63.05445098876953],[-56.26500701904297,-63.16944885253906]]],[[[-60.471839904785156,-62.90089797973633],[-60.58000183105469,-63.008056640625],[-60.74248123168945,-62.97399139404297],[-60.471839904785156,-62.90089797973633]]],[[[-62.69139099121094,-63.095001220703125],[-62.48944854736328,-62.921112060546875],[-62.26055908203125,-62.88166809082031],[-62.69139099121094,-63.095001220703125]]],[[[-61.358612060546875,-62.81361389160156],[-61.47917175292969,-62.75389099121094],[-61.15055847167969,-62.7086181640625],[-61.358612060546875,-62.81361389160156]]],[[[-60.51667022705078,-62.55389404296875],[-59.81694793701172,-62.614173889160156],[-61.17250061035156,-62.57500457763672],[-60.51667022705078,-62.55389404296875]]],[[[-59.665557861328125,-62.55694580078125],[-59.97917175292969,-62.450836181640625],[-59.54222869873047,-62.49861145019531],[-59.665557861328125,-62.55694580078125]]],[[[-59.439170837402344,-62.44722557067871],[-59.67833709716797,-62.3638916015625],[-59.32750701904297,-62.37139129638672],[-59.439170837402344,-62.44722557067871]]],[[[-58.99250030517578,-62.3477783203125],[-59.208892822265625,-62.285560607910156],[-58.81639099121094,-62.298057556152344],[-58.99250030517578,-62.3477783203125]]],[[[-57.6219482421875,-61.90972900390625],[-58.98638916015625,-62.214447021484375],[-58.40028381347656,-61.93861389160156],[-57.6219482421875,-61.90972900390625]]],[[[-55.09222412109375,-61.098060607910156],[-54.646392822265625,-61.09278106689453],[-55.49444580078125,-61.126670837402344],[-55.09222412109375,-61.098060607910156]]],[[[-54.04695129394531,-61.269447326660156],[-54.2005615234375,-61.236114501953125],[-54.0322265625,-61.08805847167969],[-54.04695129394531,-61.269447326660156]]],[[[-44.428062438964844,-60.72333526611328],[-44.78472900390625,-60.73445129394531],[-44.531394958496094,-60.675559997558594],[-44.428062438964844,-60.72333526611328]]],[[[-45.005279541015625,-60.72528076171875],[-45.07111358642578,-60.63111114501953],[-45.025840759277344,-60.641944885253906],[-45.005279541015625,-60.72528076171875]]],[[[-45.55083465576172,-60.54722595214844],[-45.14527893066406,-60.76611328125],[-46.02361297607422,-60.61083984375],[-45.55083465576172,-60.54722595214844]]]]}},{"type":"Feature","properties":{"name":"Bouvet Island","iso2":"BV","iso3":"BVT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[3.361389,-54.462784],[3.366944,-54.399727],[3.483611,-54.402229],[3.361389,-54.462784]]]]}},{"type":"Feature","properties":{"name":"French Southern and Antarctic Lands","iso2":"TF","iso3":"ATF"},"geometry":{"type":"MultiPolygon","coordinates":[[[[69.81277656555176,-49.678062438964844],[69.76193428039551,-49.65888977050781],[69.79500007629395,-49.64722442626953],[69.81277656555176,-49.678062438964844]]],[[[68.78915596008301,-49.361671447753906],[68.64444160461426,-49.34361267089844],[68.80166816711426,-49.328338623046875],[68.78915596008301,-49.361671447753906]]],[[[69.60666084289551,-49.20777893066406],[69.53305244445801,-49.19667053222656],[69.67833137512207,-49.15306091308594],[69.60666084289551,-49.20777893066406]]],[[[69.26471138000488,-49.09111785888672],[69.21638679504395,-48.96722412109375],[69.36888313293457,-48.886390686035156],[69.26471138000488,-49.09111785888672]]],[[[69.15222358703613,-48.988059997558594],[69.22221565246582,-48.856117248535156],[69.24249458312988,-48.89250183105469],[69.15222358703613,-48.988059997558594]]],[[[69.4911060333252,-48.882781982421875],[69.40193367004395,-48.834449768066406],[69.51721382141113,-48.86028289794922],[69.4911060333252,-48.882781982421875]]],[[[69.00110054016113,-48.79750061035156],[69.06305122375488,-49.119728088378906],[69.10388374328613,-48.99583435058594],[69.21721076965332,-49.12555694580078],[69.62193489074707,-48.978057861328125],[69.2824878692627,-49.18639373779297],[69.58276557922363,-49.30445098876953],[70.32388496398926,-49.05083465576172],[70.5666675567627,-49.24500274658203],[69.77472114562988,-49.39417266845703],[70.25360298156738,-49.69111633300781],[69.6433277130127,-49.50139617919922],[68.79777717590332,-49.721946716308594],[69.00110054016113,-48.79750061035156]],[[69.9044361114502,-49.47722625732422],[69.82527351379395,-49.42583465576172],[69.84305000305176,-49.459449768066406],[69.9044361114502,-49.47722625732422]],[[70.01193428039551,-49.57194519042969],[69.92109870910645,-49.5130615234375],[69.83554267883301,-49.508056640625],[70.01193428039551,-49.57194519042969]]],[[[68.6755542755127,-48.643890380859375],[68.60611152648926,-48.63972473144531],[68.66861152648926,-48.62805938720703],[68.6755542755127,-48.643890380859375]]],[[[68.79777717590332,-48.61500358581543],[68.78721809387207,-48.57722473144531],[68.82470893859863,-48.570556640625],[68.79777717590332,-48.61500358581543]]],[[[52.25444221496582,-46.45750427246094],[52.088335037231445,-46.41111755371094],[52.257219314575195,-46.37805938720703],[52.25444221496582,-46.45750427246094]]],[[[51.81944465637207,-46.45361328125],[51.65194129943848,-46.374168395996094],[51.78000068664551,-46.34111785888672],[51.81944465637207,-46.45361328125]]],[[[50.27221870422363,-46.13139343261719],[50.17694282531738,-46.0625],[50.27388954162598,-46.05083465576172],[50.27221870422363,-46.13139343261719]]],[[[77.5294361114502,-38.73778533935547],[77.49971199035645,-38.731117248535156],[77.50610542297363,-38.703895568847656],[77.5294361114502,-38.73778533935547]]],[[[77.55415534973145,-37.90277862548828],[77.48388862609863,-37.83528137207031],[77.55444526672363,-37.82250213623047],[77.55415534973145,-37.90277862548828]]],[[[42.75777626037598,-17.075000762939453],[42.72110939025879,-17.055557250976562],[42.75694465637207,-17.059722900390625],[42.75777626037598,-17.075000762939453]]]]}},{"type":"Feature","properties":{"name":"Heard Island and McDonald Islands","iso2":"HM","iso3":"HMD"},"geometry":{"type":"MultiPolygon","coordinates":[[[[73.77388,-53.125031],[73.474442,-53.194168],[73.234436,-52.987785],[73.77388,-53.125031]]]]}},{"type":"Feature","properties":{"name":"British Indian Ocean Territory","iso2":"IO","iso3":"IOT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[72.48719800000012,-7.381944],[72.35914600000015,-7.265278],[72.4488680000002,-7.234445],[72.48719800000012,-7.381944]]],[[[71.3483279999999,-6.658889],[71.343323,-6.656667],[71.36526500000011,-6.651667],[71.3483279999999,-6.658889]]],[[[71.266388,-6.391945],[71.25860600000013,-6.382222],[71.266098,-6.366666],[71.266388,-6.391945]]],[[[71.347763,-6.206944],[71.338593,-6.195833],[71.360809,-6.174167],[71.347763,-6.206944]]],[[[71.7824860000002,-5.440277],[71.759995,-5.431389],[71.766388,-5.429722],[71.7824860000002,-5.440277]]],[[[72.216385,-5.362222],[72.207764,-5.354445],[72.20860300000012,-5.348056],[72.216385,-5.362222]]],[[[72.23248300000014,-5.319722],[72.2211,-5.335556],[72.228043,-5.315833],[72.23248300000014,-5.319722]]],[[[71.74220300000016,-5.291111],[71.74054,-5.271111],[71.748596,-5.265556],[71.74220300000016,-5.291111]]],[[[71.86943100000016,-5.257778],[71.87025500000013,-5.249722],[71.882202,-5.256111],[71.86943100000016,-5.257778]]]]}},{"type":"Feature","properties":{"name":"Christmas Island","iso2":"CX","iso3":"CXR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[105.701401,-10.51097],[105.628998,-10.43731],[105.736603,-10.38408],[105.701401,-10.51097]]]]}},{"type":"Feature","properties":{"name":"United States Minor Outlying Islands","iso2":"UM","iso3":"UMI"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-160.021149,-0.398056],[-160.048615,-0.383611],[-160.017792,-0.374722],[-160.021149,-0.398056]]],[[[-176.456146,0.215833],[-176.468323,0.222222],[-176.453918,0.226111],[-176.456146,0.215833]]],[[[-176.632202,0.793055],[-176.64447,0.795555],[-176.643097,0.812778],[-176.632202,0.793055]]],[[[-169.522522,16.728882],[-169.543884,16.726379000000108],[-169.531708,16.732491],[-169.522522,16.728882]]],[[[166.646362,19.279442000000145],[166.607452,19.304996],[166.627594,19.324577],[166.646362,19.279442000000145]]],[[[-177.334442,28.194157],[-177.321686,28.213608],[-177.317505,28.200829000000155],[-177.334442,28.194157]]],[[[-177.388062,28.18637800000012],[-177.389771,28.212769],[-177.358032,28.219162],[-177.388062,28.18637800000012]]]]}},{"type":"Feature","properties":{"name":"Vanuatu","iso2":"VU","iso3":"VUT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[169.846069,-20.252224],[169.745514,-20.149445],[169.886658,-20.170555],[169.846069,-20.252224]]],[[[170.217468,-19.559444],[170.205231,-19.525002],[170.2324520000001,-19.52417],[170.217468,-19.559444]]],[[[169.498291,-19.545002],[169.349701,-19.636944],[169.232452,-19.350277],[169.498291,-19.545002]]],[[[169.594971,-19.273613],[169.578583,-19.262501],[169.594971,-19.231388],[169.594971,-19.273613]]],[[[169.30523700000018,-18.978886],[168.989136,-18.880833],[169.018585,-18.639999],[169.30523700000018,-18.978886]]],[[[168.574677,-17.692776],[168.148041,-17.719719],[168.3110960000001,-17.531391],[168.574677,-17.692776]]],[[[168.399139,-16.78278],[168.168579,-16.805279],[168.14831500000017,-16.580555],[168.399139,-16.78278]]],[[[168.231079,-16.516113],[168.20135500000012,-16.500557],[168.242462,-16.429165],[168.231079,-16.516113]]],[[[168.21524000000014,-16.174168],[168.304138,-16.339443],[167.9177550000002,-16.260281],[168.21524000000014,-16.174168]]],[[[167.41665600000013,-16.110001],[167.7724910000002,-16.535],[167.41748,-16.532223],[167.177765,-15.899168],[167.41665600000013,-16.110001]]],[[[167.209137,-15.755556],[167.077454,-15.640278],[167.227173,-15.637779],[167.209137,-15.755556]]],[[[167.258606,-15.588055],[167.239136,-15.574444],[167.2769170000001,-15.546112],[167.258606,-15.588055]]],[[[167.202454,-15.60861],[167.110229,-15.59],[167.16275,-15.535833],[167.190521,-15.529167],[167.21051000000014,-15.580278],[167.202454,-15.60861]]],[[[168.21078500000013,-15.998055],[168.15332,-15.492222],[168.266663,-15.870832],[168.21078500000013,-15.998055]]],[[[167.85580400000012,-15.485832],[167.66830400000012,-15.446945],[168.0021970000001,-15.290001],[167.85580400000012,-15.485832]]],[[[167.17526200000012,-15.266666],[167.163605,-15.254168],[167.179413,-15.256668],[167.17526200000012,-15.266666]]],[[[167.14444000000012,-14.971388],[167.096344,-14.932501],[167.1510930000002,-14.957777],[167.14444000000012,-14.971388]]],[[[168.169128,-15.395834],[168.10580400000018,-14.92],[168.190247,-15.214722],[168.169128,-15.395834]]],[[[166.802765,-15.157501],[167.058868,-14.945],[167.237717,-15.524258],[167.151154,-15.520343],[167.071625,-15.598055],[166.90277100000017,-15.582777],[166.8146970000001,-15.663055],[166.761932,-15.642778],[166.59274300000018,-14.624443],[166.802765,-15.157501]]],[[[167.527466,-14.326666],[167.413605,-14.178888],[167.58828700000012,-14.172777],[167.527466,-14.326666]]],[[[167.479126,-13.948334],[167.4766240000001,-13.706667],[167.577759,-13.847221],[167.479126,-13.948334]]],[[[167.70553600000014,-13.675001],[167.62356600000012,-13.691944],[167.687744,-13.621666],[167.70553600000014,-13.675001]]],[[[167.34719800000013,-13.56139],[167.29330400000018,-13.52639],[167.322205,-13.486944],[167.34719800000013,-13.56139]]],[[[166.67746,-13.452499],[166.6508180000001,-13.409723],[166.694122,-13.415834],[166.67746,-13.452499]]],[[[166.631622,-13.381388],[166.5960690000002,-13.334166],[166.6413570000001,-13.356943],[166.631622,-13.381388]]],[[[166.620239,-13.271389],[166.587463,-13.223055],[166.638306,-13.221666],[166.620239,-13.271389]]],[[[166.55969200000013,-13.186388],[166.521362,-13.070555],[166.564972,-13.091944],[166.55969200000013,-13.186388]]]]}},{"type":"Feature","properties":{"name":"Nigeria","iso2":"NG","iso3":"NGA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[7.466389,4.445277],[7.335833,4.443055],[7.411944,4.488055],[7.466389,4.445277]]],[[[7.20361,4.380555000000129],[7.22611,4.52],[7.316667,4.4725],[7.20361,4.380555000000129]]],[[[5.874722,13.749443],[6.423055,13.605276000000131],[6.933332,12.997221000000124],[7.815,13.352777],[9.634932,12.802435],[10.724165,13.386389],[12.459166,13.066111],[13.62512,13.718338],[14.07472,13.0816650000001],[14.174444,12.396666],[14.645277,12.188332000000145],[14.646387,11.575832],[13.80722,11.055832],[12.79694400000011,8.769722],[12.253887000000134,8.408054],[11.864166,7.084722],[11.340277,6.440833],[10.615000000000123,7.06861],[9.795555,6.801666],[8.865276,5.841944],[8.591738000000134,4.810932000000122],[7.676944,4.496388],[7.071666,4.753888],[7.073055,4.434722],[6.962222000000111,4.725277000000119],[7.005555,4.369444],[6.768055,4.774722],[6.848611000000119,4.348332000000113],[6.727221,4.605],[6.694166000000109,4.33],[6.104166,4.272778000000102],[5.451944,4.923055],[5.345277,5.33],[5.639722,5.536111],[5.257222000000183,5.43555500000015],[5.501111,5.620555],[5.175278000000105,5.575555],[4.525833,6.304999],[3.388611,6.443333000000109],[3.807222000000166,6.612778],[2.719606,6.365505],[2.789444,9.043888],[3.095,9.090555],[3.855,10.584999],[3.604459,11.693274],[4.1425,13.476944],[5.874722,13.749443]]]]}},{"type":"Feature","properties":{"name":"Netherlands","iso2":"NL","iso3":"NLD"},"geometry":{"type":"MultiPolygon","coordinates":[[[[3.764165878295898,51.34527778625488],[3.370866775512695,51.373857498168945],[4.238897323608398,51.35042762756348],[3.764165878295898,51.34527778625488]]],[[[5.763887405395508,52.4152774810791],[5.573057174682617,52.368051528930664],[5.53416633605957,52.283334732055664],[5.428613662719727,52.26416206359863],[5.135557174682617,52.38027381896973],[5.643613815307617,52.60110664367676],[5.855558395385742,52.54416847229004],[5.855558395385742,52.49249458312988],[5.763887405395508,52.4152774810791]]],[[[5.423334121704102,52.63638496398926],[5.051794052124023,52.39411735534668],[5.039495468139648,52.63365364074707],[5.423334121704102,52.63638496398926]]],[[[4.76472282409668,52.99027442932129],[4.713888168334961,53.056108474731445],[4.883333206176758,53.18416786193848],[4.76472282409668,52.99027442932129]]],[[[4.957223892211914,53.23777961730957],[4.879999160766602,53.21444129943848],[5.106389999389648,53.30333137512207],[4.957223892211914,53.23777961730957]]],[[[6.871667861938477,53.41610908508301],[7.208364486694336,53.242807388305664],[7.051668167114258,52.64361000061035],[6.68889045715332,52.54916572570801],[7.065557479858398,52.38582801818848],[6.828889846801758,51.96555519104004],[5.962499618530273,51.80777931213379],[6.222223281860352,51.465829849243164],[5.864721298217773,51.04610633850098],[6.011800765991211,50.757272720336914],[5.640832901000977,50.83972358703613],[5.849172592163086,51.156381607055664],[5.041391372680664,51.48666572570801],[4.252370834350586,51.37514686584473],[3.440832138061523,51.53582954406738],[4.286111831665039,51.44861030578613],[3.687501907348633,51.70971870422363],[4.167753219604492,51.68557167053223],[3.865556716918945,51.81499671936035],[4.584432601928711,52.461503982543945],[5.424444198608398,52.248605728149414],[5.533609390258789,52.267221450805664],[5.624723434448242,52.35416603088379],[5.774168014526367,52.40527534484863],[5.878057479858398,52.50943946838379],[5.855001449584961,52.60691261291504],[5.599443435668945,52.65860939025879],[5.59916877746582,52.75777626037598],[5.718351364135742,52.838022232055664],[5.368612289428711,52.87777900695801],[5.420557022094727,52.96444129943848],[5.364168167114258,53.07027626037598],[5.100278854370117,52.94805335998535],[5.304166793823242,52.70694160461426],[5.033334732055664,52.634164810180664],[5.02833366394043,52.37583351135254],[4.579999923706055,52.47166633605957],[4.734167098999023,52.95555305480957],[6.871667861938477,53.41610908508301]]],[[[5.213056564331055,53.35000038146973],[5.168889999389648,53.37388801574707],[5.581945419311523,53.44777870178223],[5.213056564331055,53.35000038146973]]],[[[5.699167251586914,53.462778091430664],[5.956113815307617,53.462778091430664],[5.633054733276367,53.441667556762695],[5.699167251586914,53.462778091430664]]],[[[6.135000228881836,53.4536075592041],[6.148889541625977,53.49749946594238],[6.34111213684082,53.50277900695801],[6.135000228881836,53.4536075592041]]]]}},{"type":"Feature","properties":{"name":"Norway","iso2":"NO","iso3":"NOR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[8.743612289428711,58.40972328186035],[8.726945877075195,58.41277503967285],[8.73750114440918,58.43499946594238],[8.761388778686523,58.436662673950195],[8.761388778686523,58.42138862609863],[8.743612289428711,58.40972328186035]]],[[[5.961946487426758,58.97222328186035],[5.945001602172852,58.977495193481445],[5.958887100219727,58.98388862609863],[5.961946487426758,58.97222328186035]]],[[[5.726388931274414,59.07805061340332],[5.548334121704102,59.13055610656738],[5.68889045715332,59.129167556762695],[5.726388931274414,59.07805061340332]]],[[[5.952779769897461,59.22833442687988],[5.909723281860352,59.2741641998291],[6.059167861938477,59.26082801818848],[5.952779769897461,59.22833442687988]]],[[[5.287778854370117,59.218889236450195],[5.155279159545898,59.14694404602051],[5.183610916137695,59.411943435668945],[5.287778854370117,59.218889236450195]]],[[[5.263334274291992,59.79860877990723],[5.148889541625977,59.58111000061035],[5.107500076293945,59.86444282531738],[5.263334274291992,59.79860877990723]]],[[[5.413057327270508,59.751665115356445],[5.276388168334961,59.96694374084473],[5.468332290649414,59.88638496398926],[5.413057327270508,59.751665115356445]]],[[[5.524999618530273,59.893327713012695],[5.360834121704102,59.99221992492676],[5.658056259155273,60.075273513793945],[5.524999618530273,59.893327713012695]]],[[[5.268056869506836,60.0049991607666],[5.168058395385742,60.031389236450195],[5.17277717590332,60.12166786193848],[5.268056869506836,60.0049991607666]]],[[[5.954721450805664,60.08944129943848],[5.924165725708008,60.145273208618164],[6.016946792602539,60.14666175842285],[5.954721450805664,60.08944129943848]]],[[[5.216943740844727,60.24194526672363],[5.19972038269043,60.251108169555664],[5.233335494995117,60.254716873168945],[5.216943740844727,60.24194526672363]]],[[[5.111944198608398,60.18583106994629],[4.946943283081055,60.249162673950195],[4.942499160766602,60.427499771118164],[5.111944198608398,60.18583106994629]]],[[[5.195276260375977,60.408884048461914],[5.000833511352539,60.53110694885254],[5.179445266723633,60.48277473449707],[5.195276260375977,60.408884048461914]]],[[[5.185277938842773,60.50610542297363],[4.926946640014648,60.60527229309082],[5.121667861938477,60.57805061340332],[5.185277938842773,60.50610542297363]]],[[[5.55000114440918,60.4313907623291],[5.360002517700195,60.52388954162598],[5.675832748413086,60.683053970336914],[5.55000114440918,60.4313907623291]]],[[[5.158334732055664,60.58166694641113],[4.85444450378418,60.732500076293945],[4.980001449584961,60.71472358703613],[5.158334732055664,60.58166694641113]]],[[[4.696390151977539,60.98722267150879],[4.630834579467773,61.006662368774414],[4.628057479858398,61.06443977355957],[4.696390151977539,60.98722267150879]]],[[[4.986387252807617,61.104440689086914],[4.804723739624023,61.044443130493164],[4.788057327270508,61.14638710021973],[4.986387252807617,61.104440689086914]]],[[[4.934167861938477,61.7741641998291],[4.804166793823242,61.84055519104004],[5.221944808959961,61.84555244445801],[4.934167861938477,61.7741641998291]]],[[[5.068056106567383,61.923051834106445],[5.009721755981445,62.01361274719238],[5.127222061157227,61.99249458312988],[5.068056106567383,61.923051834106445]]],[[[5.64777946472168,62.1874942779541],[5.506109237670898,62.224443435668945],[5.80805778503418,62.27305030822754],[5.64777946472168,62.1874942779541]]],[[[5.840555191040039,62.239999771118164],[5.804998397827148,62.36694526672363],[5.977502822875977,62.41111183166504],[5.840555191040039,62.239999771118164]]],[[[6.253889083862305,62.39166450500488],[6.023054122924805,62.435556411743164],[6.333612442016602,62.41333198547363],[6.253889083862305,62.39166450500488]]],[[[6.736665725708008,62.66722297668457],[6.649721145629883,62.6813907623291],[6.919443130493164,62.70916175842285],[6.736665725708008,62.66722297668457]]],[[[6.886388778686523,62.77694129943848],[6.775835037231445,62.84555244445801],[6.940557479858398,62.84444618225098],[6.886388778686523,62.77694129943848]]],[[[7.548334121704102,62.94832801818848],[7.365556716918945,62.99638557434082],[7.711946487426758,63.00249671936035],[7.548334121704102,62.94832801818848]]],[[[7.809724807739258,63.023332595825195],[7.679445266723633,63.056108474731445],[7.915277481079102,63.07916450500488],[7.809724807739258,63.023332595825195]]],[[[8.060277938842773,63.14166450500488],[7.926389694213867,63.171945571899414],[8.18638801574707,63.15305519104004],[8.060277938842773,63.14166450500488]]],[[[8.391111373901367,63.15916633605957],[8.269723892211914,63.2661075592041],[8.437498092651367,63.283884048461914],[8.576112747192383,63.18943977355957],[8.391111373901367,63.15916633605957]]],[[[8.511945724487305,63.319162368774414],[8.431112289428711,63.33194160461426],[8.675832748413086,63.34666633605957],[8.511945724487305,63.319162368774414]]],[[[8.162221908569336,63.36138343811035],[7.77833366394043,63.405832290649414],[8.091665267944336,63.46666145324707],[8.162221908569336,63.36138343811035]]],[[[8.494165420532227,63.42833137512207],[8.280000686645508,63.46472358703613],[9.176389694213867,63.56472206115723],[8.494165420532227,63.42833137512207]]],[[[8.808332443237305,63.81027412414551],[8.794443130493164,63.69749641418457],[8.269998550415039,63.67888832092285],[8.808332443237305,63.81027412414551]]],[[[11.453611373901367,64.51416206359863],[11.175554275512695,64.50694465637207],[11.038610458374023,64.62887763977051],[11.453611373901367,64.51416206359863]]],[[[11.351388931274414,64.64999580383301],[11.310834884643555,64.59666633605957],[11.176111221313477,64.64444160461426],[11.351388931274414,64.64999580383301]]],[[[11.261667251586914,64.88472175598145],[10.82499885559082,64.8449878692627],[11.106111526489258,64.95027351379395],[11.261667251586914,64.88472175598145]]],[[[11.110834121704102,64.96582221984863],[10.731389999389648,64.86027717590332],[10.777776718139648,64.91888618469238],[11.110834121704102,64.96582221984863]]],[[[11.636667251586914,65.06527900695801],[11.531389236450195,65.06082344055176],[11.77277946472168,65.11360359191895],[11.636667251586914,65.06527900695801]]],[[[12.156389236450195,65.05137825012207],[11.981668472290039,65.07638740539551],[12.183610916137695,65.20833015441895],[12.315279006958008,65.10998725891113],[12.285001754760742,65.08444404602051],[12.156389236450195,65.05137825012207]]],[[[12.075277328491211,65.21138191223145],[12.258054733276367,65.57611274719238],[12.502779006958008,65.39193916320801],[12.075277328491211,65.21138191223145]]],[[[11.974164962768555,65.62693977355957],[11.758611679077148,65.61694526672363],[11.894445419311523,65.70443916320801],[11.974164962768555,65.62693977355957]]],[[[12.542501449584961,65.89694404602051],[12.414999008178711,65.89360237121582],[12.573888778686523,66.01054573059082],[12.90361213684082,66.00860786437988],[12.542501449584961,65.89694404602051]]],[[[12.352499008178711,66.02249336242676],[12.563333511352539,66.21777534484863],[12.657220840454102,66.10472297668457],[12.352499008178711,66.02249336242676]]],[[[12.796667098999023,66.21443367004395],[12.71583366394043,66.24749946594238],[12.870832443237305,66.27749824523926],[12.796667098999023,66.21443367004395]]],[[[12.986665725708008,66.22833442687988],[12.93083381652832,66.22638130187988],[13.158334732055664,66.27749824523926],[12.986665725708008,66.22833442687988]]],[[[14.257776260375977,67.13304328918457],[14.191946029663086,66.99943733215332],[13.991109848022461,67.07859992980957],[14.257776260375977,67.13304328918457]]],[[[14.253053665161133,67.35859870910645],[14.216665267944336,67.35832405090332],[14.374998092651367,67.42221260070801],[14.253053665161133,67.35859870910645]]],[[[15.20222282409668,67.90027046203613],[14.931665420532227,67.92387580871582],[15.303609848022461,67.92027473449707],[15.20222282409668,67.90027046203613]]],[[[15.90333366394043,67.97888374328613],[15.49888801574707,67.98777961730957],[15.851110458374023,68.01361274719238],[15.90333366394043,67.97888374328613]]],[[[12.841943740844727,67.8086109161377],[13.155832290649414,68.08110237121582],[13.134443283081055,67.95250129699707],[12.841943740844727,67.8086109161377]]],[[[13.438055038452148,68.11277961730957],[13.163057327270508,68.01138496398926],[13.299165725708008,68.14972114562988],[13.438055038452148,68.11277961730957]]],[[[13.968332290649414,68.23832893371582],[14.135831832885742,68.23944282531738],[13.44972038269043,68.06749153137207],[13.968332290649414,68.23832893371582]]],[[[14.870553970336914,68.21165657043457],[14.826112747192383,68.25444221496582],[14.940553665161133,68.26805305480957],[14.870553970336914,68.21165657043457]]],[[[14.203611373901367,68.23916816711426],[14.049444198608398,68.30333137512207],[14.214166641235352,68.30110359191895],[14.203611373901367,68.23916816711426]]],[[[13.973333358764648,68.25332832336426],[13.883333206176758,68.30221748352051],[13.990556716918945,68.30999946594238],[13.973333358764648,68.25332832336426]]],[[[15.026388168334961,68.3549976348877],[14.19972038269043,68.15222358703613],[15.168889999389648,68.45054817199707],[15.026388168334961,68.3549976348877]]],[[[16.405553817749023,68.41110420227051],[16.094446182250977,68.39665412902832],[16.32694435119629,68.53360176086426],[16.405553817749023,68.41110420227051]]],[[[17.11638832092285,68.75248908996582],[16.81305503845215,68.72833442687988],[17.00055503845215,68.85443305969238],[17.11638832092285,68.75248908996582]]],[[[17.241666793823242,68.78860664367676],[17.0836124420166,68.91026496887207],[17.437776565551758,68.86526679992676],[17.241666793823242,68.78860664367676]]],[[[14.954442977905273,68.87277412414551],[14.839166641235352,68.88194465637207],[14.885278701782227,68.93332099914551],[14.954442977905273,68.87277412414551]]],[[[15.988054275512695,68.75193977355957],[15.739442825317383,68.52610969543457],[16.17888832092285,68.85165596008301],[16.565000534057617,68.65193367004395],[14.986665725708008,68.24749946594238],[15.71360969543457,68.69861030578613],[15.451665878295898,68.76220893859863],[15.636110305786133,68.94665718078613],[15.988054275512695,68.75193977355957]]],[[[16.537221908569336,68.87971687316895],[16.261110305786133,68.96666145324707],[16.601667404174805,68.94554328918457],[16.537221908569336,68.87971687316895]]],[[[15.382776260375977,68.84527778625488],[15.059167861938477,68.57249641418457],[14.371110916137695,68.6836109161377],[15.148611068725586,68.81221199035645],[15.087778091430664,69.00804328918457],[15.382776260375977,68.84527778625488]]],[[[17.41694450378418,68.99582099914551],[17.3527774810791,69.02415657043457],[17.56138801574707,69.0949878692627],[17.41694450378418,68.99582099914551]]],[[[15.522500991821289,68.90609931945801],[15.560277938842773,69.09471321105957],[16.148054122924805,69.28637886047363],[15.522500991821289,68.90609931945801]]],[[[17.63661003112793,69.51604652404785],[18.074167251586914,69.43083381652832],[18.003610610961914,69.19027900695801],[16.775278091430664,69.06443977355957],[17.173887252807617,69.19583320617676],[16.93083381652832,69.39248847961426],[17.63661003112793,69.51604652404785]]],[[[30.155553817749023,69.78166389465332],[30.11055564880371,69.78721809387207],[30.12611198425293,69.79748725891113],[30.155553817749023,69.78166389465332]]],[[[18.89000129699707,69.69194221496582],[17.996946334838867,69.58833503723145],[18.75139045715332,69.68277168273926],[18.693056106567383,69.88443183898926],[18.89000129699707,69.69194221496582]]],[[[20.68027687072754,69.8086109161377],[20.5563907623291,69.85110664367676],[20.739168167114258,69.90527534484863],[20.68027687072754,69.8086109161377]]],[[[29.8266658782959,69.75694465637207],[29.841943740844727,69.91026496887207],[30.04805564880371,69.82750129699707],[29.8266658782959,69.75694465637207]]],[[[21.730276107788086,69.93110847473145],[21.668611526489258,69.94194221496582],[21.717222213745117,69.94970893859863],[21.730276107788086,69.93110847473145]]],[[[19.56722068786621,69.85165596008301],[19.459444046020508,69.84250068664551],[19.89777946472168,69.97221565246582],[19.56722068786621,69.85165596008301]]],[[[19.959165573120117,70.00555610656738],[19.899168014526367,70.01609992980957],[19.996110916137695,70.01277351379395],[19.959165573120117,70.00555610656738]]],[[[19.300554275512695,70.02610969543457],[19.691946029663086,69.99472236633301],[18.72110939025879,69.93416023254395],[19.300554275512695,70.02610969543457]]],[[[20.892568588256836,70.03081703186035],[21.10249900817871,70.00471687316895],[20.757776260375977,69.98999214172363],[20.892568588256836,70.03081703186035]]],[[[21.00083351135254,70.01971626281738],[20.95194435119629,70.02583503723145],[21.049165725708008,70.04971504211426],[21.00083351135254,70.01971626281738]]],[[[18.785001754760742,70.11137580871582],[19.002779006958008,70.08415412902832],[18.684446334838867,69.99666023254395],[18.785001754760742,70.11137580871582]]],[[[20.919721603393555,70.07943916320801],[20.814722061157227,70.1161060333252],[20.861387252807617,70.14915657043457],[20.919721603393555,70.07943916320801]]],[[[19.607500076293945,70.1019458770752],[19.349721908569336,70.13138008117676],[19.4313907623291,70.17776679992676],[19.607500076293945,70.1019458770752]]],[[[20.831945419311523,70.19388008117676],[20.78388786315918,70.05638313293457],[20.385278701782227,70.09887886047363],[20.831945419311523,70.19388008117676]]],[[[20.11277961730957,70.10472297668457],[19.76999855041504,70.06527900695801],[19.53611183166504,70.24832344055176],[20.11277961730957,70.10472297668457]]],[[[19.185277938842773,70.12249946594238],[19.03360939025879,70.16110420227051],[19.233610153198242,70.25444221496582],[19.185277938842773,70.12249946594238]]],[[[22.8347225189209,70.33221626281738],[23.02277946472168,70.25943183898926],[22.36861228942871,70.33444404602051],[22.8347225189209,70.33221626281738]]],[[[21.77277946472168,70.26666450500488],[21.697778701782227,70.38194465637207],[21.84139060974121,70.35026741027832],[21.77277946472168,70.26666450500488]]],[[[23.595834732055664,70.57805061340332],[23.230554580688477,70.27832221984863],[22.851110458374023,70.40582466125488],[23.595834732055664,70.57805061340332]]],[[[23.871110916137695,70.51220893859863],[23.634164810180664,70.69638252258301],[24.12583351135254,70.61526679992676],[23.871110916137695,70.51220893859863]]],[[[23.4516658782959,70.78360176086426],[22.78416633605957,70.51971626281738],[21.94972038269043,70.64610481262207],[23.4516658782959,70.78360176086426]]],[[[24.06194496154785,70.90887641906738],[23.880834579467773,70.99360847473145],[24.2438907623291,70.95193672180176],[24.06194496154785,70.90887641906738]]],[[[24.7994441986084,71.02388191223145],[24.63944435119629,71.06082344055176],[24.853612899780273,71.0899829864502],[24.7994441986084,71.02388191223145]]],[[[25.828054428100586,71.09860420227051],[26.2197208404541,71.03360176086426],[25.28611183166504,71.02083015441895],[25.828054428100586,71.09860420227051]]],[[[5.336946487426758,61.59277534484863],[5.276834487915039,61.58799934387207],[5.345335006713867,61.58633232116699],[5.336946487426758,61.59277534484863],[4.938055038452148,61.6763858795166],[6.763612747192383,61.868051528930664],[5.148054122924805,61.892221450805664],[5.40361213684082,62.0161075592041],[5.150278091430664,62.21193885803223],[6.357221603393555,62.05527687072754],[5.918058395385742,62.215829849243164],[6.306665420532227,62.37166786193848],[6.538057327270508,62.10472297668457],[6.388334274291992,62.36972236633301],[6.87611198425293,62.414995193481445],[7.043058395385742,62.08638954162598],[7.415555953979492,62.232500076293945],[6.781389236450195,62.47833442687988],[6.257223129272461,62.44888496398926],[6.649835586547852,62.49838447570801],[6.246946334838867,62.574716567993164],[8.14527702331543,62.68999671936035],[6.958887100219727,62.72249794006348],[7.03639030456543,62.96750068664551],[8.548334121704102,62.653886795043945],[7.879167556762695,63.01055335998535],[8.530832290649414,62.841386795043945],[8.15916633605957,63.12027931213379],[8.938333511352539,63.20666694641113],[8.477777481079102,63.29361152648926],[8.763612747192383,63.34527778625488],[8.652776718139648,63.40916633605957],[9.004999160766602,63.46750068664551],[9.427778244018555,63.37693977355957],[9.149721145629883,63.48416328430176],[9.647500991821289,63.62388801574707],[10.25666618347168,63.26111030578613],[10.047224044799805,63.40610694885254],[10.910276412963867,63.45111274719238],[10.65888786315918,63.549997329711914],[11.455831527709961,63.78721809387207],[11.090555191040039,63.87832832336426],[11.492776870727539,64.01944160461426],[11.318887710571289,64.03221321105957],[11.358331680297852,64.11055183410645],[11.30583381652832,64.11638069152832],[11.180276870727539,64.00804328918457],[10.574167251586914,63.80499458312988],[10.904165267944336,63.89416694641113],[11.07722282409668,63.83749580383301],[10.941946029663086,63.738054275512695],[10.04777717590332,63.496110916137695],[9.789167404174805,63.66250038146973],[10.098333358764648,63.76194190979004],[9.543889999389648,63.76361274719238],[10.189722061157227,63.930551528930664],[9.982221603393555,63.990556716918945],[10.495290756225586,64.42381477355957],[10.972223281860352,64.60138130187988],[11.22166633605957,64.31610298156738],[11.728055953979492,64.57971382141113],[11.438333511352539,64.71110725402832],[12.224443435668945,64.93721199035645],[11.297224044799805,64.88360786437988],[11.975000381469727,65.06582832336426],[12.019445419311523,65.02610969543457],[12.04749870300293,65.05583381652832],[12.148889541625977,65.03915596008301],[12.624723434448242,65.13360786437988],[12.939722061157227,65.30832099914551],[12.24888801574707,65.22860908508301],[12.638055801391602,65.41888618469238],[12.360834121704102,65.64776802062988],[12.788610458374023,65.63638496398926],[12.667501449584961,65.91693305969238],[13.17500114440918,65.84915351867676],[13.121946334838867,65.94027900695801],[12.931943893432617,65.9749927520752],[12.959444046020508,66.04222297668457],[12.673887252807617,66.06694221496582],[14.146665573120117,66.32165718078613],[13.027223587036133,66.18609809875488],[13.53639030456543,66.3036060333252],[12.969999313354492,66.5183277130127],[13.725557327270508,66.6019458770752],[13.228055953979492,66.71249580383301],[13.990835189819336,66.78360176086426],[13.546945571899414,66.92666816711426],[15.739721298217773,67.17248725891113],[14.361665725708008,67.23388862609863],[15.035833358764648,67.57054328918457],[15.64000129699707,67.26638984680176],[15.541112899780273,67.4769458770752],[15.899168014526367,67.55888557434082],[14.758054733276367,67.80526924133301],[15.871110916137695,67.92332649230957],[15.961111068725586,68.01304817199707],[15.283056259155273,68.03555488586426],[15.972223281860352,68.24554634094238],[16.217222213745117,67.88804817199707],[16.495832443237305,67.79416084289551],[16.20749855041504,68.00166511535645],[16.71527671813965,68.0666675567627],[16.103334426879883,68.27693367004395],[16.80583381652832,68.13138008117676],[16.31722068786621,68.36694526672363],[17.35472297668457,68.17387580871582],[17.200834274291992,68.36694526672363],[17.552778244018555,68.52388191223145],[16.459444046020508,68.50804328918457],[17.68027687072754,68.6544361114502],[17.236112594604492,68.75471687316895],[17.79250144958496,68.75694465637207],[17.425832748413086,68.90500068664551],[18.152223587036133,69.15222358703613],[18.25694465637207,69.48637580871582],[19.440553665161133,69.22583198547363],[18.94416618347168,69.6130542755127],[19.75889015197754,69.81027412414551],[19.679166793823242,69.42944526672363],[20.304166793823242,69.96832466125488],[19.946943283081055,69.25610542297363],[20.853055953979492,69.48916816711426],[20.48138999938965,69.63888740539551],[21.307222366333008,70.01971626281738],[22.101667404174805,69.74083137512207],[21.797224044799805,70.03360176086426],[22.09666633605957,70.11332893371582],[21.30000114440918,70.24693489074707],[22.9505558013916,70.20555305480957],[22.287778854370117,70.03888130187988],[23.31194496154785,69.94082832336426],[23.660001754760742,70.42000007629395],[24.72916603088379,70.62193489074707],[24.245553970336914,70.77722358703613],[24.591943740844727,70.96304512023926],[25.907777786254883,70.88665962219238],[25.073610305786133,70.50000190734863],[25.273054122924805,70.39888191223145],[24.9424991607666,70.08777046203613],[25.234724044799805,70.08972358703613],[26.570276260375977,70.93889045715332],[26.5049991607666,70.3630542755127],[27.029443740844727,70.47415351867676],[27.565553665161133,70.80471992492676],[27.136110305786133,70.95833015441895],[27.65166664123535,71.1130542755127],[28.550832748413086,70.96832466125488],[27.64750099182129,70.60527229309082],[28.295000076293945,70.71277046203613],[27.851667404174805,70.47888374328613],[28.335554122924805,70.50555610656738],[28.038888931274414,70.06193733215332],[28.527498245239258,70.72665596008301],[29.03611183166504,70.8741626739502],[31.078054428100586,70.28915596008301],[28.61250114440918,70.10777473449707],[29.671667098999023,69.96750068664551],[29.365556716918945,69.85527229309082],[29.73750114440918,69.90527534484863],[29.486665725708008,69.65555000305176],[30.854841232299805,69.79231452941895],[30.910001754760742,69.54887580871582],[30.103334426879883,69.66305732727051],[28.95734214782715,69.05162239074707],[28.78416633605957,69.16055488586426],[29.176111221313477,69.6352710723877],[28.165834426879883,69.91221809387207],[26.44999885559082,69.92721748352051],[25.945833206176758,69.67332649230957],[25.761110305786133,68.98916816711426],[24.934919357299805,68.58081245422363],[23.976388931274414,68.83249092102051],[22.398332595825195,68.71110725402832],[21.320833206176758,69.32611274719238],[20.580930709838867,69.06030464172363],[20.09694480895996,69.04222297668457],[20.350278854370117,68.78665351867676],[19.937776565551758,68.33749580383301],[18.09083366394043,68.50776863098145],[17.884164810180664,67.94554328918457],[16.726945877075195,67.89915657043457],[16.085832595825195,67.41165351867676],[16.3538875579834,67.01777839660645],[15.36277961730957,66.4799976348877],[15.468053817749023,66.28387641906738],[14.504999160766602,66.13249397277832],[14.49305534362793,65.31360054016113],[13.662500381469727,64.58276557922363],[14.116388320922852,64.47055244445801],[13.988332748413086,64.01805305480957],[12.938055038452148,64.05333137512207],[12.139444351196289,63.58416175842285],[11.93638801574707,63.27221870422363],[12.295831680297852,62.261667251586914],[12.124444961547852,61.72860908508301],[12.856111526489258,61.362497329711914],[12.210000991821289,61.00249671936035],[12.594446182250977,60.51693916320801],[12.494165420532227,60.11110877990723],[11.815961837768555,59.84610176086426],[11.75111198425293,59.09027290344238],[11.429193496704102,58.98764228820801],[10.79749870300293,59.18638801574707],[10.557779312133789,59.72860908508301],[10.748334884643555,59.88694190979004],[10.527498245239258,59.87527656555176],[10.558053970336914,59.54305458068848],[10.222223281860352,59.727495193481445],[10.516389846801758,59.31083106994629],[10.231111526489258,59.03860664367676],[9.540834426879883,59.11471748352051],[9.693056106567383,58.98305702209473],[9.409444808959961,58.841386795043945],[9.191110610961914,58.658334732055664],[8.995832443237305,58.59832954406738],[8.712644577026367,58.441938400268555],[8.691946029663086,58.37722206115723],[8.510278701782227,58.270273208618164],[8.248056411743164,58.20194435119629],[8.211111068725586,58.115556716918945],[6.597776412963867,58.07027626037598],[6.767221450805664,58.23832893371582],[5.45777702331543,58.74444007873535],[5.552778244018555,59.03277778625488],[6.168611526489258,58.832223892211914],[6.623334884643555,59.05166816711426],[5.866388320922852,59.072221755981445],[6.468889236450195,59.55527687072754],[5.511110305786133,59.27499580383301],[5.178056716918945,59.50833320617676],[6.306390762329102,59.843332290649414],[5.698335647583008,59.832773208618164],[6.204721450805664,60.29555702209473],[6.640554428100586,60.4102725982666],[6.521112442016602,60.07666206359863],[7.108057022094727,60.49416542053223],[6.220834732055664,60.41250038146973],[5.747224807739258,59.98666572570801],[5.734445571899414,60.38694190979004],[5.411111831665039,60.129716873168945],[5.142221450805664,60.346384048461914],[5.70250129699707,60.45443916320801],[5.700834274291992,60.694162368774414],[5.261388778686523,60.553056716918945],[4.928888320922852,60.79888343811035],[5.433610916137695,60.62722206115723],[5.236387252807617,60.77388954162598],[5.533609390258789,60.87249946594238],[5.007776260375977,61.03721809387207],[5.419443130493164,61.02555274963379],[5.920835494995117,61.123056411743164],[6.372224807739258,61.06194496154785],[6.590555191040039,61.151384353637695],[7.113889694213867,60.86027717590332],[7.000833511352539,61.09610939025879],[7.428613662719727,61.1813907623291],[7.303888320922852,61.294443130493164],[7.574445724487305,61.479440689086914],[7.309167861938477,61.362497329711914],[7.273054122924805,61.278886795043945],[7.353891372680664,61.18999671936035],[7.278055191040039,61.15860939025879],[6.955556869506836,61.109994888305664],[6.564165115356445,61.218332290649414],[6.703611373901367,61.401384353637695],[6.520406723022461,61.24620246887207],[6.498334884643555,61.13027381896973],[5.749166488647461,61.15277290344238],[5.397222518920898,61.06860542297363],[4.953332901000977,61.25860786437988],[5.63416862487793,61.360551834106445],[4.948888778686523,61.41277503967285],[5.804998397827148,61.452775955200195],[5.130834579467773,61.52666664123535],[5.273889541625977,61.55777549743652],[5.148611068725586,61.59305000305176],[5.336946487426758,61.59277534484863]],[[5.77833366394043,58.94749641418457],[5.754999160766602,58.95638465881348],[5.760835647583008,58.94583320617676],[5.77833366394043,58.94749641418457]]]]}},{"type":"Feature","properties":{"name":"Nepal","iso2":"NP","iso3":"NPL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[82.06639900000013,27.914154],[80.055817,28.836109],[80.37692300000012,29.748604],[81.02536,30.204353],[81.22360200000011,30.010277],[81.421097,30.385273],[82.10054,30.342220000000125],[83.55276500000011,29.185829],[84.119141,29.259998],[84.481094,28.736660000000157],[85.189972,28.603329],[85.1066440000001,28.309441],[85.721375,28.279163],[86.014435,27.882774],[86.183594,28.163883],[86.444977,27.90805100000013],[86.686371,28.112217],[87.192749,27.82305100000015],[88.142792,27.866055],[88.014709,26.364719],[85.855545,26.57027400000011],[84.147217,27.51138700000014],[83.29136700000018,27.337776],[82.06639900000013,27.914154]]]]}},{"type":"Feature","properties":{"name":"Nauru","iso2":"NR","iso3":"NRU"},"geometry":{"type":"MultiPolygon","coordinates":[[[[166.929138,-0.552222],[166.930542,-0.493333],[166.958588,-0.506389],[166.929138,-0.552222]]]]}},{"type":"Feature","properties":{"name":"Suriname","iso2":"SR","iso3":"SUR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-55.127968,5.822173],[-54.030006,5.821111],[-54.166946,5.346944],[-54.477501,4.747777],[-54.001114,3.448333],[-54.603783,2.329195],[-55.965836,2.532777],[-55.904167,1.893055],[-56.470634,1.944499000000135],[-57.301392,3.3775],[-57.642227,3.356389000000107],[-58.047226,4.008333000000107],[-57.92333999999988,4.821944],[-57.327225,5.026111],[-57.248505,5.486111],[-56.972504,5.996944],[-55.899559,5.671908],[-55.836395,5.956666],[-55.127968,5.822173]]]]}},{"type":"Feature","properties":{"name":"Nicaragua","iso2":"NI","iso3":"NIC"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-83.712509,11.868332],[-83.73194899999987,11.903332],[-83.714447,11.988054],[-83.712509,11.868332]]],[[[-83.048889,12.145555],[-83.05751,12.183611],[-83.021393,12.184166],[-83.048889,12.145555]]],[[[-82.964737,12.286943],[-82.983337,12.313055],[-82.97139,12.312498000000119],[-82.964737,12.286943]]],[[[-82.750839,14.353888],[-82.7897339999999,14.374998],[-82.733612,14.418888],[-82.750839,14.353888]]],[[[-83.239731,14.98249800000012],[-83.131851,14.992979000000105],[-83.421402,14.80611],[-83.186951,14.323889],[-83.551117,13.450554],[-83.482788,12.403889],[-83.604446,12.819443],[-83.83168,11.874722],[-83.645798,10.924847],[-83.915558,10.708611],[-85.087784,11.009998],[-85.692383,11.076061],[-87.69250499999987,12.912222],[-87.301392,12.986599],[-86.695007,13.296944000000124],[-86.763016,13.751621],[-86.015839,14.065832000000114],[-85.732315,13.829235],[-84.906677,14.808611],[-84.482788,14.617777],[-83.239731,14.98249800000012]]]]}},{"type":"Feature","properties":{"name":"New Zealand","iso2":"NZ","iso3":"NZL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[169.185516,-52.57695],[169.000824,-52.507225],[169.205231,-52.441383],[169.185516,-52.57695]]],[[[166.09661900000017,-50.923058],[165.923584,-50.856392],[166.22052,-50.887505],[166.09661900000017,-50.923058]]],[[[165.995544,-50.603638],[165.969421,-50.605003],[166.003601,-50.595001],[165.995544,-50.603638]]],[[[166.2508240000001,-50.82695],[165.886932,-50.804443],[166.199402,-50.527222],[166.2508240000001,-50.82695]]],[[[166.321899,-50.50695],[166.284973,-50.50528],[166.331909,-50.49472],[166.321899,-50.50695]]],[[[178.816376,-49.723885],[178.71524,-49.685272],[178.814972,-49.613617],[178.816376,-49.723885]]],[[[166.632172,-48.04084],[166.563873,-48.039444],[166.622192,-47.995552],[166.632172,-48.04084]]],[[[179.076904,-47.680595],[179.049133,-47.67556],[179.0697020000002,-47.661667],[179.076904,-47.680595]]],[[[167.434967,-47.248611],[167.426636,-47.222496],[167.486908,-47.214165],[167.434967,-47.248611]]],[[[167.685791,-46.796669],[167.663605,-46.760002],[167.718842,-46.771385],[167.685791,-46.796669]]],[[[168.191925,-46.905273],[167.519135,-47.27417],[167.775818,-46.700279],[168.191925,-46.905273]]],[[[166.71637000000013,-45.741669],[166.50497400000015,-45.719162],[166.710785,-45.61528],[166.71637000000013,-45.741669]]],[[[167.0099790000002,-45.31028],[166.891357,-45.250282],[166.962189,-45.153328],[167.0099790000002,-45.31028]]],[[[-176.162231,-44.324722],[-176.23584,-44.234734],[-176.115814,-44.263336],[-176.162231,-44.324722]]],[[[-176.45224,-43.736122],[-176.60556,-44.119171],[-176.53421,-43.870277],[-176.848053,-43.812225],[-176.45224,-43.736122]]],[[[174.399414,-41.115837],[174.37439,-41.203056],[174.193298,-41.232498],[174.344421,-41.18306],[174.3718870000001,-41.148613],[174.322754,-41.1325],[174.399414,-41.115837]]],[[[173.80581700000013,-40.92778],[173.823303,-40.762505],[173.963867,-40.710556],[173.80581700000013,-40.92778]]],[[[172.861359,-40.507782],[172.656921,-40.653328],[173.013306,-40.796669],[173.10553,-41.313332],[174.323853,-41.003334],[174.026642,-41.236115],[174.20636,-41.269447],[174.326904,-41.222771],[174.04443400000022,-41.442497],[174.289154,-41.748337],[172.760803,-43.239166],[173.091644,-43.856392],[172.424988,-43.733612],[171.293579,-44.343613],[170.554413,-45.888054],[170.783051,-45.878334],[169.008026,-46.680832],[166.48440600000018,-46.01445],[166.987183,-45.709724],[166.775818,-45.662773],[167.0413510000001,-45.501396],[166.704407,-45.574448],[166.82162500000013,-45.320557],[167.21191400000012,-45.475273],[166.996918,-45.145836],[167.507202,-45.001396],[168.374969,-44.037781],[170.794128,-42.90139],[172.064972,-41.40361],[172.108856,-40.885559],[172.861359,-40.507782]]],[[[177.001373,-37.870552],[176.964691,-37.863617],[176.97995,-37.848053],[177.001373,-37.870552]]],[[[176.43856800000012,-37.650276],[176.44693,-37.604721],[176.459412,-37.622772],[176.43856800000012,-37.650276]]],[[[175.166077,-36.833885],[175.002472,-36.792778],[175.193848,-36.727493],[175.166077,-36.833885]]],[[[175.827179,-36.630829],[175.770264,-36.580833],[175.80246,-36.576111],[175.827179,-36.630829]]],[[[174.86386100000013,-36.459724],[174.869965,-36.388893],[174.907196,-36.451668],[174.86386100000013,-36.459724]]],[[[175.1494139999999,-36.213333],[175.07968100000014,-36.200836],[175.121887,-36.170555],[175.1494139999999,-36.213333]]],[[[175.5447080000002,-36.347778],[175.358856,-36.229439],[175.3718870000001,-36.070557],[175.5447080000002,-36.347778]]],[[[173.038879,-34.436943],[173.2691350000002,-35.019722],[173.450806,-34.807777],[174.319977,-35.232773],[174.85440099999985,-36.847778],[175.579132,-37.244446],[175.353577,-36.481941],[175.84079,-36.754173],[175.994415,-37.638893],[177.15942400000014,-38.013336],[178.0180050000001,-37.550831],[178.565521,-37.713333],[177.90997300000012,-39.25695],[177.05496200000013,-39.204445],[176.834137,-40.181671],[175.323029,-41.614449],[174.591919,-41.27861],[175.127747,-40.713615],[175.155548,-40.095833],[173.75192300000012,-39.288612],[174.594421,-38.815834],[174.974976,-37.75],[174.549713,-37.073616],[174.887482,-37.059166],[174.502472,-37.037506],[174.187744,-36.496948],[174.453033,-36.651108],[174.268585,-36.342224],[174.505249,-36.231384],[173.913879,-35.86972],[174.080811,-36.409439],[173.398865,-35.573891],[173.655548,-35.313332],[173.38052400000012,-35.528053],[173.087463,-35.211388],[172.722473,-34.495277],[173.038879,-34.436943]]],[[[172.157196,-34.173889],[172.133331,-34.153328],[172.18692,-34.152496],[172.157196,-34.173889]]],[[[-178.605286,-30.581116],[-178.613068,-30.587223],[-178.612518,-30.574448],[-178.605286,-30.581116]]],[[[-177.84613,-29.278614],[-177.923615,-29.284725],[-177.952484,-29.226112],[-177.84613,-29.278614]]]]}},{"type":"Feature","properties":{"name":"Paraguay","iso2":"PY","iso3":"PRY"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-54.330559,-24.679449],[-54.59891499999989,-25.573223],[-54.698334,-26.438335],[-55.736115,-27.439445],[-58.604622,-27.316921],[-57.576668,-25.549446],[-57.75611099999986,-25.176945],[-61.007782,-23.813335],[-62.643768,-22.238903],[-61.7425,-19.645],[-59.09584,-19.348892],[-58.15139,-19.828056],[-58.15889,-20.168056],[-57.814445,-20.971947],[-57.985107,-22.091827],[-55.849724,-22.288891],[-55.411667,-23.95639],[-54.407227,-23.916668],[-54.330559,-24.679449]]]]}},{"type":"Feature","properties":{"name":"Peru","iso2":"PE","iso3":"PER"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-78.70903,-4.584787],[-78.3375089999999,-3.422778],[-76.66062899999986,-2.572135],[-75.559174,-1.534167],[-75.21608,-0.965336],[-75.62796,-0.108859],[-75.285843,-0.119722],[-74.776947,-0.204167],[-74.227234,-1.027778],[-73.556396,-1.370833],[-72.88195799999988,-2.506389],[-71.698059,-2.146945],[-70.288345,-2.505],[-70.067505,-2.755556],[-70.724167,-3.779723],[-69.956924,-4.236874],[-70.765839,-4.146389],[-72.85195899999985,-5.124722],[-73.123901,-6.447223],[-73.74417099999988,-6.876945],[-74.01055899999989,-7.541389],[-72.964172,-8.983334],[-73.205292,-9.407223],[-72.366394,-9.494446],[-72.14389,-10.004723],[-71.298889,-9.996389],[-70.5146639999999,-9.428001],[-70.631393,-11.009167],[-69.568436,-10.951092],[-68.673904,-12.50115],[-68.974457,-12.869722],[-68.853058,-14.199167],[-69.366394,-14.802502],[-69.136948,-15.245834],[-69.421951,-15.618057],[-68.82251,-16.339725],[-69.618896,-17.214725],[-69.499725,-17.50528],[-69.951126,-18.242779],[-70.405487,-18.348545],[-71.497513,-17.296947],[-75.047501,-15.469168],[-75.933334,-14.658056],[-76.39389,-13.898056],[-76.196945,-13.418335],[-77.652512,-11.292223],[-78.989731,-8.226946],[-79.982788,-6.764445],[-81.174728,-6.086667],[-80.871399,-5.652223],[-81.289734,-4.31],[-80.340424,-3.380517],[-80.153336,-3.884228],[-80.467224,-3.986945],[-80.467789,-4.43889],[-79.649734,-4.432778],[-79.054825,-5.009132],[-78.70903,-4.584787]]]]}},{"type":"Feature","properties":{"name":"Pakistan","iso2":"PK","iso3":"PAK"},"geometry":{"type":"MultiPolygon","coordinates":[[[[67.449417,24.002777],[67.41192600000014,24.005833000000123],[67.379425,24.051662],[67.45887800000011,24.05694200000012],[67.481659,24.042774],[67.45887800000011,24.007221],[67.449417,24.002777]]],[[[74.8174900000001,37.021767],[75.864426,36.65967600000015],[76.166382,35.819717],[77.8239290000001,35.501328],[77.04248,35.099159],[76.8699800000002,34.658882],[73.94165,34.646385],[73.913315,34.068604],[74.295822,33.977486],[73.99054000000015,33.743881000000115],[74.016388,33.18859900000011],[75.381287,32.214241],[74.605324,31.877119],[74.69458800000021,31.053961],[73.872498,30.390099],[73.933403,30.136002],[73.397491,29.942772],[71.896942,27.961941000000152],[70.829437,27.706383],[70.368317,28.020832000000112],[69.580276,27.173328],[69.506104,26.754444000000106],[70.183594,26.536110000000107],[70.088043,25.982773],[70.666382,25.69833],[71.10582,24.416386],[70.01470900000012,24.169716],[68.78305100000014,24.332775],[68.747208,23.969994],[68.1978,23.766685000000123],[67.493591,23.890831],[67.53804000000017,23.938129],[67.50067100000015,23.974043],[67.486649,24.045277],[67.461197,24.065355],[67.338043,24.089718],[67.2738800000001,24.425827],[67.15165700000014,24.610554],[67.2541660000002,24.746105000000128],[66.645538,24.829163],[66.732758,25.197495],[66.359421,25.613609000000125],[66.141602,25.503941000000125],[66.506378,25.402496],[64.65193200000013,25.162773],[64.113876,25.453327],[61.61103100000017,25.197647],[61.858047,26.234718],[63.17638400000013,26.631107],[63.34193400000012,27.122498],[62.782494000000185,27.260555],[62.78138,28.266941],[61.90554800000015,28.554996],[60.86859900000016,29.863884],[62.4844360000001,29.406105],[66.256653,29.851940000000113],[66.395538,30.94083],[66.72303800000012,31.212215],[67.778046,31.33221800000014],[67.575546,31.53194000000012],[68.166092,31.833054000000104],[68.833054,31.603886],[69.32824700000012,31.940365000000114],[69.505264,33.034164],[70.326935,33.33194],[69.90637200000018,34.035271],[71.08194000000012,34.05582400000013],[70.987488,34.551102000000114],[71.64942900000014,35.424995],[71.2435760000001,36.129715],[72.556641,36.821266],[74.56543,37.027817],[74.8174900000001,37.021767]]]]}},{"type":"Feature","properties":{"name":"Poland","iso2":"PL","iso3":"POL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[18.851246,49.517357],[18.577221,49.914444],[17.657776,50.108055],[17.722775,50.319717],[16.890274,50.439438],[17.00222,50.216942],[16.641941,50.10833],[16.20583,50.423882],[16.341942,50.66111],[14.828333,50.865829],[15.036388,51.285553],[14.599443,51.818604],[14.640276,52.572495],[14.14916600000015,52.862778],[14.275627,53.699066],[14.614166,53.816383],[14.218887,53.869019],[14.225555000000156,53.928604],[17.918888,54.82666],[18.334999,54.836662],[18.739998,54.685272],[18.405277,54.74305],[18.582775,54.435272],[18.836388,54.353333],[19.627258,54.463272],[19.651108,54.455826],[19.226662,54.32888],[19.797007,54.43755],[22.785885,54.363838],[23.50404,53.947044],[23.94083,52.732208],[23.1654,52.282276],[23.638607,52.079437],[23.604633,51.527695],[24.111385,50.56694],[22.680828000000105,49.572495],[22.886074,49.002914],[22.558052,49.079437],[21.618889,49.436386],[20.074444,49.175278],[19.475555,49.599998],[18.851246,49.517357]]]]}},{"type":"Feature","properties":{"name":"Panama","iso2":"PA","iso3":"PAN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-81.77862358093262,7.276388168334961],[-81.79750061035156,7.225835800170898],[-81.81861877441406,7.290002822875977],[-81.77862358093262,7.276388168334961]]],[[[-81.20584106445312,7.486665725708008],[-81.24972534179688,7.488332748413086],[-81.03361511230469,7.570833206176758],[-81.20584106445312,7.486665725708008]]],[[[-81.64944458007812,7.38416862487793],[-81.87417602539062,7.491113662719727],[-81.75862121582031,7.63416862487793],[-81.64944458007812,7.38416862487793]]],[[[-81.10389709472656,7.717779159545898],[-81.149169921875,7.741666793823242],[-81.12417602539062,7.758890151977539],[-81.10389709472656,7.717779159545898]]],[[[-81.165283203125,7.822778701782227],[-81.17361450195312,7.818056106567383],[-81.16139221191406,7.841665267944336],[-81.165283203125,7.822778701782227]]],[[[-82.34056091308594,8.087499618530273],[-82.36639404296875,8.088888168334961],[-82.31973266601562,8.136667251586914],[-82.34056091308594,8.087499618530273]]],[[[-82.21334838867188,8.197500228881836],[-82.2952880859375,8.193609237670898],[-82.31333923339844,8.218889236450195],[-82.21334838867188,8.197500228881836]]],[[[-82.33250427246094,8.233610153198242],[-82.40362358093262,8.253053665161133],[-82.33612060546875,8.292501449584961],[-82.31417846679688,8.271665573120117],[-82.33250427246094,8.233610153198242]]],[[[-79.10694885253906,8.201112747192383],[-79.09750366210938,8.309167861938477],[-79.05584716796875,8.25139045715332],[-79.10694885253906,8.201112747192383]]],[[[-79.07640075683594,8.369722366333008],[-79.11445617675781,8.415277481079102],[-79.07583618164062,8.408609390258789],[-79.07640075683594,8.369722366333008]]],[[[-78.85139465332031,8.288610458374023],[-78.95916557312012,8.29222297668457],[-78.96028137207031,8.447221755981445],[-78.85139465332031,8.288610458374023]]],[[[-82.0150146484375,9.12639045715332],[-82.04917907714844,9.144166946411133],[-82.04583740234375,9.176389694213867],[-82.0150146484375,9.12639045715332]]],[[[-82.07917785644531,9.284444808959961],[-82.12445068359375,9.271944046020508],[-82.20639038085938,9.348333358764648],[-82.07917785644531,9.284444808959961]]],[[[-82.22445678710938,9.335000991821289],[-82.22944641113281,9.337499618530273],[-82.2247314453125,9.352499008178711],[-82.22445678710938,9.335000991821289]]],[[[-82.23918151855469,9.330278396606445],[-82.314453125,9.424722671508789],[-82.25834655761719,9.429166793823242],[-82.23918151855469,9.330278396606445]]],[[[-79.46305847167969,9.568056106567383],[-78.03556823730469,9.230001449584961],[-77.36666870117188,8.67500114440918],[-77.21556091308594,7.937223434448242],[-77.57389831542969,7.525278091430664],[-77.74667358398438,7.722223281860352],[-77.88972473144531,7.228891372680664],[-78.43305969238281,8.051942825317383],[-78.25723266601562,8.101945877075195],[-78.13917541503906,8.403890609741211],[-77.7791748046875,8.155000686645508],[-78.10751342773438,8.455831527709961],[-78.41416931152344,8.344167709350586],[-78.97862243652344,9.142778396606445],[-80.47361755371094,8.212778091430664],[-79.98973083496094,7.516111373901367],[-80.43333435058594,7.244443893432617],[-80.92529296875,7.250001907348633],[-81.05805969238281,7.873334884643555],[-81.17886352539062,7.85499382019043],[-81.21778869628906,7.607221603393555],[-81.4969482421875,7.698610305786133],[-81.73861694335938,8.162500381469727],[-82.19195556640625,8.19444465637207],[-82.2872314453125,8.313333511352539],[-82.7216796875,8.317220687866211],[-82.89884757995605,8.025671005249023],[-82.71084594726562,8.931112289428711],[-82.93472290039062,9.47166633605957],[-82.56356811523438,9.562875747680664],[-82.23695373535156,8.997777938842773],[-81.81639099121094,8.945276260375977],[-81.88389587402344,9.174444198608398],[-81.19612121582031,8.780279159545898],[-79.46305847167969,9.568056106567383]],[[-77.98695373535156,8.242223739624023],[-77.99223327636719,8.250555038452148],[-78.00306701660156,8.25111198425293],[-77.98695373535156,8.242223739624023]]]]}},{"type":"Feature","properties":{"name":"Portugal","iso2":"PT","iso3":"PRT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-17.102500915527344,32.82332801818848],[-16.715557098388672,32.75889015197754],[-16.94361114501953,32.63749885559082],[-17.102500915527344,32.82332801818848]]],[[[-16.28583526611328,33.09416389465332],[-16.400558471679688,33.03860664367676],[-16.325557708740234,33.10805702209473],[-16.28583526611328,33.09416389465332]]],[[[-25.01639175415039,36.9697208404541],[-25.200557708740234,36.9858341217041],[-25.08639144897461,37.02360725402832],[-25.01639175415039,36.9697208404541]]],[[[-25.585002899169922,37.82666206359863],[-25.864723205566406,37.85055732727051],[-25.130279541015625,37.811662673950195],[-25.585002899169922,37.82666206359863]]],[[[-28.14111328125,38.44988441467285],[-28.03778076171875,38.40694618225098],[-28.54944610595703,38.52722358703613],[-28.14111328125,38.44988441467285]]],[[[-27.086944580078125,38.63138771057129],[-27.38500213623047,38.76333045959473],[-27.065834045410156,38.76416206359863],[-27.086944580078125,38.63138771057129]]],[[[-31.215557098388672,39.35333442687988],[-31.213890075683594,39.52194404602051],[-31.123058319091797,39.44888496398926],[-31.215557098388672,39.35333442687988]]],[[[-8.204723358154297,41.87471961975098],[-6.594165802001953,41.9536075592041],[-6.187221527099609,41.579721450805664],[-6.931667327880859,41.01805305480957],[-7.017221450805664,39.674997329711914],[-7.532505035400391,39.66942024230957],[-6.954792022705078,39.026384353637695],[-7.321111679077148,38.44944190979004],[-6.939167022705078,38.178056716918945],[-7.446945190429688,37.69944190979004],[-7.431854248046875,37.253190994262695],[-8.990278244018555,37.02305030822754],[-8.673334121704102,38.413888931274414],[-9.183889389038086,38.41971778869629],[-8.984445571899414,38.94777870178223],[-9.484445571899414,38.71000099182129],[-8.660833358764648,40.68721961975098],[-8.74500846862793,41.95250129699707],[-8.201223373413086,42.15274238586426],[-8.204723358154297,41.87471961975098]]]]}},{"type":"Feature","properties":{"name":"Papua New Guinea","iso2":"PG","iso3":"PNG"},"geometry":{"type":"MultiPolygon","coordinates":[[[[153.77081489562988,-11.616388320922852],[153.376070022583,-11.567222595214844],[153.19803047180176,-11.324167251586914],[153.77081489562988,-11.616388320922852]]],[[[154.29776191711426,-11.391944885253906],[154.00332832336426,-11.383890151977539],[154.15387153625488,-11.314167022705078],[154.29776191711426,-11.391944885253906]]],[[[153.241060256958,-11.268890380859375],[153.21051216125488,-11.285833358764648],[153.09106636047363,-11.197221755981445],[153.241060256958,-11.268890380859375]]],[[[152.87329292297363,-10.662221908569336],[152.74441719055176,-10.716665267944336],[152.54080390930176,-10.63055419921875],[152.87329292297363,-10.662221908569336]]],[[[151.06970405578613,-10.61111068725586],[151.0422077178955,-10.676944732666016],[150.90997505187988,-10.654722213745117],[151.06970405578613,-10.61111068725586]]],[[[150.89221382141113,-10.650833129882812],[150.79080390930176,-10.54222297668457],[150.90027046203613,-10.553054809570312],[150.89221382141113,-10.650833129882812]]],[[[151.116060256958,-10.046667098999023],[151.28137397766113,-9.923334121704102],[151.22912788391113,-10.20111083984375],[150.958589553833,-10.11027717590332],[150.7599811553955,-9.70777702331543],[151.116060256958,-10.046667098999023]]],[[[150.66665840148926,-9.438333511352539],[150.92163276672363,-9.670833587646484],[150.42190742492676,-9.389444351196289],[150.66665840148926,-9.438333511352539]]],[[[150.33914375305176,-9.524723052978516],[150.10830879211426,-9.368610382080078],[150.18914985656738,-9.211111068725586],[150.33914375305176,-9.524723052978516]]],[[[152.81497383117676,-8.972776412963867],[152.99719429016113,-9.173055648803711],[152.49774360656738,-9.021665573120117],[152.81497383117676,-8.972776412963867]]],[[[151.1249713897705,-8.425556182861328],[151.14444160461426,-8.830554962158203],[150.996919631958,-8.52861213684082],[151.1249713897705,-8.425556182861328]]],[[[143.638032913208,-8.733055114746094],[143.18359565734863,-8.420000076293945],[143.46719551086426,-8.527778625488281],[143.638032913208,-8.733055114746094]]],[[[143.57275581359863,-8.493888854980469],[143.3144245147705,-8.376665115356445],[143.57831001281738,-8.37388801574707],[143.57275581359863,-8.493888854980469]]],[[[143.68719673156738,-8.439722061157227],[143.60717964172363,-8.33277702331543],[143.672212600708,-8.35444450378418],[143.68719673156738,-8.439722061157227]]],[[[143.6974811553955,-8.245277404785156],[143.65164375305176,-8.199722290039062],[143.73330879211426,-8.174722671508789],[143.6974811553955,-8.245277404785156]]],[[[143.67776679992676,-8.174722671508789],[143.6049518585205,-8.108888626098633],[143.70025825500488,-8.106109619140625],[143.67776679992676,-8.174722671508789]]],[[[143.73108100891113,-8.071666717529297],[143.58856391906738,-8.071666717529297],[143.56524848937988,-8.020000457763672],[143.73108100891113,-8.071666717529297]]],[[[145.1935749053955,-7.867221832275391],[145.18054389953613,-7.861110687255859],[145.182466506958,-7.827777862548828],[145.1935749053955,-7.867221832275391]]],[[[143.99969673156738,-7.824443817138672],[143.8771686553955,-7.709722518920898],[143.96692085266113,-7.748332977294922],[143.99969673156738,-7.824443817138672]]],[[[154.88244819641113,-5.543333053588867],[155.91858100891113,-6.807777404785156],[155.2399616241455,-6.622499465942383],[154.74438667297363,-5.939779281616211],[154.88244819641113,-5.543333053588867]]],[[[148.0614948272705,-5.777116775512695],[147.86511421203613,-5.747753143310547],[147.78027534484863,-5.494165420532227],[148.0614948272705,-5.777116775512695]]],[[[148.12079048156738,-5.468332290649414],[148.071626663208,-5.424444198608398],[148.099702835083,-5.377498626708984],[148.12079048156738,-5.468332290649414]]],[[[147.60217475891113,-5.361944198608398],[147.5605182647705,-5.318889617919922],[147.60913276672363,-5.288055419921875],[147.60217475891113,-5.361944198608398]]],[[[147.15332221984863,-5.44972038269043],[147.0080280303955,-5.350276947021484],[147.1210651397705,-5.191110610961914],[147.15332221984863,-5.44972038269043]]],[[[154.67553901672363,-5.440832138061523],[154.53027534484863,-5.133888244628906],[154.63916206359863,-5.016387939453125],[154.67553901672363,-5.440832138061523]]],[[[149.15692329406738,-4.923055648803711],[149.118013381958,-4.889444351196289],[149.16192817687988,-4.866388320922852],[149.15692329406738,-4.923055648803711]]],[[[146.24661445617676,-4.857500076293945],[146.19940376281738,-4.833610534667969],[146.21997261047363,-4.788331985473633],[146.24661445617676,-4.857500076293945]]],[[[149.55719184875488,-4.718889236450195],[149.45581245422363,-4.679166793823242],[149.5402545928955,-4.653888702392578],[149.55719184875488,-4.718889236450195]]],[[[159.516939163208,-4.578056335449219],[159.51138496398926,-4.576665878295898],[159.51886177062988,-4.536388397216797],[159.516939163208,-4.578056335449219]]],[[[145.95135688781738,-4.764444351196289],[145.87246894836426,-4.67249870300293],[145.98163032531738,-4.527500152587891],[145.95135688781738,-4.764444351196289]]],[[[154.1552448272705,-4.438055038452148],[154.13272285461426,-4.371665954589844],[154.15277290344238,-4.379444122314453],[154.1552448272705,-4.438055038452148]]],[[[152.23523139953613,-4.207221984863281],[152.40582466125488,-4.688888549804688],[151.970796585083,-4.993331909179688],[152.09607124328613,-5.457221984863281],[151.45941352844238,-5.535833358764648],[150.46856880187988,-6.276111602783203],[149.05691719055176,-6.164165496826172],[148.323091506958,-5.675376892089844],[148.42859077453613,-5.45111083984375],[149.88080024719238,-5.534999847412109],[150.08886909484863,-5.007778167724609],[150.16443061828613,-5.551387786865234],[150.924409866333,-5.487220764160156],[151.67608833312988,-4.908054351806641],[151.51165962219238,-4.204444885253906],[152.23523139953613,-4.207221984863281]],[[149.05359077453613,-6.094165802001953],[149.05414009094238,-6.083889007568359],[149.04385566711426,-6.088611602783203],[149.05359077453613,-6.094165802001953]]],[[[145.05774116516113,-4.135276794433594],[145.06884956359863,-4.045000076293945],[145.109956741333,-4.098333358764648],[145.05774116516113,-4.135276794433594]]],[[[153.64554023742676,-4.140277862548828],[153.58441352844238,-4.095832824707031],[153.65860176086426,-4.019166946411133],[153.64554023742676,-4.140277862548828]]],[[[153.25833320617676,-3.49888801574707],[153.19384956359863,-3.468610763549805],[153.23358345031738,-3.446666717529297],[153.25833320617676,-3.49888801574707]]],[[[154.83304023742676,-3.510276794433594],[154.8185749053955,-3.530277252197266],[154.799409866333,-3.424999237060547],[154.83304023742676,-3.510276794433594]]],[[[153.34524726867676,-3.411943435668945],[153.26248359680176,-3.404443740844727],[153.333589553833,-3.371389389038086],[153.34524726867676,-3.411943435668945]]],[[[152.64636421203613,-3.228610992431641],[152.53888130187988,-3.106109619140625],[152.599702835083,-3.048055648803711],[152.64636421203613,-3.228610992431641]]],[[[150.94134712219238,-2.921943664550781],[151.02163887023926,-2.971942901611328],[150.7660846710205,-2.979442596435547],[150.94134712219238,-2.921943664550781]]],[[[152.06997871398926,-3.001388549804688],[151.97357368469238,-2.848054885864258],[152.07885932922363,-2.928333282470703],[152.06997871398926,-3.001388549804688]]],[[[152.00219917297363,-2.828887939453125],[151.93164253234863,-2.832500457763672],[151.932466506958,-2.708332061767578],[152.00219917297363,-2.828887939453125]]],[[[150.90652656555176,-2.635944366455078],[152.05581855773926,-3.247777938842773],[152.98968696594238,-4.075832366943359],[152.97467231750488,-4.766666412353516],[152.73550605773926,-4.660833358764648],[152.69165229797363,-4.18055534362793],[152.28247261047363,-3.572776794433594],[150.72967720031738,-2.740554809570313],[150.90652656555176,-2.635944366455078]]],[[[141.889986038208,-2.969999313354492],[144.51165962219238,-3.820833206176758],[145.73550605773926,-4.802776336669922],[145.76638984680176,-5.48527717590332],[147.47686958312988,-5.974191665649414],[147.86941719055176,-6.660833358764648],[146.96136665344238,-6.747220993041992],[147.17859077453613,-7.463888168334961],[148.13525581359863,-8.066110610961914],[148.60412788391113,-9.082500457763672],[149.31469917297363,-9.018890380859375],[149.21997261047363,-9.474721908569336],[150.008882522583,-9.631387710571289],[149.71747016906738,-9.826665878295898],[149.914155960083,-10.04888916015625],[150.87829780578613,-10.231666564941406],[150.3691120147705,-10.321945190429688],[150.69134712219238,-10.561111450195312],[150.2096881866455,-10.700555801391602],[149.74774360656738,-10.342777252197266],[147.95245552062988,-10.145833969116211],[147.05523872375488,-9.466665267944336],[146.97247505187988,-9.029167175292969],[146.5866413116455,-8.999164581298828],[146.089693069458,-8.091110229492188],[144.52054023742676,-7.501943588256836],[144.21301460266113,-7.795276641845703],[143.66482734680176,-7.467649459838867],[143.95800971984863,-7.978622436523438],[143.35830879211426,-7.902500152587891],[143.611909866333,-8.243888854980469],[142.13720893859863,-8.225555419921875],[143.11023139953613,-8.470277786254883],[143.331636428833,-9.02833366394043],[142.6388874053955,-9.334722518920898],[141.00702095031738,-9.128467559814453],[141.00247383117676,-2.607084274291992],[141.889986038208,-2.969999313354492]]],[[[152.02221870422363,-2.667499542236328],[151.9577350616455,-2.664722442626953],[151.9838581085205,-2.596111297607422],[152.02221870422363,-2.667499542236328]]],[[[150.45831489562988,-2.653610229492188],[149.948579788208,-2.47166633605957],[150.21637153625488,-2.377777099609375],[150.45831489562988,-2.653610229492188]]],[[[147.8124713897705,-2.349721908569336],[147.81524848937988,-2.243610382080078],[147.8791217803955,-2.293611526489258],[147.8124713897705,-2.349721908569336]]],[[[147.30081367492676,-2.025278091430664],[146.524995803833,-2.190832138061523],[146.63858222961426,-1.978610992431641],[147.30081367492676,-2.025278091430664]]],[[[142.86636543273926,-1.697776794433594],[142.81360054016113,-1.732776641845703],[142.82107734680176,-1.695833206176758],[142.86636543273926,-1.697776794433594]]],[[[149.7196979522705,-1.433332443237305],[149.7319049835205,-1.60333251953125],[149.52777290344238,-1.454442977905273],[149.7196979522705,-1.433332443237305]]],[[[144.52191352844238,-1.395553588867188],[144.50555610656738,-1.380556106567383],[144.51638984680176,-1.381942749023438],[144.52191352844238,-1.395553588867188]]],[[[144.52054023742676,-1.120832443237305],[144.51443672180176,-1.116109848022461],[144.51721382141113,-1.098333358764648],[144.52054023742676,-1.120832443237305]]]]}},{"type":"Feature","properties":{"name":"Guinea-Bissau","iso2":"GW","iso3":"GNB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-15.885834,11.052221],[-15.981111999999882,11.049444000000122],[-15.94639,11.195],[-15.885834,11.052221]]],[[[-16.005836,11.068333],[-16.06139,11.163055],[-15.980556,11.202499000000131],[-16.005836,11.068333]]],[[[-16.088058,11.025555],[-16.24416699999989,11.100555],[-16.0825,11.206944],[-16.088058,11.025555]]],[[[-15.862223,11.199999],[-15.906388999999876,11.224998],[-15.830278,11.300833],[-15.862223,11.199999]]],[[[-15.740002,11.166943],[-15.77639,11.225832000000167],[-15.667501,11.306389],[-15.740002,11.166943]]],[[[-16.17778,11.2152770000001],[-16.264446,11.281666],[-16.160835,11.290277000000103],[-16.17778,11.2152770000001]]],[[[-15.679724,11.439444000000108],[-15.743057,11.458332],[-15.665834,11.502222000000131],[-15.679724,11.439444000000108]]],[[[-16.21278,11.439722],[-16.300556,11.449444],[-16.16444799999988,11.514999],[-16.21278,11.439722]]],[[[-16.250557,11.536665],[-16.419445,11.482777],[-16.393889999999885,11.545832000000132],[-16.250557,11.536665]]],[[[-15.952501,11.423054],[-16.065002,11.44972],[-15.958334,11.594166],[-15.952501,11.423054]]],[[[-15.553057,11.517221],[-15.633612,11.535276],[-15.472223,11.631109000000109],[-15.553057,11.517221]]],[[[-16.031948,11.755833],[-16.162224,11.86861],[-15.978334,11.905832],[-16.031948,11.755833]]],[[[-16.236389,11.836943],[-16.30167,11.971666000000113],[-16.184723,11.876665],[-16.236389,11.836943]]],[[[-14.516945,12.67972200000014],[-13.713139,12.677221],[-13.971035,12.154758],[-13.709167,11.715277],[-14.686944999999895,11.509722],[-15.016847999999868,10.956451000000143],[-15.022779,11.195276],[-15.407223,11.184999],[-15.26528,11.425913],[-15.509167,11.338055],[-15.027223999999876,11.594166],[-15.55666699999989,11.723331],[-14.931946,11.750832],[-15.003889,11.974165000000113],[-15.963335,11.734165000000132],[-15.704445,12.004444],[-15.852779,12.016666],[-16.128056,11.881943],[-16.333893,11.996664],[-16.334446,12.15111],[-16.110558,12.330832],[-16.71777,12.322426],[-14.516945,12.67972200000014]]]]}},{"type":"Feature","properties":{"name":"Qatar","iso2":"QA","iso3":"QAT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[51.51759,25.383415],[51.611664,25.010277],[51.215164,24.620888],[50.830956,24.749966],[51.042496,26.049442],[51.568054,25.908333],[51.51759,25.383415]]]]}},{"type":"Feature","properties":{"name":"Reunion","iso2":"RE","iso3":"REU"},"geometry":{"type":"MultiPolygon","coordinates":[[[[55.709999,-20.998058],[55.674164,-21.37389],[55.219719,-21.027779],[55.709999,-20.998058]]]]}},{"type":"Feature","properties":{"name":"Romania","iso2":"RO","iso3":"ROU"},"geometry":{"type":"MultiPolygon","coordinates":[[[[20.726955,46.17556],[21.176666,46.295555],[22.032497,47.530273],[22.894804,47.95454],[24.91944100000012,47.711662],[26.634995,48.257164],[28.119717,46.854404],[28.21484,45.448647],[29.664331,45.211803],[29.549438,44.820267],[28.868324,44.943047],[28.583244,43.747765],[27.036427,44.147339],[25.430229,43.626778],[24.179996,43.684715],[22.875275,43.842499],[23.044167,44.076111],[22.681435,44.224701],[22.457333,44.474358],[22.764893,44.559006],[22.479164,44.710274],[22.146385,44.479164],[21.400398,44.780823],[21.513611,45.151108],[20.261024,46.114853],[20.726955,46.17556]]]]}},{"type":"Feature","properties":{"name":"Republic of Moldova","iso2":"MD","iso3":"MDA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[28.119717,46.854404],[26.634995,48.257164],[27.755554,48.451385],[29.141937000000155,47.98609200000014],[29.184441,47.443047],[29.949997,46.814156],[30.11694,46.386101],[28.994434,46.47832500000011],[28.971935,46.006653],[28.21484,45.448647],[28.119717,46.854404]]]]}},{"type":"Feature","properties":{"name":"Philippines","iso2":"PH","iso3":"PHL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[119.47221565246582,4.648054122924805],[119.45583534240723,4.90888786315918],[119.51053810119629,4.763887405395508],[119.47221565246582,4.648054122924805]]],[[[120.01915168762207,5.030279159545898],[120.01888465881348,5.02861213684082],[120.01471138000488,5.030832290649414],[120.01915168762207,5.030279159545898]]],[[[119.94719886779785,5.076944351196289],[119.93414497375488,5.075834274291992],[119.94109535217285,5.083612442016602],[119.94719886779785,5.076944351196289]]],[[[120.24414253234863,5.300832748413086],[120.22664833068848,5.306390762329102],[120.23108863830566,5.325002670288086],[120.24414253234863,5.300832748413086]]],[[[120.25360298156738,5.233335494995117],[119.83110237121582,5.059164047241211],[120.17775917053223,5.343610763549805],[120.25360298156738,5.233335494995117]]],[[[125.41470527648926,5.361112594604492],[125.32998847961426,5.38722038269043],[125.40582466125488,5.430276870727539],[125.41470527648926,5.361112594604492]]],[[[125.47831916809082,5.388334274291992],[125.45027351379395,5.421945571899414],[125.47943305969238,5.491945266723633],[125.47831916809082,5.388334274291992]]],[[[120.86971473693848,5.491388320922852],[120.84332466125488,5.585000991821289],[120.90999031066895,5.536111831665039],[120.86971473693848,5.491388320922852]]],[[[121.18387031555176,5.787500381469727],[121.13916206359863,5.785276412963867],[121.1463794708252,5.84889030456543],[121.18387031555176,5.787500381469727]]],[[[121.18525886535645,6.039999008178711],[121.42581367492676,5.95250129699707],[120.87552833557129,5.921110153198242],[121.18525886535645,6.039999008178711]]],[[[121.86303901672363,6.016389846801758],[121.76277351379395,6.09083366394043],[121.95332527160645,6.051111221313477],[121.86303901672363,6.016389846801758]]],[[[120.56833076477051,6.244722366333008],[120.47776985168457,6.264165878295898],[120.59971809387207,6.396112442016602],[120.56833076477051,6.244722366333008]]],[[[122.23027229309082,6.660833358764648],[122.03386878967285,6.411111831665039],[121.79471015930176,6.593610763549805],[122.23027229309082,6.660833358764648]]],[[[118.53360176086426,7.035001754760742],[118.54026985168457,6.965276718139648],[118.41721534729004,7.022222518920898],[118.53360176086426,7.035001754760742]]],[[[125.79498481750488,6.932775497436523],[125.66998481750488,7.075002670288086],[125.69914436340332,7.191667556762695],[125.79498481750488,6.932775497436523]]],[[[117.02221870422363,7.808889389038086],[116.94999885559082,8.032220840454102],[117.06553840637207,8.078611373901367],[117.02221870422363,7.808889389038086]]],[[[117.29886817932129,8.182222366333008],[117.26805305480957,8.306108474731445],[117.31804847717285,8.331110000610352],[117.29886817932129,8.182222366333008]]],[[[126.23665046691895,9.008333206176758],[126.23166084289551,8.998052597045898],[126.22943305969238,9.013055801391602],[126.23665046691895,9.008333206176758]]],[[[126.26361274719238,8.997220993041992],[126.24664497375488,9.013612747192383],[126.26053810119629,9.00666618347168],[126.26361274719238,8.997220993041992]]],[[[123.67498970031738,9.226388931274414],[123.60942268371582,9.092222213745117],[123.45720863342285,9.190553665161133],[123.67498970031738,9.226388931274414]]],[[[124.77858924865723,9.075555801391602],[124.64360237121582,9.155279159545898],[124.67276191711426,9.253053665161133],[124.77858924865723,9.075555801391602]]],[[[123.77361488342285,9.544164657592773],[123.74471473693848,9.595277786254883],[123.84499549865723,9.636110305786133],[123.77361488342285,9.544164657592773]]],[[[125.95247840881348,9.557500839233398],[125.90054512023926,9.616941452026367],[125.93831062316895,9.756387710571289],[125.95247840881348,9.557500839233398]]],[[[126.0486011505127,9.231943130493164],[126.58582496643066,7.285001754760742],[126.16526985168457,6.88166618347168],[126.19165229797363,6.272222518920898],[125.85555458068848,7.349721908569336],[125.65220832824707,7.236665725708008],[125.37719917297363,6.719720840454102],[125.70332527160645,6.027223587036133],[125.40555000305176,5.563333511352539],[125.26361274719238,6.091665267944336],[124.95694160461426,5.851388931274414],[124.1858081817627,6.210554122924805],[123.94859504699707,6.823335647583008],[124.26860237121582,7.374444961547852],[123.6766529083252,7.812498092651367],[123.45471382141113,7.367498397827148],[123.11638069152832,7.72944450378418],[122.83276557922363,7.275278091430664],[122.62387275695801,7.773054122924805],[122.14998817443848,6.905279159545898],[121.92109870910645,6.994165420532227],[122.22331428527832,7.962221145629883],[122.92302894592285,8.15083122253418],[123.37915229797363,8.72722053527832],[123.81804847717285,8.47694206237793],[123.67109870910645,7.953889846801758],[124.43221473693848,8.615274429321289],[124.72747993469238,8.486387252807617],[124.80386543273926,9.001665115356445],[125.51471138000488,9.00666618347168],[125.44026374816895,9.809164047241211],[126.0486011505127,9.231943130493164]]],[[[124.57415962219238,9.854719161987305],[124.56609535217285,9.849443435668945],[124.56553840637207,9.861944198608398],[124.57415962219238,9.863332748413086],[124.57415962219238,9.854719161987305]]],[[[123.38443183898926,9.878885269165039],[123.3722095489502,9.880552291870117],[123.37970161437988,9.888055801391602],[123.38443183898926,9.878885269165039]]],[[[126.11303901672363,9.744443893432617],[125.94553565979004,9.830831527709961],[126.06025886535645,10.054166793823242],[126.11303901672363,9.744443893432617]]],[[[124.48387336730957,10.050832748413086],[124.36554145812988,9.626943588256836],[123.79332160949707,9.72944450378418],[124.14888191223145,10.146944046020508],[124.48387336730957,10.050832748413086]]],[[[125.28692817687988,9.90916633605957],[125.12664985656738,10.155832290649414],[125.21748542785645,10.122220993041992],[125.28692817687988,9.90916633605957]]],[[[125.6594181060791,9.82472038269043],[125.47527503967285,10.131109237670898],[125.64526557922363,10.468889236450195],[125.6594181060791,9.82472038269043]]],[[[119.82721138000488,10.439722061157227],[119.75833320617676,10.556943893432617],[120.00248908996582,10.591386795043945],[119.82721138000488,10.439722061157227]]],[[[124.3672046661377,10.60777473449707],[124.27581977844238,10.587778091430664],[124.32054328918457,10.706941604614258],[124.3672046661377,10.60777473449707]]],[[[124.43747901916504,10.624998092651367],[124.45139503479004,10.714998245239258],[124.51748847961426,10.659444808959961],[124.43747901916504,10.624998092651367]]],[[[122.6352710723877,10.443609237670898],[122.47971534729004,10.487775802612305],[122.6594181060791,10.748331069946289],[122.6352710723877,10.443609237670898]]],[[[125.80246925354004,10.688886642456055],[125.6624927520752,10.750833511352539],[125.69220161437988,10.823610305786133],[125.80246925354004,10.688886642456055]]],[[[123.56387519836426,10.794164657592773],[123.13638496398926,9.836111068725586],[123.29637336730957,9.229719161987305],[123.01471138000488,9.03388786315918],[122.45276832580566,9.973333358764648],[122.85832405090332,10.097497940063477],[122.95247840881348,10.894445419311523],[123.56387519836426,10.794164657592773]]],[[[121.0405445098877,10.79194450378418],[121.00388526916504,10.836111068725586],[121.08110237121582,10.905279159545898],[121.0405445098877,10.79194450378418]]],[[[124.01987648010254,11.11894416809082],[124.02693367004395,10.381940841674805],[123.31025886535645,9.411943435668945],[124.01987648010254,11.11894416809082]]],[[[123.75081825256348,11.147500991821289],[123.69275093078613,11.22138786315918],[123.7330493927002,11.300554275512695],[123.75081825256348,11.147500991821289]]],[[[119.50857734680176,11.335607528686523],[119.71248817443848,10.497499465942383],[117.1858081817627,8.325555801391602],[119.31247901916504,10.582498550415039],[119.21692848205566,10.959997177124023],[119.45610237121582,10.723608016967773],[119.50857734680176,11.335607528686523]]],[[[119.53386878967285,11.362497329711914],[119.52221870422363,11.366666793823242],[119.54026985168457,11.373052597045898],[119.53386878967285,11.362497329711914]]],[[[119.83249092102051,11.376943588256836],[119.71470832824707,11.476110458374023],[119.87137031555176,11.50666618347168],[119.83249092102051,11.376943588256836]]],[[[124.63889503479004,11.293333053588867],[124.94748115539551,11.42500114440918],[125.02998542785645,11.195833206176758],[125.27165412902832,10.29749870300293],[124.98027229309082,10.37916374206543],[125.01471138000488,10.027776718139648],[124.28970527648926,11.541387557983398],[124.63889503479004,11.293333053588867]]],[[[124.58471870422363,11.472497940063477],[124.3388843536377,11.68083381652832],[124.53137397766113,11.679719924926758],[124.58471870422363,11.472497940063477]]],[[[124.83167457580566,11.528886795043945],[124.71805000305176,11.72722053527832],[124.84276008605957,11.591665267944336],[124.83167457580566,11.528886795043945]]],[[[122.22943305969238,11.79777717590332],[122.88081550598145,11.429166793823242],[123.15305519104004,11.600275039672852],[123.12859535217285,11.174444198608398],[121.94331550598145,10.416387557983398],[122.09887886047363,11.69999885559082],[121.8480396270752,11.760000228881836],[122.22943305969238,11.79777717590332]]],[[[119.96527290344238,11.656942367553711],[119.88498878479004,11.976110458374023],[120.07054328918457,11.864999771118164],[119.96527290344238,11.656942367553711]],[[120.04637336730957,11.823331832885742],[120.04609870910645,11.826387405395508],[120.04387092590332,11.824441909790039],[120.04637336730957,11.823331832885742]]],[[[120.26805305480957,11.826944351196289],[120.20276832580566,11.946111679077148],[120.25444221496582,11.982221603393555],[120.26805305480957,11.826944351196289]]],[[[120.08471870422363,11.958608627319336],[120.06553840637207,11.964166641235352],[120.06165504455566,11.992498397827148],[120.08471870422363,11.958608627319336]]],[[[119.95358467102051,12.021665573120117],[119.95025825500488,12.030553817749023],[119.95941352844238,12.036943435668945],[119.95358467102051,12.021665573120117]]],[[[121.13749885559082,12.157499313354492],[121.04276466369629,12.22944450378418],[121.04582405090332,12.290555953979492],[121.13749885559082,12.157499313354492]]],[[[120.16829872131348,12.118330001831055],[120.3399829864502,11.992776870727539],[119.87387275695801,12.314443588256836],[120.16829872131348,12.118330001831055]]],[[[122.68109321594238,12.308053970336914],[122.43248176574707,12.461111068725586],[122.66943550109863,12.483610153198242],[122.68109321594238,12.308053970336914]]],[[[124.4638843536377,12.520833969116211],[125.29694557189941,12.457498550415039],[125.7602710723877,11.011667251586914],[125.26944160461426,11.128053665161133],[124.96999549865723,11.447500228881836],[124.84359931945801,11.466386795043945],[125.04248237609863,11.747220993041992],[124.38693428039551,12.190275192260742],[124.25804328918457,12.55555534362793],[124.4638843536377,12.520833969116211]],[[125.67249488830566,11.089998245239258],[125.68193244934082,11.103609085083008],[125.66470527648926,11.102777481079102],[125.67249488830566,11.089998245239258]]],[[[123.66943550109863,12.346944808959961],[124.07639503479004,11.718332290649414],[123.53027534484863,12.208608627319336],[123.15776252746582,11.908609390258789],[123.24165534973145,12.606943130493164],[123.66943550109863,12.346944808959961]]],[[[122.30693244934082,12.486387252807617],[122.24803352355957,12.56110954284668],[122.28305244445801,12.633333206176758],[122.30693244934082,12.486387252807617]]],[[[123.79221534729004,12.344999313354492],[123.58554267883301,12.660554885864258],[123.72776985168457,12.601663589477539],[123.79221534729004,12.344999313354492]]],[[[122.0486011505127,12.176664352416992],[121.91748237609863,12.304166793823242],[122.12275886535645,12.676942825317383],[122.0486011505127,12.176664352416992]]],[[[123.38247871398926,12.69194221496582],[122.93193244934082,13.10999870300293],[123.0486011505127,13.134721755981445],[123.38247871398926,12.69194221496582]]],[[[124.21805000305176,13.17249870300293],[124.07832527160645,13.211111068725586],[124.16330909729004,13.232221603393555],[124.21805000305176,13.17249870300293]]],[[[124.04609870910645,13.220552444458008],[123.95610237121582,13.232500076293945],[123.91499519348145,13.286386489868164],[124.09887886047363,13.260557174682617],[124.04609870910645,13.220552444458008]]],[[[123.91304206848145,13.24305534362793],[123.87915229797363,13.22944450378418],[123.85386848449707,13.267221450805664],[123.8510913848877,13.35194206237793],[123.93081855773926,13.324441909790039],[123.89048194885254,13.278779983520508],[123.91304206848145,13.24305534362793]]],[[[122.1513843536377,13.39555549621582],[122.13165473937988,13.40083122253418],[122.12608528137207,13.421945571899414],[122.1513843536377,13.39555549621582]]],[[[122.12343788146973,13.404104232788086],[122.00332832336426,13.20222282409668],[121.81331062316895,13.448610305786133],[122.12343788146973,13.404104232788086]]],[[[120.72165107727051,13.477777481079102],[121.5022144317627,13.148889541625977],[121.55832099914551,12.601110458374023],[121.22054481506348,12.230554580688477],[120.30330848693848,13.443609237670898],[120.72165107727051,13.477777481079102]]],[[[120.28193855285645,13.754167556762695],[120.27469825744629,13.668333053588867],[120.07998847961426,13.849164962768555],[120.28193855285645,13.754167556762695]]],[[[124.28736305236816,13.946176528930664],[124.20804023742676,13.515275955200195],[124.03055000305176,13.663888931274414],[124.28736305236816,13.946176528930664]]],[[[124.30108833312988,13.95222282409668],[124.29414558410645,13.95805549621582],[124.30304145812988,13.96360969543457],[124.30108833312988,13.95222282409668]]],[[[124.34221076965332,13.942220687866211],[124.3127613067627,13.954999923706055],[124.32527351379395,13.981943130493164],[124.34221076965332,13.942220687866211]]],[[[122.17109870910645,13.99860954284668],[121.91748237609863,14.185277938842773],[122.12442207336426,14.088888168334961],[122.17109870910645,13.99860954284668]]],[[[122.25417518615723,14.722497940063477],[122.09860420227051,14.837778091430664],[122.21304512023926,14.839166641235352],[122.25417518615723,14.722497940063477]]],[[[122.05081367492676,14.996664047241211],[121.93081855773926,14.62916374206543],[121.81915473937988,14.991666793823242],[122.05081367492676,14.996664047241211]]],[[[120.00026893615723,16.225553512573242],[119.92442512512207,16.2994441986084],[119.97415351867676,16.34666633605957],[120.00277900695801,16.34055519104004],[120.00026893615723,16.225553512573242]]],[[[121.25665473937988,18.566110610961914],[121.93665504455566,18.269445419311523],[122.24165534973145,18.51277732849121],[122.17025947570801,17.607221603393555],[122.53333473205566,17.099443435668945],[121.37886238098145,15.332220077514648],[121.73387336730957,14.170831680297852],[122.23332405090332,13.897222518920898],[122.1655445098877,14.158056259155273],[122.71331977844238,14.33833122253418],[123.0999927520752,13.667497634887695],[123.34305000305176,14.086942672729492],[123.92498970031738,13.789167404174805],[123.53193855285645,13.575555801391602],[123.76277351379395,13.061666488647461],[124.19582557678223,13.057775497436523],[124.08276557922363,12.540555953979492],[123.84887886047363,12.731943130493164],[124.02858924865723,12.963052749633789],[123.32222175598145,13.008611679077148],[122.56099891662598,13.936567306518555],[122.60748481750488,13.163888931274414],[121.75470924377441,13.964445114135742],[121.27942848205566,13.593889236450195],[120.66110420227051,13.768331527709961],[120.59221076965332,14.231111526489258],[120.95665168762207,14.636945724487305],[120.5516529083252,14.826944351196289],[120.49331855773926,14.429719924926758],[120.08611488342285,14.785276412963867],[119.78692817687988,16.32305335998535],[119.92886543273926,16.38499641418457],[119.91914558410645,16.2902774810791],[119.93525886535645,16.242773056030273],[120.15664863586426,16.03611183166504],[120.42192268371582,16.155832290649414],[120.57054328918457,18.49083137512207],[121.25665473937988,18.566110610961914]],[[122.73526191711426,13.774168014526367],[122.74498176574707,13.781667709350586],[122.72747993469238,13.777223587036133],[122.73526191711426,13.774168014526367]]],[[[121.40054512023926,18.847219467163086],[121.27942848205566,18.86610984802246],[121.48442268371582,18.882776260375977],[121.40054512023926,18.847219467163086]]],[[[121.88275337219238,18.83333396911621],[121.83305549621582,18.880552291870117],[121.94609260559082,19.004446029663086],[121.88275337219238,18.83333396911621]]],[[[121.25139045715332,19.011945724487305],[121.20192909240723,19.065275192260742],[121.22026252746582,19.172773361206055],[121.25139045715332,19.011945724487305]]],[[[121.53970527648926,19.26666831970215],[121.37275886535645,19.364442825317383],[121.53055000305176,19.389719009399414],[121.53970527648926,19.26666831970215]]],[[[121.97470283508301,19.479997634887695],[121.90305519104004,19.550275802612305],[121.99359321594238,19.565275192260742],[121.97470283508301,19.479997634887695]]],[[[121.88693428039551,20.283334732055664],[121.84192848205566,20.282499313354492],[121.84636878967285,20.3527774810791],[121.88693428039551,20.283334732055664]]],[[[121.95443916320801,20.348608016967773],[121.92386817932129,20.4072208404541],[122.02665901184082,20.48333168029785],[121.95443916320801,20.348608016967773]]],[[[121.81218910217285,20.686662673950195],[121.87082099914551,20.8347225189209],[121.88333320617676,20.765275955200195],[121.81218910217285,20.686662673950195]]],[[[121.95694160461426,21.103609085083008],[121.94941902160645,21.106107711791992],[121.94970893859863,21.11805534362793],[121.95694160461426,21.103609085083008]]]]}},{"type":"Feature","properties":{"name":"Puerto Rico","iso2":"PR","iso3":"PRI"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-67.880569,18.048332],[-67.93084699999989,18.109722000000104],[-67.84668,18.10749800000012],[-67.880569,18.048332]]],[[[-65.441391,18.090275],[-65.580292,18.114719],[-65.301117,18.147778],[-65.441391,18.090275]]],[[[-65.242783,18.302219],[-65.27528399999989,18.276943],[-65.338898,18.346664],[-65.242783,18.302219]]],[[[-66.99667399999987,18.504997],[-65.603058,18.232498],[-67.1872249999999,17.932499],[-67.266113,18.368053],[-66.99667399999987,18.504997]]]]}},{"type":"Feature","properties":{"name":"Russia","iso2":"RU","iso3":"RUS"},"geometry":{"type":"MultiPolygon","coordinates":[[[[131.87329292297363,42.95694160461426],[131.77997016906738,43.04944038391113],[131.9172077178955,43.02110481262207],[131.87329292297363,42.95694160461426]]],[[[146.13748359680176,43.45888710021973],[146.07608222961426,43.51333045959473],[146.22607612609863,43.52555274963379],[146.13748359680176,43.45888710021973]]],[[[146.66998481750488,43.70443916320801],[146.60467720031738,43.80388069152832],[146.90497016906738,43.83999061584473],[146.66998481750488,43.70443916320801]]],[[[47.73971748352051,43.93221473693848],[47.62803840637207,43.974435806274414],[47.78555488586426,43.958879470825195],[47.73971748352051,43.93221473693848]]],[[[146.148042678833,44.50999641418457],[146.56802558898926,44.43832588195801],[145.4374713897705,43.716936111450195],[146.148042678833,44.50999641418457]]],[[[148.82525825500488,45.33499336242676],[146.84051704406738,44.415544509887695],[147.93274116516113,45.4213809967041],[148.82525825500488,45.33499336242676]]],[[[47.96249580383301,45.50499153137207],[47.960275650024414,45.65304756164551],[47.99387550354004,45.53665351867676],[47.96249580383301,45.50499153137207]]],[[[48.468881607055664,45.67388343811035],[48.33777046203613,45.79721260070801],[48.404428482055664,45.794992446899414],[48.468881607055664,45.67388343811035]]],[[[48.72331428527832,45.698320388793945],[48.591928482055664,45.74749183654785],[48.49582862854004,45.882211685180664],[48.72331428527832,45.698320388793945]]],[[[150.0663776397705,45.847490310668945],[149.4374713897705,45.58360481262207],[150.49856758117676,46.19249153137207],[150.0663776397705,45.847490310668945]]],[[[150.874116897583,46.44082832336426],[150.79852485656738,46.44998359680176],[150.84192085266113,46.47110176086426],[150.874116897583,46.44082832336426]]],[[[150.764986038208,46.70388221740723],[150.730806350708,46.72276496887207],[150.76220893859863,46.727487564086914],[150.764986038208,46.70388221740723]]],[[[152.22552680969238,47.17471504211426],[152.013032913208,46.88888740539551],[151.71219062805176,46.801103591918945],[152.22552680969238,47.17471504211426]]],[[[152.519136428833,47.30721473693848],[152.388032913208,47.34415626525879],[152.5038776397705,47.377214431762695],[152.519136428833,47.30721473693848]]],[[[153.0160846710205,47.69304847717285],[153.07412910461426,47.80832862854004],[153.08026313781738,47.71415901184082],[153.0160846710205,47.69304847717285]]],[[[153.29052925109863,48.053606033325195],[153.13775825500488,48.10110664367676],[153.22329902648926,48.1330509185791],[153.29052925109863,48.053606033325195]]],[[[154.01944160461426,48.72332191467285],[154.11218452453613,48.89499855041504],[154.228853225708,48.90249061584473],[154.01944160461426,48.72332191467285]]],[[[153.9819049835205,48.92666053771973],[153.90191841125488,48.969987869262695],[154.00470161437988,48.96360969543457],[153.9819049835205,48.92666053771973]]],[[[154.454683303833,49.16916084289551],[154.5988483428955,49.11194038391113],[154.50055122375488,49.07444190979004],[154.454683303833,49.16916084289551]]],[[[154.7157917022705,49.26388740539551],[154.60244941711426,49.373605728149414],[154.90442085266113,49.624162673950195],[154.7157917022705,49.26388740539551]]],[[[154.42498970031738,49.73360633850098],[154.3749713897705,49.82499885559082],[154.45996284484863,49.81388282775879],[154.42498970031738,49.73360633850098]]],[[[155.78552436828613,50.18499183654785],[155.208589553833,50.080827713012695],[156.10412788391113,50.76111030578613],[155.78552436828613,50.18499183654785]]],[[[156.4038257598877,50.653398513793945],[156.16443061828613,50.72860145568848],[156.46386909484863,50.86944007873535],[156.4038257598877,50.653398513793945]]],[[[155.62079048156738,50.806100845336914],[155.44775581359863,50.897775650024414],[155.63916206359863,50.92083168029785],[155.62079048156738,50.806100845336914]]],[[[143.66192817687988,49.312211990356445],[143.2460651397705,49.379159927368164],[143.32025337219238,49.313608169555664],[143.66192817687988,49.312211990356445],[143.01776313781738,49.139719009399414],[142.53470039367676,48.00277900695801],[143.08828926086426,46.80166053771973],[143.49164009094238,46.808603286743164],[143.4738483428955,46.0927677154541],[143.37857246398926,46.5483341217041],[142.7096881866455,46.744157791137695],[142.07745552062988,45.89138221740723],[141.81274604797363,46.58610725402832],[142.18887519836426,47.97526741027832],[141.85244941711426,48.75027656555176],[142.26721382141113,51.12027168273926],[141.638032913208,52.31582832336426],[141.766939163208,53.37137794494629],[142.7983112335205,53.69748878479004],[142.39386177062988,54.237497329711914],[142.696626663208,54.42471504211426],[143.29080390930176,53.13027381896973],[143.220796585083,51.521379470825195],[144.75164985656738,48.64193916320801],[143.66192817687988,49.312211990356445]]],[[[137.77997016906738,54.36638832092285],[137.70831489562988,54.368600845336914],[137.91388130187988,54.50777626037598],[137.77997016906738,54.36638832092285]]],[[[137.632173538208,54.41304969787598],[137.54886054992676,54.5049991607666],[137.61856269836426,54.56527137756348],[137.632173538208,54.41304969787598]]],[[[19.697778701782227,54.479440689086914],[19.65110969543457,54.455827713012695],[19.627260208129883,54.463274002075195],[19.898202896118164,54.625959396362305],[19.697778701782227,54.479440689086914]]],[[[167.855806350708,54.68138313293457],[168.1169147491455,54.50777626037598],[167.43298530578613,54.86307716369629],[167.855806350708,54.68138313293457]]],[[[137.18829536437988,55.10222053527832],[137.04608345031738,54.917497634887695],[136.66726875305176,54.90506172180176],[137.18829536437988,55.10222053527832]]],[[[137.99133491516113,54.88555335998535],[137.70718574523926,54.61832618713379],[137.22131538391113,54.77372169494629],[137.57831001281738,55.1905460357666],[138.20413398742676,55.04388618469238],[137.99133491516113,54.88555335998535]]],[[[21.431386947631836,55.25193977355957],[22.842496871948242,54.89694404602051],[22.785886764526367,54.363840103149414],[19.797006607055664,54.437551498413086],[20.405000686645508,54.67916297912598],[19.872713088989258,54.64055061340332],[19.96944236755371,54.95749855041504],[20.942834854125977,55.28720283508301],[20.98481559753418,55.27655220031738],[20.538053512573242,54.94943428039551],[21.222497940063477,54.93194007873535],[21.26393699645996,55.24898719787598],[21.431386947631836,55.25193977355957]]],[[[166.1191120147705,55.3286075592041],[166.66302680969238,54.67416572570801],[165.83801460266113,55.26444435119629],[166.1191120147705,55.3286075592041]]],[[[164.65692329406738,59.08443641662598],[163.38553047180176,58.559404373168945],[163.69940376281738,59.01444435119629],[164.65692329406738,59.08443641662598]]],[[[150.59051704406738,59.01971626281738],[150.4545612335205,59.01780128479004],[150.74383735656738,59.11194038391113],[150.59051704406738,59.01971626281738]]],[[[149.10467720031738,59.18776893615723],[148.941011428833,59.141672134399414],[149.00525093078613,59.21110725402832],[149.10467720031738,59.18776893615723]]],[[[155.55581855773926,59.32193946838379],[155.47830390930176,59.317216873168945],[155.55581855773926,59.35916328430176],[155.55581855773926,59.32193946838379]]],[[[28.693052291870117,60.267770767211914],[28.551111221313477,60.349435806274414],[28.714998245239258,60.31138038635254],[28.693052291870117,60.267770767211914]]],[[[35.991106033325195,64.3258228302002],[35.854440689086914,64.40582466125488],[36.047494888305664,64.35554695129395],[35.991106033325195,64.3258228302002]]],[[[-172.54446411132812,64.61331367492676],[-172.75808715820312,64.66079902648926],[-172.48831176757812,64.63360786437988],[-172.54446411132812,64.61331367492676]]],[[[40.412492752075195,64.65359687805176],[40.47137641906738,64.56608772277832],[39.97471046447754,64.6827564239502],[40.412492752075195,64.65359687805176]]],[[[-172.590576171875,64.70331001281738],[-172.53115844726562,64.8430347442627],[-172.17111206054688,64.79525947570801],[-172.590576171875,64.70331001281738]]],[[[35.79083442687988,64.97331428527832],[35.52469825744629,65.15887641906738],[35.83443641662598,65.16832160949707],[35.79083442687988,64.97331428527832]]],[[[36.061662673950195,65.19026374816895],[36.30082893371582,65.20109748840332],[35.94332313537598,65.18193244934082],[36.061662673950195,65.19026374816895]]],[[[-169.0533447265625,65.74914741516113],[-169.07501220703125,65.81552314758301],[-168.98974609375,65.8088550567627],[-169.0533447265625,65.74914741516113]]],[[[69.33499336242676,66.6544361114502],[69.24331855773926,66.69331550598145],[69.33333015441895,66.71887397766113],[69.33499336242676,66.6544361114502]]],[[[70.03387641906738,66.72387886047363],[69.78915596008301,66.78027534484863],[69.95359992980957,66.76111030578613],[70.03387641906738,66.72387886047363]]],[[[42.7066593170166,66.68637275695801],[42.43249702453613,66.75860786437988],[42.62276649475098,66.78221321105957],[42.7066593170166,66.68637275695801]]],[[[69.2522144317627,66.78997993469238],[70.05525398254395,66.70332527160645],[70.10443305969238,66.53109931945801],[69.84109687805176,66.47831916809082],[69.41943550109863,66.76971626281738],[69.12664985656738,66.7885913848877],[69.2522144317627,66.78997993469238]]],[[[54.21193885803223,68.24971199035645],[54.28305244445801,68.33665657043457],[54.33693885803223,68.30386543273926],[54.21193885803223,68.24971199035645]]],[[[53.949716567993164,68.29275703430176],[53.86888313293457,68.34610176086426],[54.01333045959473,68.3621997833252],[53.949716567993164,68.29275703430176]]],[[[50.814157485961914,68.3722095489502],[51.16388130187988,68.4952564239502],[51.4566593170166,68.47693061828613],[50.814157485961914,68.3722095489502]]],[[[57.92083168029785,68.80331611633301],[57.86471748352051,68.76193428039551],[57.19999885559082,68.71887397766113],[57.92083168029785,68.80331611633301]]],[[[67.38304328918457,68.7774829864502],[67.14888191223145,68.82193183898926],[67.33859443664551,68.81915473937988],[67.38304328918457,68.7774829864502]]],[[[55.47231483459473,68.90904426574707],[55.224565505981445,68.90986824035645],[55.50842475891113,68.91211128234863],[55.47231483459473,68.90904426574707]]],[[[-179.62612915039062,68.90635871887207],[-175.463623046875,67.70747566223145],[-175.19110107421875,67.51080513000488],[-175.38031005859375,67.3449878692627],[-174.83029174804688,67.38273811340332],[-174.7427978515625,66.77304267883301],[-175.00033569335938,66.67109870910645],[-174.46194458007812,66.30107307434082],[-173.7586669921875,66.44803047180176],[-174.30307006835938,66.57776069641113],[-173.995849609375,66.69134712219238],[-174.12527465820312,66.98913764953613],[-174.65252685546875,67.06360054016113],[-173.66696166992188,67.13165473937988],[-173.17669677734375,67.06331062316895],[-173.35250854492188,66.83886909484863],[-171.72610473632812,66.95524787902832],[-170.64447021484375,66.2371997833252],[-169.69110107421875,66.07249641418457],[-170.58779907226562,65.86360359191895],[-170.63558959960938,65.61053657531738],[-171.544189453125,65.83360481262207],[-171.11557006835938,65.47636604309082],[-172.80029296875,65.6816577911377],[-172.1905517578125,65.44662666320801],[-172.693359375,65.23275947570801],[-172.12612915039062,65.08636665344238],[-173.20086669921875,64.78608894348145],[-172.3558349609375,64.45831489562988],[-173.19140625,64.25442695617676],[-173.413330078125,64.61998176574707],[-173.68167114257812,64.34721565246582],[-175.44888305664062,64.78442573547363],[-176.07806396484375,65.47026252746582],[-178.56307983398438,65.51638984680176],[-178.46054077148438,65.73637580871582],[-178.90945434570312,65.99386787414551],[-178.51699829101562,66.40277290344238],[-179.69558715820312,66.18303108215332],[-179.79837036132812,65.87051582336426],[-179.31500244140625,65.53608894348145],[-180,65.06891059875488],[-180,68.98010444641113],[-179.62612915039062,68.90635871887207]]],[[[54.65416145324707,68.9558277130127],[54.56777381896973,68.9558277130127],[54.69415473937988,68.99136543273926],[54.65416145324707,68.9558277130127]]],[[[66.17192268371582,69.08777046203613],[66.53776741027832,68.94359016418457],[65.95193672180176,69.09387397766113],[66.17192268371582,69.08777046203613]]],[[[59.23943519592285,69.17581367492676],[58.76055335998535,69.33360481262207],[59.19388008117676,69.23387336730957],[59.23943519592285,69.17581367492676]]],[[[34.40471076965332,69.33943367004395],[33.97304725646973,69.36609077453613],[34.2133731842041,69.4027271270752],[34.40471076965332,69.33943367004395]]],[[[67.13109016418457,69.36137580871582],[66.93803596496582,69.44359016418457],[67.21054267883301,69.42581367492676],[67.13109016418457,69.36137580871582]]],[[[50.30526924133301,69.16192817687988],[48.91276741027832,68.7361011505127],[48.21610450744629,68.89499092102051],[48.31276893615723,69.27916145324707],[48.94332313537598,69.50694465637207],[50.30526924133301,69.16192817687988]]],[[[161.44330024719238,68.88998603820801],[161.45800971984863,68.99553108215332],[161.13443183898926,69.08970832824707],[161.09634590148926,69.47053718566895],[161.37774848937988,69.53221321105957],[161.3888874053955,69.45915412902832],[161.28933906555176,69.41586494445801],[161.36136054992676,69.35859870910645],[161.31997871398926,69.24109077453613],[161.38611030578613,69.10247993469238],[161.51526069641113,68.9871997833252],[161.50915718078613,68.9155445098877],[161.44330024719238,68.88998603820801]]],[[[67.25248908996582,69.44470405578613],[67.02110481262207,69.4861011505127],[67.33831977844238,69.5888843536377],[67.25248908996582,69.44470405578613]]],[[[161.43774604797363,69.40803718566895],[161.3949909210205,69.59082221984863],[161.62219429016113,69.58859443664551],[161.43774604797363,69.40803718566895]]],[[[170.1510944366455,69.7341480255127],[169.984956741333,69.74803352355957],[170.20331001281738,69.78831672668457],[170.1510944366455,69.7341480255127]]],[[[169.4474811553955,69.80887031555176],[168.86828804016113,69.5677661895752],[167.7519245147705,69.82748603820801],[169.4474811553955,69.80887031555176]]],[[[83.0969409942627,70.12498664855957],[82.76860237121582,70.2088794708252],[82.86387825012207,70.25166511535645],[83.08276557922363,70.21859931945801],[83.11360359191895,70.19331550598145],[83.0969409942627,70.12498664855957]]],[[[59.46110725402832,70.27665901184082],[60.54610633850098,69.79915046691895],[59.60166358947754,69.71249580383301],[58.40860176086426,70.25027656555176],[59.03305244445801,70.47886848449707],[59.46110725402832,70.27665901184082]]],[[[83.55026435852051,70.46360969543457],[83.61276435852051,70.4377613067627],[83.53360176086426,70.37719917297363],[83.37970161437988,70.36499214172363],[83.4124927520752,70.44026374816895],[83.62442207336426,70.52415657043457],[83.55026435852051,70.46360969543457]]],[[[57.20471382141113,70.50888252258301],[56.965829849243164,70.51748847961426],[56.84166145324707,70.59915351867676],[57.20471382141113,70.50888252258301]]],[[[162.38189888000488,70.67915534973145],[162.484956741333,70.65109443664551],[162.23663520812988,70.65915107727051],[162.38189888000488,70.67915534973145]]],[[[83.3722095489502,70.68609809875488],[83.0697193145752,70.39776802062988],[83.21415901184082,70.80720710754395],[83.3722095489502,70.68609809875488]]],[[[161.69384956359863,70.75027656555176],[161.46328926086426,70.80359077453613],[161.65774726867676,70.80859565734863],[161.69384956359863,70.75027656555176]]],[[[160.6191120147705,70.81469917297363],[160.40802192687988,70.91914558410645],[160.71978950500488,70.81851387023926],[160.6191120147705,70.81469917297363]]],[[[53.59527015686035,71.11026191711426],[53.43249702453613,71.13693428039551],[53.542497634887695,71.18387031555176],[53.59527015686035,71.11026191711426]]],[[[53.360551834106445,71.29220771789551],[53.20416450500488,71.31109809875488],[53.129159927368164,71.35859870910645],[53.360551834106445,71.29220771789551]]],[[[52.85860633850098,71.3783130645752],[53.20749855041504,71.25110054016113],[53.14193916320801,70.97831916809082],[52.20888710021973,71.30554389953613],[52.85860633850098,71.3783130645752]]],[[[-175.620849609375,71.37776374816895],[-175.92361450195312,71.42581367492676],[-175.76419067382812,71.42440986633301],[-175.620849609375,71.37776374816895]]],[[[137.96109199523926,71.50305366516113],[137.67691230773926,71.41165351867676],[136.99133491516113,71.51555061340332],[137.96109199523926,71.50305366516113]]],[[[180.00000190734863,71.53586006164551],[180.00000190734863,70.9972095489502],[178.79101753234863,70.7964038848877],[178.61773872375488,71.0355396270752],[180.00000190734863,71.53586006164551]]],[[[-178.568603515625,71.56414985656738],[-177.439453125,71.22693061828613],[-180,70.9972095489502],[-180,71.53584480285645],[-178.568603515625,71.56414985656738]]],[[[138.5160846710205,71.8560962677002],[138.27386665344238,71.85998725891113],[138.36245918273926,71.88554573059082],[138.5160846710205,71.8560962677002]]],[[[128.1430377960205,72.5788745880127],[129.56109809875488,72.22526741027832],[128.76361274719238,72.07415962219238],[127.54971504211426,72.43332099914551],[126.65027046203613,72.43609809875488],[128.1430377960205,72.5788745880127]]],[[[77.76249885559082,72.29525947570801],[76.85470771789551,72.32998847961426],[77.6202564239502,72.63054084777832],[78.39305305480957,72.4891529083252],[77.76249885559082,72.29525947570801]]],[[[128.83886909484863,72.57666206359863],[128.10052680969238,72.63195991516113],[128.97220039367676,72.59082221984863],[128.83886909484863,72.57666206359863]]],[[[72.99304389953613,72.60247993469238],[72.84054756164551,72.67498970031738],[72.98498725891113,72.67608833312988],[72.99304389953613,72.60247993469238]]],[[[129.355806350708,72.7027759552002],[127.31414985656738,72.65332221984863],[128.30191230773926,72.78776741027832],[129.355806350708,72.7027759552002]]],[[[129.23025703430176,72.83194160461426],[129.29803657531738,72.80026435852051],[128.29052925109863,72.86609077453613],[129.23025703430176,72.83194160461426]]],[[[122.95583534240723,72.86331367492676],[123.60582160949707,72.77777290344238],[122.30246925354004,72.93748664855957],[122.95583534240723,72.86331367492676]]],[[[74.86276435852051,73.08970832824707],[74.6544361114502,72.85582160949707],[74.08970832824707,73.02054023742676],[74.86276435852051,73.08970832824707]]],[[[79.57083320617676,72.73027229309082],[78.57859992980957,72.84553718566895],[79.19470405578613,73.09582710266113],[79.57083320617676,72.73027229309082]]],[[[120.2138843536377,73.04248237609863],[119.62970161437988,73.11470222473145],[120.0869312286377,73.1524829864502],[120.2138843536377,73.04248237609863]]],[[[76.4527759552002,73.19053840637207],[76.73748970031738,73.15359687805176],[76.12275886535645,73.20721626281738],[76.4527759552002,73.19053840637207]]],[[[71.34109687805176,73.32499885559082],[71.13998603820801,73.28970527648926],[71.26277351379395,73.41415596008301],[71.34109687805176,73.32499885559082]]],[[[55.33166694641113,73.32998847961426],[56.58860206604004,73.13749885559082],[55.61527442932129,72.96138191223145],[56.262216567993164,72.96081733703613],[55.4294376373291,72.78415107727051],[55.94554328918457,72.66665840148926],[55.118051528930664,72.44803047180176],[55.57583045959473,72.1958179473877],[55.221017837524414,71.92561531066895],[56.228044509887695,71.19413948059082],[57.63999366760254,70.72638130187988],[55.18631935119629,70.55206489562988],[53.46360969543457,70.81387519836426],[53.74332618713379,70.94304084777832],[53.50833320617676,71.08610725402832],[54.24499702453613,71.12664985656738],[53.453325271606445,71.26111030578613],[53.9294376373291,71.4669361114502],[53.480546951293945,71.29165840148926],[53.3558292388916,71.56721687316895],[51.79722023010254,71.4749927520752],[51.41610145568848,71.73776435852051],[51.57444190979004,72.07083320617676],[52.39721870422363,72.07609748840332],[53.097490310668945,72.59471321105957],[52.74888038635254,72.63304328918457],[53.219438552856445,72.64721870422363],[52.37638282775879,72.72470283508301],[53.38193702697754,72.88109016418457],[53.15332221984863,73.15582466125488],[54.914438247680664,73.42221260070801],[55.33166694641113,73.32998847961426]]],[[[71.04693794250488,73.50000190734863],[71.26500129699707,73.43637275695801],[70.99914741516113,73.28888130187988],[71.6766529083252,73.17692756652832],[69.86638069152832,73.03276252746582],[69.97442817687988,73.40721321105957],[71.04693794250488,73.50000190734863]]],[[[127.29637336730957,73.51721382141113],[129.11828804016113,73.09471321105957],[126.58943367004395,72.53581428527832],[126.52693367004395,72.40054512023926],[126.30246925354004,72.50110054016113],[126.44999885559082,72.7855396270752],[126.3338794708252,72.89721870422363],[126.77192878723145,73.07638740539551],[126.6594181060791,73.41693305969238],[127.29637336730957,73.51721382141113]]],[[[76.3902759552002,73.52083015441895],[76.76609992980957,73.43387031555176],[76.07415962219238,73.5213794708252],[76.3902759552002,73.52083015441895]]],[[[128.05554389953613,73.4830493927002],[127.38804817199707,73.52026557922363],[127.70776557922363,73.5355396270752],[128.05554389953613,73.4830493927002]]],[[[80.36053657531738,73.50027656555176],[80.05664253234863,73.55581855773926],[80.40359687805176,73.54609870910645],[80.36053657531738,73.50027656555176]]],[[[76.0777759552002,73.55803108215332],[75.30632209777832,73.41833686828613],[75.62109565734863,73.54998970031738],[76.0777759552002,73.55803108215332]]],[[[124.60443305969238,73.72859382629395],[125.56025886535645,73.40304756164551],[126.30887031555176,73.54582405090332],[126.15664863586426,73.37442207336426],[126.71499824523926,73.08442878723145],[126.27805519104004,72.87997627258301],[126.38582038879395,72.79275703430176],[126.24443244934082,72.51887702941895],[126.34832954406738,72.37997627258301],[126.12552833557129,72.30053901672363],[124.76500129699707,72.67082405090332],[122.42804145812988,72.98193550109863],[123.65886878967285,73.16804695129395],[123.21914863586426,73.40471076965332],[123.37692451477051,73.6624927520752],[124.60443305969238,73.72859382629395]]],[[[142.15497016906738,73.88998603820801],[143.43191719055176,73.52249336242676],[143.5058307647705,73.23027229309082],[139.65359687805176,73.40220832824707],[142.15497016906738,73.88998603820801]]],[[[124.54525947570801,73.85331916809082],[124.28777503967285,73.88443183898926],[124.65999031066895,73.89804267883301],[124.54525947570801,73.85331916809082]]],[[[86.4871997833252,73.90887641906738],[86.22331428527832,73.96638679504395],[86.30137825012207,73.97720527648926],[86.4871997833252,73.90887641906738]]],[[[84.41914558410645,74.03193855285645],[84.38943672180176,73.95555305480957],[83.87942695617676,74.00665473937988],[84.41914558410645,74.03193855285645]]],[[[82.60971260070801,74.0486011505127],[82.31469917297363,74.11442756652832],[82.73637580871582,74.09887886047363],[82.60971260070801,74.0486011505127]]],[[[83.61581611633301,74.09305000305176],[82.8158130645752,74.09109687805176],[83.2027759552002,74.14972114562988],[83.61581611633301,74.09305000305176]]],[[[85.53442573547363,74.12747383117676],[85.40887641906738,74.18969917297363],[85.73278999328613,74.16862678527832],[85.53442573547363,74.12747383117676]]],[[[135.649995803833,74.20359992980957],[136.27249336242676,73.9358081817627],[135.35357856750488,74.25277900695801],[135.649995803833,74.20359992980957]]],[[[141.02054023742676,73.99275398254395],[140.07275581359863,74.09776496887207],[140.87439155578613,74.27110481262207],[141.02054023742676,73.99275398254395]]],[[[116.06888008117676,74.28692817687988],[115.88582038879395,74.32026863098145],[116.06749153137207,74.36914253234863],[116.06888008117676,74.28692817687988]]],[[[59.033884048461914,74.34276008605957],[58.93499183654785,74.35832405090332],[59.08111000061035,74.40915107727051],[59.033884048461914,74.34276008605957]]],[[[84.94525337219238,74.47776985168457],[84.74443244934082,74.39526557922363],[84.37303352355957,74.44859504699707],[84.94525337219238,74.47776985168457]]],[[[112.71331977844238,74.49887275695801],[113.43332099914551,74.39387702941895],[112.78777503967285,74.0919361114502],[111.45555305480957,74.3166675567627],[112.71331977844238,74.49887275695801]]],[[[85.43942451477051,74.45359992980957],[85.14499092102051,74.54026985168457],[85.65332221984863,74.5294361114502],[85.43942451477051,74.45359992980957]]],[[[86.21249580383301,74.5183277130127],[85.65942573547363,74.47053718566895],[85.82361030578613,74.57026863098145],[86.21249580383301,74.5183277130127]]],[[[79.38611030578613,74.6172046661377],[79.6121997833252,74.5949878692627],[79.14915657043457,74.6030445098877],[79.38611030578613,74.6172046661377]]],[[[85.65555000305176,74.79165840148926],[85.70027351379395,74.72165107727051],[85.09553718566895,74.74775886535645],[85.65555000305176,74.79165840148926]]],[[[87.04971504211426,74.97915840148926],[86.83526802062988,74.82638740539551],[86.21110725402832,74.89860725402832],[87.04971504211426,74.97915840148926]]],[[[82.15193367004395,75.11554145812988],[82.02720832824707,75.1283130645752],[82.10748481750488,75.15832710266113],[82.15193367004395,75.11554145812988]]],[[[82.10582160949707,75.41220283508301],[82.29193305969238,75.33055305480957],[82.01193428039551,75.17221260070801],[81.49304389953613,75.35832405090332],[82.10582160949707,75.41220283508301]]],[[[147.01831245422363,75.33471870422363],[150.95303535461426,75.13943672180176],[148.70440864562988,74.75999641418457],[146.07025337219238,75.22665596008301],[146.41497993469238,75.58610725402832],[147.01831245422363,75.33471870422363]]],[[[140.745943069458,75.65185737609863],[140.51944160461426,75.7058277130127],[140.7699909210205,75.67720222473145],[140.745943069458,75.65185737609863]]],[[[135.65387153625488,75.36499214172363],[135.44412422180176,75.4408130645752],[135.70800971984863,75.8499927520752],[136.17776679992676,75.61914253234863],[135.65387153625488,75.36499214172363]]],[[[59.19249153137207,75.88804817199707],[58.993608474731445,75.89109992980957],[59.278329849243164,75.90832710266113],[59.19249153137207,75.88804817199707]]],[[[81.60026741027832,75.93525886535645],[82.25694465637207,75.86943244934082],[81.55081367492676,75.9236011505127],[81.60026741027832,75.93525886535645]]],[[[82.9730396270752,75.96914863586426],[83.30247688293457,75.94136238098145],[82.2572193145752,75.95860481262207],[82.9730396270752,75.96914863586426]]],[[[58.754716873168945,75.89694404602051],[58.694711685180664,75.8994312286377],[59.26693916320801,75.96943855285645],[58.754716873168945,75.89694404602051]]],[[[96.76693916320801,75.97526741027832],[96.6958179473877,76.01138496398926],[97.33728218078613,76.10208320617676],[96.76693916320801,75.97526741027832]]],[[[140.91079902648926,76.06694221496582],[140.84720039367676,76.09553718566895],[141.07940864562988,76.10942268371582],[140.91079902648926,76.06694221496582]]],[[[60.472490310668945,76.15999031066895],[59.866106033325195,76.10415840148926],[60.04110908508301,76.15693855285645],[60.472490310668945,76.15999031066895]]],[[[139.19079780578613,76.07222175598145],[140.47912788391113,75.63611030578613],[141.06079292297363,75.64526557922363],[140.9718952178955,76.03915596008301],[141.61969184875488,76.01249885559082],[141.35663032531738,76.18054389953613],[145.39471626281738,75.51748847961426],[143.94970893859863,75.02693367004395],[142.90359687805176,75.13388252258301],[142.50604438781738,75.45372200012207],[143.04052925109863,75.66971015930176],[142.4474811553955,75.71110725402832],[142.1552448272705,75.37553596496582],[142.61245918273926,75.09971809387207],[143.70691108703613,74.93858528137207],[139.6469440460205,74.97915840148926],[139.09607124328613,74.64721870422363],[136.86136054992676,75.34915351867676],[137.40497016906738,75.35220527648926],[136.95855903625488,75.60421943664551],[137.74469184875488,75.74832344055176],[137.44998359680176,75.95471382141113],[139.19079780578613,76.07222175598145]]],[[[152.74133491516113,76.10775947570801],[152.45523262023926,76.15693855285645],[152.75665473937988,76.2119312286377],[152.74133491516113,76.10775947570801]]],[[[95.19941902160645,76.15776252746582],[95.00277900695801,76.17248725891113],[95.08450508117676,76.22079658508301],[95.19941902160645,76.15776252746582]]],[[[94.99748420715332,76.26915168762207],[94.84027290344238,76.17943000793457],[94.40803718566895,76.20498847961426],[94.99748420715332,76.26915168762207]]],[[[96.36638069152832,76.30108833312988],[96.6494312286377,76.24887275695801],[95.26361274719238,76.21304512023926],[96.36638069152832,76.30108833312988]]],[[[96.75694465637207,76.3227710723877],[96.66470527648926,76.29248237609863],[96.38304328918457,76.33194160461426],[96.75694465637207,76.3227710723877]]],[[[96.99748420715332,76.27720832824707],[96.71110725402832,76.21360969543457],[96.83442878723145,76.3469409942627],[96.99748420715332,76.27720832824707]]],[[[113.43997383117676,76.36053657531738],[113.11876106262207,76.36999702453613],[113.25888252258301,76.43637275695801],[113.43997383117676,76.36053657531738]]],[[[94.35721015930176,76.57443428039551],[93.86998176574707,76.58499336242676],[93.95181465148926,76.60981941223145],[94.35721015930176,76.57443428039551]]],[[[112.52192878723145,76.62248420715332],[112.7138843536377,76.51054573059082],[111.95665168762207,76.59860420227051],[112.52192878723145,76.62248420715332]]],[[[95.59887886047363,76.66998481750488],[95.41276741027832,76.69970893859863],[95.83194160461426,76.68553352355957],[95.59887886047363,76.66998481750488]]],[[[95.13304328918457,76.7027759552002],[95.32693672180176,76.66110420227051],[94.81303596496582,76.64888191223145],[95.13304328918457,76.7027759552002]]],[[[96.46408271789551,76.70601081848145],[96.2422046661377,76.60971260070801],[95.88916206359863,76.62137031555176],[96.46408271789551,76.70601081848145]]],[[[97.54637336730957,76.58221626281738],[97.31637763977051,76.60664558410645],[97.44053840637207,76.71499824523926],[97.54637336730957,76.58221626281738]]],[[[149.3144245147705,76.75360298156738],[149.16885566711426,76.65054512023926],[148.39221382141113,76.64360237121582],[149.3144245147705,76.75360298156738]]],[[[97.86998176574707,76.77026557922363],[97.72943305969238,76.81833076477051],[97.91943550109863,76.83831977844238],[97.86998176574707,76.77026557922363]]],[[[68.26609992980957,76.95860481262207],[68.93136787414551,76.78276252746582],[68.8611011505127,76.54193305969238],[61.28777503967285,75.32609748840332],[59.925554275512695,74.99914741516113],[60.68027687072754,74.93332099914551],[60.31860542297363,74.76054573059082],[59.50999641418457,74.79498481750488],[59.773324966430664,74.59109687805176],[59.169443130493164,74.71971321105957],[59.14721870422363,74.43858528137207],[58.18335151672363,74.57353401184082],[58.74276924133301,74.26693916320801],[58.13582801818848,73.98526191711426],[57.25750160217285,74.07609748840332],[57.91166114807129,73.9155445098877],[57.71527290344238,73.71304512023926],[56.55582618713379,73.88220405578613],[57.61361122131348,73.66220283508301],[56.72304725646973,73.6736011505127],[57.25332832336426,73.48776435852051],[56.75889015197754,73.24693489074707],[55.90777015686035,73.44026374816895],[55.977487564086914,73.31749153137207],[54.97165870666504,73.44220161437988],[54.22054481506348,73.32304573059082],[55.176103591918945,73.70610237121582],[53.63054847717285,73.7552661895752],[55.86638832092285,74.10247993469238],[55.07332801818848,74.26443672180176],[56.29055213928223,74.49136543273926],[55.571664810180664,74.65971565246582],[56.98458290100098,74.6871509552002],[55.829721450805664,74.79609870910645],[56.678606033325195,74.95221138000488],[55.79777717590332,75.1463794708252],[57.73721504211426,75.32304573059082],[57.50332832336426,75.49247932434082],[58.194711685180664,75.58831977844238],[58.00139045715332,75.67415046691895],[60.75000190734863,76.00610542297363],[61.06638526916504,76.27388191223145],[64.10971260070801,76.31137275695801],[68.26609992980957,76.95860481262207]]],[[[88.66470527648926,77.09637641906738],[88.95721626281738,77.12581062316895],[88.78305244445801,77.00499153137207],[88.66470527648926,77.09637641906738]]],[[[96.57554817199707,77.1302661895752],[96.16609382629395,76.9891529083252],[95.22915840148926,76.99331855773926],[96.57554817199707,77.1302661895752]]],[[[156.61773872375488,77.10386848449707],[156.43414497375488,77.1352710723877],[156.73217964172363,77.12581062316895],[156.61773872375488,77.10386848449707]]],[[[90.18026924133301,77.11581611633301],[89.96721076965332,77.11303901672363],[89.82971382141113,77.14082527160645],[90.18026924133301,77.11581611633301]]],[[[105.88472175598145,77.26138496398926],[105.78055000305176,77.27415657043457],[106.00776863098145,77.2824878692627],[105.88472175598145,77.26138496398926]]],[[[89.6816577911377,77.28442573547363],[89.48526191711426,77.17997932434082],[89.13582038879395,77.20498847961426],[89.6816577911377,77.28442573547363]]],[[[106.4024829864502,77.30359077453613],[106.33167457580566,77.31805610656738],[106.45833015441895,77.31526374816895],[106.4024829864502,77.30359077453613]]],[[[107.56192207336426,77.25499153137207],[107.20027351379395,77.23387336730957],[107.66665840148926,77.3308277130127],[107.56192207336426,77.25499153137207]]],[[[106.64665412902832,77.37608528137207],[106.50417518615723,77.38998603820801],[106.90081977844238,77.45915412902832],[106.64665412902832,77.37608528137207]]],[[[82.56025886535645,77.4619312286377],[82.1202564239502,77.50638008117676],[82.4438648223877,77.5102710723877],[82.56025886535645,77.4619312286377]]],[[[91.96638679504395,77.5999927520752],[91.73970222473145,77.64721870422363],[92.03776741027832,77.63081550598145],[91.96638679504395,77.5999927520752]]],[[[104.26748847961426,77.67581367492676],[106.29193305969238,77.36276435852051],[104.1172046661377,77.09082221984863],[107.50360298156738,76.92221260070801],[106.40109443664551,76.50972175598145],[111.10386848449707,76.7552661895752],[112.74275398254395,76.32832527160645],[112.56667518615723,76.0405445098877],[113.24275398254395,76.26220893859863],[113.89248847961426,75.8499927520752],[113.50943183898926,75.5324878692627],[112.33719825744629,75.84665107727051],[113.71748542785645,75.40860176086426],[108.18969917297363,73.67025947570801],[107.14248847961426,73.61470222473145],[105.2119312286377,72.76471138000488],[106.3338794708252,73.18719673156738],[110.9143238067627,73.69668769836426],[109.52916145324707,73.77026557922363],[110.20041084289551,74.02444648742676],[111.54332160949707,74.04498481750488],[111.20139503479004,73.96748542785645],[112.24832344055176,73.70694160461426],[112.88777351379395,73.96499824523926],[113.49942207336426,73.33415412902832],[113.48636817932129,72.95833015441895],[113.10443305969238,72.85359382629395],[113.17859077453613,72.72360420227051],[114.04471015930176,72.59721565246582],[113.15109443664551,72.83943367004395],[113.53082466125488,72.96026802062988],[113.54694557189941,73.2422046661377],[114.03386878967285,73.3419361114502],[113.47527503967285,73.5041675567627],[118.63443183898926,73.57165718078613],[118.99387550354004,73.4891529083252],[118.39221382141113,73.23581123352051],[119.81775856018066,72.9358081817627],[121.86580848693848,72.96805000305176],[124.72971534729004,72.62637519836426],[126.11775398254395,72.26693916320801],[126.37248420715332,72.35331916809082],[127.1294116973877,71.8510913848877],[127.22054481506348,71.39248847961426],[127.32608222961426,71.89804267883301],[126.71914863586426,72.38888740539551],[127.65860176086426,72.34749031066895],[128.7116413116455,71.77054023742676],[129.17993354797363,71.80026435852051],[129.0724811553955,72.00193977355957],[129.53994941711426,71.72221565246582],[128.84744453430176,71.60138130187988],[131.13025093078613,70.7310962677002],[132.18469429016113,71.21470832824707],[131.946626663208,71.28915596008301],[132.72802925109863,71.94192695617676],[133.67914009094238,71.43332099914551],[135.8649616241455,71.63971138000488],[137.85412788391113,71.11137580871582],[138.22134590148926,71.26220893859863],[137.82412910461426,71.38388252258301],[138.06607246398926,71.57361030578613],[139.932466506958,71.48498725891113],[139.3366413116455,71.94552803039551],[140.19830513000488,72.20332527160645],[139.08523750305176,72.23332405090332],[141.0241413116455,72.58581733703613],[140.74884223937988,72.88943672180176],[146.84802436828613,72.34749031066895],[144.13858222961426,72.27083015441895],[144.391939163208,72.17192268371582],[145.08636665344238,72.25915718078613],[146.930269241333,72.30941963195801],[145.96466255187988,71.8469409942627],[145.98855781555176,72.02554512023926],[146.33996772766113,72.12803840637207],[145.98550605773926,72.06137275695801],[145.89831733703613,72.20610237121582],[145.7116413116455,72.2522144317627],[145.60830879211426,72.24359321594238],[145.749116897583,72.20721626281738],[145.6149616241455,72.08055305480957],[145.80240058898926,71.92553901672363],[144.95691108703613,71.95833015441895],[145.21634101867676,71.82721138000488],[144.9133014678955,71.6958179473877],[145.31884956359863,71.65803718566895],[146.08828926086426,71.79387092590332],[147.13971138000488,72.31721687316895],[149.18524360656738,72.22249031066895],[150.07525825500488,71.88388252258301],[148.823579788208,71.66998481750488],[150.66775703430176,71.48942756652832],[150.02359199523926,71.20749092102051],[151.45331001281738,71.34332466125488],[152.1410846710205,70.99748420715332],[151.66360664367676,70.98082160949707],[152.5383014678955,70.83777046203613],[155.93719673156738,71.09443855285645],[159.05386543273926,70.86914253234863],[160.03802680969238,70.40555000305176],[159.72967720031738,69.83471870422363],[160.99524116516113,69.58831977844238],[160.96386909484863,69.10359382629395],[161.41165351867676,68.97970771789551],[161.06607246398926,68.56331062316895],[160.84607124328613,68.52276802062988],[161.12774848937988,68.55525398254395],[161.319429397583,68.79248237609863],[161.579683303833,68.91499519348145],[161.44607734680176,69.38554573059082],[164.01443672180176,69.76748847961426],[166.86050605773926,69.49054145812988],[167.78692817687988,69.77609443664551],[168.28332710266113,69.24165534973145],[170.61194038391113,68.75633430480957],[171.03192329406738,69.04220771789551],[170.60913276672363,69.58027839660645],[170.12384223937988,69.60998725891113],[170.56720161437988,69.77804756164551],[170.4718952178955,70.13415718078613],[173.19192695617676,69.77971076965332],[176.111909866333,69.89055061340332],[180.00000190734863,68.98010444641113],[180.00000190734863,65.06891059875488],[178.52221870422363,64.58804512023926],[178.75555610656738,64.68220710754395],[177.60940742492676,64.71805000305176],[176.89972114562988,65.08360481262207],[176.30276679992676,65.04998970031738],[177.303316116333,64.8277759552002],[174.43664741516113,64.68831062316895],[177.48608589172363,64.76138496398926],[177.63189888000488,64.31888008117676],[178.36746406555176,64.27388191223145],[178.75747871398926,63.63999366760254],[178.26165962219238,63.5624942779541],[178.68802070617676,63.3830509185791],[178.77221870422363,63.59499549865723],[179.40860176086426,63.142770767211914],[179.23663520812988,62.994157791137695],[179.56109809875488,62.62137794494629],[179.061372756958,62.28472328186035],[176.97552680969238,62.865549087524414],[177.26553535461426,62.574716567993164],[172.710786819458,61.42999458312988],[172.95608711242676,61.30277442932129],[170.641939163208,60.417497634887695],[170.24884223937988,59.909433364868164],[169.21023750305176,60.62276649475098],[167.0502643585205,60.32388496398926],[166.13775825500488,59.81527137756348],[166.34857368469238,60.48638343811035],[164.99719429016113,60.12943458557129],[165.182466506958,59.98110389709473],[164.83218574523926,59.78110694885254],[164.46856880187988,60.11138343811035],[164.15555000305176,59.8527774810791],[163.63553047180176,60.045549392700195],[163.17303657531738,59.559160232543945],[163.1935749053955,59.053606033325195],[162.87634468078613,59.1280460357666],[163.044771194458,59.01031684875488],[161.93887519836426,58.07444190979004],[162.34607124328613,57.68471717834473],[162.57107734680176,57.95110511779785],[163.2135944366455,57.83610725402832],[162.736909866333,57.35777473449707],[162.791353225708,56.79110908508301],[163.21386909484863,56.740549087524414],[163.35467720031738,56.1986026763916],[162.64526557922363,56.19193458557129],[163.08914375305176,56.53416633605957],[162.39358711242676,56.39999580383301],[162.57220649719238,56.26721382141113],[162.03692817687988,56.061662673950195],[161.71246528625488,55.4969425201416],[162.11218452453613,54.76194190979004],[160.0058307647705,54.13916206359863],[159.79165840148926,53.514719009399414],[160.05523872375488,53.09360694885254],[158.43054389953613,53.02193641662598],[158.64471626281738,52.89471626281738],[158.27581977844238,51.936655044555664],[156.668306350708,50.881662368774414],[155.54413032531738,55.303606033325195],[155.94885444641113,56.66610145568848],[156.9777545928955,57.414438247680664],[156.74884223937988,57.72832679748535],[158.23330879211426,58.01944160461426],[161.91443061828613,60.42276954650879],[163.65832710266113,60.87193489074707],[164.12774848937988,62.28277015686035],[165.64248847961426,62.452775955200195],[164.35940742492676,62.71221351623535],[163.26361274719238,62.545000076293945],[162.95025825500488,61.80638313293457],[163.28802680969238,61.664438247680664],[162.40332221984863,61.672494888305664],[160.13775825500488,60.58360481262207],[160.39135932922363,61.025827407836914],[159.78055000305176,60.94082832336426],[159.82718086242676,61.26138496398926],[160.3549518585205,61.94748878479004],[159.531099319458,61.66276741027832],[159.24746894836426,61.92222023010254],[157.48663520812988,61.80332374572754],[154.23272895812988,59.88193702697754],[154.11413764953613,59.45971870422363],[155.190523147583,59.357805252075195],[154.74164009094238,59.12693977355957],[153.36856269836426,59.243051528930664],[152.8771686553955,58.917497634887695],[151.309419631958,58.83693885803223],[151.073579788208,59.110551834106445],[152.28775215148926,59.226938247680664],[149.59857368469238,59.771379470825195],[148.743013381958,59.49166297912598],[148.898042678833,59.23916053771973],[143.926362991333,59.4133243560791],[142.15970039367676,59.069162368774414],[140.688570022583,58.2338809967041],[140.49633979797363,57.82332801818848],[135.15442085266113,54.85943794250488],[135.73663520812988,54.5705509185791],[136.81607246398926,54.651384353637695],[136.76080513000488,53.76860237121582],[137.17248725891113,53.83471870422363],[137.28912544250488,54.03360939025879],[137.06189155578613,54.14083290100098],[137.18716621398926,54.2147159576416],[137.738862991333,54.317216873168945],[137.30798530578613,54.11444282531738],[137.85913276672363,53.961381912231445],[137.31079292297363,53.53277015686035],[138.55386543273926,53.98943519592285],[138.23941230773926,53.5624942779541],[138.44412422180176,53.51055335998535],[138.641939163208,54.29527473449707],[139.74633979797363,54.30888557434082],[141.41913032531738,53.2902774810791],[141.19998359680176,52.98638343811035],[140.7055377960205,53.113054275512695],[141.51416206359863,52.213327407836914],[140.46051216125488,50.7066593170166],[140.69580268859863,50.08749580383301],[140.40747261047363,49.871660232543945],[140.17581367492676,48.4486026763916],[135.12967109680176,43.49888038635254],[133.15136909484863,42.68221473693848],[132.3105182647705,42.844438552856445],[132.35217475891113,43.29277229309082],[131.94302558898926,43.06388282775879],[132.0563678741455,43.31332588195801],[131.8105182647705,43.3255558013916],[131.22134590148926,42.55582618713379],[130.69998359680176,42.67916297912598],[130.69742012023926,42.29220771789551],[130.6388874053955,42.406938552856445],[130.60437202453613,42.42186164855957],[130.4052448272705,42.71805000305176],[131.12329292297363,42.91082191467285],[131.311372756958,43.392221450805664],[130.94998359680176,44.84110450744629],[131.86468696594238,45.34554481506348],[133.12219429016113,45.12860298156738],[133.90017890930176,46.250314712524414],[134.182466506958,47.32332801818848],[134.76721382141113,47.70749855041504],[134.74075508117676,48.26712989807129],[133.08856391906738,48.10166358947754],[132.521089553833,47.710275650024414],[130.98855781555176,47.68860054016113],[130.52163887023926,48.60777473449707],[130.67163276672363,48.864999771118164],[127.52942848205566,49.78916358947754],[127.58606910705566,50.208566665649414],[126.09554481506348,52.76444435119629],[123.38220405578613,53.52665901184082],[120.86387825012207,53.27971839904785],[120.02916145324707,52.76805305480957],[120.71360969543457,52.54471778869629],[120.77665901184082,52.114999771118164],[119.13860511779785,50.39471626281738],[119.36136817932129,50.33693885803223],[119.21415901184082,50.015275955200195],[117.87471199035645,49.520578384399414],[116.71138191223145,49.83046913146973],[114.31302833557129,50.28416633605957],[113.09082221984863,49.59860420227051],[110.7885913848877,49.14943885803223],[108.57222175598145,49.33360481262207],[107.94914436340332,49.678049087524414],[107.97712898254395,49.94362831115723],[106.66304206848145,50.33860206604004],[102.91858863830566,50.31527137756348],[102.32776832580566,50.569719314575195],[102.21887397766113,51.33360481262207],[98.93026924133301,52.14361000061035],[97.8277759552002,51.001108169555664],[98.28970527648926,50.29388618469238],[97.34082221984863,49.73443794250488],[94.6352710723877,50.02443885803223],[94.27499580383301,50.56944465637207],[92.3227710723877,50.81499671936035],[87.84070014953613,49.17295265197754],[87.34820747375488,49.09262275695801],[86.61665534973145,49.58721351623535],[86.77499580383301,49.788888931274414],[86.19108772277832,49.472490310668945],[85.25860786437988,49.591379165649414],[85.01443672180176,50.07583045959473],[84.36303901672363,50.21221351623535],[83.45637702941895,51.00249671936035],[81.46805000305176,50.74221992492676],[80.68783760070801,51.31472206115723],[80.07795906066895,50.75808906555176],[77.90803718566895,53.27110481262207],[76.52165412902832,53.99388313293457],[76.81164741516113,54.447771072387695],[74.42915534973145,53.47860145568848],[73.43719673156738,53.436105728149414],[73.23858833312988,53.64444160461426],[73.76388740539551,54.0655460357666],[72.61331367492676,54.145273208618164],[72.46859931945801,53.908884048461914],[72.0516529083252,54.387773513793945],[72.19609260559082,54.13749885559082],[71.18553352355957,54.10332679748535],[70.99693489074707,54.33915901184082],[71.27887153625488,54.69027137756348],[70.84332466125488,55.30193519592285],[69.18553352355957,55.343881607055664],[65.48332405090332,54.63804817199707],[65.21638679504395,54.31888771057129],[63.17222023010254,54.18638038635254],[62.547494888305664,53.87943458557129],[61.01416206359863,53.94748878479004],[61.226938247680664,53.81193733215332],[60.90555000305176,53.62027168273926],[61.57749366760254,53.51333045959473],[61.18471717834473,53.306657791137695],[62.11832618713379,53.004167556762695],[61.09916114807129,52.98166084289551],[60.69415473937988,52.68082618713379],[61.06193733215332,52.34249305725098],[60.00222206115723,51.958330154418945],[61.68582344055176,51.26583290100098],[61.38138008117676,50.78360939025879],[60.04361152648926,50.86332893371582],[59.542497634887695,50.47832679748535],[58.33777046203613,51.15609931945801],[57.48193550109863,50.86471748352051],[56.51082801818848,51.083330154418945],[55.69249153137207,50.53249549865723],[54.64721870422363,51.036943435668945],[54.523935317993164,50.52884101867676],[54.50638771057129,50.856943130493164],[53.428606033325195,51.49166297912598],[52.60332679748535,51.45694160461426],[52.338327407836914,51.78221321105957],[51.303049087524414,51.47971534729004],[50.77330207824707,51.769182205200195],[48.69748878479004,50.591936111450195],[48.796945571899414,49.94193458557129],[48.251665115356445,49.86971473693848],[47.520830154418945,50.43638038635254],[46.9294376373291,49.86361122131348],[46.79583168029785,49.3397159576416],[47.06276893615723,49.142770767211914],[46.499162673950195,48.417497634887695],[47.12276649475098,48.27166175842285],[47.38332557678223,47.68888282775879],[48.20443153381348,47.70498847961426],[49.02720832824707,46.77609443664551],[48.56054878234863,46.56499671936035],[49.2225284576416,46.3463077545166],[48.627763748168945,46.08276557922363],[48.713327407836914,45.830270767211914],[48.56582069396973,45.965829849243164],[47.83054542541504,45.65582466125488],[47.55221748352051,45.76944160461426],[47.637216567993164,45.55304145812988],[47.38027381896973,45.74471473693848],[47.56915473937988,45.5574893951416],[46.67971229553223,44.52304267883301],[47.35026741027832,44.02665138244629],[47.40720558166504,43.50110054016113],[47.698320388793945,43.86887550354004],[47.46221351623535,43.01915168762207],[48.58395576477051,41.835771560668945],[47.76693153381348,41.19609260559082],[46.57138252258301,41.87193489074707],[46.45175361633301,41.89705848693848],[44.934709548950195,42.76027870178223],[43.911935806274414,42.583322525024414],[42.849992752075195,43.179155349731445],[40.25338935852051,43.58252143859863],[40.00296974182129,43.3792667388916],[38.76027870178223,44.27026557922363],[36.575273513793945,45.184709548950195],[36.96054267883301,45.27499580383301],[36.830827713012695,45.43664741516113],[37.73720741271973,45.29916572570801],[37.59137153625488,45.62748146057129],[37.940263748168945,46.025827407836914],[38.57443428039551,46.08970832824707],[37.734994888305664,46.66916084289551],[38.5816593170166,46.650827407836914],[38.41081428527832,46.82805061340332],[39.29998970031738,47.07693672180176],[38.23582649230957,47.10943031311035],[38.30332374572754,47.55859565734863],[38.85360145568848,47.86082649230957],[39.79638862609863,47.85721778869629],[39.99888038635254,48.29722023010254],[39.656938552856445,48.61666297912598],[40.07666206359863,48.8749942779541],[39.69665718078613,49.01082801818848],[40.166940689086914,49.248605728149414],[40.1397647857666,49.60105323791504],[38.30777168273926,50.07388496398926],[38.02422523498535,49.903085708618164],[37.45860481262207,50.439714431762695],[35.60665321350098,50.36944007873535],[35.37188911437988,51.04143714904785],[34.382211685180664,51.26361274719238],[34.09804725646973,51.653879165649414],[34.41971778869629,51.80888557434082],[33.838884353637695,52.360551834106445],[33.41770362854004,52.35540199279785],[31.78388786315918,52.108049392700195],[31.266942977905273,53.02471351623535],[32.741106033325195,53.46305274963379],[31.76422691345215,53.802621841430664],[31.84416389465332,54.06443977355957],[30.781389236450195,54.79361152648926],[31.029722213745117,55.0433292388916],[30.92624855041504,55.60257148742676],[28.168012619018555,56.150156021118164],[27.701662063598633,56.91471290588379],[27.861108779907227,57.30221748352051],[27.372060775756836,57.5356388092041],[27.82305335998535,57.87388038635254],[27.42610740661621,58.813608169555664],[28.170358657836914,59.30978202819824],[28.015832901000977,59.47860145568848],[28.080278396606445,59.79638862609863],[30.24582862854004,59.97526741027832],[28.60194206237793,60.38443946838379],[28.686662673950195,60.73582649230957],[27.807832717895508,60.546403884887695],[31.588930130004883,62.91441535949707],[29.99333381652832,63.743608474731445],[30.578054428100586,64.22137641906738],[29.636667251586914,64.92805671691895],[29.81888771057129,65.65332221984863],[30.134164810180664,65.71916389465332],[29.07499885559082,66.89583015441895],[30.02861213684082,67.6947193145752],[28.693334579467773,68.19749641418457],[28.45749855041504,68.53193855285645],[28.820554733276367,68.84443855285645],[28.431943893432617,68.89694404602051],[28.95734214782715,69.05162239074707],[30.103334426879883,69.66305732727051],[30.910001754760742,69.54887580871582],[30.854841232299805,69.79231452941895],[33.09360694885254,69.74748420715332],[32.02639579772949,69.63653755187988],[33.02941703796387,69.47186470031738],[32.80999183654785,69.29609870910645],[33.52166175842285,69.42192268371582],[33.02276802062988,68.95332527160645],[33.71915626525879,69.33137702941895],[35.974992752075195,69.17303657531738],[40.99221992492676,67.71609687805176],[41.39055061340332,67.12275886535645],[41.21971321105957,66.83777046203613],[40.07332801818848,66.27777290344238],[38.60777473449707,66.05220222473145],[31.854997634887695,67.15387153625488],[33.732492446899414,66.42387580871582],[33.31276893615723,66.31608772277832],[34.847490310668945,65.90109443664551],[34.96360969543457,65.71776008605957],[34.69082832336426,65.80386543273926],[34.68166542053223,65.45109748840332],[34.37777137756348,65.3783130645752],[34.936105728149414,64.83831977844238],[34.78777503967285,64.54776191711426],[37.414995193481445,63.80388069152832],[38.07749366760254,64.01721382141113],[37.9788761138916,64.3166675567627],[37.14471626281738,64.40887641906738],[36.439714431762695,64.94275093078613],[37.03221321105957,65.20833015441895],[38.40860176086426,64.85887336730957],[38.046945571899414,64.64109992980957],[40.50583076477051,64.53526496887207],[39.75139045715332,65.55081367492676],[42.1683292388916,66.52276802062988],[43.29972267150879,66.42221260070801],[43.69748878479004,66.23581123352051],[43.35471534729004,66.0385913848877],[43.858049392700195,66.17692756652832],[44.17444038391113,65.87469673156738],[44.49638557434082,66.9074878692627],[43.75193977355957,67.31888008117676],[44.24582862854004,68.27026557922363],[43.311662673950195,68.68498420715332],[45.90332221984863,68.48221015930176],[46.520830154418945,68.14415168762207],[46.70694160461426,67.81303596496582],[45.38249397277832,67.73553657531738],[44.911935806274414,67.37275886535645],[46.60083198547363,66.85331916809082],[46.38555335998535,66.73970222473145],[47.699716567993164,66.98637580871582],[47.99499702453613,67.65027046203613],[49.10110664367676,67.62803840637207],[48.59110450744629,67.93498420715332],[52.074716567993164,68.54443550109863],[52.26860237121582,68.30581855773926],[52.733049392700195,68.46638679504395],[52.28833198547363,68.6141529083252],[53.78360939025879,68.96805000305176],[54.56082344055176,68.99247932434082],[53.59887886047363,68.90803718566895],[54.0191593170166,68.85525703430176],[53.71971321105957,68.65193367004395],[53.94582557678223,68.39999580383301],[53.20999336242676,68.26138496398926],[54.791940689086914,68.16304206848145],[55.32473182678223,68.55000495910645],[57.27610206604004,68.55581855773926],[58.898332595825195,68.99971199035645],[59.42721748352051,68.7452564239502],[59.07332801818848,68.42137336730957],[59.83610725402832,68.36665534973145],[59.811662673950195,68.68193244934082],[60.914438247680664,68.90471076965332],[60.14055061340332,69.57415962219238],[60.87443733215332,69.86360359191895],[64.15054512023926,69.54193305969238],[65.00277900695801,69.29803657531738],[64.78776741027832,69.14276313781738],[67.11609077453613,68.84276008605957],[67.03915596008301,68.78970527648926],[67.19304084777832,68.70471382141113],[68.15942573547363,68.41137886047363],[68.26500129699707,68.18748664855957],[68.43637275695801,68.2249927520752],[69.22026252746582,68.95721626281738],[68.45971870422363,68.9780445098877],[68.10165596008301,69.5466480255127],[67.00055122375488,69.69970893859863],[66.95027351379395,69.52887153625488],[66.79915046691895,69.57415962219238],[66.8733081817627,70.00110054016113],[67.3277759552002,70.09749031066895],[67.08804512023926,70.21721076965332],[67.33970832824707,70.75027656555176],[66.68887519836426,70.76054573059082],[66.89166450500488,71.07748603820801],[66.62303352355957,71.0516529083252],[68.46554756164551,71.81889533996582],[69.3338794708252,72.9488697052002],[71.56053352355957,72.90971565246582],[72.83333015441895,72.70860481262207],[72.88192939758301,72.28137397766113],[71.80247688293457,71.47249031066895],[72.84054756164551,70.86526679992676],[72.77804756164551,70.41804695129395],[72.4246997833252,70.27026557922363],[72.68637275695801,69.84971809387207],[72.55386543273926,68.97665596008301],[73.64804267883301,68.45776557922363],[73.0980396270752,68.2169361114502],[73.04081916809082,67.72415351867676],[72.0405445098877,67.29693794250488],[72.2310962677002,67.1605396270752],[71.41026496887207,66.9669361114502],[71.55859565734863,66.64526557922363],[70.69497871398926,66.50804328918457],[70.29136848449707,66.62387275695801],[70.73082160949707,66.7572193145752],[68.96776008605957,66.80415534973145],[69.38611030578613,66.50749397277832],[72.00000190734863,66.21943855285645],[73.84721565246582,66.9810962677002],[73.90887641906738,67.29803657531738],[74.73997688293457,67.69165229797363],[74.73166084289551,68.14305305480957],[74.33276557922363,68.3802661895752],[74.64055061340332,68.76915168762207],[76.59166145324707,68.96832466125488],[77.32443428039551,68.51693916320801],[77.0919361114502,67.77859687805176],[79.04484748840332,67.5671558380127],[77.46249580383301,67.76220893859863],[77.55859565734863,68.14387702941895],[78.1746997833252,68.26500129699707],[77.63499641418457,68.90776252746582],[76.03720283508301,69.2371997833252],[73.74942207336426,69.16804695129395],[73.89444160461426,69.42581367492676],[73.51638984680176,69.75555610656738],[74.31498908996582,70.6736011505127],[73.0152759552002,71.4216480255127],[73.53219795227051,71.81915473937988],[74.95804023742676,72.10942268371582],[74.82998847961426,72.83415412902832],[75.71582221984863,72.55664253234863],[75.24193000793457,71.37608528137207],[76.91581916809082,71.0697193145752],[79.11276435852051,71.00248908996582],[76.27054023742676,71.57165718078613],[76.09749031066895,71.92859077453613],[78.10473823547363,71.87614631652832],[77.36998176574707,72.09887886047363],[78.53804206848145,72.40359687805176],[81.65304756164551,71.70804023742676],[83.26164436340332,71.7210865020752],[82.25749397277832,71.25972175598145],[82.41443061828613,70.77110481262207],[82.08110237121582,70.5677661895752],[82.34610176086426,70.19859504699707],[82.16026496887207,70.57748603820801],[83.11886787414551,70.88749885559082],[82.63916206359863,70.17442512512207],[83.10693550109863,70.06860542297363],[83.19359016418457,70.1233081817627],[83.13054084777832,70.20804023742676],[82.95166206359863,70.32054328918457],[83.53166389465332,70.33915901184082],[83.74553108215332,70.45999336242676],[83.1483325958252,71.2361011505127],[83.62858772277832,71.62387275695801],[82.19247627258301,72.28305244445801],[80.72137641906738,72.52609443664551],[80.81721687316895,72.96609687805176],[80.2310962677002,73.1736011505127],[80.57249641418457,73.22053718566895],[80.24859809875488,73.31414985656738],[80.50999641418457,73.57165718078613],[87.0869312286377,73.85942268371582],[85.77832221984863,73.45971870422363],[86.78360176086426,72.99408149719238],[85.8480396270752,73.47526741027832],[87.66499519348145,73.89471626281738],[85.95109748840332,74.28082466125488],[87.13275337219238,74.36914253234863],[85.78915596008301,74.63081550598145],[86.02916145324707,74.81303596496582],[86.91304206848145,74.61248970031738],[87.38665962219238,74.94304084777832],[87.1816577911377,74.98997688293457],[87.78581428527832,75.02221870422363],[86.99498176574707,75.1513843536377],[94.16192817687988,75.94275093078613],[92.86526679992676,75.94832038879395],[93.15555000305176,76.09776496887207],[96.19775581359863,76.08526802062988],[95.74386787414551,75.85054206848145],[99.27693367004395,76.21415901184082],[99.7683277130127,76.03109931945801],[99.09443855285645,75.55497932434082],[100.18625831604004,75.16853523254395],[99.17192268371582,75.56999397277832],[99.87719917297363,76.09166145324707],[98.81387519836426,76.49275398254395],[102.23359870910645,76.37719917297363],[100.8783130645752,76.55137825012207],[101.23471260070801,76.75305366516113],[100.84971809387207,76.87858772277832],[103.10555458068848,77.63192939758301],[104.26748847961426,77.67581367492676]],[[86.90220832824707,73.69748115539551],[86.39499092102051,73.58831977844238],[86.73665046691895,73.59526252746582],[86.90220832824707,73.69748115539551]],[[40.27443885803223,64.87414741516113],[40.278879165649414,64.9458179473877],[40.20971870422363,64.99247932434082],[40.27443885803223,64.87414741516113]]],[[[107.6352710723877,78.16609382629395],[107.43887519836426,78.04942512512207],[106.49304389953613,78.12164497375488],[107.6352710723877,78.16609382629395]]],[[[93.75055122375488,78.15582466125488],[93.51971626281738,78.1877613067627],[93.6402759552002,78.22276496887207],[93.75055122375488,78.15582466125488]]],[[[106.76138496398926,78.30359077453613],[105.99275398254395,78.21415901184082],[106.45860481262207,78.33471870422363],[106.76138496398926,78.30359077453613]]],[[[92.70221138000488,79.07138252258301],[92.18261909484863,79.12718391418457],[92.72554206848145,79.07499885559082],[92.70221138000488,79.07138252258301]]],[[[102.97276496887207,79.33137702941895],[102.39333534240723,78.82859992980957],[103.94693183898926,79.13333320617676],[105.41443061828613,78.56469917297363],[99.34137153625488,78.01999092102051],[100.3783130645752,78.7452564239502],[101.16805458068848,78.75833320617676],[100.89388465881348,78.97665596008301],[101.62442207336426,78.98221015930176],[100.98887825012207,79.06109809875488],[101.55081367492676,79.34832954406738],[102.97276496887207,79.33137702941895]]],[[[92.80554389953613,79.38247871398926],[92.58221626281738,79.40693855285645],[92.98776435852051,79.41693305969238],[92.80554389953613,79.38247871398926]]],[[[92.46748542785645,79.42997932434082],[92.24359321594238,79.37997627258301],[91.80415534973145,79.4124927520752],[92.46748542785645,79.42997932434082]]],[[[99.9458179473877,79.4013843536377],[99.85054206848145,79.4155445098877],[100.01776313781738,79.43304634094238],[99.9458179473877,79.4013843536377]]],[[[91.46859931945801,79.45471382141113],[90.78193855285645,79.54915046691895],[91.16609382629395,79.52693367004395],[91.46859931945801,79.45471382141113]]],[[[76.23248481750488,79.60138130187988],[76.04193305969238,79.63472175598145],[77.61970710754395,79.51220893859863],[76.23248481750488,79.60138130187988]]],[[[100.01082038879395,79.6222095489502],[100.30664253234863,79.66470527648926],[99.90359687805176,79.5999927520752],[100.01082038879395,79.6222095489502]]],[[[91.65109443664551,79.65109443664551],[91.12442207336426,79.72249031066895],[91.85887336730957,79.66470527648926],[91.65109443664551,79.65109443664551]]],[[[58.68638038635254,79.94470405578613],[58.988046646118164,79.89554023742676],[58.27916145324707,79.9266529083252],[58.68638038635254,79.94470405578613]]],[[[94.3077564239502,80.01693916320801],[93.92747688293457,79.96832466125488],[93.98825263977051,80.0097827911377],[94.3077564239502,80.01693916320801]]],[[[49.379159927368164,79.9891529083252],[49.19360542297363,80.03221321105957],[49.43526649475098,80.00248908996582],[49.379159927368164,79.9891529083252]]],[[[51.20499610900879,80.03804206848145],[51.50193977355957,79.9316577911377],[50.04388618469238,79.9730396270752],[51.20499610900879,80.03804206848145]]],[[[91.17637825012207,80.05304145812988],[93.80859565734863,79.8883228302002],[91.9216480255127,79.67331123352051],[92.3499927520752,79.72776985168457],[90.86442756652832,80.05720710754395],[91.17637825012207,80.05304145812988]]],[[[59.42222023010254,79.92025947570801],[58.759164810180664,80.02276802062988],[59.84471321105957,80.06833076477051],[59.42222023010254,79.92025947570801]]],[[[49.59610176086426,80.0727710723877],[49.683053970336914,80.03637886047363],[49.330278396606445,80.06192207336426],[49.59610176086426,80.0727710723877]]],[[[50.25277900695801,80.1463794708252],[49.972490310668945,80.05415534973145],[49.53221321105957,80.15220832824707],[50.25277900695801,80.1463794708252]]],[[[97.61499214172363,80.1655445098877],[98.03442573547363,80.06749153137207],[97.19304084777832,79.70221138000488],[98.52859687805176,80.05247688293457],[100.01526832580566,79.82415962219238],[99.65915107727051,79.29582405090332],[99.03526496887207,79.29026985168457],[99.93887519836426,78.95332527160645],[97.3047046661377,78.84526252746582],[94.77720832824707,79.08442878723145],[94.33249092102051,79.46554756164551],[93.6988697052002,79.45610237121582],[93.87803840637207,79.60138130187988],[92.85081672668457,79.55386543273926],[94.61609077453613,79.81192207336426],[94.22221565246582,79.89776802062988],[94.93664741516113,80.09942817687988],[95.26944160461426,80.01638984680176],[95.58027839660645,80.11137580871582],[97.61499214172363,80.1655445098877]]],[[[60.261667251586914,80.16331672668457],[59.897775650024414,80.19165229797363],[60.289438247680664,80.16693305969238],[60.261667251586914,80.16331672668457]]],[[[55.15110206604004,80.22026252746582],[54.857500076293945,80.25248908996582],[55.54388618469238,80.29387092590332],[55.15110206604004,80.22026252746582]]],[[[53.621103286743164,80.29498481750488],[53.871660232543945,80.25665473937988],[52.18138313293457,80.27192878723145],[53.621103286743164,80.29498481750488]]],[[[54.221933364868164,80.20416450500488],[54.151384353637695,80.29942512512207],[54.439714431762695,80.2986011505127],[54.221933364868164,80.20416450500488]]],[[[57.096940994262695,80.34305000305176],[57.050546646118164,80.07499885559082],[55.71360969543457,80.1010913848877],[57.096940994262695,80.34305000305176]]],[[[52.45249366760254,80.32110786437988],[52.16666603088379,80.35026741027832],[52.521379470825195,80.3308277130127],[52.45249366760254,80.32110786437988]]],[[[55.3669376373291,80.42886543273926],[55.167497634887695,80.36943244934082],[54.977487564086914,80.41693305969238],[55.3669376373291,80.42886543273926]]],[[[56.30804634094238,80.3813648223877],[55.78611183166504,80.40721321105957],[55.87304878234863,80.43525886535645],[56.30804634094238,80.3813648223877]]],[[[54.637216567993164,80.39360237121582],[54.37027168273926,80.40582466125488],[54.863054275512695,80.45027351379395],[54.637216567993164,80.39360237121582]]],[[[57.96832466125488,80.48942756652832],[59.276384353637695,80.33415412902832],[57.71859931945801,80.09832954406738],[56.94638252258301,80.47442817687988],[57.96832466125488,80.48942756652832]]],[[[54.30166053771973,80.41914558410645],[53.77999305725098,80.46943855285645],[54.45888710021973,80.49803352355957],[54.30166053771973,80.41914558410645]]],[[[55.01583290100098,80.55693244934082],[55.16304969787598,80.49470710754395],[54.6411075592041,80.52804756164551],[55.01583290100098,80.55693244934082]]],[[[53.442216873168945,80.48498725891113],[53.10527229309082,80.61998176574707],[53.39860725402832,80.62664985656738],[53.442216873168945,80.48498725891113]]],[[[58.85527229309082,80.6402759552002],[58.80638313293457,80.58276557922363],[58.53777503967285,80.60582160949707],[58.85527229309082,80.6402759552002]]],[[[58.01055335998535,80.64109992980957],[57.87082862854004,80.55331611633301],[57.21305274963379,80.60359382629395],[58.01055335998535,80.64109992980957]]],[[[56.778879165649414,80.73581123352051],[56.9486026763916,80.69275093078613],[55.43249702453613,80.70833015441895],[56.778879165649414,80.73581123352051]]],[[[47.897775650024414,80.80331611633301],[48.76638984680176,80.6463794708252],[47.751665115356445,80.76638984680176],[47.30332374572754,80.6574878692627],[47.42360877990723,80.5888843536377],[46.08416175842285,80.43692207336426],[46.036386489868164,80.57222175598145],[44.857500076293945,80.61638069152832],[47.897775650024414,80.80331611633301]]],[[[62.21832466125488,80.81109809875488],[61.06610298156738,80.40359687805176],[59.22082710266113,80.64276313781738],[62.21832466125488,80.81109809875488]]],[[[55.44999885559082,80.85138130187988],[55.98276710510254,80.79582405090332],[53.97554969787598,80.81749153137207],[55.44999885559082,80.85138130187988]]],[[[58.98665809631348,80.79165840148926],[57.81638526916504,80.80581855773926],[58.756662368774414,80.89610481262207],[58.98665809631348,80.79165840148926]]],[[[50.1330509185791,80.84665107727051],[51.7469425201416,80.71220588684082],[48.80971717834473,80.37637519836426],[48.62276649475098,80.30026435852051],[49.113054275512695,80.1827564239502],[48.374162673950195,80.08720588684082],[46.61638832092285,80.29081916809082],[48.18387794494629,80.33137702941895],[47.38027381896973,80.45054817199707],[49.192216873168945,80.5213794708252],[49.68138313293457,80.71748542785645],[48.95416450500488,80.73137092590332],[50.44137763977051,80.90387153625488],[50.1330509185791,80.84665107727051]]],[[[79.97720527648926,80.95248603820801],[80.4377613067627,80.92637825012207],[78.97276496887207,80.83749580383301],[79.97720527648926,80.95248603820801]]],[[[58.533334732055664,80.95305061340332],[57.83416175842285,81.04525947570801],[58.69887733459473,81.02554512023926],[58.533334732055664,80.95305061340332]]],[[[50.59721565246582,81.04609870910645],[50.347490310668945,81.09027290344238],[50.98333168029785,81.10054206848145],[50.59721565246582,81.04609870910645]]],[[[56.24249458312988,81.1010913848877],[58.27860450744629,80.91971015930176],[56.096384048461914,81.08915901184082],[56.24249458312988,81.1010913848877]]],[[[58.7580509185791,81.07332038879395],[58.515275955200195,81.10443305969238],[58.80804634094238,81.09749031066895],[58.7580509185791,81.07332038879395]]],[[[54.74943733215332,81.10971260070801],[57.72082710266113,80.79248237609863],[54.4183292388916,81.00610542297363],[54.74943733215332,81.10971260070801]]],[[[60.98526954650879,80.91609382629395],[60.02499580383301,80.99165534973145],[61.65416145324707,81.11081123352051],[60.98526954650879,80.91609382629395]]],[[[58.445268630981445,81.1141529083252],[58.14943885803223,81.12886238098145],[58.64860725402832,81.13499641418457],[58.445268630981445,81.1141529083252]]],[[[91.25027656555176,81.06303596496582],[89.89360237121582,81.1685962677002],[91.57721138000488,81.14305305480957],[91.25027656555176,81.06303596496582]]],[[[65.45248603820801,81.02777290344238],[64.30304145812988,80.72998237609863],[62.504167556762695,80.81833076477051],[64.48359870910645,81.19108772277832],[65.45248603820801,81.02777290344238]]],[[[59.76638984680176,81.17025947570801],[59.01082801818848,81.20721626281738],[59.84471321105957,81.17997932434082],[59.76638984680176,81.17025947570801]]],[[[57.56499671936035,81.1252613067627],[56.99471473693848,81.1655445098877],[58.08055305480957,81.20971870422363],[57.56499671936035,81.1252613067627]]],[[[95.95860481262207,81.21721076965332],[97.96943855285645,80.71554756164551],[97.12915229797363,80.66276741027832],[97.42637825012207,80.3108081817627],[97.15887641906738,80.23359870910645],[94.8097095489502,80.13998603820801],[93.75305366516113,79.99582099914551],[92.06164741516113,80.17025947570801],[93.24664497375488,80.30554389953613],[91.42137336730957,80.3077564239502],[92.62387275695801,80.38499641418457],[91.88943672180176,80.45776557922363],[93.32554817199707,80.80581855773926],[92.48748970031738,80.76748847961426],[93.06860542297363,80.99443244934082],[95.95860481262207,81.21721076965332]]],[[[60.63888740539551,81.27221870422363],[60.37748908996582,81.24414253234863],[59.72221565246582,81.28332710266113],[60.63888740539551,81.27221870422363]]],[[[57.45804786682129,81.31360054016113],[57.90277290344238,81.29026985168457],[55.43166542053223,81.27165412902832],[57.45804786682129,81.31360054016113]]],[[[59.05332374572754,81.28499031066895],[58.46193885803223,81.33859443664551],[59.381662368774414,81.32415962219238],[59.05332374572754,81.28499031066895]]],[[[54.29361152648926,81.33333015441895],[54.42193794250488,81.27026557922363],[54.11471748352051,81.34721565246582],[54.29361152648926,81.33333015441895]]],[[[57.79666328430176,81.52998542785645],[58.57249641418457,81.41192817687988],[56.74138069152832,81.44859504699707],[57.79666328430176,81.52998542785645]]],[[[58.49083137512207,81.55887031555176],[58.22665596008301,81.58137702941895],[58.71971321105957,81.59971809387207],[58.49083137512207,81.55887031555176]]],[[[62.080827713012695,81.54414558410645],[61.654436111450195,81.6030445098877],[62.2036075592041,81.56498908996582],[62.080827713012695,81.54414558410645]]],[[[62.7933292388916,81.70860481262207],[63.80277442932129,81.65332221984863],[62.10416603088379,81.67248725891113],[62.7933292388916,81.70860481262207]]],[[[59.28750038146973,81.74275398254395],[57.88888740539551,81.70694160461426],[59.43776893615723,81.8166675567627],[59.28750038146973,81.74275398254395]]]]}},{"type":"Feature","properties":{"name":"Rwanda","iso2":"RW","iso3":"RWA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[29.952221,-2.309445],[29.85083,-2.759722],[29.024441,-2.744722],[28.868332,-2.394444],[29.596943,-1.385834],[29.974998,-1.464445],[30.48222,-1.063334],[30.894165,-2.076111],[30.57333,-2.399167],[29.952221,-2.309445]]]]}},{"type":"Feature","properties":{"name":"Saudi Arabia","iso2":"SA","iso3":"SAU"},"geometry":{"type":"MultiPolygon","coordinates":[[[[41.957773208618164,16.708887100219727],[41.753610610961914,16.87611198425293],[42.17999458312988,16.566946029663086],[41.957773208618164,16.708887100219727]]],[[[41.98666572570801,16.753332138061523],[41.83722114562988,16.86861228942871],[41.84555244445801,17.009164810180664],[41.98666572570801,16.753332138061523]]],[[[37.08055305480957,24.959165573120117],[37.03582954406738,24.963056564331055],[37.04166603088379,24.996946334838867],[37.08055305480957,24.959165573120117]]],[[[35.754716873168945,27.0947208404541],[35.75777626037598,27.07694435119629],[35.726388931274414,27.128610610961914],[35.754716873168945,27.0947208404541]]],[[[49.53721046447754,27.36360740661621],[49.63861274719238,27.31638526916504],[49.45221138000488,27.285829544067383],[49.53721046447754,27.36360740661621]]],[[[34.59360694885254,27.90916633605957],[34.49221992492676,27.996110916137695],[34.54666328430176,27.99860954284668],[34.59360694885254,27.90916633605957]]],[[[44.721662521362305,29.198331832885742],[46.546945571899414,29.10420036315918],[47.45999336242676,28.999441146850586],[47.68888282775879,28.53888511657715],[48.41658973693848,28.545278549194336],[48.838876724243164,27.619718551635742],[50.15916633605957,26.656667709350586],[49.9938907623291,26.01999855041504],[50.83095741271973,24.749967575073242],[51.215166091918945,24.62088966369629],[51.5836124420166,24.259721755981445],[52.583330154418945,22.93889045715332],[55.199167251586914,22.69972038269043],[55.66610908508301,21.999723434448242],[55.00000190734863,20.000001907348633],[51.99929237365723,18.999345779418945],[48.76638984680176,18.266389846801758],[46.33305549621582,15.616945266723633],[46.333330154418945,16.66666603088379],[44.46750068664551,17.411943435668945],[43.3094425201416,17.457223892211914],[43.20611000061035,16.672224044799805],[42.789682388305664,16.377504348754883],[40.75999641418457,19.760278701782227],[39.17694282531738,21.099164962768555],[39.06277656555176,22.58333396911621],[38.452775955200195,23.782499313354492],[37.441667556762695,24.371389389038086],[37.235551834106445,25.1825008392334],[35.16055488586426,28.056665420532227],[34.571664810180664,28.08888816833496],[34.96138954162598,29.3608341217041],[36.07000160217285,29.18889045715332],[36.743608474731445,29.864721298217773],[37.50277900695801,30.002222061157227],[38.00139045715332,30.504167556762695],[37.00527381896973,31.505556106567383],[39.19674491882324,32.15494346618652],[40.41333198547363,31.948331832885742],[42.08500099182129,31.111661911010742],[44.721662521362305,29.198331832885742]]]]}},{"type":"Feature","properties":{"name":"Saint Kitts and Nevis","iso2":"KN","iso3":"KNA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-62.55278,17.094166],[-62.62194799999989,17.111385],[-62.599724,17.19722],[-62.55278,17.094166]]],[[[-62.70166799999987,17.336941],[-62.62528199999986,17.220833],[-62.863892,17.370831000000138],[-62.70166799999987,17.336941]]]]}},{"type":"Feature","properties":{"name":"Seychelles","iso2":"SC","iso3":"SYC"},"geometry":{"type":"MultiPolygon","coordinates":[[[[46.491386,-9.754446],[46.476105,-9.744167],[46.508331,-9.717779],[46.491386,-9.754446]]],[[[46.510551,-9.396946],[46.269165000000186,-9.463057],[46.204163,-9.389446],[46.510551,-9.396946]]],[[[46.413887,-9.358891],[46.276665,-9.346111],[46.42694100000014,-9.342779],[46.413887,-9.358891]]],[[[56.282219,-7.134167],[56.247215000000125,-7.194445],[56.278610000000214,-7.110834],[56.282219,-7.134167]]],[[[55.53527100000011,-4.763056],[55.376106,-4.627223],[55.45916,-4.55139],[55.53527100000011,-4.763056]]],[[[55.246109,-4.506945],[55.23166700000016,-4.448056],[55.26722000000015,-4.481668],[55.246109,-4.506945]]],[[[55.775833,-4.348333],[55.687218,-4.2875],[55.77166,-4.315556],[55.775833,-4.348333]]]]}},{"type":"Feature","properties":{"name":"South Africa","iso2":"ZA","iso3":"ZAF"},"geometry":{"type":"MultiPolygon","coordinates":[[[[37.85083,-46.956947],[37.576385000000215,-46.909447],[37.781944,-46.83223],[37.85083,-46.956947]]],[[[37.959442000000166,-46.658615],[37.856941,-46.626945],[37.942772,-46.60334],[37.959442000000166,-46.658615]]],[[[29.893887,-22.194447],[31.297504000000146,-22.414764],[32.016106,-24.459446],[31.96851,-25.95784],[31.33083,-25.751392],[30.902048,-26.305254],[30.818886000000106,-26.810558],[31.161663,-27.203056],[31.987499,-27.316113],[32.1334,-26.839626],[32.890427,-26.847145],[32.39027400000012,-28.537781],[31.325832,-29.390835],[30.0238880000002,-31.281113],[27.899998,-33.040558],[26.53055200000017,-33.753334],[25.724998,-33.767227],[25.701942,-34.031952],[22.544998,-34.005005],[20,-34.822002],[18.817776,-34.377785],[18.793331,-34.08667],[18.40472000000011,-34.30278],[18.441109,-33.706673],[17.8475,-32.830833],[18.292221,-32.624451],[18.27861000000013,-31.89278],[16.48959,-28.578178],[17.06361,-28.028614],[17.40472,-28.713612],[18.175831,-28.908611],[19.123055000000107,-28.962223],[19.99612,-28.421448],[20.000942,-24.765408],[20.811386,-25.883335],[20.642498,-26.828056],[21.667221,-26.864445],[22.624809000000113,-26.111565],[23.014832000000126,-25.299725],[24.6772,-25.827824],[25.50972,-25.67778],[25.871387,-24.744446],[26.845276,-24.264446],[26.95919,-23.752075],[28.29833200000013,-22.609447],[29.373623,-22.19241],[29.893887,-22.194447]],[[28.565552,-28.610001],[27.011108,-29.625278],[27.564617,-30.404911],[28.079937,-30.650528],[28.377777,-30.16028],[29.168888,-29.913891],[29.430832,-29.278614],[28.565552,-28.610001]]]]}},{"type":"Feature","properties":{"name":"Lesotho","iso2":"LS","iso3":"LSO"},"geometry":{"type":"MultiPolygon","coordinates":[[[[27.564617,-30.404911],[27.011108,-29.625278],[28.565552,-28.610001],[29.430832,-29.278614],[29.168888,-29.913891],[28.377777,-30.16028],[28.079937,-30.650528],[27.564617,-30.404911]]]]}},{"type":"Feature","properties":{"name":"Botswana","iso2":"BW","iso3":"BWA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[26.95919,-23.752075],[26.845276,-24.264446],[25.871387,-24.744446],[25.50972,-25.67778],[24.6772,-25.827824],[23.014832000000126,-25.299725],[22.624809000000113,-26.111565],[21.667221,-26.864445],[20.642498,-26.828056],[20.811386,-25.883335],[20.000942,-24.765408],[19.996666,-22.005001],[20.991943,-21.996948],[20.993286,-18.318417],[23.297108,-17.995949],[23.615578,-18.485069],[24.362499,-17.948612],[25.264431,-17.80225],[26.166111,-19.527779],[27.219997,-20.091667],[27.287453,-20.494965],[27.713165,-20.506432],[28.015831,-21.566113],[29.060555,-21.798058],[29.373623,-22.19241],[28.29833200000013,-22.609447],[26.95919,-23.752075]]]]}},{"type":"Feature","properties":{"name":"Senegal","iso2":"SN","iso3":"SEN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-17.148308,14.61392],[-17.537224,14.756109],[-16.878334,15.224998],[-16.527679,16.060249],[-16.280834,16.519722],[-14.345278,16.638611],[-12.244833,14.764385],[-12.057222,13.664721],[-11.378056,12.988054],[-11.373058,12.407774],[-12.345404,12.301748],[-13.713139,12.677221],[-14.516945,12.67972200000014],[-16.71777,12.322426],[-16.586945,12.632776],[-15.626945,12.531111],[-15.390001,12.831944],[-15.650002,12.555555],[-16.598057,12.791666],[-16.756111,12.564999],[-16.750874,13.059977],[-15.809723,13.159721],[-15.803612,13.347776],[-15.285002,13.374443],[-15.111668,13.595833],[-14.351112,13.237778],[-13.798613,13.406387],[-15.070278,13.826387],[-16.56567,13.589998],[-16.490837,13.958055],[-16.747223,13.951944],[-16.363056,14.166111],[-16.775837,14.012499],[-17.148308,14.61392]]]]}},{"type":"Feature","properties":{"name":"Slovenia","iso2":"SI","iso3":"SVN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[13.718655,46.526611],[14.544998,46.407494],[16.111805,46.86972],[16.607872,46.476234],[16.572498,46.475273],[15.654722,46.219444],[15.697777,45.844162],[15.174458,45.425819],[14.601387,45.675278],[13.591740000000101,45.481697],[13.716944,45.596107],[13.919167,45.637497],[13.480000000000103,46.011108],[13.669167,46.177498],[13.383055,46.297218],[13.718655,46.526611]]]]}},{"type":"Feature","properties":{"name":"Sierra Leone","iso2":"SL","iso3":"SLE"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-12.525278,7.431389],[-12.952778,7.568333],[-12.591112,7.634444],[-12.525278,7.431389]]],[[[-11.214444999999898,9.997499],[-10.571526,9.059532],[-10.695835,8.298611],[-10.266651,8.488377],[-11.492331,6.927091000000132],[-12.958612,7.9],[-13.288057,8.496111000000127],[-13.05139,8.36861],[-13.120278999999897,8.461666000000122],[-12.897500999999863,8.567778],[-13.165279,8.51861],[-13.2425,8.802500000000123],[-13.132223,8.861944],[-13.29561,9.032143],[-12.456112,9.888332],[-11.214444999999898,9.997499]]]]}},{"type":"Feature","properties":{"name":"Singapore","iso2":"SG","iso3":"SGP"},"geometry":{"type":"MultiPolygon","coordinates":[[[[103.99054,1.383291],[103.640808,1.315555],[103.713593,1.429444],[103.99054,1.383291]]]]}},{"type":"Feature","properties":{"name":"Somalia","iso2":"SO","iso3":"SOM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[42.944092,11.002438],[43.249222,11.469534],[44.278328,10.447777],[44.898331,10.420555],[45.759995,10.875277],[46.448051,10.688889],[47.398888,11.179998],[50.085548,11.511944],[50.76944,11.979166],[51.277222,11.836666],[51.01416,10.442778],[51.412636,10.451515],[50.896942,10.319721],[50.83625,9.432688],[47.954437,4.463888],[46.014717,2.427778],[43.488609,0.649999],[41.558159,-1.674868],[40.998329,-0.866111],[40.98659500000011,2.829956],[41.905167,3.980322],[43.686386,4.891944],[44.950829,4.902499],[47.988243,8.004107],[47.01194,8.00111],[44.010551,9.007221],[42.848053,10.22361],[42.663055,10.6325],[42.944092,11.002438]]]]}},{"type":"Feature","properties":{"name":"Spain","iso2":"ES","iso3":"ESP"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-17.91278076171875,27.771665573120117],[-17.98278045654297,27.63749885559082],[-18.17055892944336,27.73722267150879],[-17.91278076171875,27.771665573120117]]],[[[-15.554166793823242,27.755834579467773],[-15.70250129699707,28.156110763549805],[-15.365556716918945,28.010278701782227],[-15.554166793823242,27.755834579467773]]],[[[-17.175003051757812,28.016942977905273],[-17.31694793701172,28.172224044799805],[-17.101947784423828,28.134721755981445],[-17.175003051757812,28.016942977905273]]],[[[-16.341114044189453,28.37027931213379],[-16.671390533447266,27.984167098999023],[-16.91278076171875,28.34139060974121],[-16.15694808959961,28.572221755981445],[-16.341114044189453,28.37027931213379]]],[[[-14.32722282409668,28.046388626098633],[-13.869722366333008,28.75139045715332],[-13.923055648803711,28.24916648864746],[-14.32722282409668,28.046388626098633]]],[[[-17.831947326660156,28.453889846801758],[-17.90444564819336,28.849443435668945],[-17.716392517089844,28.746110916137695],[-17.831947326660156,28.453889846801758]]],[[[-13.609724044799805,28.926389694213867],[-13.852222442626953,28.906389236450195],[-13.442501068115234,29.23166847229004],[-13.609724044799805,28.926389694213867]]],[[[-2.925277709960938,35.26666450500488],[-2.946945190429688,35.32916450500488],[-2.914722442626953,35.27360725402832],[-2.925277709960938,35.26666450500488]]],[[[-5.31944465637207,35.87693977355957],[-5.345832824707031,35.84166145324707],[-5.395557403564453,35.916337966918945],[-5.31944465637207,35.87693977355957]]],[[[-3.036109924316406,35.91277503967285],[-3.051111221313477,35.91583442687988],[-3.0272216796875,35.92444038391113],[-3.036109924316406,35.91277503967285]]],[[[1.577779769897461,38.68777656555176],[1.390279769897461,38.643327713012695],[1.383054733276367,38.72055244445801],[1.577779769897461,38.68777656555176]]],[[[1.531667709350586,38.95194435119629],[1.211946487426758,38.898332595825195],[1.519723892211914,39.11833381652832],[1.531667709350586,38.95194435119629]]],[[[3.247777938842773,39.73472023010254],[3.47972297668457,39.71110725402832],[3.06361198425293,39.26361274719238],[2.364168167114258,39.55583381652832],[2.98777961730957,39.91111183166504],[3.247777938842773,39.73472023010254]]],[[[4.273332595825195,39.96138954162598],[4.276388168334961,39.8063907623291],[3.796945571899414,40.017221450805664],[4.273332595825195,39.96138954162598]]],[[[-7.855554580688477,43.75999641418457],[-7.044818878173828,43.49040412902832],[-1.780876159667969,43.35992622375488],[-0.562221527099609,42.781389236450195],[1.445833206176758,42.601945877075195],[1.723611831665039,42.50943946838379],[3.177656173706055,42.43680763244629],[3.17527961730957,41.86749458312988],[0.964445114135742,41.03277778625488],[0.048891067504883,40.03610420227051],[-0.338054656982422,39.435556411743164],[0.207223892211914,38.73221015930176],[-0.511667251586914,38.32499885559082],[-0.715555191040039,37.606943130493164],[-1.643610000610352,37.37277412414551],[-2.129165649414063,36.73138618469238],[-4.398332595825195,36.72222328186035],[-5.334506988525391,36.16256141662598],[-5.355798721313477,36.16330909729004],[-6.037500381469727,36.18027687072754],[-6.355554580688477,36.8608341217041],[-7.431854248046875,37.253190994262695],[-7.446945190429688,37.69944190979004],[-6.939167022705078,38.178056716918945],[-7.321111679077148,38.44944190979004],[-6.954792022705078,39.026384353637695],[-7.532505035400391,39.66942024230957],[-7.017221450805664,39.674997329711914],[-6.931667327880859,41.01805305480957],[-6.187221527099609,41.579721450805664],[-6.594165802001953,41.9536075592041],[-8.204723358154297,41.87471961975098],[-8.201223373413086,42.15274238586426],[-8.74500846862793,41.95250129699707],[-8.898612976074219,42.10805702209473],[-8.579723358154297,42.35166358947754],[-8.86916732788086,42.25139045715332],[-8.719446182250977,42.69583320617676],[-9.041389465332031,42.528886795043945],[-9.20944595336914,43.15277290344238],[-7.855554580688477,43.75999641418457]],[[-6.924999237060547,37.17083168029785],[-6.973054885864258,37.210275650024414],[-6.954166412353516,37.18027687072754],[-6.924999237060547,37.17083168029785]]]]}},{"type":"Feature","properties":{"name":"Saint Lucia","iso2":"LC","iso3":"LCA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-60.954727,13.709444],[-61.079445,13.879999],[-60.930283,14.109444],[-60.954727,13.709444]]]]}},{"type":"Feature","properties":{"name":"Sudan","iso2":"SD","iso3":"SDN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[37.268608000000114,20.75111],[37.242218,20.785831],[37.263855,20.84972400000011],[37.268608000000114,20.75111]]],[[[31.453888,21.998333000000102],[36.888466,22.000111000000132],[37.309441,21.060276],[37.10527000000016,21.212219],[37.433327000000105,18.858055],[38.600693,17.994881],[37.423286000000104,17.034214],[36.995827,17.073887],[36.97305300000019,16.269444],[36.44328300000021,15.149952],[36.5428160000001,14.262053],[36.142693,12.706923000000117],[35.70108,12.666115],[35.096939000000106,11.826944],[34.864441,10.734999],[34.594444,10.887777],[34.28611,10.554165],[34.120552,8.577221000000122],[33.252777,8.458611000000118],[32.991104,7.924999],[33.711388,7.660277],[34.70472,6.677777000000106],[35.30194100000014,5.378055],[35.821663,5.32861],[35.940552,4.622499],[34.388191,4.609682],[33.996666,4.222777000000136],[33.516937,3.752222],[33.016663,3.888611000000111],[32.193329,3.511389000000108],[31.176666,3.795278],[30.858818,3.493394000000137],[29.64333,4.643611000000135],[28.363052,4.29],[27.455276,5.016388],[27.142776,5.771944],[26.437496000000124,6.077777],[26.404999,6.646388],[25.206944000000135,7.497499],[25.25333,7.850555],[24.192497000000117,8.30361],[24.201111,8.686943],[23.517776,8.714167],[23.669167,9.866943],[22.866505,10.922447],[22.46694200000013,12.621666],[21.827774,12.797499000000144],[22.294167,13.35861],[22.084442,13.779165],[22.55499600000013,14.125555000000148],[22.384163,14.55416500000014],[22.935833,15.11611],[22.937222000000105,15.561943],[23.999603,15.698709],[24.002747,19.499065],[24.000832000000116,20.001942],[25.000832,19.999119],[25.001423,21.999695],[31.271111000000104,21.998333000000102],[31.455555000000146,22.23222],[31.453888,21.998333000000102]]]]}},{"type":"Feature","properties":{"name":"Sweden","iso2":"SE","iso3":"SWE"},"geometry":{"type":"MultiPolygon","coordinates":[[[[16.836666,56.82694200000013],[16.420830000000194,56.211105],[17.105553,57.348328],[16.836666,56.82694200000013]]],[[[18.206108,56.91194200000011],[18.119164,57.531105],[19.004719000000136,57.908607],[18.206108,56.91194200000011]]],[[[19.334442,57.955826],[19.12611,57.839722],[19.034443,57.901108],[19.334442,57.955826]]],[[[11.594444,57.932495000000145],[11.501944,58.036659],[11.735884,58.041714],[11.594444,57.932495000000145]]],[[[16.816666,58.116104],[16.77861,58.100555],[16.801109,58.12332900000011],[16.816666,58.116104]]],[[[11.806389000000195,58.120552],[11.40111,58.13027200000012],[11.6775,58.286659000000114],[11.806389000000195,58.120552]]],[[[19.236942,58.337219],[19.186665,58.391388],[19.331108,58.366104],[19.236942,58.337219]]],[[[17.691387,58.91693900000014],[17.639164,58.971107],[17.6758310000001,59.054718],[17.691387,58.91693900000014]]],[[[18.40583,59.023888],[18.35722,59.034996],[18.479164000000196,59.11999500000012],[18.40583,59.023888]]],[[[18.537220000000133,59.223885],[18.389442000000145,59.284721],[18.610275000000144,59.254166000000126],[18.537220000000133,59.223885]]],[[[17.786942,59.310555],[17.6055530000001,59.416664],[17.773888,59.372772],[17.786942,59.310555]]],[[[17.734722000000147,59.296104],[17.817497,59.2777710000001],[17.62277600000013,59.30527500000012],[17.52027500000011,59.418327],[17.734722000000147,59.296104]]],[[[17.266388000000177,59.374443],[17.07,59.459442],[17.266941,59.44416],[17.266388000000177,59.374443]]],[[[18.575554,59.448326],[18.570274,59.526382],[18.746944,59.544998],[18.575554,59.448326]]],[[[18.57,60.307777],[18.401108,60.36527300000013],[18.374165000000175,60.4997180000001],[18.57,60.307777]]],[[[17.509163,62.363327],[17.367222000000197,62.471664],[17.472221,62.458328],[17.509163,62.363327]]],[[[18.060833000000173,62.67083],[18.039165,62.73555000000012],[18.153053000000142,62.728882],[18.060833000000173,62.67083]]],[[[20.885555,63.751663000000136],[20.83805500000011,63.773331],[20.928608000000168,63.773331],[20.885555,63.751663000000136]]],[[[21.809166,68.570541],[23.66611100000017,67.941666],[23.431110000000103,67.46554600000015],[23.76777600000011,67.41610700000014],[23.571663,67.15666200000011],[24.007774,66.800552],[23.661942,66.31221],[24.167007000000126,65.814026],[22.644722,65.905548],[22.3291660000001,65.829712],[22.40583,65.535263],[21.766941,65.722488],[22.199165,65.54527300000014],[21.260555,65.337494],[21.621387,65.142212],[21.03611000000018,64.8244320000001],[21.584999,64.439713],[20.777775,63.869164],[19.428055,63.549438],[18.20861100000019,62.77861],[17.696663,62.991943],[18.048054,62.601387],[17.32888800000012,62.486938],[17.654720000000168,62.23111],[17.34972000000016,61.945274],[17.498886,61.63582600000014],[17.140274,61.719719],[17.150555,60.945],[19.081944000000192,59.75972],[17.941109,59.335548],[17.764442,59.400551],[17.845276,59.53305100000013],[17.71722000000011,59.66333],[17.59222,59.656105000000125],[17.648331,59.66583300000015],[17.654163,59.718048],[17.594166,59.80693800000013],[17.4447210000001,59.676109],[17.543152000000163,59.573006],[17.513054000000125,59.706383],[17.618332,59.73138400000012],[17.561171000000172,59.668449],[17.786663,59.535828],[17.73111,59.442772],[17.38361,59.654999],[16.020275,59.49499500000012],[16.88999900000016,59.383331],[16.692776,59.471382],[16.84027500000019,59.48944100000013],[17.375832,59.247498],[17.35083,59.32444],[17.847221,59.264442],[18.289444000000174,59.368607],[18.466663,59.330276000000126],[18.434444,59.433609],[18.640274,59.338882],[18.277222,59.31082900000011],[18.311386,59.1325],[17.894722000000115,58.858887],[17.663887,59.168327],[17.349998,58.75222000000015],[16.193607,58.62749500000011],[16.93861,58.4841610000001],[16.413330000000116,58.474716],[16.824718,58.19944],[16.613888,57.98693800000011],[16.770554000000175,57.884438],[16.495552,57.98555],[16.70070600000011,57.74015],[16.418610000000115,57.893326],[16.693333,57.469162],[15.865555,56.092216],[14.696665,56.161110000000164],[14.217222,55.830276000000126],[14.193546,55.386147],[12.982222,55.400551],[13.059721,55.693054],[12.451666000000102,56.2977750000001],[12.813332000000145,56.23277300000011],[12.622221,56.411942],[12.887499000000162,56.638329],[11.698889000000179,57.697220000000144],[11.88611,58.211937],[11.798054,58.318329],[11.201387000000182,58.399437],[11.113333000000125,59.00360900000011],[11.429192000000114,58.98764],[11.751110000000153,59.0902710000001],[11.815960000000189,59.8461],[12.494165,60.1111070000001],[12.594444000000124,60.516937],[12.209999,61.002495],[12.85611,61.36249500000012],[12.124443,61.728607],[12.295832000000132,62.261665],[11.936388,63.272217],[12.139444000000111,63.58416],[12.938055,64.05332900000015],[13.988333000000154,64.01805100000014],[14.116388,64.470551],[13.662498,64.58276400000013],[14.49305500000014,65.313599],[14.504999,66.13249200000014],[15.468054000000109,66.283875],[15.362778,66.479996],[16.353886,67.017776],[16.085831,67.41165200000013],[16.726944000000174,67.899155],[17.884163,67.945541],[18.090832,68.50776700000013],[19.937775,68.33749400000012],[20.350277000000176,68.7866520000001],[20.096943,69.042221],[20.580929,69.060303],[21.809166,68.570541]]]]}},{"type":"Feature","properties":{"name":"Syrian Arab Republic","iso2":"SY","iso3":"SYR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[42.355614,37.106926],[41.290276,36.355553],[41.003876,34.419434],[38.794701,33.377594],[36.837776,32.313606],[35.648888,32.685272],[35.623634,33.245728],[36.623741,34.204994],[36.459999,34.635277],[35.972771,34.647499],[35.733887,35.581665],[35.92244,35.926994],[36.69026900000014,36.236107],[36.659943,36.83371],[39.229996,36.665276],[40.770821,37.11805],[42.355614,37.106926]]]]}},{"type":"Feature","properties":{"name":"Switzerland","iso2":"CH","iso3":"CHE"},"geometry":{"type":"MultiPolygon","coordinates":[[[[7.697223,47.543327000000104],[8.576420000000155,47.59137],[8.566111,47.806938],[9.566724,47.540451],[9.533569,47.274544],[9.474637,47.057457],[9.598635,47.063835],[10.471235,46.871353],[10.465277000000128,46.546387],[10.050278000000105,46.539993],[10.129999000000112,46.22721900000015],[9.281944000000124,46.49582700000015],[9.036665,45.837776],[8.436388000000136,46.463333000000105],[7.855742,45.91905200000012],[7.038054,45.93193800000013],[6.791389000000152,46.434166],[5.966666,46.209442],[6.990555000000143,47.497215],[7.588268,47.58448],[7.697223,47.543327000000104]],[[8.710255,47.696808],[8.670555,47.711105],[8.678595,47.693344],[8.710255,47.696808]]]]}},{"type":"Feature","properties":{"name":"Trinidad and Tobago","iso2":"TT","iso3":"TTO"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-60.923058,10.797222],[-61.008057,10.140554000000122],[-61.91806,10.042776],[-61.458336,10.278332],[-61.662224,10.709166000000124],[-60.923058,10.797222]]],[[[-60.63945,11.203054],[-60.847504,11.158333000000141],[-60.526672,11.346109],[-60.63945,11.203054]]]]}},{"type":"Feature","properties":{"name":"Thailand","iso2":"TH","iso3":"THA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[99.219162,6.532499],[99.159988,6.548888],[99.256119,6.571944],[99.219162,6.532499]]],[[[99.668045,6.496387],[99.594986,6.593888],[99.66281100000012,6.702995],[99.668045,6.496387]]],[[[100.536087,7.15611000000014],[100.520813,7.154999],[100.534973,7.174166],[100.536087,7.15611000000014]]],[[[99.38916,7.194721],[99.39360000000013,7.270555000000144],[99.419144,7.234165000000147],[99.38916,7.194721]]],[[[99.110809,7.46805500000012],[99.04248,7.525832],[99.0241550000002,7.636666],[99.110809,7.46805500000012]]],[[[99.11970500000021,7.591944],[99.045822,7.669443000000101],[99.12191800000014,7.665277],[99.11970500000021,7.591944]]],[[[98.434708,7.930554],[98.418045,7.93611],[98.43692,7.94361],[98.434708,7.930554]]],[[[98.603592,7.901111],[98.526093,8.121386],[98.61192300000013,8.048609],[98.603592,7.901111]]],[[[98.39984100000018,7.941753],[98.305252,7.757222],[98.282486,8.186386000000155],[98.39984100000018,7.941753]]],[[[98.616653,8.084442000000124],[98.568329,8.11722],[98.628311,8.189165],[98.616653,8.084442000000124]]],[[[98.266663,9.030554],[98.28082300000014,9.158054],[98.324432,9.084164],[98.266663,9.030554]]],[[[97.87915,9.381941000000126],[97.835266,9.402777000000142],[97.847214,9.43222],[97.87915,9.381941000000126]]],[[[97.89888,9.437498],[97.847488,9.45860900000011],[97.883881,9.475554],[97.89888,9.437498]]],[[[99.681366,9.506109],[99.664993,9.524443],[99.7086029999999,9.53861],[99.681366,9.506109]]],[[[98.467484,9.574999000000105],[98.45776400000014,9.573887000000113],[98.464432,9.585554],[98.467484,9.574999000000105]]],[[[99.976089,9.41361000000012],[99.93220500000015,9.546944],[100.080833,9.58861],[99.976089,9.41361000000012]]],[[[99.685532,9.606665],[99.676651,9.607498],[99.67359900000011,9.629164],[99.685532,9.606665]]],[[[98.407211,9.714165],[98.380814,9.732775000000103],[98.40832500000013,9.770832],[98.407211,9.714165]]],[[[100.08167300000011,9.686665],[99.99054,9.711388000000142],[99.987488,9.796387],[100.08167300000011,9.686665]]],[[[102.59552,11.56361],[102.531357,11.601387],[102.560226,11.754396],[102.59552,11.56361]]],[[[102.435791,11.954165],[102.29135100000022,11.97444200000011],[102.250549,12.15],[102.435791,11.954165]]],[[[102.241089,12.283888],[102.235527,12.285276],[102.2397,12.299442],[102.241089,12.283888]]],[[[100.68887300000014,12.923609],[100.671654,12.938332],[100.676376,12.952776],[100.68887300000014,12.923609]]],[[[100.816673,13.129442],[100.807213,13.180277],[100.821381,13.15055500000011],[100.816673,13.129442]]],[[[100.08132200000014,20.348841],[100.09137,20.348606],[100.58046,20.157768000000104],[100.50360100000015,19.526665],[101.281097,19.562218],[100.921371,17.56721900000015],[101.162773,17.459995],[102.089394,18.214983000000146],[102.683594,17.819996],[103.397217,18.434994],[103.985527,18.321663],[104.71832300000014,17.50333],[104.747208,16.528332],[105.637772,15.659721],[105.536102,14.563332000000116],[105.210602,14.349648],[103.180542,14.32972],[102.37719700000011,13.573887],[102.916092,11.635851],[102.06025700000012,12.567497],[100.85386700000018,12.682775],[100.976349,13.462809],[100.066673,13.41999800000012],[100.021378,12.194164],[99.149155,10.365553],[99.237488,9.25416600000014],[99.847763,9.30083100000013],[100.421082,7.159444000000136],[101.541367,6.851388],[102.09523,6.236138],[101.833862,5.743332],[101.56997700000014,5.916666],[101.139687,5.631943],[101.11551700000021,6.248888000000122],[100.654968,6.448332],[100.214981,6.711110000000119],[100.127113,6.424947],[98.656372,8.38361],[98.27415500000015,8.274443000000119],[98.742752,10.348608],[99.661652,11.826942],[99.112198,13.055832],[99.173965,13.727781],[98.201096,15.074999],[98.92804,16.38583],[98.68969700000011,16.284996],[97.346375,18.562496000000138],[97.774704,18.569996],[98.049988,19.807499000000135],[98.995529,19.780552],[99.522766,20.352776000000134],[100.08132200000014,20.348841]]]]}},{"type":"Feature","properties":{"name":"Tajikistan","iso2":"TJ","iso3":"TJK"},"geometry":{"type":"MultiPolygon","coordinates":[[[[74.915741,37.237328],[73.307205,37.462753],[71.6772,36.67601],[71.429428,37.075829],[71.591934,37.902618],[71.252777,37.922035],[71.363037,38.248497],[70.967209,38.472115],[70.161377,37.933372],[70.155823,37.536232],[69.515823,37.580826],[69.315262,37.115273],[68.887772,37.3386],[68.058014,36.932526],[67.779877,37.185822],[68.384155,38.195541],[68.123871,38.98555],[67.376373,39.212494],[67.441956,39.483582],[68.540268,39.55471],[69.009995,40.089714],[68.600815,40.178329],[69.308029,40.201385],[69.356094,40.772491],[69.732483,40.638603],[70.423874,41.049118],[70.796799,40.725594],[70.375534,40.376404],[70.98204,40.244843],[70.498032,39.90683],[69.540817,40.131378],[69.306091,39.539436],[70.997757,39.40094],[71.473038,39.6213],[72.248596,39.191856],[73.655685,39.454826],[73.817764,38.607712],[74.8566440000001,38.470482],[74.902771,37.647156],[75.187485,37.406586000000104],[74.915741,37.237328]]]]}},{"type":"Feature","properties":{"name":"Tokelau","iso2":"TK","iso3":"TKL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-171.214722,-9.377499],[-171.223907,-9.378889],[-171.224701,-9.345556],[-171.214722,-9.377499]]],[[[-171.843079,-9.207502],[-171.860535,-9.206667],[-171.853882,-9.168058],[-171.843079,-9.207502]]],[[[-172.483917,-8.587221],[-172.496979,-8.553888],[-172.483612,-8.566666],[-172.483917,-8.587221]]]]}},{"type":"Feature","properties":{"name":"Tonga","iso2":"TO","iso3":"TON"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-174.91085815429688,-21.426666259765625],[-174.97470092773438,-21.365833282470703],[-174.91143798828125,-21.306110382080078],[-174.91085815429688,-21.426666259765625]]],[[[-175.14584350585938,-21.178058624267578],[-175.35946655273438,-21.099170684814453],[-175.0472412109375,-21.139442443847656],[-175.14584350585938,-21.178058624267578]]],[[[-174.76083374023438,-20.276390075683594],[-174.79196166992188,-20.234722137451172],[-174.76004028320312,-20.237224578857422],[-174.76083374023438,-20.276390075683594]]],[[[-174.4139404296875,-19.926666259765625],[-174.42254638671875,-19.910003662109375],[-174.390869140625,-19.881668090820312],[-174.4139404296875,-19.926666259765625]]],[[[-174.318603515625,-19.821945190429688],[-174.35498046875,-19.81195068359375],[-174.31585693359375,-19.764171600341797],[-174.318603515625,-19.821945190429688]]],[[[-175.05667114257812,-19.800838470458984],[-175.09860229492188,-19.749725341796875],[-175.08169555664062,-19.706390380859375],[-175.05667114257812,-19.800838470458984]]],[[[-174.27252197265625,-19.752784729003906],[-174.30722045898438,-19.740833282470703],[-174.25613403320312,-19.688053131103516],[-174.27252197265625,-19.752784729003906]]],[[[-175.01834106445312,-19.691387176513672],[-175.03585815429688,-19.676666259765625],[-175.00558471679688,-19.65250015258789],[-175.01834106445312,-19.691387176513672]]],[[[-174.24447631835938,-19.656112670898438],[-174.28195190429688,-19.634445190429688],[-174.29196166992188,-19.594444274902344],[-174.24447631835938,-19.656112670898438]]],[[[-174.64697265625,-18.830280303955078],[-174.675048828125,-18.804447174072266],[-174.6497802734375,-18.783058166503906],[-174.62307739257812,-18.809444427490234],[-174.64697265625,-18.830280303955078]]],[[[-174.0614013671875,-18.704723358154297],[-174.09780883789062,-18.696388244628906],[-174.07363891601562,-18.681110382080078],[-174.0614013671875,-18.704723358154297]]],[[[-174.01974487304688,-18.717220306396484],[-174.0433349609375,-18.680835723876953],[-174.01919555664062,-18.694446563720703],[-174.01974487304688,-18.717220306396484]]],[[[-174.0897216796875,-18.674171447753906],[-174.1280517578125,-18.70333480834961],[-174.11581420898438,-18.671390533447266],[-174.0897216796875,-18.674171447753906]]],[[[-173.91055297851562,-18.638057708740234],[-174.07058715820312,-18.632503509521484],[-173.939208984375,-18.568893432617188],[-173.91055297851562,-18.638057708740234]]],[[[-175.64474487304688,-15.629167556762695],[-175.68392944335938,-15.589723587036133],[-175.62139892578125,-15.560834884643555],[-175.64474487304688,-15.629167556762695]]]]}},{"type":"Feature","properties":{"name":"Togo","iso2":"TG","iso3":"TGO"},"geometry":{"type":"MultiPolygon","coordinates":[[[[1.398542,9.429901],[1.635404,6.218721],[1.198891,6.100546],[0.525,6.947778],[0.727222,8.321388],[0.382735,8.760756],[0.550833,9.411388],[0.2175,9.457222],[0.368333,10.259443],[-0.149762,11.13854],[0.91797,10.996399],[0.776667,10.376665],[1.355,9.995277],[1.398542,9.429901]]]]}},{"type":"Feature","properties":{"name":"Sao Tome and Principe","iso2":"ST","iso3":"STP"},"geometry":{"type":"MultiPolygon","coordinates":[[[[6.523889000000139,0.018333],[6.467222,0.259722000000139],[6.687778,0.402222],[6.523889000000139,0.018333]]],[[[7.423055,1.556111],[7.327222,1.607222000000107],[7.406666000000143,1.701944000000154],[7.423055,1.556111]]]]}},{"type":"Feature","properties":{"name":"Tunisia","iso2":"TN","iso3":"TUN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[10.99361,33.75],[10.865,33.638611],[10.72611,33.880829],[10.99361,33.75]]],[[[11.064722,34.64054900000015],[11.03500000000011,34.617493000000124],[10.961111000000102,34.655273],[11.064722,34.64054900000015]]],[[[11.13722,34.675278],[11.230833,34.821106],[11.302221,34.80332900000012],[11.13722,34.675278]]],[[[10.808611,37.119438],[10.791943,37.126389],[10.814722,37.125275000000116],[10.808611,37.119438]]],[[[9.845247000000143,37.139351],[10.252499,37.186386],[10.381943000000149,36.723328],[11.067778000000118,37.051384],[10.455276,36.123329],[11.128887,35.23583200000017],[10.005833,34.16693900000011],[10.331944,33.700272],[11.048611,33.61694300000012],[11.17111,33.210831],[11.526081,33.171135],[11.567499,32.442215],[10.287222,31.694164],[10.21361,30.730831],[9.537113,30.23439],[9.055277,32.099998],[8.34861,32.533333],[7.492499000000123,33.887497],[8.251665,34.64444],[8.183611,36.524162],[8.62203,36.941368],[9.672499000000187,37.338051],[9.845247000000143,37.139351]]],[[[8.917776000000174,37.510826],[8.896111000000133,37.525833],[8.9447210000001,37.538055],[8.917776000000174,37.510826]]]]}},{"type":"Feature","properties":{"name":"Turkey","iso2":"TR","iso3":"TUR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[26.078053,39.783600000000106],[25.97499500000015,39.829987],[26.07582900000017,39.839722],[26.078053,39.783600000000106]]],[[[25.824444,40.100266],[25.66388300000017,40.126389],[26.013611,40.157494],[25.824444,40.100266]]],[[[27.607220000000154,40.57222],[27.531109,40.648331],[27.735271,40.634438000000145],[27.607220000000154,40.57222]]],[[[35.09693100000018,41.961655],[35.506386000000106,41.638054],[36.051102,41.691933],[36.429153,41.242775],[38.361382,40.909431],[40.149994,40.920273],[41.531559,41.523876],[42.827492,41.584991],[43.46077,41.112961],[43.75193800000014,40.739998],[43.65749400000013,40.10859700000016],[44.347214,40.023888],[44.778862,39.70638300000017],[44.813042,39.630814],[44.605820000000136,39.78054],[44.4161,39.425262],[44.034157,39.3849950000001],[44.484154,38.345543],[44.223969,37.899151],[44.61805,37.727768],[44.787338,37.149712],[44.317215,36.970543],[44.116379,37.316376],[42.790825000000126,37.384720000000144],[42.355614,37.106926],[40.770821,37.11805],[39.229996,36.665276],[36.659943,36.83371],[36.69026900000014,36.236107],[35.92244,35.926994],[35.783875,36.312485],[36.217766,36.654999],[36.02193500000013,36.926384],[35.339989,36.539162],[34.659431,36.805275],[33.98860200000016,36.277771],[32.808884,36.02555100000011],[31.046661,36.849152],[30.623333000000144,36.850822],[30.40694,36.203606],[29.67721600000013,36.11833200000014],[28.454163,36.881386],[27.983887,36.55277300000013],[28.118332,36.800278],[27.37944000000016,36.680832],[28.328606,37.039719],[27.252499,36.96749900000013],[27.595276,37.232491],[27.193886,37.350822],[27.267773000000147,37.955544],[26.275829,38.264435],[26.369999,38.661942],[26.682217,38.307487],[27.161942000000124,38.443886],[26.730827,38.645821],[27.064442,38.874435],[26.644722000000144,39.263054],[26.951664,39.552773],[26.067219,39.483047],[26.707222,40.384995],[28.985271,40.356934],[28.795277,40.551384],[29.938049,40.723885],[29.12944000000016,40.914444],[29.166111,41.226662],[31.23111,41.0888750000001],[33.33387800000017,42.020264],[35.09693100000018,41.961655]]],[[[27.394997,42.008041],[28.013054,41.982216],[28.090549000000124,41.631386],[29.039162,41.057213],[27.50972,40.983597],[26.181107,40.045273],[26.826939,40.594437],[26.044720000000154,40.735825],[26.63388400000011,41.35443900000014],[26.361095,41.711052],[27.394997,42.008041]]]]}},{"type":"Feature","properties":{"name":"Tuvalu","iso2":"TV","iso3":"TUV"},"geometry":{"type":"MultiPolygon","coordinates":[[[[179.222366,-8.554146],[179.203705,-8.462443],[179.231094,-8.50492],[179.222366,-8.554146]]],[[[178.366913,-8.062778],[178.355804,-8.06139],[178.36969,-8.0275],[178.366913,-8.062778]]],[[[178.39776599999985,-8.015278],[178.39151,-8],[178.4030460000001,-7.991388],[178.39776599999985,-8.015278]]],[[[178.700531,-7.482223],[178.687469,-7.478889],[178.690796,-7.464445],[178.700531,-7.482223]]],[[[177.158875,-7.187778],[177.146362,-7.188611],[177.142212,-7.173611],[177.158875,-7.187778]]],[[[176.310242,-6.285556],[176.295258,-6.278056],[176.30886800000016,-6.257501],[176.310242,-6.285556]]],[[[177.295807,-6.113889],[177.28137200000012,-6.089444],[177.308868,-6.098889],[177.295807,-6.113889]]],[[[176.139709,-5.690556],[176.130249,-5.693333],[176.12939500000013,-5.675],[176.139709,-5.690556]]],[[[176.08136,-5.665277],[176.066376,-5.665277],[176.079407,-5.657778],[176.08136,-5.665277]]]]}},{"type":"Feature","properties":{"name":"Turkmenistan","iso2":"TM","iso3":"TKM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[53.069719314575195,38.89972114562988],[53.0786075592041,39.093881607055664],[53.10000038146973,38.751108169555664],[53.069719314575195,38.89972114562988]]],[[[58.78055000305176,42.65804481506348],[60.01444435119629,42.21749305725098],[60.140275955200195,41.38110542297363],[61.874162673950195,41.12555122375488],[62.551103591918945,39.934160232543945],[64.38302803039551,38.95312690734863],[66.64387702941895,38.00305366516113],[66.5377368927002,37.36638069152832],[65.7088794708252,37.53860664367676],[64.79803657531738,37.1249942779541],[64.50360298156738,36.28055000305176],[63.11944007873535,35.86194038391113],[63.10527229309082,35.45083045959473],[62.72221565246582,35.254716873168945],[62.309160232543945,35.14166450500488],[61.276559829711914,35.607248306274414],[61.15721321105957,36.64999580383301],[60.33305549621582,36.65609931945801],[59.338884353637695,37.53916358947754],[57.450273513793945,37.939157485961914],[57.21221351623535,38.281938552856445],[55.442766189575195,38.08610725402832],[54.681108474731445,37.44360542297363],[53.90564155578613,37.35085487365723],[53.9838809967041,38.91582679748535],[53.54138374328613,39.335824966430664],[53.162492752075195,39.175554275512695],[53.26416206359863,39.6552677154541],[53.73443794250488,39.523881912231445],[53.40832710266113,39.66582679748535],[53.57583045959473,39.96610450744629],[52.93471717834473,39.990549087524414],[53.004716873168945,39.762216567993164],[52.721933364868164,40.44610023498535],[52.91860389709473,41.08166694641113],[53.74638557434082,40.61527442932129],[54.41777229309082,40.7036075592041],[54.24471473693848,40.88027381896973],[54.7338809967041,41.10222053527832],[54.072771072387695,41.47554969787598],[53.80388069152832,42.12388038635254],[52.94665718078613,41.97304725646973],[52.81582832336426,41.69582557678223],[52.88193702697754,41.04722023010254],[52.440073013305664,41.74093818664551],[53.01500129699707,42.13888740539551],[54.173051834106445,42.33721351623535],[55.45694160461426,41.28666114807129],[56.00096321105957,41.32845497131348],[57.04471778869629,41.26027870178223],[56.98694038391113,41.89305305480957],[58.0266056060791,42.50464057922363],[58.51555061340332,42.3044376373291],[58.164438247680664,42.651933670043945],[58.78055000305176,42.65804481506348]]]]}},{"type":"Feature","properties":{"name":"United Republic of Tanzania","iso2":"TZ","iso3":"TZA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[39.682495,-7.993334],[39.591385,-7.945834],[39.901108,-7.638889],[39.682495,-7.993334]]],[[[39.4466630000002,-6.210556],[39.516106,-6.468612],[39.201385,-6.226945],[39.304161,-5.723889],[39.4466630000002,-6.210556]]],[[[39.736107,-5.462778],[39.676941,-4.941389],[39.857216,-4.908611],[39.736107,-5.462778]]],[[[31.677219,-0.999722],[33.920273,-1.001111],[37.602776,-2.995833],[37.613609,-3.504167],[39.20302600000011,-4.669618],[38.776382,-6.045556],[39.5478820000001,-6.994313],[39.274437,-7.579167],[39.387772,-8.9025],[39.8263850000001,-9.993057],[40.43681300000017,-10.478174],[39.268051000000156,-11.168056],[37.941383,-11.285002],[37.462044,-11.727329],[36.18972,-11.706667],[35.838333,-11.414722],[34.966728,-11.572111],[34.325272,-9.732779],[33.13472000000016,-9.494167],[32.940399,-9.405077],[31.041111,-8.590279],[30.77124000000012,-8.192247],[29.550278,-6.295279],[29.423885,-4.448056],[30.026108000000107,-4.269444],[30.83499900000018,-3.256945],[30.843662,-2.978794],[30.4175,-2.861945],[30.57333,-2.399167],[30.894165,-2.076111],[30.48222,-1.063334],[31.677219,-0.999722]]]]}},{"type":"Feature","properties":{"name":"Uganda","iso2":"UG","iso3":"UGA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[33.996666,4.222777000000136],[34.463333,3.671389],[35.0097200000001,1.895278],[33.907219,0.103056],[33.920273,-1.001111],[31.677219,-0.999722],[30.48222,-1.063334],[29.974998,-1.464445],[29.596943,-1.385834],[29.960552,0.825555],[31.302776,2.121388],[30.729721000000126,2.448055],[30.858818,3.493394000000137],[31.176666,3.795278],[32.193329,3.511389000000108],[33.016663,3.888611000000111],[33.516937,3.752222],[33.996666,4.222777000000136]]]]}},{"type":"Feature","properties":{"name":"United Kingdom","iso2":"GB","iso3":"GBR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-6.29083251953125,49.91221809387207],[-6.317499160766602,49.9152774810791],[-6.295000076293945,49.93388557434082],[-6.29083251953125,49.91221809387207]]],[[[-1.059720993041992,50.6874942779541],[-1.569999694824219,50.66055488586426],[-1.296943664550781,50.77194404602051],[-1.059720993041992,50.6874942779541]]],[[[-0.938331604003906,50.77749824523926],[-1.022499084472656,50.78582954406738],[-0.970832824707031,50.830827713012695],[-0.938331604003906,50.77749824523926]]],[[[-4.651666641235352,51.159440994262695],[-4.673334121704102,51.161386489868164],[-4.665555953979492,51.19500160217285],[-4.651666641235352,51.159440994262695]]],[[[-4.571388244628906,53.23861122131348],[-4.693889617919922,53.3013858795166],[-4.621665954589844,53.32139015197754],[-4.571388244628906,53.23861122131348]]],[[[-4.15333366394043,53.22555732727051],[-4.4022216796875,53.12583351135254],[-4.56916618347168,53.3880558013916],[-4.15333366394043,53.22555732727051]]],[[[-6.35333251953125,55.23777961730957],[-5.688055038452148,54.806108474731445],[-5.908332824707031,54.60472297668457],[-5.429721832275391,54.48360633850098],[-6.266975402832031,54.09983253479004],[-7.030834197998047,54.41777229309082],[-7.559444427490234,54.12693977355957],[-8.159444808959961,54.44194221496582],[-7.406389236450195,54.95333290100098],[-7.252506256103516,55.07059669494629],[-6.35333251953125,55.23777961730957]]],[[[-6.17277717590332,55.29305458068848],[-6.188333511352539,55.259721755981445],[-6.282499313354492,55.29222297668457],[-6.17277717590332,55.29305458068848]]],[[[-5.103610992431641,55.438608169555664],[-5.381111145019531,55.66861152648926],[-5.1602783203125,55.67916297912598],[-5.103610992431641,55.438608169555664]]],[[[-6.121665954589844,55.87888526916504],[-6.076665878295898,55.64999580383301],[-6.509166717529297,55.68222236633301],[-6.121665954589844,55.87888526916504]]],[[[-5.016387939453125,55.721940994262695],[-5.206388473510742,55.89943885803223],[-5.036388397216797,55.837778091430664],[-5.016387939453125,55.721940994262695]]],[[[-6.193889617919922,56.02916145324707],[-6.263055801391602,56.03611183166504],[-6.130832672119141,56.12082862854004],[-6.193889617919922,56.02916145324707]]],[[[-5.946945190429688,55.82999610900879],[-6.078887939453125,55.90555000305176],[-5.69444465637207,56.14721870422363],[-5.946945190429688,55.82999610900879]]],[[[-5.735000610351563,56.15805244445801],[-5.675277709960938,56.19194221496582],[-5.675832748413086,56.169443130493164],[-5.735000610351563,56.15805244445801]]],[[[-5.629999160766602,56.19693946838379],[-5.641944885253906,56.26027870178223],[-5.606388092041016,56.25444221496582],[-5.629999160766602,56.19693946838379]]],[[[-5.616666793823242,56.26888465881348],[-5.64555549621582,56.30111122131348],[-5.583889007568359,56.319719314575195],[-5.616666793823242,56.26888465881348]]],[[[-6.404722213745117,56.303606033325195],[-6.43638801574707,56.310556411743164],[-6.38194465637207,56.340829849243164],[-6.404722213745117,56.303606033325195]]],[[[-5.543611526489258,56.38277626037598],[-5.587778091430664,56.38916206359863],[-5.510000228881836,56.41111183166504],[-5.543611526489258,56.38277626037598]]],[[[-6.16583251953125,56.46472358703613],[-6.260000228881836,56.481943130493164],[-6.215555191040039,56.49777412414551],[-6.16583251953125,56.46472358703613]]],[[[-6.739166259765625,56.51583290100098],[-6.892778396606445,56.438608169555664],[-6.990833282470703,56.49444007873535],[-6.739166259765625,56.51583290100098]]],[[[-5.783611297607422,56.50889015197754],[-5.648332595825195,56.43583106994629],[-5.808610916137695,56.3174991607666],[-6.366111755371094,56.30888557434082],[-6.017778396606445,56.37471961975098],[-6.193611145019531,56.36138343811035],[-6.002777099609375,56.49416542053223],[-6.319999694824219,56.60305213928223],[-5.783611297607422,56.50889015197754]]],[[[-6.589166641235352,56.57999610900879],[-6.698888778686523,56.57999610900879],[-6.454444885253906,56.686105728149414],[-6.589166641235352,56.57999610900879]]],[[[-6.144721984863281,56.86999702453613],[-6.213054656982422,56.90694618225098],[-6.113611221313477,56.93249702453613],[-6.144721984863281,56.86999702453613]]],[[[-6.317499160766602,56.93416786193848],[-6.451665878295898,57.00610542297363],[-6.261667251586914,57.03777503967285],[-6.317499160766602,56.93416786193848]]],[[[-7.466943740844727,56.94082832336426],[-7.559999465942383,56.960275650024414],[-7.439722061157227,57.05444526672363],[-7.466943740844727,56.94082832336426]]],[[[-6.499166488647461,57.05221748352051],[-6.602500915527344,57.04638862609863],[-6.549444198608398,57.06805610656738],[-6.499166488647461,57.05221748352051]]],[[[-5.939167022705078,57.27805519104004],[-6.017778396606445,57.311662673950195],[-5.933889389038086,57.311662673950195],[-5.939167022705078,57.27805519104004]]],[[[-7.223054885864258,57.33749580383301],[-7.381389617919922,57.10860633850098],[-7.424999237060547,57.382219314575195],[-7.223054885864258,57.33749580383301]]],[[[-7.268888473510742,57.39888954162598],[-7.406389236450195,57.46416664123535],[-7.204721450805664,57.460832595825195],[-7.268888473510742,57.39888954162598]]],[[[-6.026945114135742,57.3286075592041],[-6.078332901000977,57.39416694641113],[-5.979999542236328,57.49582862854004],[-6.026945114135742,57.3286075592041]]],[[[-6.143888473510742,57.56805610656738],[-6.127222061157227,57.306108474731445],[-5.663888931274414,57.20499610900879],[-6.011943817138672,57.02221870422363],[-6.785833358764648,57.44610786437988],[-6.143888473510742,57.56805610656738]]],[[[-5.967777252197266,57.522775650024414],[-5.990833282470703,57.54083442687988],[-5.961666107177734,57.57499885559082],[-5.967777252197266,57.522775650024414]]],[[[-7.18861198425293,57.68721961975098],[-7.153888702392578,57.50943946838379],[-7.543333053588867,57.590829849243164],[-7.18861198425293,57.68721961975098]]],[[[-7.196666717529297,57.702219009399414],[-7.219165802001953,57.707773208618164],[-7.144721984863281,57.72361183166504],[-7.196666717529297,57.702219009399414]]],[[[-8.555278778076172,57.81083106994629],[-8.582500457763672,57.79888343811035],[-8.621389389038086,57.82277870178223],[-8.555278778076172,57.81083106994629]]],[[[-7.006389617919922,57.88138771057129],[-7.077777862548828,57.8799991607666],[-6.993610382080078,57.91861152648926],[-7.006389617919922,57.88138771057129]]],[[[-6.204166412353516,58.35611152648926],[-6.473888397216797,57.94027900695801],[-7.123056411743164,57.8174991607666],[-6.830278396606445,57.900835037231445],[-7.040555953979492,58.23333168029785],[-6.204166412353516,58.35611152648926]],[[-6.802221298217773,58.20305061340332],[-6.88972282409668,58.25249671936035],[-6.869167327880859,58.20388984680176],[-6.802221298217773,58.20305061340332]]],[[[-4.15333366394043,53.22555732727051],[-2.702499389648438,53.346384048461914],[-3.107500076293945,53.55166816711426],[-2.81361198425293,54.2227725982666],[-3.226110458374023,54.09861183166504],[-3.634166717529297,54.51194190979004],[-3.023056030273438,54.97055244445801],[-4.393054962158203,54.90805244445801],[-4.387222290039063,54.675554275512695],[-4.852222442626953,54.868608474731445],[-4.941110610961914,54.64888954162598],[-5.174165725708008,55.00055122375488],[-4.613332748413086,55.49499702453613],[-4.879722595214844,55.936105728149414],[-4.481668472290039,55.92110633850098],[-4.828605651855469,56.1131649017334],[-5.303333282470703,55.85055732727051],[-5.032222747802734,56.232500076293945],[-5.777500152587891,55.29666328430176],[-5.573610305786133,56.324716567993164],[-5.107778549194336,56.50777626037598],[-5.398666381835938,56.47866630554199],[-5.120000839233398,56.816667556762695],[-5.676944732666016,56.4938907623291],[-6.008333206176758,56.63749885559082],[-5.546943664550781,56.69194221496582],[-6.235000610351563,56.71916389465332],[-5.399723052978516,57.1058292388916],[-5.64961051940918,57.161611557006836],[-5.450277328491211,57.42027473449707],[-5.81916618347168,57.3638858795166],[-5.508611679077148,57.53472328186035],[-5.816667556762695,57.821664810180664],[-5.102777481079102,57.85083198547363],[-5.455278396606445,58.07638740539551],[-5.004722595214844,58.62333106994629],[-3.025554656982422,58.64750099182129],[-3.208610534667969,58.30444526672363],[-4.392221450805664,57.90527534484863],[-3.773056030273438,57.85110664367676],[-4.435832977294922,57.57499885559082],[-2.075555801391602,57.69944190979004],[-1.773332595825195,57.45805549621582],[-2.5272216796875,56.5786075592041],[-3.278055191040039,56.357500076293945],[-2.58277702331543,56.26805305480957],[-3.725276947021484,56.02749824523926],[-2.631111145019531,56.05471992492676],[-1.633888244628906,55.580827713012695],[-1.29749870300293,54.76361274719238],[-0.07499885559082,54.11194038391113],[0.11805534362793,53.56443977355957],[-0.718889236450195,53.699716567993164],[0.235555648803711,53.39943885803223],[0.341669082641602,53.095834732055664],[0.000036239624023,52.87954902648926],[1.282224655151367,52.927499771118164],[1.749444961547852,52.455827713012695],[1.223611831665039,51.80888557434082],[0.699724197387695,51.71944618225098],[0.950555801391602,51.60638618469238],[0.382780075073242,51.4505558013916],[1.385557174682617,51.387773513793945],[0.975000381469727,50.93194007873535],[0.242223739624023,50.738054275512695],[-0.254999160766602,50.82638740539551],[-0.796388626098633,50.72527503967285],[-0.926942825317383,50.83944129943848],[-1.154722213745117,50.84416389465332],[-2.434450149536133,50.541791915893555],[-2.924722671508789,50.731943130493164],[-3.716667175292969,50.20666694641113],[-4.379999160766602,50.3638858795166],[-5.193056106567383,49.955278396606445],[-5.712499618530273,50.053606033325195],[-4.226388931274414,51.189165115356445],[-3.02833366394043,51.20611000061035],[-2.379999160766602,51.75555610656738],[-3.346111297607422,51.378610610961914],[-5.246944427490234,51.73027229309082],[-4.130832672119141,52.33471870422363],[-4.133611679077148,52.914445877075195],[-4.760862350463867,52.78897285461426],[-4.15333366394043,53.22555732727051]],[[0.904722213745117,51.35805702209473],[0.908891677856445,51.416940689086914],[0.735002517700195,51.408334732055664],[0.904722213745117,51.35805702209473]]],[[[-2.918333053588867,58.731943130493164],[-3.036945343017578,58.81805610656738],[-2.886388778686523,58.83194160461426],[-2.918333053588867,58.731943130493164]]],[[[-3.231388092041016,58.77555274963379],[-3.418054580688477,58.90416145324707],[-3.134721755981445,58.80082893371582],[-3.231388092041016,58.77555274963379]]],[[[-2.793054580688477,58.95138740539551],[-3.194999694824219,58.91111183166504],[-3.351388931274414,59.10638618469238],[-2.793054580688477,58.95138740539551]]],[[[-2.681388854980469,59.19583320617676],[-2.55555534362793,59.303056716918945],[-2.390277862548828,59.28305244445801],[-2.681388854980469,59.19583320617676]]],[[[-2.889999389648438,59.29527473449707],[-2.877498626708984,59.22860908508301],[-3.076389312744141,59.33138465881348],[-2.889999389648438,59.29527473449707]]],[[[-1.296110153198242,60.491106033325195],[-1.037221908569336,60.444162368774414],[-1.268610000610352,59.85110664367676],[-1.291389465332031,60.24138832092285],[-1.693056106567383,60.27971839904785],[-1.296110153198242,60.491106033325195]]],[[[-1.029443740844727,60.49582862854004],[-1.170276641845703,60.52722358703613],[-1.098609924316406,60.729997634887695],[-1.029443740844727,60.49582862854004]]],[[[-0.819721221923828,60.68889045715332],[-0.965555191040039,60.68805122375488],[-0.878332138061523,60.84444618225098],[-0.758054733276367,60.81777381896973],[-0.819721221923828,60.68889045715332]]]]}},{"type":"Feature","properties":{"name":"Ukraine","iso2":"UA","iso3":"UKR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[33.040276000000205,46.011375],[32.759438,46.036110000000136],[32.965271,46.049431],[33.040276000000205,46.011375]]],[[[34.227486,46.061928],[34.158043000000106,46.100548],[34.229149,46.187759000000156],[34.227486,46.061928]]],[[[32.16776300000018,46.14582100000011],[31.584164,46.253319],[31.501106000000135,46.366653],[32.16776300000018,46.14582100000011]]],[[[33.41770200000022,52.3554],[33.838882,52.36055],[34.419716,51.808884],[34.098045000000155,51.65387700000015],[34.38221,51.263611],[35.37188700000016,51.041435],[35.606651,50.369438],[37.458603000000124,50.439713],[38.024223,49.903084],[38.30777,50.073883],[40.13976300000016,49.601051],[40.16693900000021,49.248604],[39.69665500000016,49.010826],[40.07666,48.87499200000012],[39.656937,48.616661],[39.998878,48.297218],[39.796387,47.857216],[38.853600000000114,47.860825],[38.303322,47.558594],[38.23582500000012,47.109428],[35.907204,46.65109300000013],[34.98526800000016,46.075829],[35.198044,46.443314],[35.05304,46.258041],[34.702492,46.175819],[34.561661000000214,45.984993],[34.401649000000106,46.013878],[34.542496,46.187485],[33.671928,46.220818],[34.63332400000016,45.94165],[34.46054100000012,45.7672120000001],[35.126656,45.326096],[35.34304,45.332497],[35.050262,45.613884],[34.763054,46.01554900000012],[34.666939,46.093597],[34.82720900000018,46.069443],[35.05387900000014,45.65387],[35.311661,45.38304100000012],[35.475266,45.29110000000016],[36.637215,45.376099],[36.439713,45.065536],[35.515266,45.116096],[33.955544000000174,44.38110400000012],[33.366936,44.579163],[33.54193900000021,45.111931],[32.48053700000017,45.395821],[33.771935,45.920540000000116],[33.611382,46.14721700000017],[31.791943000000146,46.2830510000001],[32.05915100000013,46.395821],[31.507771,46.57972],[32.647217,46.641106],[32.019707,46.629433000000134],[31.749435,47.25331900000013],[31.907494000000185,46.648872],[30.832771,46.548325],[30.25165900000016,45.876656],[29.746941000000135,45.619431],[29.633606,45.821106000000114],[29.664331,45.211803],[28.21484,45.448647],[28.971935,46.006653],[28.994434,46.47832500000011],[30.11694,46.386101],[29.949997,46.814156],[29.184441,47.443047],[29.141937000000155,47.98609200000014],[27.755554,48.451385],[26.634995,48.257164],[24.91944100000012,47.711662],[22.894804,47.95454],[22.151442,48.411919],[22.558052,49.079437],[22.886074,49.002914],[22.680828000000105,49.572495],[24.111385,50.56694],[23.604633,51.527695],[24.396664,51.886658],[25.775829000000158,51.939156],[30.551414000000108,51.251846],[30.94309600000011,52.073792000000125],[31.783886,52.108047],[33.41770200000022,52.3554]]]]}},{"type":"Feature","properties":{"name":"United States","iso2":"US","iso3":"USA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-75.1702880859375,19.9313907623291],[-75.22372436523438,19.90155601501465],[-75.1591796875,19.960695266723633],[-75.1702880859375,19.9313907623291]]],[[[-75.12139892578125,19.88749885559082],[-75.13973999023438,19.962873458862305],[-75.08528137207031,19.893041610717773],[-75.12139892578125,19.88749885559082]]],[[[-155.00558471679688,19.328882217407227],[-155.85946655273438,19.032777786254883],[-155.86444091796875,20.269163131713867],[-155.15863037109375,19.962495803833008],[-154.79281616210938,19.538610458374023],[-155.00558471679688,19.328882217407227]]],[[[-156.5472412109375,20.5252742767334],[-156.69863891601562,20.534719467163086],[-156.58529663085938,20.607221603393555],[-156.5472412109375,20.5252742767334]]],[[[-156.89199829101562,20.74416160583496],[-157.04837036132812,20.918054580688477],[-156.812255859375,20.843610763549805],[-156.89199829101562,20.74416160583496]]],[[[-156.47335815429688,20.89805030822754],[-155.98861694335938,20.7480525970459],[-156.42001342773438,20.58860969543457],[-156.70223999023438,20.924436569213867],[-156.47335815429688,20.89805030822754]]],[[[-156.89447021484375,21.161104202270508],[-156.70391845703125,21.158052444458008],[-157.30474853515625,21.100553512573242],[-156.89447021484375,21.161104202270508]]],[[[-160.53060913085938,21.643888473510742],[-160.53778076171875,21.63221549987793],[-160.5411376953125,21.641382217407227],[-160.53060913085938,21.643888473510742]]],[[[-157.73031616210938,21.41166114807129],[-158.1036376953125,21.295278549194336],[-158.27337646484375,21.580549240112305],[-157.971923828125,21.699438095092773],[-157.73031616210938,21.41166114807129]]],[[[-160.114990234375,21.88749885559082],[-160.24777221679688,21.813608169555664],[-160.0614013671875,22.013883590698242],[-160.114990234375,21.88749885559082]]],[[[-159.43362426757812,21.88138771057129],[-159.78530883789062,22.061384201049805],[-159.35165405273438,22.22138023376465],[-159.43362426757812,21.88138771057129]]],[[[-161.94168090820312,23.039438247680664],[-161.94833374023438,23.047216415405273],[-161.93832397460938,23.046388626098633],[-161.94168090820312,23.039438247680664]]],[[[-164.69613647460938,23.56471824645996],[-164.70751953125,23.5766658782959],[-164.69668579101562,23.578054428100586],[-164.69613647460938,23.56471824645996]]],[[[-81.77389526367188,24.544721603393555],[-81.8134994506836,24.54387092590332],[-81.72917175292969,24.560556411743164],[-81.77389526367188,24.544721603393555]]],[[[-82.11444091796875,24.54583168029785],[-82.13722229003906,24.593889236450195],[-82.09999084472656,24.58305549621582],[-82.11444091796875,24.54583168029785]]],[[[-81.71511840820312,24.553117752075195],[-81.71073913574219,24.595720291137695],[-81.64622497558594,24.577550888061523],[-81.71511840820312,24.553117752075195]]],[[[-81.47721862792969,24.636384963989258],[-81.51777458190918,24.684995651245117],[-81.47860717773438,24.67777442932129],[-81.47721862792969,24.636384963989258]]],[[[-81.58833312988281,24.589998245239258],[-81.55305480957031,24.687219619750977],[-81.50834655761719,24.6299991607666],[-81.58833312988281,24.589998245239258]]],[[[-81.10861206054688,24.706106185913086],[-81.13777160644531,24.70168113708496],[-81.05267333984375,24.71653175354004],[-81.10861206054688,24.706106185913086]]],[[[-81.34944152832031,24.62972068786621],[-81.42805480957031,24.748605728149414],[-81.36082458496094,24.700830459594727],[-81.34944152832031,24.62972068786621]]],[[[-80.96888732910156,24.742773056030273],[-81.02668762207031,24.71858787536621],[-80.9234619140625,24.769208908081055],[-80.96888732910156,24.742773056030273]]],[[[-80.84611511230469,24.79749870300293],[-80.82417297363281,24.82111167907715],[-80.78617095947266,24.82293128967285],[-80.84611511230469,24.79749870300293]]],[[[-80.6986083984375,24.866666793823242],[-80.74583435058594,24.842496871948242],[-80.70249938964844,24.880830764770508],[-80.6986083984375,24.866666793823242]]],[[[-80.64666557312012,24.902219772338867],[-80.66444396972656,24.89499855041504],[-80.62388610839844,24.932775497436523],[-80.64666557312012,24.902219772338867]]],[[[-167.99057006835938,25.002500534057617],[-168.00115966796875,25.00388526916504],[-168.00588989257812,25.01749610900879],[-167.99057006835938,25.002500534057617]]],[[[-80.57722473144531,24.9455509185791],[-80.25750732421875,25.34638786315918],[-80.37193298339844,25.143888473510742],[-80.57722473144531,24.9455509185791]]],[[[-80.22500610351562,25.40110969543457],[-80.23416137695312,25.402219772338867],[-80.1885986328125,25.49416160583496],[-80.22500610351562,25.40110969543457]]],[[[-80.16221618652344,25.669443130493164],[-80.185546875,25.68943977355957],[-80.15638732910156,25.73333168029785],[-80.16221618652344,25.669443130493164]]],[[[-171.72360229492188,25.76249885559082],[-171.73138427734375,25.760831832885742],[-171.72470092773438,25.791662216186523],[-171.72360229492188,25.76249885559082]]],[[[-81.68415832519531,25.8447208404541],[-81.7147216796875,25.888608932495117],[-81.66416931152344,25.888608932495117],[-81.68415832519531,25.8447208404541]]],[[[-173.94613647460938,26.06333351135254],[-173.96084594726562,26.079439163208008],[-173.94473266601562,26.08083152770996],[-173.94613647460938,26.06333351135254]]],[[[-82.12638854980469,26.44999885559082],[-82.20639038085938,26.54583168029785],[-82.02888488769531,26.444997787475586],[-82.12638854980469,26.44999885559082]]],[[[-82.22166442871094,26.612497329711914],[-82.2449951171875,26.63499641418457],[-82.2550048828125,26.698606491088867],[-82.22166442871094,26.612497329711914]]],[[[-82.07945251464844,26.487775802612305],[-82.17971801757812,26.69916343688965],[-82.13333129882812,26.69110679626465],[-82.07945251464844,26.487775802612305]]],[[[-82.26362609863281,26.716386795043945],[-82.28138732910156,26.808889389038086],[-82.25527954101562,26.759443283081055],[-82.26362609863281,26.716386795043945]]],[[[-97.17778015136719,26.0847225189209],[-97.38575744628906,26.838224411010742],[-97.38362121582031,27.20722007751465],[-97.17778015136719,26.0847225189209]]],[[[-82.58750915527344,27.32111167907715],[-82.68055725097656,27.42582893371582],[-82.6541748046875,27.418607711791992],[-82.58750915527344,27.32111167907715]]],[[[-97.38221740722656,27.21888542175293],[-97.31723022460938,27.49582862854004],[-97.04554557800293,27.843889236450195],[-97.38221740722656,27.21888542175293]]],[[[-96.88778686523438,28.030553817749023],[-97.03582763671875,27.875276565551758],[-96.86776733398438,28.13499641418457],[-96.88778686523438,28.030553817749023]]],[[[-96.55194091796875,28.26666831970215],[-96.81361389160156,28.092496871948242],[-96.40472412109375,28.392221450805664],[-96.55194091796875,28.26666831970215]]],[[[-96.36082458496094,28.402498245239258],[-96.31304931640625,28.45527458190918],[-96.22999572753906,28.485551834106445],[-96.36082458496094,28.402498245239258]]],[[[-80.66389465332031,28.258333206176758],[-80.74028015136719,28.478330612182617],[-80.62527465820312,28.59055519104004],[-80.66389465332031,28.258333206176758]]],[[[-90.87265014648438,29.046133041381836],[-90.95039367675781,29.06000328063965],[-90.92361450195312,29.060556411743164],[-90.87265014648438,29.046133041381836]]],[[[-90.73916625976562,29.045000076293945],[-90.75834655761719,29.048608779907227],[-90.64250183105469,29.073331832885742],[-90.73916625976562,29.045000076293945]]],[[[-90.33555603027344,29.057222366333008],[-90.2852783203125,29.08305549621582],[-90.29833984375,29.06694221496582],[-90.33555603027344,29.057222366333008]]],[[[-89.97528076171875,29.242773056030273],[-90.03111267089844,29.211942672729492],[-89.95500183105469,29.268056869506836],[-89.97528076171875,29.242773056030273]]],[[[-89.92832946777344,29.27861213684082],[-89.93527221679688,29.287500381469727],[-89.90750122070312,29.302221298217773],[-89.92832946777344,29.27861213684082]]],[[[-89.86000061035156,29.310277938842773],[-89.89389038085938,29.32305335998535],[-89.86972045898438,29.335275650024414],[-89.86000061035156,29.310277938842773]]],[[[-95.11111450195312,29.098054885864258],[-94.82139587402344,29.33860969543457],[-94.78472900390625,29.308053970336914],[-95.11111450195312,29.098054885864258]]],[[[-89.17054557800293,29.473051071166992],[-89.21916198730469,29.464719772338867],[-89.15695190429688,29.492494583129883],[-89.17054557800293,29.473051071166992]]],[[[-89.60110473632812,29.513887405395508],[-89.61833190917969,29.538331985473633],[-89.59028625488281,29.560556411743164],[-89.56582641601562,29.554719924926758],[-89.56221008300781,29.5211124420166],[-89.60110473632812,29.513887405395508]]],[[[-89.08029174804688,29.521387100219727],[-89.07888793945312,29.54555320739746],[-89.03721618652344,29.573610305786133],[-89.08029174804688,29.521387100219727]]],[[[-91.78666687011719,29.486108779907227],[-92.03443908691406,29.591665267944336],[-91.85638427734375,29.63499641418457],[-91.78666687011719,29.486108779907227]]],[[[-85.11111450195312,29.632219314575195],[-85.19804382324219,29.685274124145508],[-85.08168029785156,29.679162979125977],[-85.11111450195312,29.632219314575195]]],[[[-89.42860412597656,29.692773818969727],[-89.46861267089844,29.728609085083008],[-89.42250061035156,29.7227725982666],[-89.42860412597656,29.692773818969727]]],[[[-84.9727783203125,29.608888626098633],[-85.09500122070312,29.62388801574707],[-84.69221496582031,29.758333206176758],[-84.9727783203125,29.608888626098633]]],[[[-89.42416381835938,29.74083137512207],[-89.4888916015625,29.73805046081543],[-89.49110412597656,29.793054580688477],[-89.42416381835938,29.74083137512207]]],[[[-89.2852783203125,29.771387100219727],[-89.3416748046875,29.80388832092285],[-89.27555847167969,29.80916404724121],[-89.2852783203125,29.771387100219727]]],[[[-84.63890075683594,29.77833366394043],[-84.66722106933594,29.776945114135742],[-84.57342529296875,29.819997787475586],[-84.63890075683594,29.77833366394043]]],[[[-88.84584045410156,29.77638816833496],[-88.86874389648438,30.060606002807617],[-88.80583190917969,29.90638542175293],[-88.84584045410156,29.77638816833496]]],[[[-89.31777954101562,30.040834426879883],[-89.34638977050781,30.0594425201416],[-89.18499755859375,30.16666603088379],[-89.31777954101562,30.040834426879883]]],[[[-88.43777465820312,30.206106185913086],[-88.50056457519531,30.21888542175293],[-88.42805480957031,30.2127742767334],[-88.43777465820312,30.206106185913086]]],[[[-88.55221557617188,30.214719772338867],[-88.75418090820312,30.244718551635742],[-88.52639770507812,30.223051071166992],[-88.55221557617188,30.214719772338867]]],[[[-89.08111572265625,30.19972038269043],[-89.0916748046875,30.216665267944336],[-89.06051635742188,30.246675491333008],[-89.08111572265625,30.19972038269043]]],[[[-88.0947265625,30.241106033325195],[-88.3125,30.23277473449707],[-88.10777282714844,30.273611068725586],[-88.0947265625,30.241106033325195]]],[[[-86.5291748046875,30.40083122253418],[-87.29222106933594,30.33277702331543],[-86.7630615234375,30.404996871948242],[-86.5291748046875,30.40083122253418]]],[[[-118.40695190429688,32.816667556762695],[-118.59249877929688,33.046945571899414],[-118.3691635131836,32.85471534729004],[-118.40695190429688,32.816667556762695]]],[[[-79.36500358581543,33.00305366516113],[-79.36111450195312,33.049997329711914],[-79.33612060546875,33.067216873168945],[-79.36500358581543,33.00305366516113]]],[[[-119.44415283203125,33.21666145324707],[-119.5666732788086,33.28277015686035],[-119.48056030273438,33.27443885803223],[-119.44415283203125,33.21666145324707]]],[[[-118.30194091796875,33.30943489074707],[-118.44888305664062,33.32749366760254],[-118.59221458435059,33.48665809631348],[-118.30194091796875,33.30943489074707]]],[[[-77.96083068847656,33.85000038146973],[-78.01640319824219,33.874162673950195],[-77.94972229003906,33.91304969787598],[-77.96083068847656,33.85000038146973]]],[[[-120.0352783203125,34.023881912231445],[-120.10749816894531,33.90555000305176],[-120.2260971069336,34.00610542297363],[-120.0352783203125,34.023881912231445]]],[[[-120.29778289794922,34.02860450744629],[-120.43804931640625,34.036943435668945],[-120.3638916015625,34.0655460357666],[-120.29778289794922,34.02860450744629]]],[[[-119.86805725097656,34.08416175842285],[-119.51363372802734,34.04277229309082],[-119.788330078125,33.96721076965332],[-119.86805725097656,34.08416175842285]]],[[[-76.5352783203125,34.63555335998535],[-76.65472412109375,34.686105728149414],[-76.55915832519531,34.664995193481445],[-76.5352783203125,34.63555335998535]]],[[[-76.6824951171875,34.702219009399414],[-77.09805297851562,34.65054512023926],[-76.93110656738281,34.69137763977051],[-76.6824951171875,34.702219009399414]]],[[[-76.53195190429688,34.585824966430664],[-76.42083740234375,34.775827407836914],[-76.19972229003906,34.941659927368164],[-76.53195190429688,34.585824966430664]]],[[[-76.06777954101562,35.039438247680664],[-76.131103515625,35.00193977355957],[-76.03944396972656,35.061105728149414],[-76.06777954101562,35.039438247680664]]],[[[-76.01083374023438,35.074167251586914],[-75.98110961914062,35.114999771118164],[-75.76695251464844,35.19388008117676],[-76.01083374023438,35.074167251586914]]],[[[-75.5272216796875,35.235551834106445],[-75.65361022949219,35.22554969787598],[-75.51251220703125,35.7772159576416],[-75.5272216796875,35.235551834106445]]],[[[-75.61944580078125,35.82138252258301],[-75.72332763671875,35.941659927368164],[-75.66583251953125,35.92694282531738],[-75.61944580078125,35.82138252258301]]],[[[-75.90611267089844,37.112497329711914],[-75.89889526367188,37.13694190979004],[-75.87249755859375,37.1491641998291],[-75.90611267089844,37.112497329711914]]],[[[-75.788330078125,37.238046646118164],[-75.83750915527344,37.22776985168457],[-75.7852783203125,37.29860877990723],[-75.788330078125,37.238046646118164]]],[[[-75.6966552734375,37.40277290344238],[-75.71083068847656,37.390275955200195],[-75.6683349609375,37.460275650024414],[-75.6966552734375,37.40277290344238]]],[[[-121.8013916015625,38.05526924133301],[-121.82000732421875,38.06805610656738],[-121.79638671875,38.066667556762695],[-121.8013916015625,38.05526924133301]]],[[[-75.35417175292969,37.86666297912598],[-75.38417053222656,37.87221717834473],[-75.12110900878906,38.2630558013916],[-75.35417175292969,37.86666297912598]]],[[[-74.32945251464844,39.42166328430176],[-74.39445495605469,39.38249397277832],[-74.44415283203125,39.406938552856445],[-74.37625122070312,39.42074394226074],[-74.34805297851562,39.474435806274414],[-74.32945251464844,39.42166328430176]]],[[[-74.2469482421875,39.52555274963379],[-74.09999084472656,39.75083351135254],[-74.13833618164062,39.659433364868164],[-74.2469482421875,39.52555274963379]]],[[[-74.22000122070312,40.511667251586914],[-74.17694091796875,40.64193916320801],[-74.06277465820312,40.63943672180176],[-74.22000122070312,40.511667251586914]]],[[[-73.22332763671875,40.635271072387695],[-73.29472351074219,40.63388252258301],[-72.76666259765625,40.7661075592041],[-73.22332763671875,40.635271072387695]]],[[[-72.26222229003906,41.12526893615723],[-72.62110900878906,40.91304969787598],[-71.85610961914062,41.069162368774414],[-73.58277893066406,40.59610176086426],[-74.03250122070312,40.62582588195801],[-72.26222229003906,41.12526893615723]]],[[[-69.9949951171875,41.32805061340332],[-69.99388122558594,41.25027656555176],[-70.23416137695312,41.28360939025879],[-69.9949951171875,41.32805061340332]]],[[[-70.50639343261719,41.35721778869629],[-70.83805847167969,41.359994888305664],[-70.61721801757812,41.47387886047363],[-70.50639343261719,41.35721778869629]]],[[[-71.29750061035156,41.45860481262207],[-71.35833740234375,41.45916175842285],[-71.22250366210938,41.65416145324707],[-71.29750061035156,41.45860481262207]]],[[[-68.80332946777344,44.048051834106445],[-68.89805603027344,44.12388038635254],[-68.76445007324219,44.09499549865723],[-68.80332946777344,44.048051834106445]]],[[[-68.65083312988281,44.16888618469238],[-68.72138977050781,44.2288761138916],[-68.66806030273438,44.2852725982666],[-68.65083312988281,44.16888618469238]]],[[[-68.32084655761719,44.23721504211426],[-68.42832946777344,44.31999397277832],[-68.2630615234375,44.452775955200195],[-68.1683349609375,44.34554481506348],[-68.32084655761719,44.23721504211426]]],[[[-123.93804931640625,46.431108474731445],[-123.94915771484375,46.431108474731445],[-123.98306274414062,46.46915626525879],[-123.97250366210938,46.515275955200195],[-123.93804931640625,46.431108474731445]]],[[[-122.84306335449219,47.20694160461426],[-122.9022216796875,47.297494888305664],[-122.84555053710938,47.3124942779541],[-122.84306335449219,47.20694160461426]]],[[[-122.48222351074219,47.34971809387207],[-122.4505615234375,47.518327713012695],[-122.381103515625,47.39471626281738],[-122.48222351074219,47.34971809387207]]],[[[-122.50473022460938,48.30971717834473],[-122.37222290039062,47.919443130493164],[-122.75778198242188,48.2338809967041],[-122.50473022460938,48.30971717834473]]],[[[-122.8166732788086,48.416940689086914],[-122.93611145019531,48.457773208618164],[-122.87666320800781,48.564157485961914],[-122.8166732788086,48.416940689086914]]],[[[-123,48.44610023498535],[-123.17832946777344,48.59221839904785],[-122.99500274658203,48.52971839904785],[-123,48.44610023498535]]],[[[-122.92250061035156,48.7116641998291],[-122.74916076660156,48.651384353637695],[-123.0102767944336,48.60360908508301],[-122.92250061035156,48.7116641998291]]],[[[-123.05332946777344,48.97387886047363],[-123.09375,48.99943733215332],[-123.03431701660156,48.99943733215332],[-123.05332946777344,48.97387886047363]]],[[[-95.07806396484375,49.35916328430176],[-94.6058349609375,48.724435806274414],[-92.95306396484375,48.62332344055176],[-91.4183349609375,48.04110908508301],[-90.86860656738281,48.237497329711914],[-89.35665893554688,47.97971534729004],[-88.36805725097656,48.312211990356445],[-84.85694885253906,46.9022159576416],[-84.56500244140625,46.466386795043945],[-84.12638854980469,46.531938552856445],[-83.95889282226562,46.071664810180664],[-83.57749938964844,46.10527229309082],[-83.5977783203125,45.827219009399414],[-82.54306030273438,45.3558292388916],[-82.13027954101562,43.58526802062988],[-82.52139282226562,42.61888313293457],[-83.16860961914062,42.04610633850098],[-82.6966552734375,41.68387794494629],[-78.9869384765625,42.81999397277832],[-79.18472290039062,43.46554756164551],[-78.72471618652344,43.62943458557129],[-76.80194091796875,43.63360786437988],[-74.99082946777344,44.98665809631348],[-70.87860107421875,45.238603591918945],[-69.23249816894531,47.47137641906738],[-67.79499816894531,47.06999397277832],[-67.79916381835938,45.70110511779785],[-67.20654296875,45.18303871154785],[-66.96888732910156,44.83111000061035],[-67.18693542480469,44.661935806274414],[-67.55110168457031,44.66610145568848],[-67.56527709960938,44.55027198791504],[-67.77528381347656,44.546945571899414],[-68.04750061035156,44.346940994262695],[-68.10861206054688,44.460275650024414],[-68.32115173339844,44.46588325500488],[-68.55915832519531,44.41888618469238],[-68.54750061035156,44.31777381896973],[-68.61582946777344,44.30638313293457],[-68.79527282714844,44.579721450805664],[-69.0675048828125,44.06332588195801],[-69.72193908691406,43.78582954406738],[-69.77333068847656,44.07916450500488],[-69.82389831542969,43.71444129943848],[-70.17250061035156,43.78055000305176],[-70.72917175292969,43.12276649475098],[-70.58056640625,42.651933670043945],[-71.04444885253906,42.311105728149414],[-70.32472229003906,41.711381912231445],[-70.01112365722656,41.79722023010254],[-70.07888793945312,42.062211990356445],[-69.93638610839844,41.669443130493164],[-71.18582153320312,41.46666145324707],[-71.11111450195312,41.795000076293945],[-71.39138793945312,41.81193733215332],[-71.50527954101562,41.3669376373291],[-72.90638732910156,41.28611183166504],[-73.99748992919922,40.71346092224121],[-73.9566650390625,41.30526924133301],[-74.2691650390625,40.47471046447754],[-73.95222473144531,40.299997329711914],[-74.07640075683594,39.77694129943848],[-74.05387878417969,40.05749702453613],[-74.15028381347656,39.70499610900879],[-74.40556335449219,39.5161075592041],[-74.46259307861328,39.42106819152832],[-74.41555786132812,39.35527229309082],[-74.95500183105469,38.92416572570801],[-74.89277458190918,39.16777229309082],[-75.5574951171875,39.618051528930664],[-75.02851867675781,40.01230812072754],[-75.58860778808594,39.648881912231445],[-75.04388427734375,38.42166328430176],[-75.96083068847656,37.1522159576416],[-75.64404296875,37.9611759185791],[-75.88082885742188,37.94943428039551],[-75.83805847167969,38.398881912231445],[-76.24249267578125,38.3669376373291],[-75.9566650390625,38.64860725402832],[-76.36000061035156,38.85721778869629],[-75.83168029785156,39.57749366760254],[-76.61860656738281,39.254167556762695],[-76.3760986328125,38.36361122131348],[-76.66610717773438,38.480546951293945],[-76.30999755859375,38.04638862609863],[-77.24444580078125,38.398332595825195],[-77.06111145019531,38.9052677154541],[-77.32000732421875,38.34527015686035],[-76.24166870117188,37.90499305725098],[-76.35360717773438,37.618600845336914],[-77.13389587402344,38.17276954650879],[-76.28666687011719,37.5674991607666],[-76.381103515625,37.273881912231445],[-76.68276977539062,37.42971992492676],[-76.26806640625,37.07888221740723],[-77.23222351074219,37.29638862609863],[-75.989990234375,36.91388130187988],[-75.5291748046875,35.80388069152832],[-75.93888854980469,36.71666145324707],[-75.78555297851562,36.06999397277832],[-76.19554138183594,36.31999397277832],[-76.06304931640625,36.15332221984863],[-76.65666198730469,36.03110694885254],[-76.70611572265625,36.26416206359863],[-76.73056030273438,35.93943214416504],[-76.07084655761719,35.9919376373291],[-76.0352783203125,35.64999580383301],[-75.85360717773438,35.974992752075195],[-75.72027587890625,35.81443977355957],[-76.149169921875,35.33693885803223],[-77.05082702636719,35.53027534484863],[-76.46888732910156,35.27166175842285],[-76.76139831542969,34.98777198791504],[-77.07640075683594,35.15609931945801],[-76.94444274902344,34.977487564086914],[-76.33583068847656,34.88694190979004],[-77.42887878417969,34.7419376373291],[-77.93083190917969,33.92777442932129],[-77.961669921875,34.15860176086426],[-78.01362609863281,33.89193916320801],[-78.82749938964844,33.73027229309082],[-79.19644165039062,33.278940200805664],[-79.1885986328125,33.43638038635254],[-79.27139282226562,33.37332344055176],[-79.20584106445312,33.165544509887695],[-79.37171936035156,33.05894660949707],[-79.38194274902344,33.009721755981445],[-80.67166137695312,32.52166175842285],[-80.46722412109375,32.31582832336426],[-80.83694458007812,32.51666450500488],[-80.66999816894531,32.21415901184082],[-81.4969482421875,31.12555503845215],[-81.25527954101562,29.796667098999023],[-80.552490234375,28.524999618530273],[-80.4466552734375,27.864442825317383],[-80.60221862792969,28.607500076293945],[-80.84416198730469,28.790555953979492],[-80.75556945800781,28.415830612182617],[-80.0333251953125,26.786664962768555],[-80.39862060546875,25.184720993041992],[-81.08805847167969,25.11555290222168],[-80.915283203125,25.25139045715332],[-81.336669921875,25.80499839782715],[-81.73658752441406,25.959444046020508],[-81.97005462646484,26.482831954956055],[-81.77778625488281,26.710554122924805],[-82.06416320800781,26.545000076293945],[-82.01722717285156,26.964719772338867],[-82.30278015136719,26.837221145629883],[-82.6552734375,27.4616641998291],[-82.42250061035156,27.917497634887695],[-82.69137573242188,28.0322208404541],[-82.72250366210938,27.65694236755371],[-82.85333251953125,27.855276107788086],[-82.631103515625,28.88499641418457],[-83.66944885253906,29.90610694885254],[-84.20750427246094,30.105554580688477],[-85.35417175292969,29.676664352416992],[-85.63394165039062,30.104440689086914],[-85.39222717285156,30.0494441986084],[-86.26333618164062,30.49666404724121],[-88.02362060546875,30.21944236755371],[-87.75639343261719,30.285276412963867],[-88.02027893066406,30.701108932495117],[-88.13276672363281,30.314443588256836],[-90.41972351074219,30.198331832885742],[-89.66722106933594,30.167776107788086],[-89.65805053710938,29.87388801574707],[-89.39944458007812,30.050832748413086],[-89.75334167480469,29.630830764770508],[-89.6763916015625,29.523889541625977],[-89.18721008300781,29.339719772338867],[-89.00834655761719,29.176942825317383],[-89.40499877929688,28.926664352416992],[-89.27278137207031,29.155832290649414],[-90.17832946777344,29.572500228881836],[-90.2066650390625,29.091943740844727],[-91.2469482421875,29.24083137512207],[-91.8416748046875,29.830278396606445],[-92.30833435058594,29.53972053527832],[-93.84028625488281,29.704164505004883],[-93.84527587890625,29.98805046081543],[-93.85749816894531,29.67610740661621],[-94.77250671386719,29.3638858795166],[-94.475830078125,29.56138801574707],[-95.05943298339844,29.71888542175293],[-94.8880615234375,29.37555503845215],[-94.90278625488281,29.314443588256836],[-95.09388732910156,29.17777442932129],[-95.14083862304688,29.0575008392334],[-96.21278381347656,28.485551834106445],[-95.98582458496094,28.6491641998291],[-96.64167785644531,28.719717025756836],[-96.39834594726562,28.43610954284668],[-96.80360412597656,28.473051071166992],[-97.18472290039062,27.827497482299805],[-97.52055358886719,27.86638832092285],[-97.41111755371094,27.327497482299805],[-97.77389526367188,27.458887100219727],[-97.42388916015625,27.267499923706055],[-97.55943298339844,26.836111068725586],[-97.14073944091797,25.966428756713867],[-99.104736328125,26.434999465942383],[-99.5050048828125,27.570276260375977],[-101.40501403808594,29.77277946472168],[-102.30584716796875,29.88944435119629],[-103.375,29.023611068725586],[-104.54000854492188,29.671110153198242],[-104.90055847167969,30.572778701782227],[-106.40084838867188,31.750276565551758],[-108.2086181640625,31.783334732055664],[-108.20834350585938,31.33305549621582],[-111.04583740234375,31.33305549621582],[-113.05288696289062,31.971071243286133],[-114.80982971191406,32.50699043273926],[-114.7190933227539,32.71845817565918],[-117.12237358093262,32.53533363342285],[-117.48082733154297,33.32749366760254],[-118.53472900390625,34.05082893371582],[-120.62026977539062,34.57083320617676],[-120.61416625976562,35.13582801818848],[-121.86749267578125,36.3124942779541],[-121.79638671875,36.87943458557129],[-122.48805236816406,37.518327713012695],[-122.38694763183594,37.816667556762695],[-122.00583457946777,37.47137641906738],[-122.39334106445312,37.957773208618164],[-122.24054718017578,38.059160232543945],[-121.41999816894531,38.012773513793945],[-121.5766830444336,38.11583137512207],[-121.7361068725586,38.04471778869629],[-122.01862335205078,38.148115158081055],[-122.10973358154297,38.06138038635254],[-122.36528015136719,38.15555000305176],[-122.49137878417969,37.827775955200195],[-122.9970703125,38.005109786987305],[-122.96456146240234,38.239614486694336],[-122.8035945892334,38.08804512023926],[-123.10472106933594,38.46110725402832],[-123.70361328125,38.93249702453613],[-123.77583312988281,39.71721076965332],[-124.33222961425781,40.2661075592041],[-124.03999328613281,41.431108474731445],[-124.5244369506836,42.866106033325195],[-124.13834381103516,43.371103286743164],[-123.95195007324219,46.181108474731445],[-123.16357421875,46.19519233703613],[-124,46.32361030578613],[-124.04277038574219,46.65804481506348],[-124.01583862304688,46.654436111450195],[-123.989990234375,46.397775650024414],[-123.9416732788086,46.3911075592041],[-123.7525634765625,46.693071365356445],[-124.09750366210938,46.86138343811035],[-123.79666137695312,46.97609901428223],[-124.16194152832031,46.94110298156738],[-124.7158432006836,48.395273208618164],[-122.75110626220703,48.16110420227051],[-122.63027954101562,47.91582679748535],[-123.14750671386719,47.368600845336914],[-122.8364028930664,47.439157485961914],[-123.10249328613281,47.39972114562988],[-122.5655517578125,47.93804359436035],[-122.45472717285156,47.77443885803223],[-122.54998779296875,47.28277015686035],[-122.6191635131836,47.420549392700195],[-122.75862121582031,47.189714431762695],[-122.79750061035156,47.395273208618164],[-123.06861877441406,47.15165901184082],[-122.87860107421875,47.064157485961914],[-122.30972290039062,47.40110206604004],[-122.3791732788086,48.29166603088379],[-122.70445251464844,48.48610877990723],[-122.4375,48.59804725646973],[-122.76029968261719,48.99943733215332],[-95.1541748046875,48.99943733215332],[-95.07806396484375,49.35916328430176]],[[-122.4958267211914,47.59554481506348],[-122.50334167480469,47.71527290344238],[-122.58168029785156,47.67166328430176],[-122.4958267211914,47.59554481506348]],[[-123.9385986328125,45.53666114807129],[-123.91694641113281,45.56443977355957],[-123.93443298339844,45.55832862854004],[-123.9385986328125,45.53666114807129]],[[-77.85166931152344,34.11110877990723],[-77.82084655761719,34.17527198791504],[-77.8558349609375,34.1491641998291],[-77.85166931152344,34.11110877990723]]],[[[-179.10528564453125,51.21305274963379],[-179.14199829101562,51.26859474182129],[-179.08724975585938,51.29083442687988],[-179.10528564453125,51.21305274963379]]],[[[-178.96249389648438,51.311662673950195],[-178.94998168945312,51.39693641662598],[-178.90032958984375,51.354997634887695],[-178.96249389648438,51.311662673950195]]],[[[178.993013381958,51.57499885559082],[179.47134590148926,51.36749458312988],[178.63638496398926,51.637773513793945],[178.993013381958,51.57499885559082]]],[[[-178.7769775390625,51.74553871154785],[-178.842529296875,51.81915473937988],[-178.7427978515625,51.80777168273926],[-178.7769775390625,51.74553871154785]]],[[[178.39221382141113,51.7630558013916],[178.22302436828613,51.830827713012695],[178.32995796203613,51.81499671936035],[178.39221382141113,51.7630558013916]]],[[[-176.0128173828125,51.830270767211914],[-176.14334106445312,51.77443885803223],[-176.21945190429688,51.83138465881348],[-176.0128173828125,51.830270767211914]]],[[[-176.33642578125,51.72165870666504],[-176.41448974609375,51.854997634887695],[-176.2769775390625,51.86026954650879],[-176.33642578125,51.72165870666504]]],[[[-177.81390380859375,51.71970558166504],[-177.94998168945312,51.60637855529785],[-178.21807861328125,51.87193489074707],[-177.81390380859375,51.71970558166504]]],[[[-176.55059814453125,51.90582466125488],[-176.42974853515625,51.73026466369629],[-176.97503662109375,51.5958194732666],[-176.55059814453125,51.90582466125488]]],[[[-175.95111083984375,51.86887550354004],[-176.09307861328125,51.885263442993164],[-176.001953125,51.90887641906738],[-175.95111083984375,51.86887550354004]]],[[[-177.12222290039062,51.784433364868164],[-177.7044677734375,51.70083045959473],[-177.15725708007812,51.93832588195801],[-177.12222290039062,51.784433364868164]]],[[[-175.72503662109375,51.930551528930664],[-175.72918701171875,51.96610450744629],[-175.65750122070312,51.95694160461426],[-175.72503662109375,51.930551528930664]]],[[[-175.864990234375,51.96360969543457],[-175.94668579101562,51.97886848449707],[-175.80194091796875,51.98220252990723],[-175.864990234375,51.96360969543457]]],[[[178.53692817687988,51.89361000061035],[178.46829414367676,51.98472023010254],[178.60608100891113,51.947771072387695],[178.53692817687988,51.89361000061035]]],[[[179.73745918273926,51.90304756164551],[179.48608589172363,51.97221565246582],[179.65860176086426,52.02471351623535],[179.73745918273926,51.90304756164551]]],[[[177.68469429016113,52.07999610900879],[177.6049518585205,51.92027473449707],[177.241060256958,51.87693977355957],[177.68469429016113,52.07999610900879]]],[[[-176.0372314453125,51.964433670043945],[-176.19085693359375,52.05999183654785],[-176.04611206054688,52.10222053527832],[-176.0372314453125,51.964433670043945]]],[[[-173.515869140625,52.10693550109863],[-172.95559692382812,52.08554267883301],[-174.05697631835938,52.12027168273926],[-173.515869140625,52.10693550109863]]],[[[175.96109199523926,52.33555030822754],[175.88189888000488,52.37249183654785],[175.98773384094238,52.35360908508301],[175.96109199523926,52.33555030822754]]],[[[-172.38836669921875,52.28972053527832],[-172.6280517578125,52.25832557678223],[-172.43832397460938,52.39193153381348],[-172.38836669921875,52.28972053527832]]],[[[-173.99530029296875,52.29110145568848],[-175.33584594726562,52.0141544342041],[-174.18447875976562,52.416940689086914],[-173.99530029296875,52.29110145568848]]],[[[173.78775215148926,52.501108169555664],[173.73550605773926,52.35332679748535],[173.37524604797363,52.39943885803223],[173.78775215148926,52.501108169555664]]],[[[-171.23526000976562,52.45083045959473],[-171.30804443359375,52.49942970275879],[-171.21722412109375,52.51054573059082],[-171.23526000976562,52.45083045959473]]],[[[-170.60556030273438,52.590829849243164],[-170.8416748046875,52.554155349731445],[-170.6761474609375,52.69415473937988],[-170.60556030273438,52.590829849243164]]],[[[174.17776679992676,52.70555305480957],[174.07412910461426,52.711381912231445],[174.10217475891113,52.741106033325195],[174.17776679992676,52.70555305480957]]],[[[-170.11474609375,52.71832466125488],[-170.17999267578125,52.78387641906738],[-170.05499267578125,52.765268325805664],[-170.11474609375,52.71832466125488]]],[[[-169.675048828125,52.81777381896973],[-170.0130615234375,52.81833076477051],[-169.78115844726562,52.885263442993164],[-169.675048828125,52.81777381896973]]],[[[-170.04083251953125,52.853044509887695],[-170.12747192382812,52.88859748840332],[-169.99389457702637,52.901933670043945],[-170.04083251953125,52.853044509887695]]],[[[173.29998970031738,52.882211685180664],[172.92859077453613,52.74388313293457],[172.47635078430176,52.92444038391113],[173.29998970031738,52.882211685180664]]],[[[-169.72445678710938,52.943315505981445],[-169.75250244140625,53.026376724243164],[-169.67669677734375,53.03166389465332],[-169.72445678710938,52.943315505981445]]],[[[-168.24359130859375,53.25110054016113],[-169.08670043945312,52.82805061340332],[-168.35195922851562,53.47554969787598],[-167.79531860351562,53.49553871154785],[-168.24359130859375,53.25110054016113]]],[[[-166.20999145507812,53.705270767211914],[-166.2933349609375,53.79305458068848],[-166.09002685546875,53.839433670043945],[-166.20999145507812,53.705270767211914]]],[[[-166.60748291015625,53.829721450805664],[-166.21502685546875,53.92832374572754],[-166.75283813476562,53.44638252258301],[-167.84637451171875,53.30859565734863],[-166.80389404296875,53.648874282836914],[-167.02420043945312,53.95554542541504],[-166.60748291015625,53.829721450805664]]],[[[-165.251708984375,54.07609748840332],[-165.29779052734375,54.037492752075195],[-165.48193359375,54.07443428039551],[-165.251708984375,54.07609748840332]]],[[[-164.939208984375,54.12693977355957],[-164.965576171875,54.075273513793945],[-165.221923828125,54.08999061584473],[-164.939208984375,54.12693977355957]]],[[[-165.69696044921875,54.08471870422363],[-166.12307739257812,54.11638069152832],[-165.93832397460938,54.22054481506348],[-165.69696044921875,54.08471870422363]]],[[[-165.56057739257812,54.11026954650879],[-165.68197631835938,54.238046646118164],[-165.48641967773438,54.28804969787598],[-165.56057739257812,54.11026954650879]]],[[[-162.40057373046875,54.36944007873535],[-162.48971557617188,54.40971565246582],[-162.36831665039062,54.38833045959473],[-162.40057373046875,54.36944007873535]]],[[[-162.54388427734375,54.38138008117676],[-162.78640747070312,54.41471290588379],[-162.83111572265625,54.494157791137695],[-162.54388427734375,54.38138008117676]]],[[[-132.61944580078125,54.75444221496582],[-132.7811279296875,54.92527198791504],[-132.61886596679688,54.89610481262207],[-132.61944580078125,54.75444221496582]]],[[[-159.29501342773438,54.8669376373291],[-159.33612060546875,54.92721748352051],[-159.20693969726562,54.92444038391113],[-159.29501342773438,54.8669376373291]]],[[[-163.41363525390625,54.8911075592041],[-163.3699951171875,54.78499794006348],[-163.14501953125,54.7661075592041],[-163.04861450195312,54.6683292388916],[-164.95220947265625,54.57583045959473],[-164.43276977539062,54.930551528930664],[-163.41363525390625,54.8911075592041]]],[[[-162.29306030273438,54.83416175842285],[-162.4344482421875,54.931108474731445],[-162.23275756835938,54.96527290344238],[-162.29306030273438,54.83416175842285]]],[[[-131.32583618164062,54.856943130493164],[-131.48275756835938,54.93082618713379],[-131.23638916015625,54.99527168273926],[-131.32583618164062,54.856943130493164]]],[[[-159.43417358398438,54.9405460357666],[-159.479154586792,55.01416206359863],[-159.34942626953125,55.04916572570801],[-159.43417358398438,54.9405460357666]]],[[[-161.73971557617188,55.056100845336914],[-161.90695190429688,55.151384353637695],[-161.64138793945312,55.11332893371582],[-161.73971557617188,55.056100845336914]]],[[[-132.67471313476562,55.03305244445801],[-132.86471557617188,55.02999305725098],[-132.85333251953125,55.159433364868164],[-132.67471313476562,55.03305244445801]]],[[[-131.42584228515625,55.21110725402832],[-131.37222290039062,55.01361274719238],[-131.61749267578125,55.01111030578613],[-131.42584228515625,55.21110725402832]]],[[[-132.8358154296875,54.88916206359863],[-132.67999267578125,54.66610145568848],[-133.195556640625,55.23027229309082],[-132.8358154296875,54.88916206359863]]],[[[-159.51947021484375,55.064157485961914],[-159.65557861328125,55.05499458312988],[-159.5352783203125,55.24749183654785],[-159.51947021484375,55.064157485961914]]],[[[-161.56195068359375,55.21805000305176],[-161.70611572265625,55.20471382141113],[-161.53363037109375,55.25277900695801],[-161.56195068359375,55.21805000305176]]],[[[-159.84332275390625,55.13249397277832],[-160.24472045898438,54.901384353637695],[-159.8822021484375,55.29083442687988],[-159.84332275390625,55.13249397277832]]],[[[-133.24972534179688,55.20916175842285],[-133.439453125,55.30193519592285],[-133.29666137695312,55.33055305480957],[-133.24972534179688,55.20916175842285]]],[[[-160.33306884765625,55.24804878234863],[-160.528076171875,55.3205509185791],[-160.34695434570312,55.368600845336914],[-160.33306884765625,55.24804878234863]]],[[[-160.695556640625,55.39999580383301],[-160.461669921875,55.187211990356445],[-160.81640625,55.11832618713379],[-160.695556640625,55.39999580383301]]],[[[-133.59832763671875,55.2338809967041],[-133.65362358093262,55.36944007873535],[-133.44696044921875,55.4102725982666],[-133.59832763671875,55.2338809967041]]],[[[-131.72500610351562,55.134721755981445],[-131.84609985351562,55.419992446899414],[-131.61663818359375,55.28360939025879],[-131.72500610351562,55.134721755981445]]],[[[-163.14639282226562,55.393327713012695],[-163.19473266601562,55.42193794250488],[-163.136962890625,55.436105728149414],[-163.14639282226562,55.393327713012695]]],[[[-160.17889404296875,55.39610481262207],[-160.34194946289062,55.416940689086914],[-160.24972534179688,55.46305274963379],[-160.17889404296875,55.39610481262207]]],[[[-133.5050048828125,55.42721748352051],[-133.60165405273438,55.44748878479004],[-133.42138671875,55.48360633850098],[-133.5050048828125,55.42721748352051]]],[[[-133.57806396484375,55.49777412414551],[-133.758056640625,55.48721504211426],[-133.70248413085938,55.5513858795166],[-133.57806396484375,55.49777412414551]]],[[[-133.28945922851562,55.4758243560791],[-133.43667602539062,55.52749061584473],[-133.308349609375,55.55471229553223],[-133.28945922851562,55.4758243560791]]],[[[-133.50558471679688,55.69332313537598],[-133.67779541015625,55.78416633605957],[-133.29974365234375,55.79361152648926],[-133.50558471679688,55.69332313537598]]],[[[-133.24221801757812,55.77665901184082],[-133.32916259765625,55.87748908996582],[-133.21554565429688,55.86194038391113],[-133.24221801757812,55.77665901184082]]],[[[-158.86416625976562,55.80388069152832],[-158.832763671875,55.89388465881348],[-158.709716796875,55.83138465881348],[-158.86416625976562,55.80388069152832]]],[[[-134.24972534179688,55.81944465637207],[-134.33889770507812,55.91805458068848],[-134.09664916992188,55.9183292388916],[-134.24972534179688,55.81944465637207]]],[[[-155.58029174804688,55.77443885803223],[-155.739990234375,55.8286075592041],[-155.56390380859375,55.91860389709473],[-155.58029174804688,55.77443885803223]]],[[[-133.8477783203125,55.847490310668945],[-133.92721557617188,55.911935806274414],[-133.8477783203125,55.93526649475098],[-133.8477783203125,55.847490310668945]]],[[[-131.05056762695312,55.79972267150879],[-131.14279174804688,55.19693946838379],[-131.461669921875,55.28611183166504],[-131.348876953125,55.64499855041504],[-131.52194213867188,55.29305458068848],[-131.82223510742188,55.450273513793945],[-131.68389892578125,55.833330154418945],[-131.2650146484375,55.960824966430664],[-131.05056762695312,55.79972267150879]]],[[[-131.51947021484375,55.915544509887695],[-131.57693481445312,55.93194007873535],[-131.39944458007812,55.963884353637695],[-131.51947021484375,55.915544509887695]]],[[[-133.69528198242188,55.89638710021973],[-133.67971801757812,56.06638526916504],[-133.278076171875,56.139719009399414],[-133.69528198242188,55.89638710021973]]],[[[-133.93112182617188,56.28833198547363],[-133.94805908203125,56.30193519592285],[-133.92556762695312,56.298051834106445],[-133.93112182617188,56.28833198547363]]],[[[-133.48858642578125,56.33693885803223],[-132.1441650390625,55.480546951293945],[-132.5625,55.56777381896973],[-131.98858642578125,55.26416206359863],[-132.21859741210938,54.99249458312988],[-131.96304321289062,55.025827407836914],[-132.00390625,54.6905460357666],[-132.64138793945312,55.25027656555176],[-133.22250366210938,55.28305244445801],[-132.86749267578125,55.35388374328613],[-133.12860107421875,55.49471473693848],[-132.90835571289062,55.6280460357666],[-133.37222290039062,55.62054634094238],[-133.135009765625,55.88110542297363],[-133.25836181640625,56.15249061584473],[-133.61721801757812,56.20749855041504],[-133.48858642578125,56.33693885803223]]],[[[-132.09445190429688,56.09332466125488],[-132.31887817382812,55.91221046447754],[-132.71694946289062,56.151384353637695],[-132.41778564453125,56.35083198547363],[-132.09445190429688,56.09332466125488]]],[[[-132.81723022460938,56.2338809967041],[-133.05776977539062,56.347490310668945],[-132.63555908203125,56.434160232543945],[-132.81723022460938,56.2338809967041]]],[[[-132.50085258483887,56.35332679748535],[-132.49386596679688,56.43582344055176],[-132.38668823242188,56.39860725402832],[-132.50085258483887,56.35332679748535]]],[[[-132.13247680664062,56.34527015686035],[-132.05612182617188,56.11138343811035],[-132.37387084960938,56.48443794250488],[-132.13247680664062,56.34527015686035]]],[[[-153.95889282226562,56.50277900695801],[-154.13446044921875,56.50555610656738],[-153.87387084960938,56.55332374572754],[-153.95889282226562,56.50277900695801]]],[[[-156.99664306640625,56.555551528930664],[-157.3297119140625,56.53582954406738],[-157.25167846679688,56.58166694641113],[-156.99664306640625,56.555551528930664]]],[[[-132.3980712890625,56.58360481262207],[-132.43499755859375,56.5897159576416],[-132.37942504882812,56.60054969787598],[-132.3980712890625,56.58360481262207]]],[[[-154.48138427734375,56.60169792175293],[-154.40280151367188,56.54666328430176],[-154.7874755859375,56.414968490600586],[-154.48138427734375,56.60169792175293]]],[[[-154.21194458007812,56.49888038635254],[-154.35247802734375,56.54166603088379],[-154.08499145507812,56.608049392700195],[-154.21194458007812,56.49888038635254]]],[[[-169.67337036132812,56.608598709106445],[-169.47137451171875,56.59221076965332],[-169.7861328125,56.6138858795166],[-169.67337036132812,56.608598709106445]]],[[[-132.7730712890625,56.49471473693848],[-132.87359619140625,56.79610633850098],[-132.52890014648438,56.59527015686035],[-132.7730712890625,56.49471473693848]]],[[[-133.98748779296875,56.87082862854004],[-133.90280151367188,56.75305366516113],[-134.02471923828125,56.64721870422363],[-133.83056640625,56.79610633850098],[-133.69137573242188,56.59971809387207],[-133.92056274414062,56.61416053771973],[-133.84609985351562,56.29083442687988],[-133.97320556640625,56.35610389709473],[-133.97332763671875,56.08166694641113],[-134.0655517578125,56.30582618713379],[-134.123046875,55.99582862854004],[-134.06527709960938,56.550546646118164],[-134.40890502929688,56.82943916320801],[-133.98748779296875,56.87082862854004]]],[[[-133.31777954101562,56.99388313293457],[-132.92501831054688,56.643327713012695],[-133.3519287109375,56.83860206604004],[-133.08193969726562,56.523881912231445],[-133.5755615234375,56.433603286743164],[-133.69696044921875,56.83194160461426],[-133.89056396484375,56.89694404602051],[-133.73611450195312,56.89305305480957],[-134.01806640625,57.014719009399414],[-133.31777954101562,56.99388313293457]]],[[[-153.25335693359375,56.99833106994629],[-153.40750122070312,57.072771072387695],[-153.23416137695312,57.205827713012695],[-152.883056640625,57.15027046203613],[-153.25335693359375,56.99833106994629]]],[[[-170.1661376953125,57.16331672668457],[-170.4139404296875,57.17416572570801],[-170.15057373046875,57.22832679748535],[-170.1661376953125,57.16331672668457]]],[[[-135.79583740234375,56.98638343811035],[-135.71054077148438,57.32361030578613],[-135.54611206054688,57.12943458557129],[-135.79583740234375,56.98638343811035]]],[[[-134.9375,57.35888862609863],[-134.65362358093262,56.16304969787598],[-135.67279052734375,57.351938247680664],[-134.9375,57.35888862609863]]],[[[-134.79251098632812,57.30027198791504],[-134.97470092773438,57.41526985168457],[-134.81362915039062,57.416940689086914],[-134.79251098632812,57.30027198791504]]],[[[-153.20889282226562,57.8124942779541],[-153.53640747070312,57.93471717834473],[-153.35333251953125,57.93638038635254],[-153.26974487304688,57.8991641998291],[-153.20889282226562,57.8124942779541]]],[[[-152.35443115234375,57.890275955200195],[-152.50335693359375,57.933053970336914],[-152.417236328125,57.97638130187988],[-152.35443115234375,57.890275955200195]]],[[[-153.116943359375,57.94999885559082],[-152.15139770507812,57.604440689086914],[-153.02279663085938,57.47360420227051],[-152.5958251953125,57.3699893951416],[-153.16946411132812,57.34554481506348],[-152.95611572265625,57.25388526916504],[-153.26028442382812,57.22776985168457],[-153.5,57.06388282775879],[-153.73165893554688,57.05971717834473],[-153.54998779296875,56.983049392700195],[-153.97970581054688,56.738603591918945],[-153.73776245117188,57.13082313537598],[-154.47943115234375,57.12027168273926],[-154.10110473632812,57.11638832092285],[-154.29779052734375,56.84887886047363],[-154.80111694335938,57.28611183166504],[-154.20721435546875,57.66666603088379],[-153.6280517578125,57.26944160461426],[-153.88027954101562,57.64305305480957],[-153.58111572265625,57.612497329711914],[-153.9283447265625,57.811105728149414],[-153.4969482421875,57.627214431762695],[-153.31527709960938,57.7258243560791],[-153.479154586792,57.839433670043945],[-153.21304321289062,57.78833198547363],[-153.15057373046875,57.8638858795166],[-153.04806518554688,57.82749366760254],[-153.292236328125,58.001665115356445],[-153.116943359375,57.94999885559082]]],[[[-153.18527221679688,58.09249305725098],[-152.88778686523438,57.991106033325195],[-153.41806030273438,58.05888557434082],[-153.18527221679688,58.09249305725098]]],[[[-136.43722534179688,57.846384048461914],[-136.48443603515625,58.09332466125488],[-136.33056640625,58.01027870178223],[-136.43722534179688,57.846384048461914]]],[[[-135.74276733398438,58.25610542297363],[-135.48248291015625,58.15555000305176],[-135.707763671875,57.97832679748535],[-134.9302978515625,58.02804756164551],[-135.2047119140625,57.942216873168945],[-135.01055908203125,57.77694129943848],[-135.88751220703125,57.988603591918945],[-135.29696655273438,57.73166084289551],[-134.92166137695312,57.75694465637207],[-134.84332275390625,57.46277046203613],[-135.80416870117188,57.76333045959473],[-135.54278564453125,57.47221565246582],[-135.83084106445312,57.38582801818848],[-136.4122314453125,57.81582832336426],[-136.02972412109375,57.84916114807129],[-136.35220336914062,58.219438552856445],[-135.74276733398438,58.25610542297363]]],[[[-151.84722900390625,58.16971778869629],[-151.89666557312012,58.19415473937988],[-151.83554077148438,58.26860237121582],[-151.84722900390625,58.16971778869629]]],[[[-134.45443725585938,58.31332588195801],[-134.25973510742188,58.19499397277832],[-134.68389892578125,58.2983341217041],[-134.56695556640625,58.340829849243164],[-134.45443725585938,58.31332588195801]]],[[[-152.4091796875,58.365549087524414],[-151.9727783203125,58.233049392700195],[-153.23138427734375,58.16916084289551],[-152.4091796875,58.365549087524414]]],[[[-134.67471313476562,58.16054725646973],[-134.16915893554688,58.15971565246582],[-133.87582397460938,57.67276954650879],[-134.28860473632812,58.077219009399414],[-133.86026000976562,57.360551834106445],[-134.48666381835938,57.02555274963379],[-134.61331176757812,57.224992752075195],[-134.31027221679688,57.33610725402832],[-134.572509765625,57.48971748352051],[-134.3497314453125,57.54277229309082],[-134.65444946289062,57.59832954406738],[-134.9566650390625,58.40777015686035],[-134.67471313476562,58.16054725646973]]],[[[-152.49386596679688,58.47221565246582],[-152.66055297851562,58.5433292388916],[-152.3458251953125,58.627214431762695],[-152.49386596679688,58.47221565246582]]],[[[-160.95693969726562,58.55694007873535],[-161.11309814453125,58.65527534484863],[-160.68722534179688,58.81833076477051],[-160.95693969726562,58.55694007873535]]],[[[-152.31332397460938,58.90832710266113],[-152.36026000976562,58.91638374328613],[-152.16140747070312,58.942216873168945],[-152.31332397460938,58.90832710266113]]],[[[-150.69168090820312,59.306657791137695],[-150.77667236328125,59.32888221740723],[-150.61663818359375,59.389719009399414],[-150.69168090820312,59.306657791137695]]],[[[-153.41140747070312,59.330278396606445],[-153.55221557617188,59.36471748352051],[-153.403076171875,59.406938552856445],[-153.41140747070312,59.330278396606445]]],[[[-150.3114013671875,59.420549392700195],[-150.44027709960938,59.40110206604004],[-150.29278564453125,59.46305274963379],[-150.3114013671875,59.420549392700195]]],[[[-144.58499145507812,59.81027412414551],[-144.50390625,59.89444160461426],[-144.20889282226562,60.00555610656738],[-144.58499145507812,59.81027412414551]]],[[[-148.1611328125,59.94110298156738],[-148.24581909179688,59.94249153137207],[-147.99221801757812,60.0402774810791],[-148.1611328125,59.94110298156738]]],[[[-148.02780151367188,59.94665718078613],[-147.88333129882812,60.067216873168945],[-147.81723022460938,60.06888771057129],[-148.02780151367188,59.94665718078613]]],[[[-148.11553955078125,59.99638557434082],[-147.96722412109375,60.15304756164551],[-147.87664794921875,60.10388374328613],[-148.11553955078125,59.99638557434082]]],[[[-148.03390502929688,60.18943214416504],[-148.15139770507812,60.041940689086914],[-148.30972290039062,60.02971839904785],[-148.03390502929688,60.18943214416504]]],[[[-147.8499755859375,59.77694129943848],[-147.193603515625,60.35332679748535],[-146.92333984375,60.309160232543945],[-147.8499755859375,59.77694129943848]]],[[[-147.71194458007812,60.37610054016113],[-147.75973510742188,60.165544509887695],[-147.90972900390625,60.23472023010254],[-147.71194458007812,60.37610054016113]]],[[[-148.07943725585938,60.28277015686035],[-148.14251708984375,60.3205509185791],[-147.98330688476562,60.38388252258301],[-148.07943725585938,60.28277015686035]]],[[[-166.10971069335938,60.39915657043457],[-165.68142700195312,60.29471778869629],[-165.55972290039062,59.92360877990723],[-166.19305419921875,59.75443458557129],[-167.41806030273438,60.18942451477051],[-166.10971069335938,60.39915657043457]]],[[[-146.3538818359375,60.40749549865723],[-146.07888793945312,60.4052677154541],[-146.72415161132812,60.374711990356445],[-146.3538818359375,60.40749549865723]]],[[[-145.12277221679688,60.30721473693848],[-145.28195190429688,60.32999610900879],[-145.08694458007812,60.41666603088379],[-145.12277221679688,60.30721473693848]]],[[[-172.52029418945312,60.38833045959473],[-172.20697021484375,60.31304359436035],[-173.05364990234375,60.497209548950195],[-172.52029418945312,60.38833045959473]]],[[[-151.95556640625,60.42276954650879],[-151.95111083984375,60.512216567993164],[-151.85638427734375,60.48971748352051],[-151.95556640625,60.42276954650879]]],[[[-146.2469482421875,60.45499610900879],[-146.320556640625,60.494157791137695],[-145.74972534179688,60.59471321105957],[-146.2469482421875,60.45499610900879]]],[[[-147.37277221679688,60.66166114807129],[-147.47555541992188,60.68888282775879],[-147.31390380859375,60.67749214172363],[-147.37277221679688,60.66166114807129]]],[[[-147.92556762695312,60.66221046447754],[-148.00418090820312,60.726938247680664],[-147.84609985351562,60.69999885559082],[-147.92556762695312,60.66221046447754]]],[[[-148.14083862304688,60.642221450805664],[-148.21417236328125,60.75444221496582],[-148.10861206054688,60.73638343811035],[-148.14083862304688,60.642221450805664]]],[[[-164.98831176757812,60.82249641418457],[-165.01751708984375,60.87443733215332],[-164.90362358093262,60.85360908508301],[-164.98831176757812,60.82249641418457]]],[[[-146.75335693359375,60.80721473693848],[-146.83193969726562,60.836381912231445],[-146.744140625,60.88138008117676],[-146.75335693359375,60.80721473693848]]],[[[-147.15084838867188,60.86027717590332],[-147.31777954101562,60.884164810180664],[-147.07528686523438,60.8991641998291],[-147.15084838867188,60.86027717590332]]],[[[-147.92889404296875,60.80694007873535],[-148.133056640625,60.79972267150879],[-148.10665893554688,60.912492752075195],[-147.92889404296875,60.80694007873535]]],[[[-170.31890869140625,63.254716873168945],[-170.31585693359375,63.25387763977051],[-170.29611206054688,63.238046646118164],[-170.31890869140625,63.254716873168945]]],[[[-170.31890869140625,63.254716873168945],[-170.36221313476562,63.28249549865723],[-170.34188842773438,63.271127700805664],[-170.31890869140625,63.254716873168945]]],[[[-170.46676635742188,63.334184646606445],[-170.40390014648438,63.3044376373291],[-170.48583984375,63.34110450744629],[-170.46676635742188,63.334184646606445]]],[[[-170.54364013671875,63.35971260070801],[-170.49026489257812,63.341928482055664],[-170.5511474609375,63.360551834106445],[-170.54364013671875,63.35971260070801]]],[[[-170.59500122070312,63.37193489074707],[-170.58197021484375,63.368051528930664],[-170.86325073242188,63.41851234436035],[-170.59500122070312,63.37193489074707]]],[[[-162.37747192382812,63.544443130493164],[-162.70361328125,63.571664810180664],[-162.4202880859375,63.63749885559082],[-162.37747192382812,63.544443130493164]]],[[[-171.465576171875,63.60666084289551],[-170.30001831054688,63.69415473937988],[-168.70086669921875,63.290544509887695],[-169.6661376953125,62.943315505981445],[-170.51889038085938,63.37803840637207],[-170.856689453125,63.46193885803223],[-171.46112060546875,63.314714431762695],[-171.850830078125,63.50860786437988],[-171.72695922851562,63.79221534729004],[-171.465576171875,63.60666084289551]]],[[[-166.6591796875,66.10331916809082],[-166.443603515625,66.18081855773926],[-166.16946411132812,66.22137641906738],[-166.6591796875,66.10331916809082]]],[[[-165.36444091796875,66.42637825012207],[-165.4708251953125,66.41415596008301],[-164.76223754882812,66.53831672668457],[-165.36444091796875,66.42637825012207]]],[[[-156.44696044921875,71.26361274719238],[-155.58694458007812,71.16276741027832],[-156.1824951171875,70.91832160949707],[-155.97360229492188,70.75583076477051],[-155.08749389648438,71.1513843536377],[-154.24386596679688,70.7794361114502],[-152.25250244140625,70.83526802062988],[-152.49859619140625,70.6494312286377],[-152.07611083984375,70.57499885559082],[-152.62942504882812,70.55748176574707],[-151.73248291015625,70.55720710754395],[-151.96609497070312,70.44359016418457],[-149.17471313476562,70.49081611633301],[-144.95220947265625,69.96832466125488],[-143.28057861328125,70.11831855773926],[-141.00299072265625,69.64236640930176],[-140.99554443359375,60.30721473693848],[-139.06805419921875,60.35222053527832],[-139.18890380859375,60.088884353637695],[-137.5908203125,59.238603591918945],[-137.47805786132812,58.90721321105957],[-135.47360229492188,59.80193519592285],[-133.42999267578125,58.45916175842285],[-131.82415771484375,56.596940994262695],[-130.01507568359375,55.90918159484863],[-130.17471313476562,55.75444221496582],[-129.99053955078125,55.28166389465332],[-130.68612670898438,54.76194190979004],[-131.00863647460938,55.004167556762695],[-130.461669921875,55.327775955200195],[-131.05612182617188,55.12276649475098],[-130.6138916015625,55.29610633850098],[-130.86416625976562,55.308603286743164],[-131.01028442382812,56.10638618469238],[-131.90057373046875,55.85527229309082],[-131.75250244140625,55.80777168273926],[-131.95498657226562,55.501108169555664],[-132.1602783203125,55.5786075592041],[-131.76974487304688,56.19693946838379],[-132.7913818359375,57.08804512023926],[-133.50836181640625,57.19360542297363],[-133.06304931640625,57.34887886047363],[-133.64056396484375,57.69638252258301],[-133.00057983398438,57.51500129699707],[-133.55694580078125,57.90249061584473],[-133.12136840820312,57.857500076293945],[-134.05499267578125,58.07193946838379],[-133.7691650390625,58.518327713012695],[-134.1541748046875,58.197771072387695],[-134.510009765625,58.35388374328613],[-134.76141357421875,58.382211685180664],[-135.33526611328125,59.46832466125488],[-135.30471801757812,59.08360481262207],[-135.55056762695312,59.2288761138916],[-135.08554077148438,58.233049392700195],[-135.91555786132812,58.3830509185791],[-136.06832885742188,58.81777381896973],[-135.76947021484375,58.90027046203613],[-136.1622314453125,59.03360939025879],[-136.23471069335938,58.75083351135254],[-137.05667114257812,59.06860542297363],[-137.12554931640625,58.82193946838379],[-136.5736083984375,58.83860206604004],[-136.02749633789062,58.387216567993164],[-136.6541748046875,58.21527290344238],[-138.443603515625,59.191659927368164],[-139.71054077148438,59.49582862854004],[-139.49386596679688,59.98221015930176],[-139.28555297851562,59.57138252258301],[-138.89279174804688,59.806657791137695],[-139.5,60.03305244445801],[-140.40335083007812,59.69804573059082],[-141.37664794921875,59.86638832092285],[-141.39083862304688,60.13860511779785],[-143.92333984375,59.994157791137695],[-144.9364013671875,60.30166053771973],[-144.61138916015625,60.71554756164551],[-145.29415893554688,60.35027503967285],[-145.85943603515625,60.49166297912598],[-145.62582397460938,60.67193794250488],[-146.26113891601562,60.64805030822754],[-146.04083251953125,60.79860877990723],[-146.65335083007812,60.699716567993164],[-146.1241455078125,60.84332466125488],[-146.75668334960938,60.955270767211914],[-146.30084228515625,61.13082313537598],[-147.366943359375,60.887773513793945],[-147.54666137695312,61.154436111450195],[-147.86526489257812,60.83249855041504],[-148.05221557617188,60.949716567993164],[-147.7197265625,61.27804756164551],[-148.69973754882812,60.78972053527832],[-148.197509765625,60.62610054016113],[-148.68417358398438,60.44832801818848],[-147.93695068359375,60.46221351623535],[-148.43112182617188,60.192766189575195],[-148.0977783203125,60.20749855041504],[-148.31777954101562,60.16888618469238],[-148.43582153320312,59.94887733459473],[-149.2861328125,59.86888313293457],[-149.41696166992188,60.11832618713379],[-149.52584838867188,59.71666145324707],[-149.73193359375,59.96055030822754],[-149.74359130859375,59.65860176086426],[-150.0341796875,59.79638862609863],[-149.91583251953125,59.7147159576416],[-150.01364135742188,59.62748908996582],[-150.34942626953125,59.46554756164551],[-150.213623046875,59.71666145324707],[-150.47360229492188,59.46444129943848],[-150.54168701171875,59.59166145324707],[-150.90750122070312,59.24332618713379],[-151.98056030273438,59.28055000305176],[-150.99276733398438,59.7772159576416],[-151.87664794921875,59.75388526916504],[-151.30389404296875,60.38555335998535],[-151.40890502929688,60.727487564086914],[-150.399169921875,61.03721809387207],[-149.028076171875,60.8477725982666],[-150.06417846679688,61.154436111450195],[-149.41696166992188,61.50860786437988],[-151.5836181640625,60.976938247680664],[-152.4302978515625,60.288888931274414],[-153.10305786132812,60.289438247680664],[-152.57720947265625,60.064714431762695],[-154.26083374023438,59.142221450805664],[-153.26779174804688,58.84860420227051],[-154.10333251953125,58.48193550109863],[-154.23361206054688,58.13110542297363],[-156.489990234375,57.33111000061035],[-156.54861450195312,56.977487564086914],[-158.42306518554688,56.44388008117676],[-158.64999389648438,56.26444435119629],[-158.12054443359375,56.23360633850098],[-158.50527954101562,55.9888858795166],[-158.60110473632812,56.18804359436035],[-159.667236328125,55.577219009399414],[-159.84109497070312,55.85110664367676],[-161.25418090820312,55.346940994262695],[-161.48553466796875,55.48110389709473],[-161.14169311523438,55.538888931274414],[-161.5625,55.62276649475098],[-161.9677734375,55.101938247680664],[-162.45416259765625,55.03833198547363],[-162.62664794921875,55.29944038391113],[-162.5625,54.955270767211914],[-163.1844482421875,55.139719009399414],[-163.04446411132812,54.9374942779541],[-163.36026000976562,54.81193733215332],[-163.25863647460938,54.97332191467285],[-163.32305908203125,55.121660232543945],[-161.79998779296875,55.88665962219238],[-160.24972534179688,55.77054786682129],[-160.57470703125,55.98665809631348],[-160.34695434570312,56.28555488586426],[-158.64056396484375,56.76111030578613],[-158.64889526367188,57.05332374572754],[-157.93804931640625,57.4919376373291],[-157.39666557312012,57.490549087524414],[-157.7066650390625,57.643327713012695],[-157.6099853515625,58.0897159576416],[-157.13861083984375,58.162492752075195],[-157.55361938476562,58.38249397277832],[-156.7791748046875,59.151384353637695],[-158.18832397460938,58.60638618469238],[-158.49249267578125,58.99943733215332],[-157.99276733398438,58.90499305725098],[-158.53695678710938,59.17527198791504],[-158.89752197265625,58.39554786682129],[-160.32666015625,59.05971717834473],[-162.17138671875,58.64972114562988],[-161.56582641601562,59.10360908508301],[-161.99221801757812,59.1441593170166],[-161.70526123046875,59.496660232543945],[-162.15139770507812,60.24554634094238],[-162.37222290039062,60.176103591918945],[-161.87942504882812,60.702219009399414],[-162.5694580078125,60.31638526916504],[-162.52166557312012,59.99276924133301],[-164.06527709960938,59.824167251586914],[-165.42529296875,60.55526924133301],[-164.66500854492188,60.91166114807129],[-164.26446533203125,60.778879165649414],[-164.42916870117188,60.55332374572754],[-163.957763671875,60.78027534484863],[-163.66946411132812,60.58721351623535],[-163.40972900390625,60.756662368774414],[-163.89561462402344,60.85688591003418],[-163.5513916015625,60.903879165649414],[-165.15029907226562,60.928049087524414],[-164.82223510742188,61.11110877990723],[-165.12054443359375,61.083879470825195],[-165.13861083984375,61.256662368774414],[-165.16372680664062,61.17004585266113],[-165.3699951171875,61.20083045959473],[-165.15057373046875,61.416940689086914],[-165.05967712402344,61.41684150695801],[-164.99842834472656,61.469770431518555],[-164.84527587890625,61.49444007873535],[-164.71609497070312,61.62555122375488],[-165.01724243164062,61.50000190734863],[-165.0755615234375,61.43221473693848],[-165.1611328125,61.43249702453613],[-165.28750610351562,61.333879470825195],[-165.40750122070312,61.208330154418945],[-165.34136962890625,61.15721321105957],[-165.38668823242188,61.06860542297363],[-166.19778442382812,61.59471321105957],[-165.24722290039062,62.44610023498535],[-164.63641357421875,62.417497634887695],[-164.852783203125,62.57027626037598],[-164.479154586792,62.74582862854004],[-164.87777709960938,62.83555030822754],[-164.31832885742188,63.00694465637207],[-164.41055297851562,63.21193885803223],[-163.11166381835938,63.05193519592285],[-162.31195068359375,63.54110908508301],[-161.15167236328125,63.51249885559082],[-160.77749633789062,63.868600845336914],[-161.5291748046875,64.41887092590332],[-160.78390502929688,64.72192573547363],[-161.1824951171875,64.93748664855957],[-162.790283203125,64.33610725402832],[-163.17001342773438,64.65526008605957],[-163.17584228515625,64.4074878692627],[-166.12136840820312,64.57470893859863],[-166.96194458007812,65.18887519836426],[-166.05889892578125,65.25610542297363],[-168.131103515625,65.6655445098877],[-164.35360717773438,66.59471321105957],[-163.625,66.56721687316895],[-164.18832397460938,66.19609260559082],[-163.65640258789062,66.07054328918457],[-161.00335693359375,66.20416450500488],[-161.91000366210938,66.2744312286377],[-161.9061279296875,66.53526496887207],[-162.63613891601562,66.86886787414551],[-162.33694458007812,66.95833015441895],[-161.60055541992188,66.44775581359863],[-160.23056030273438,66.39972114562988],[-160.26419067382812,66.64749336242676],[-161.50668334960938,66.53387641906738],[-161.89779663085938,66.72831916809082],[-161.50112915039062,66.97915840148926],[-162.46112060546875,66.99247932434082],[-162.35055541992188,67.16137886047363],[-163.73248291015625,67.11360359191895],[-164.1241455078125,67.60998725891113],[-166.82778930664062,68.35081672668457],[-166.3726043701172,68.4167652130127],[-166.2158203125,68.88304328918457],[-163.64529418945312,69.10693550109863],[-161.94223022460938,70.30720710754395],[-162.11886596679688,70.15165901184082],[-159.9375,70.59332466125488],[-160.1986083984375,70.47165107727051],[-159.83612060546875,70.2683277130127],[-159.28555297851562,70.53055000305176],[-160.12442016601562,70.61526679992676],[-159.66806030273438,70.79803657531738],[-157.97943115234375,70.83749580383301],[-156.44696044921875,71.26361274719238]],[[-135.55416870117188,58.32999610900879],[-135.62527465820312,58.3830509185791],[-135.72610473632812,58.35943794250488],[-135.55416870117188,58.32999610900879]]]]}},{"type":"Feature","properties":{"name":"Burkina Faso","iso2":"BF","iso3":"BFA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-2.834048,11.002007],[-2.685561,9.481817],[-3.633611,9.954443000000111],[-4.704445,9.698055],[-5.51985,10.436272],[-5.273056,11.843887],[-4.4175,12.300831],[-4.337223,13.121666],[-3.964253,13.50383],[-3.437675,13.166498],[-3.2575,13.696665],[-2.879167,13.655554],[-2.474722,14.287498],[-2.006945,14.187777],[-1.980834,14.474722],[-0.725278,15.082777],[0.235048,14.915068],[0.602222,13.703888],[1.285306,13.349957],[0.991667,13.371666],[0.989167,13.047222],[1.578333,12.629999],[2.1425,12.694443],[2.397925,11.896152],[2.014722,11.422499],[1.435278,11.458887],[0.91797,10.996399],[-0.149762,11.13854],[-0.618333,10.911665],[-2.834048,11.002007]]]]}},{"type":"Feature","properties":{"name":"Uruguay","iso2":"UY","iso3":"URY"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-57.806396,-30.748219],[-57.608002,-30.184925],[-56.811394,-30.105278],[-56.008923,-31.079794],[-55.581947,-30.845837],[-53.879723,-31.967781],[-53.093056,-32.729729],[-53.522781,-33.147781],[-53.374298,-33.740669],[-54.145004,-34.671394],[-56.320282,-34.910561],[-57.117783,-34.462227],[-57.840279,-34.494728],[-58.402779,-33.929726],[-58.361946,-33.133339],[-58.146393,-33.101952],[-58.045563,-32.934723],[-58.199242,-32.45031],[-57.806396,-30.748219]]]]}},{"type":"Feature","properties":{"name":"Uzbekistan","iso2":"UZ","iso3":"UZB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[64.383026,38.953125],[62.551102,39.934158],[61.874161,41.125549],[60.14027400000012,41.381104],[60.014442,42.217491],[58.780548,42.658043],[58.16443600000011,42.651932],[58.51554900000011,42.304436],[58.02660400000016,42.504639],[56.986938,41.893051],[57.044716,41.260277],[56.000961,41.32845300000015],[55.99749,45.001106],[58.569717,45.571106],[62.025108,43.484787],[64.931366,43.73777],[65.82193,42.877213],[66.123871,42.99694100000012],[66.02916,42.003052],[66.526382,42.003052],[66.7199860000002,41.174995],[67.935532,41.183327],[68.455261,40.59777100000012],[69.05636600000011,41.379433000000105],[70.97081,42.254669],[71.276382,42.195511],[70.187195,41.52829],[71.418045,41.118553],[71.69136,41.556335],[72.19548,41.006592],[73.173035,40.822998],[71.710541,40.145767],[70.98204,40.244843],[70.375534,40.376404],[70.796799,40.725594],[70.423874,41.049118],[69.732483,40.638603],[69.356094,40.772491],[69.308029,40.201385],[68.600815,40.178329],[69.009995,40.089714],[68.540268,39.55471],[67.441956,39.483582],[67.376373,39.212494],[68.123871,38.98555],[68.384155,38.195541],[67.779877,37.185822],[66.537735,37.366379],[66.64387500000012,38.003052000000125],[64.383026,38.953125]]]]}},{"type":"Feature","properties":{"name":"Saint Vincent and the Grenadines","iso2":"VC","iso3":"VCT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-61.416946,12.590277],[-61.45417,12.593887],[-61.425835,12.612499],[-61.416946,12.590277]]],[[[-61.32805599999989,12.687777],[-61.347778,12.701666],[-61.31056199999989,12.734999],[-61.32805599999989,12.687777]]],[[[-61.216667,12.998055],[-61.252228,12.988609],[-61.199722,13.044722],[-61.216667,12.998055]]],[[[-61.173058,13.1325],[-61.28139499999989,13.207777000000164],[-61.177223,13.384165],[-61.173058,13.1325]]]]}},{"type":"Feature","properties":{"name":"Venezuela","iso2":"VE","iso3":"VEN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-61.00361633300781,8.548887252807617],[-61.266395568847656,8.509164810180664],[-61.080833435058594,8.61027717590332],[-61.00361633300781,8.548887252807617]]],[[[-61.04778289794922,8.629446029663086],[-61.1844482421875,8.598611831665039],[-61.16722869873047,8.651945114135742],[-61.04778289794922,8.629446029663086]]],[[[-61.04194641113281,8.640275955200195],[-61.146949768066406,8.654443740844727],[-61.17778015136719,8.679445266723633],[-60.9344482421875,8.718332290649414],[-61.04194641113281,8.640275955200195]]],[[[-60.82722473144531,8.649442672729492],[-60.988616943359375,8.635557174682617],[-60.84083557128906,8.728055953979492],[-60.82722473144531,8.649442672729492]]],[[[-60.976112365722656,8.725831985473633],[-61.17028045654297,8.693334579467773],[-61.042503356933594,8.821111679077148],[-60.860557556152344,8.853334426879883],[-60.976112365722656,8.725831985473633]]],[[[-61.070556640625,8.892499923706055],[-61.09972381591797,8.891111373901367],[-61.065834045410156,8.976945877075195],[-60.84861755371094,9.093610763549805],[-61.070556640625,8.892499923706055]]],[[[-60.87028503417969,9.108331680297852],[-60.9586181640625,9.066946029663086],[-60.863616943359375,9.193334579467773],[-60.87028503417969,9.108331680297852]]],[[[-60.730003356933594,9.18638801574707],[-60.841392517089844,9.116666793823242],[-60.822784423828125,9.201665878295898],[-60.730003356933594,9.18638801574707]]],[[[-62.288612365722656,9.755556106567383],[-62.28639221191406,9.934167861938477],[-62.249168395996094,9.856943130493164],[-62.288612365722656,9.755556106567383]]],[[[-62.64750671386719,10.302499771118164],[-62.788063049316406,10.414999008178711],[-62.78722381591797,10.478612899780273],[-62.64750671386719,10.302499771118164]]],[[[-63.9072265625,10.72944450378418],[-63.996673583984375,10.802221298217773],[-63.90666961669922,10.777498245239258],[-63.9072265625,10.72944450378418]]],[[[-65.26861572265625,10.881109237670898],[-65.417236328125,10.924722671508789],[-65.21194458007812,10.956110000610352],[-65.26861572265625,10.881109237670898]]],[[[-63.804725646972656,11.021387100219727],[-64.40583801269531,10.967500686645508],[-63.88111114501953,11.176942825317383],[-63.804725646972656,11.021387100219727]]],[[[-66.64834594726562,11.758611679077148],[-66.61056518554688,11.821111679077148],[-66.58639526367188,11.771665573120117],[-66.64834594726562,11.758611679077148]]],[[[-66.1158447265625,11.773611068725586],[-66.19306945800781,11.817220687866211],[-66.10861206054688,11.825555801391602],[-66.1158447265625,11.773611068725586]]],[[[-64.57223510742188,11.80555534362793],[-64.64389038085938,11.82472038269043],[-64.61500358581543,11.89555549621582],[-64.57223510742188,11.80555534362793]]],[[[-69.77084350585938,11.696111679077148],[-68.4183349609375,11.179998397827148],[-68.16000366210938,10.496946334838867],[-66.23529052734375,10.642221450805664],[-65.08139038085938,10.060556411743164],[-63.69750213623047,10.485555648803711],[-64.25889587402344,10.661664962768555],[-61.882781982421875,10.733331680297852],[-62.91667175292969,10.528055191040039],[-63.000282287597656,10.271665573120117],[-62.78212356567383,10.399694442749023],[-62.62805938720703,10.107778549194336],[-63.01722717285156,10.097776412963867],[-62.80528259277344,10.008611679077148],[-62.61750030517578,10.089723587036133],[-62.61333465576172,10.222776412963867],[-62.5352783203125,10.20222282409668],[-62.31806182861328,9.704999923706055],[-62.2005615234375,9.905553817749023],[-62.210838317871094,9.634443283081055],[-62.18861389160156,10.015832901000977],[-61.738616943359375,9.595556259155273],[-61.62250518798828,9.906110763549805],[-60.85028076171875,9.440832138061523],[-60.78361511230469,9.304998397827148],[-61.08222961425781,9.10222053527832],[-60.94972229003906,9.179445266723633],[-61.0977783203125,8.963335037231445],[-61.208892822265625,8.595556259155273],[-61.59889221191406,8.554998397827148],[-61.073890686035156,8.400835037231445],[-60.90222930908203,8.582223892211914],[-59.99028015136719,8.535276412963867],[-59.8255615234375,8.236112594604492],[-60.71916961669922,7.535554885864258],[-60.288612365722656,7.057222366333008],[-61.13402557373047,6.711042404174805],[-61.38972473144531,5.940000534057617],[-60.730369567871094,5.204801559448242],[-60.57972717285156,4.94666862487793],[-60.98500061035156,4.52055549621582],[-62.74583435058594,4.032499313354492],[-62.875,3.560277938842773],[-63.343055725097656,3.961111068725586],[-64.01779174804688,3.886110305786133],[-64.7952880859375,4.281389236450195],[-64.19111633300781,3.594446182250977],[-64.04501342773438,2.482500076293945],[-63.361114501953125,2.419168472290039],[-63.39305877685547,2.151388168334961],[-65.51889038085938,0.649721145629883],[-65.58973693847656,0.989168167114258],[-66.31195068359375,0.750558853149414],[-66.87188720703125,1.221643447875977],[-67.1925048828125,2.392499923706055],[-67.82833862304688,2.825002670288086],[-67.29055786132812,3.397500991821289],[-67.85972595214844,4.558610916137695],[-67.45445251464844,6.193056106567383],[-69.24528503417969,6.081388473510742],[-70.11917114257812,6.975835800170898],[-72,7.018888473510742],[-72.4716796875,7.491945266723633],[-72.32528686523438,8.095556259155273],[-72.77972412109375,9.080278396606445],[-73.37806701660156,9.171388626098633],[-72.49305725097656,11.121110916137695],[-72.2093505859375,11.250001907348633],[-71.97723388671875,11.664999008178711],[-71.32472229003906,11.853055953979492],[-71.96833801269531,11.55583381652832],[-71.57695007324219,10.714445114135742],[-72.12750244140625,9.813055038452148],[-71.61805725097656,9.04194450378418],[-71.05528259277344,9.341390609741211],[-71.49751281738281,10.960000991821289],[-69.79861450195312,11.427778244018555],[-69.814453125,11.690832138061523],[-70.23834228515625,11.63166618347168],[-70.02694702148438,12.195276260375977],[-69.77084350585938,11.696111679077148]],[[-61.20667266845703,9.585832595825195],[-61.41166687011719,9.72972297668457],[-61.32695007324219,9.646665573120117],[-61.20667266845703,9.585832595825195]]]]}},{"type":"Feature","properties":{"name":"British Virgin Islands","iso2":"VG","iso3":"VGB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-64.660843,18.383888],[-64.65251199999989,18.441109],[-64.558334,18.451942],[-64.660843,18.383888]]],[[[-64.422501,18.43861],[-64.412231,18.506107],[-64.322235,18.506107],[-64.422501,18.43861]]],[[[-64.31140099999988,18.746109],[-64.270004,18.696388],[-64.408066,18.735832],[-64.31140099999988,18.746109]]]]}},{"type":"Feature","properties":{"name":"Viet Nam","iso2":"VN","iso3":"VNM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[106.600273,8.647778],[106.555817,8.688887],[106.659378,8.764740000000103],[106.600273,8.647778]]],[[[103.4985960000001,9.31361],[103.469437,9.279444],[103.467209,9.304443],[103.4985960000001,9.31361]]],[[[106.26275600000011,9.528887],[106.088058,9.754438],[106.2855220000001,9.586943],[106.26275600000011,9.528887]]],[[[106.54357900000011,9.82583],[106.41857900000016,9.934443],[106.48578600000016,9.902222000000137],[106.54357900000011,9.82583]]],[[[106.59662600000016,10.257221000000115],[106.664413,10.243053],[106.586906,10.256943],[106.59662600000016,10.257221000000115]]],[[[106.63719200000017,10.269999],[106.75247200000015,10.234442],[106.511642,10.29361],[106.63719200000017,10.269999]]],[[[104.083862,10.361942],[104.02638200000015,10.080276],[103.837196,10.36944200000012],[104.083862,10.361942]]],[[[107.092468,10.32222],[107.063858,10.383333],[107.20636000000016,10.432775],[107.092468,10.32222]]],[[[106.89524800000018,10.372219],[106.88748200000012,10.510555],[106.97914100000011,10.408888],[106.89524800000018,10.372219]]],[[[108.958588,10.504166],[108.930252,10.510277],[108.930252,10.550276],[108.958588,10.504166]]],[[[106.904694,10.520832],[106.875793,10.530277],[106.851357,10.561943],[106.871384,10.595519],[106.852188,10.625553000000153],[106.87941000000015,10.63722],[106.92746,10.592775],[106.930252,10.544722],[106.904694,10.520832]]],[[[106.852188,10.403610000000128],[106.755539,10.481386],[106.749977,10.562498000000119],[106.786301,10.578066],[106.7532120000001,10.660968000000125],[106.856476,10.60388200000014],[106.835747,10.569703000000118],[106.87413,10.502499],[106.852188,10.403610000000128]]],[[[109.332764,12.187777],[109.245247,12.227497],[109.33148200000014,12.221088],[109.332764,12.187777]]],[[[109.3936,12.350275000000124],[109.387207,12.34972],[109.385269,12.366941],[109.3936,12.350275000000124]]],[[[107.919434,16.349442],[107.86692800000012,16.35944],[107.661217,16.572613],[107.919434,16.349442]]],[[[107.73027,20.127773],[107.711647,20.131939000000116],[107.7383120000002,20.144440000000102],[107.73027,20.127773]]],[[[107.378311,20.799164],[107.334991,20.846664],[107.382477,20.824165],[107.378311,20.799164]]],[[[107.068047,20.727493],[106.9080430000001,20.832218],[107.033867,20.856106],[107.068047,20.727493]]],[[[106.75277700000018,20.854164000000125],[106.719147,20.870831],[106.74108900000013,20.871109],[106.75277700000018,20.854164000000125]]],[[[106.873306,20.78722],[106.770828,20.852497],[106.78137200000012,20.922497],[106.873306,20.78722]]],[[[106.9480290000001,20.936382],[106.93221300000013,20.936939],[106.927467,20.944717],[106.9480290000001,20.936382]]],[[[107.4885860000002,20.839165],[107.464706,20.821384],[107.554153,20.966106000000124],[107.4885860000002,20.839165]]],[[[106.89388300000022,20.965549],[106.916656,20.954441],[106.888046,20.965549],[106.89388300000022,20.965549]]],[[[107.460823,20.942219],[107.454712,20.943886],[107.45498700000022,20.950272],[107.46219600000015,20.967495],[107.476089,20.972218000000126],[107.47831700000015,20.966106000000124],[107.4733120000001,20.954441],[107.460823,20.942219]]],[[[106.75360100000015,20.950829],[106.688873,20.956661],[106.67942800000017,20.97749300000011],[106.75360100000015,20.950829]]],[[[107.746933,20.937218],[107.747757,21.019165],[107.790817,20.981937000000116],[107.746933,20.937218]]],[[[107.462769,20.90304900000011],[107.39498900000015,20.896664000000115],[107.476723,20.946983],[107.502403,21.012671],[107.554428,21.038052],[107.462769,20.90304900000011]]],[[[107.859421,21.037777],[107.80693100000016,20.986938],[107.8311,21.034996],[107.859421,21.037777]]],[[[107.578323,20.977219],[107.567207,21.020554],[107.6207430000002,21.11783600000011],[107.578323,20.977219]]],[[[107.513321,21.128330000000105],[107.509163,21.133331],[107.53221100000016,21.145828],[107.513321,21.128330000000105]]],[[[107.383881,21.04638700000011],[107.47194700000014,21.27142],[107.604431,21.218884],[107.383881,21.04638700000011]]],[[[107.742752,21.308887000000126],[107.7083280000002,21.305275],[107.81804700000012,21.356384],[107.742752,21.308887000000126]]],[[[107.996643,21.39471800000011],[107.933319,21.364162],[107.828598,21.371384],[107.996643,21.39471800000011]]],[[[105.577477,23.059162000000143],[106.70720700000018,22.864998000000142],[106.693314,22.03083],[107.990021,21.542412],[107.414703,21.326107],[107.36998000000014,21.022221],[107.154427,20.924995000000152],[106.6438830000001,21.021385],[106.776932,20.69916200000013],[105.954163,19.92083000000015],[105.61387600000015,18.977219],[106.698868,17.399719],[108.830276,15.42083200000016],[109.466377,12.8933320000001],[109.145538,12.435555],[109.269989,11.892498],[109.17330900000016,12.120552],[109.021103,11.353331],[107.997742,10.699165],[107.26619000000014,10.376129],[106.999748,10.657166000000132],[106.961189,10.466075],[106.93219,10.567221000000103],[106.94329800000011,10.593609000000129],[106.904137,10.631386000000134],[106.744133,10.669998000000135],[106.770813,10.591108000000148],[106.73830400000011,10.560613000000117],[106.736359,10.513054],[106.591553,10.429691],[106.738571,10.469442],[106.79274,10.386944],[106.784698,10.277498],[106.424316,10.311384],[106.776367,10.079998],[106.290527,10.25083200000013],[106.618027,9.811388],[106.11718800000014,10.238331],[106.54303,9.583609],[105.820534,10.002499],[106.19412200000014,9.366941],[105.02110300000012,8.592775],[104.742752,8.604998000000151],[105.107468,9.945276],[104.445328,10.422739],[105.101913,10.955553],[106.203308,10.770554],[105.851067,11.659998],[106.458214,11.665863000000101],[106.420242,11.973608],[107.54749300000012,12.35360900000012],[107.489151,14.448608],[107.5466,14.708618],[107.695251,15.270832],[107.1755370000001,15.784164],[107.464706,16.078609000000128],[106.685532,16.45805],[106.561096,16.996941],[105.183319,18.334442],[105.193863,18.642494],[103.87943300000015,19.29361],[104.03724700000012,19.69294400000011],[104.640266,19.611942],[104.979156,20.004997],[104.3819270000001,20.444717],[104.6436,20.660275000000112],[104.109154,20.977219],[103.693588,20.657219],[103.170532,20.846664],[102.976089,21.739437],[102.676651,21.65583],[102.14074700000012,22.396286],[102.479713,22.773888],[103.030548,22.435551],[103.33638000000016,22.79638700000011],[103.964432,22.499111],[105.35386700000018,23.3347210000001],[105.577477,23.059162000000143]]]]}},{"type":"Feature","properties":{"name":"United States Virgin Islands","iso2":"VI","iso3":"VIR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-64.761948,17.774166],[-64.560287,17.748333],[-64.896118,17.67666600000014],[-64.761948,17.774166]]],[[[-64.665283,18.332222],[-64.79028299999987,18.33083],[-64.731949,18.371944],[-64.665283,18.332222]]],[[[-64.841675,18.312496],[-65.026947,18.36277800000012],[-64.9039,18.364719],[-64.841675,18.312496]]]]}},{"type":"Feature","properties":{"name":"Namibia","iso2":"NA","iso3":"NAM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[23.284721,-17.662502],[23.476109,-17.625835],[24.969997,-17.559723],[25.264431,-17.80225],[24.362499,-17.948612],[23.615578,-18.485069],[23.297108,-17.995949],[20.993286,-18.318417],[20.991943,-21.996948],[19.996666,-22.005001],[20.000942,-24.765408],[19.99612,-28.421448],[19.123055000000107,-28.962223],[18.175831,-28.908611],[17.40472,-28.713612],[17.06361,-28.028614],[16.48959,-28.578178],[15.294167,-27.322502],[14.463333,-24.109169],[14.511389,-22.55278],[11.804722,-18.081947],[11.752783000000107,-17.254833],[13.16055500000013,-16.952778],[13.993219,-17.423946],[18.451538,-17.389835],[18.915833000000134,-17.815556],[20.854164,-18.016392],[23.284721,-17.662502]]]]}},{"type":"Feature","properties":{"name":"Wallis and Futuna Islands","iso2":"WF","iso3":"WLF"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-178.042511,-14.319447],[-178.140564,-14.316389],[-178.189453,-14.236113],[-178.042511,-14.319447]]],[[[-176.161438,-13.352777],[-176.156158,-13.213614],[-176.121094,-13.263334],[-176.161438,-13.352777]]]]}},{"type":"Feature","properties":{"name":"Samoa","iso2":"WS","iso3":"WSM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-171.429749,-14.019724],[-172.064758,-13.874443],[-171.822266,-13.807503],[-171.429749,-14.019724]]],[[[-172.285858,-13.486387],[-172.214172,-13.807777],[-172.780609,-13.533335],[-172.285858,-13.486387]]]]}},{"type":"Feature","properties":{"name":"Swaziland","iso2":"SZ","iso3":"SWZ"},"geometry":{"type":"MultiPolygon","coordinates":[[[[30.902048,-26.305254],[31.33083,-25.751392],[31.96851,-25.95784],[32.1334,-26.839626],[31.987499,-27.316113],[31.161663,-27.203056],[30.818886000000106,-26.810558],[30.902048,-26.305254]]]]}},{"type":"Feature","properties":{"name":"Yemen","iso2":"YE","iso3":"YEM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[53.340828,12.108889],[53.25666,12.124998000000119],[53.291664,12.134443],[53.340828,12.108889]]],[[[53.085831,12.13361],[53.011383,12.158609],[53.09610700000016,12.175554],[53.085831,12.13361]]],[[[52.234161,12.201111],[52.395828,12.155277],[52.083054,12.222776],[52.234161,12.201111]]],[[[43.438606,12.631109],[43.396111000000104,12.666388],[43.443886000000106,12.659443],[43.438606,12.631109]]],[[[53.774719,12.616388000000114],[54.476944000000145,12.557777],[53.753609,12.308054000000126],[53.325829,12.545832000000104],[53.774719,12.616388000000114]]],[[[42.755829000000205,13.69861],[42.677216,13.666111],[42.793884,13.781111],[42.755829000000205,13.69861]]],[[[42.78749800000011,13.91],[42.689163,14.01361100000014],[42.766388,14.066944000000106],[42.78749800000011,13.91]]],[[[42.594719,15.271944000000147],[42.568886,15.3925],[42.642494,15.458332],[42.594719,15.271944000000147]]],[[[52.23194100000015,15.674166],[49.098885,14.519165],[48.69805100000022,14.039999],[45.666664,13.341665],[45.055443,12.751296],[43.957222,12.592777],[43.46721600000015,12.677776],[43.247498000000206,13.210278000000145],[42.681107,15.208332],[42.78968,16.377502],[43.206108,16.672222],[43.309441,17.4572220000001],[44.46749900000012,17.41194200000014],[46.333328,16.666664],[46.333054,15.616943],[48.766388,18.266388000000106],[51.99929,18.999344000000136],[53.114441,16.642778],[52.29888200000019,16.27222100000013],[52.23194100000015,15.674166]]]]}},{"type":"Feature","properties":{"name":"Zambia","iso2":"ZM","iso3":"ZMB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[24.969997,-17.559723],[23.476109,-17.625835],[22.000149000000135,-16.171661],[21.998333,-13.004168],[24.020554,-13.00639],[23.986206,-10.870461],[24.44833,-11.463612],[25.332222000000115,-11.193335],[25.35972200000012,-11.641668],[26.004719,-11.9025],[26.86861,-11.973612],[27.199249,-11.567905],[27.66000000000011,-12.296667],[28.441944,-12.519724],[29.015831,-13.397779],[29.589443,-13.221945],[29.801388,-13.454168],[29.80505,-12.155247],[29.49361,-12.458057],[29.031387,-12.383057],[28.363331,-11.550835],[28.699718000000104,-10.653334],[28.372219,-9.260834],[28.901665,-8.478613],[30.77124000000012,-8.192247],[31.041111,-8.590279],[32.940399,-9.405077],[33.702278,-10.561857],[33.250549,-10.886667],[33.273331,-12.144445],[33.54583,-12.359446],[33.046387,-12.603889],[32.678886,-13.60639],[33.222229,-14.012566],[30.21301700000018,-14.981716],[30.415756,-15.631872],[28.927219,-15.972223],[28.759441,-16.552223],[27.825275,-16.959167],[27.038055,-17.959446],[25.264431,-17.80225],[24.969997,-17.559723]]]]}},{"type":"Feature","properties":{"name":"Zimbabwe","iso2":"ZW","iso3":"ZWE"},"geometry":{"type":"MultiPolygon","coordinates":[[[[32.987808,-17.265003],[33.073051000000106,-18.348892],[32.699165,-18.944447],[33.0188830000001,-19.943336],[32.50222000000011,-20.598614],[32.488876,-21.344448],[31.297504000000146,-22.414764],[29.893887,-22.194447],[29.373623,-22.19241],[29.060555,-21.798058],[28.015831,-21.566113],[27.713165,-20.506432],[27.287453,-20.494965],[27.219997,-20.091667],[26.166111,-19.527779],[25.264431,-17.80225],[27.038055,-17.959446],[27.825275,-16.959167],[28.759441,-16.552223],[28.927219,-15.972223],[30.415756,-15.631872],[30.422775,-16.009167],[31.276665,-16.018612],[32.98114,-16.709053],[32.987808,-17.265003]]]]}},{"type":"Feature","properties":{"name":"Indonesia","iso2":"ID","iso3":"IDN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.85999488830566,-10.61027717590332],[121.6908130645752,-10.566389083862305],[121.99693489074707,-10.441110610961914],[121.85999488830566,-10.61027717590332]]],[[[123.21470832824707,-10.81222152709961],[122.80774879455566,-10.794723510742188],[123.39026832580566,-10.436944961547852],[123.21470832824707,-10.81222152709961]]],[[[123.40054512023926,-10.342777252197266],[123.30859565734863,-10.276666641235352],[123.45332527160645,-10.13972282409668],[123.40054512023926,-10.342777252197266]]],[[[120.02916145324707,-9.383333206176758],[120.81025886535645,-9.979166030883789],[120.72442817687988,-10.199722290039062],[120.16470527648926,-10.231388092041016],[118.93109321594238,-9.561111450195312],[120.02916145324707,-9.383333206176758]]],[[[125.16404914855957,-9.066141128540039],[125.12798881530762,-9.435955047607422],[124.43525886535645,-10.162778854370117],[123.48831367492676,-10.316389083862305],[124.04616355895996,-9.33997917175293],[124.34309577941895,-9.46337890625],[124.44572639465332,-9.18480110168457],[124.94544792175293,-8.954038619995117],[125.16404914855957,-9.066141128540039]]],[[[115.59471321105957,-8.804166793823242],[115.46999549865723,-8.734443664550781],[115.51249885559082,-8.670000076293945],[115.59471321105957,-8.804166793823242]]],[[[119.69053840637207,-8.802778244018555],[119.60748481750488,-8.773611068725586],[119.63305854797363,-8.60079574584961],[119.69053840637207,-8.802778244018555]]],[[[122.96943855285645,-8.572500228881836],[122.98803901672363,-8.456666946411133],[123.17775917053223,-8.442222595214844],[122.96943855285645,-8.572500228881836]]],[[[119.46164894104004,-8.440277099609375],[119.58554267883301,-8.563055038452148],[119.44719886779785,-8.754167556762695],[119.46164894104004,-8.440277099609375]]],[[[113.38889503479004,-8.497220993041992],[113.29553413391113,-8.500556945800781],[113.28581428527832,-8.440000534057617],[113.38889503479004,-8.497220993041992]]],[[[124.2905445098877,-8.329166412353516],[124.11525917053223,-8.55555534362793],[123.90693855285645,-8.452499389648438],[124.2905445098877,-8.329166412353516]]],[[[123.76442909240723,-8.32722282409668],[123.21748542785645,-8.536666870117188],[123.93914985656738,-8.242498397827148],[123.76442909240723,-8.32722282409668]]],[[[123.28109931945801,-8.405834197998047],[123.01609992980957,-8.378055572509766],[123.22083473205566,-8.233610153198242],[123.28109931945801,-8.405834197998047]]],[[[128.21997261047363,-8.210556030273438],[128.20831489562988,-8.287221908569336],[128.07995796203613,-8.259445190429688],[128.21997261047363,-8.210556030273438]]],[[[116.54915046691895,-8.775001525878906],[115.84414863586426,-8.755279541015625],[116.38749885559082,-8.204999923706055],[116.73581123352051,-8.363054275512695],[116.54915046691895,-8.775001525878906]]],[[[127.66832160949707,-8.244443893432617],[127.60582160949707,-8.20694351196289],[127.77110481262207,-8.188888549804688],[127.66832160949707,-8.244443893432617]]],[[[129.0080280303955,-8.269445419311523],[128.82831001281738,-8.198888778686523],[128.9696979522705,-8.183889389038086],[129.0080280303955,-8.269445419311523]]],[[[117.54081916809082,-8.390277862548828],[117.48137092590332,-8.191389083862305],[117.67581367492676,-8.156110763549805],[117.54081916809082,-8.390277862548828]]],[[[138.87356758117676,-8.414722442626953],[138.54471015930176,-8.333053588867188],[138.81414985656738,-8.154722213745117],[138.87356758117676,-8.414722442626953]]],[[[118.31192207336426,-8.37472152709961],[118.6483325958252,-8.294445037841797],[118.66609382629395,-8.552223205566406],[118.99693489074707,-8.31361198425293],[119.17804145812988,-8.720277786254883],[118.45720863342285,-8.871944427490234],[118.40637397766113,-8.584722518920898],[118.15498542785645,-8.871944427490234],[116.75139045715332,-9.009445190429688],[117.12275886535645,-8.378610610961914],[117.96637916564941,-8.74860954284668],[118.2844181060791,-8.594165802001953],[117.73552894592285,-8.152223587036133],[118.31192207336426,-8.37472152709961]]],[[[122.98108863830566,-8.149444580078125],[122.83249092102051,-8.601663589477539],[121.76555061340332,-8.892223358154297],[119.79623603820801,-8.720342636108398],[120.52249336242676,-8.257223129272461],[122.28830909729004,-8.644445419311523],[122.98108863830566,-8.149444580078125]]],[[[124.57776832580566,-8.135833740234375],[125.13971138000488,-8.329166412353516],[124.35080909729004,-8.454444885253906],[124.57776832580566,-8.135833740234375]]],[[[125.58167457580566,-8.317499160766602],[125.49609565734863,-8.269445419311523],[125.6413745880127,-8.135833740234375],[125.58167457580566,-8.317499160766602]]],[[[119.07248878479004,-8.267499923706055],[119.07859992980957,-8.133890151977539],[119.13693428039551,-8.195554733276367],[119.07248878479004,-8.267499923706055]]],[[[115.5022144317627,-8.178611755371094],[115.70776557922363,-8.40916633605957],[115.12608528137207,-8.854166030883789],[114.44553565979004,-8.104721069335938],[115.5022144317627,-8.178611755371094]]],[[[127.84359931945801,-8.101110458374023],[128.12744331359863,-8.171667098999023],[128.02527046203613,-8.267499923706055],[127.84359931945801,-8.101110458374023]]],[[[130.80414009094238,-8.352222442626953],[131.013032913208,-8.0897216796875],[131.180269241333,-8.129720687866211],[130.80414009094238,-8.352222442626953]]],[[[127.2138843536377,-8.113332748413086],[127.15305519104004,-8.099166870117188],[127.18166542053223,-8.02194595336914],[127.2138843536377,-8.113332748413086]]],[[[129.76443672180176,-8.061111450195312],[129.6069049835205,-7.803888320922852],[129.84329414367676,-7.840555191040039],[129.76443672180176,-8.061111450195312]]],[[[126.72136878967285,-7.673055648803711],[125.77221870422363,-8.008890151977539],[125.97221565246582,-7.658611297607422],[126.72136878967285,-7.673055648803711]]],[[[130.98913764953613,-7.723333358764648],[130.98413276672363,-7.664165496826172],[131.12884712219238,-7.626665115356445],[130.98913764953613,-7.723333358764648]]],[[[127.38109016418457,-7.658611297607422],[127.36804389953613,-7.513889312744141],[127.48193550109863,-7.528888702392578],[127.38109016418457,-7.658611297607422]]],[[[138.96829414367676,-7.556110382080078],[138.44470405578613,-8.383333206176758],[137.63525581359863,-8.430000305175781],[138.15469551086426,-7.513889312744141],[138.96829414367676,-7.556110382080078]]],[[[130.8649616241455,-7.494165420532227],[130.98358345031738,-7.520833969116211],[130.84442329406738,-7.547222137451172],[130.8649616241455,-7.494165420532227]]],[[[131.07275581359863,-7.511388778686523],[131.00332832336426,-7.424999237060547],[131.1774616241455,-7.408611297607422],[131.07275581359863,-7.511388778686523]]],[[[121.77858924865723,-7.424444198608398],[121.76193428039551,-7.359165191650391],[121.83055305480957,-7.342777252197266],[121.77858924865723,-7.424444198608398]]],[[[121.10832405090332,-7.394443511962891],[121.09332466125488,-7.304721832275391],[121.16858863830566,-7.352222442626953],[121.10832405090332,-7.394443511962891]]],[[[131.27276802062988,-7.372776031494141],[131.216646194458,-7.359165191650391],[131.263032913208,-7.300554275512695],[131.27276802062988,-7.372776031494141]]],[[[120.93137550354004,-7.283611297607422],[121.06360054016113,-7.304721832275391],[120.78970527648926,-7.277500152587891],[120.93137550354004,-7.283611297607422]]],[[[131.73608589172363,-7.214166641235352],[131.10968208312988,-8.000833511352539],[131.24328804016113,-7.479999542236328],[131.73608589172363,-7.214166641235352]]],[[[131.92718696594238,-7.106943130493164],[131.968843460083,-7.254444122314453],[131.72857856750488,-7.158611297607422],[131.92718696594238,-7.106943130493164]]],[[[114.4024829864502,-7.181110382080078],[114.29332160949707,-7.082500457763672],[114.37024879455566,-7.066110610961914],[114.4024829864502,-7.181110382080078]]],[[[128.639986038208,-7.219165802001953],[128.5260944366455,-7.143611907958984],[128.61523628234863,-7.064722061157227],[128.639986038208,-7.219165802001953]]],[[[120.74165534973145,-7.075555801391602],[120.66914558410645,-7.145553588867188],[120.63054084777832,-7.016387939453125],[120.74165534973145,-7.075555801391602]]],[[[113.99136543273926,-6.880277633666992],[113.50388526916504,-7.225276947021484],[112.6877613067627,-7.051111221313477],[113.99136543273926,-6.880277633666992]]],[[[115.2933292388916,-6.83879280090332],[115.57083320617676,-6.925832748413086],[115.29109382629395,-7.008333206176758],[115.2933292388916,-6.83879280090332]]],[[[138.690523147583,-6.761388778686523],[138.78665351867676,-6.84083366394043],[138.61108589172363,-6.736110687255859],[138.690523147583,-6.761388778686523]]],[[[131.59219551086426,-6.678888320922852],[131.62634468078613,-6.707500457763672],[131.53579902648926,-6.801387786865234],[131.59219551086426,-6.678888320922852]]],[[[134.66885566711426,-6.774166107177734],[134.62634468078613,-6.715555191040039],[134.69775581359863,-6.586387634277344],[134.66885566711426,-6.774166107177734]]],[[[105.19304084777832,-6.684444427490234],[105.11303901672363,-6.611665725708008],[105.25360298156738,-6.5272216796875],[105.19304084777832,-6.684444427490234]]],[[[134.68387031555176,-6.56110954284668],[134.6833209991455,-6.451665878295898],[134.746919631958,-6.523056030273438],[134.68387031555176,-6.56110954284668]]],[[[134.58609199523926,-6.391666412353516],[134.5422077178955,-6.535833358764648],[134.34552192687988,-6.356943130493164],[134.58609199523926,-6.391666412353516]]],[[[134.83191108703613,-6.471944808959961],[134.78802680969238,-6.393054962158203],[134.858003616333,-6.289443969726563],[134.83191108703613,-6.471944808959961]]],[[[134.34411811828613,-6.804166793823242],[134.06720161437988,-6.826665878295898],[134.1027545928955,-6.173055648803711],[134.51471138000488,-6.584999084472656],[134.34411811828613,-6.804166793823242]]],[[[134.15637397766113,-6.04749870300293],[134.40359687805176,-6.286109924316406],[134.133882522583,-6.154722213745117],[134.15637397766113,-6.04749870300293]]],[[[134.73135566711426,-6.036666870117188],[134.60302925109863,-6.370553970336914],[134.2680377960205,-6.117221832275391],[134.73135566711426,-6.036666870117188]]],[[[106.16330909729004,-6.014165878295898],[108.31109809875488,-6.260278701782227],[108.73442268371582,-6.814998626708984],[110.39082527160645,-6.979721069335938],[110.91998481750488,-6.409999847412109],[111.15277290344238,-6.69999885559082],[112.56025886535645,-6.912221908569336],[112.84554481506348,-7.599721908569336],[114.44832038879395,-7.800554275512695],[114.37164497375488,-8.521112442016602],[114.62109565734863,-8.746665954589844],[113.23275947570801,-8.281112670898438],[111.65109443664551,-8.362499237060547],[109.28970527648926,-7.699443817138672],[108.16304206848145,-7.783054351806641],[106.42331123352051,-7.371387481689453],[106.50943183898926,-6.979166030883789],[105.24331855773926,-6.810277938842773],[106.16330909729004,-6.014165878295898]]],[[[124.05832099914551,-6.0272216796875],[123.96582221984863,-5.948055267333984],[123.97664833068848,-5.875831604003906],[124.05832099914551,-6.0272216796875]]],[[[120.48193550109863,-6.483610153198242],[120.47998237609863,-5.766666412353516],[120.56137275695801,-6.024444580078125],[120.48193550109863,-6.483610153198242]]],[[[104.83611488342285,-5.828056335449219],[104.76888465881348,-5.747777938842773],[104.84832954406738,-5.774999618530273],[104.83611488342285,-5.828056335449219]]],[[[112.69275093078613,-5.852775573730469],[112.58777046203613,-5.843889236450195],[112.63498878479004,-5.739442825317383],[112.69275093078613,-5.852775573730469]]],[[[132.74133491516113,-5.950277328491211],[132.69330024719238,-5.59638786315918],[132.8083209991455,-5.806943893432617],[132.74133491516113,-5.950277328491211]]],[[[132.79553413391113,-5.68638801574707],[132.73855781555176,-5.639165878295898],[132.781099319458,-5.532777786254883],[132.79553413391113,-5.68638801574707]]],[[[132.34051704406738,-5.57722282409668],[132.30191230773926,-5.517221450805664],[132.37661933898926,-5.538331985473633],[132.34051704406738,-5.57722282409668]]],[[[123.8108081817627,-5.599166870117188],[123.68831062316895,-5.472221374511719],[123.80275917053223,-5.533611297607422],[123.8108081817627,-5.599166870117188]]],[[[134.57718086242676,-5.430000305175781],[134.73135566711426,-5.974721908569336],[134.30218696594238,-6.025833129882813],[134.20633125305176,-5.708053588867188],[134.57718086242676,-5.430000305175781]]],[[[102.38498878479004,-5.485832214355469],[102.10054206848145,-5.332500457763672],[102.38081550598145,-5.372499465942383],[102.38498878479004,-5.485832214355469]]],[[[132.84939765930176,-6.003334045410156],[133.16885566711426,-5.295555114746094],[133.111909866333,-5.591667175292969],[132.84939765930176,-6.003334045410156]]],[[[123.62581062316895,-5.376665115356445],[123.52110481262207,-5.251943588256836],[123.62719917297363,-5.282499313354492],[123.62581062316895,-5.376665115356445]]],[[[122.01693916320801,-5.474166870117188],[121.80859565734863,-5.272222518920898],[121.91330909729004,-5.058610916137695],[122.01693916320801,-5.474166870117188]]],[[[115.78249549865723,-4.831943511962891],[115.8530445098877,-4.747220993041992],[115.85247993469238,-4.785554885864258],[115.78249549865723,-4.831943511962891]]],[[[131.74218940734863,-4.768610000610352],[131.72162055969238,-4.691944122314453],[131.75442695617676,-4.723333358764648],[131.74218940734863,-4.768610000610352]]],[[[122.73776435852051,-4.651111602783203],[122.60555458068848,-5.420276641845703],[122.28499031066895,-5.385000228881836],[122.37109565734863,-4.759721755981445],[122.73776435852051,-4.651111602783203]]],[[[129.934419631958,-4.566387176513672],[129.85913276672363,-4.556665420532227],[129.938570022583,-4.507499694824219],[129.934419631958,-4.566387176513672]]],[[[129.87466621398926,-4.530832290649414],[129.86108589172363,-4.521389007568359],[129.87967109680176,-4.505556106567383],[129.87466621398926,-4.530832290649414]]],[[[123.21277046203613,-4.697498321533203],[122.97971534729004,-5.107221603393555],[123.21555519104004,-5.29749870300293],[122.6513843536377,-5.68638801574707],[122.90358924865723,-4.48499870300293],[123.21277046203613,-4.697498321533203]]],[[[131.670259475708,-4.536943435668945],[131.61050605773926,-4.428333282470703],[131.672212600708,-4.487220764160156],[131.670259475708,-4.536943435668945]]],[[[133.57525825500488,-4.251943588256836],[133.61551094055176,-4.300554275512695],[133.31414985656738,-4.10444450378418],[133.57525825500488,-4.251943588256836]]],[[[131.3427448272705,-4.117498397827148],[131.3044147491455,-4.124164581298828],[131.27276802062988,-4.073610305786133],[131.3427448272705,-4.117498397827148]]],[[[123.08859443664551,-4.008888244628906],[123.15387153625488,-4.241666793823242],[122.95776557922363,-4.100276947021484],[123.08859443664551,-4.008888244628906]]],[[[101.0344181060791,-4.025833129882813],[101.0274829864502,-4.005277633666992],[101.0486011505127,-3.994998931884766],[101.0344181060791,-4.025833129882813]]],[[[131.24469184875488,-4.045555114746094],[131.2096881866455,-3.983331680297852],[131.24469184875488,-4.001943588256836],[131.24469184875488,-4.045555114746094]]],[[[131.43579292297363,-4.076389312744141],[131.37884712219238,-3.960832595825195],[131.41943550109863,-3.960277557373047],[131.43579292297363,-4.076389312744141]]],[[[134.15970039367676,-3.934999465942383],[134.19940376281738,-3.991109848022461],[134.07275581359863,-3.934165954589844],[134.15970039367676,-3.934999465942383]]],[[[127.22831916809082,-3.904167175292969],[127.14888191223145,-3.830278396606445],[127.23387336730957,-3.827499389648438],[127.22831916809082,-3.904167175292969]]],[[[128.779146194458,-3.703887939453125],[128.74829292297363,-3.643054962158203],[128.79080390930176,-3.638889312744141],[128.779146194458,-3.703887939453125]]],[[[123.12552833557129,-3.626667022705078],[123.05774879455566,-3.578056335449219],[123.14777565002441,-3.543054580688477],[123.12552833557129,-3.626667022705078]]],[[[128.40277290344238,-3.640832901000977],[128.43109321594238,-3.522499084472656],[128.56329536437988,-3.576665878295898],[128.40277290344238,-3.640832901000977]]],[[[122.35193061828613,-3.560832977294922],[122.27998542785645,-3.572500228881836],[122.32053565979004,-3.514919281005859],[122.35193061828613,-3.560832977294922]]],[[[128.33496284484863,-3.625831604003906],[127.91832160949707,-3.740833282470703],[128.27331733703613,-3.512222290039063],[128.33496284484863,-3.625831604003906]]],[[[128.66470527648926,-3.538331985473633],[128.720796585083,-3.619165420532227],[128.55496406555176,-3.509721755981445],[128.66470527648926,-3.538331985473633]]],[[[132.7035846710205,-3.5191650390625],[132.62329292297363,-3.421388626098633],[132.67413520812988,-3.418609619140625],[132.7035846710205,-3.5191650390625]]],[[[122.44525337219238,-3.490554809570313],[122.41304206848145,-3.384445190429688],[122.4719181060791,-3.456943511962891],[122.44525337219238,-3.490554809570313]]],[[[116.38275337219238,-3.645553588867188],[116.31694221496582,-3.537500381469727],[116.41693305969238,-3.377498626708984],[116.38275337219238,-3.645553588867188]]],[[[127.63275337219238,-3.365278244018555],[127.48108863830566,-3.293333053588867],[127.5697193145752,-3.263889312744141],[127.63275337219238,-3.365278244018555]]],[[[116.11831855773926,-4.036109924316406],[116.00861549377441,-3.649166107177734],[116.26776313781738,-3.223054885864258],[116.11831855773926,-4.036109924316406]]],[[[127.77026557922363,-3.254444122314453],[127.63611030578613,-3.225831985473633],[127.75943183898926,-3.153055191040039],[127.77026557922363,-3.254444122314453]]],[[[100.5244312286377,-3.186166763305664],[100.49080848693848,-3.162776947021484],[100.50055122375488,-3.127222061157227],[100.5244312286377,-3.186166763305664]]],[[[126.99387550354004,-3.145000457763672],[127.23665046691895,-3.617500305175781],[126.7008228302002,-3.834444046020508],[126.01748847961426,-3.35444450378418],[126.1030445098877,-3.100555419921875],[126.99387550354004,-3.145000457763672]]],[[[127.88472175598145,-3.038331985473633],[127.82054328918457,-3.021665573120117],[127.99165534973145,-2.930000305175781],[127.88472175598145,-3.038331985473633]]],[[[106.88916206359863,-3.024444580078125],[106.72136878967285,-2.966388702392578],[106.81247901916504,-2.893054962158203],[106.88916206359863,-3.024444580078125]]],[[[129.8124713897705,-2.919721603393555],[130.58413887023926,-3.133333206176758],[130.82995796203613,-3.872776031494141],[129.89749336242676,-3.335832595825195],[128.87829780578613,-3.20777702331543],[128.46246528625488,-3.458332061767578],[128.17386054992676,-3.068887710571289],[127.90609931945801,-3.537500381469727],[128.17386054992676,-2.855554580688477],[129.8124713897705,-2.919721603393555]]],[[[107.42720222473145,-2.938888549804688],[107.36136817932129,-2.871110916137695],[107.48137092590332,-2.823333740234375],[107.42720222473145,-2.938888549804688]]],[[[107.07971382141113,-2.911664962768555],[107.03720283508301,-2.864999771118164],[107.0727710723877,-2.819999694824219],[107.07971382141113,-2.911664962768555]]],[[[100.46277046203613,-3.133333206176758],[100.45942878723145,-3.333889007568359],[100.17637825012207,-2.799999237060547],[100.46277046203613,-3.133333206176758]]],[[[131.579683303833,-2.656389236450195],[131.56524848937988,-2.651666641235352],[131.65442085266113,-2.621389389038086],[131.579683303833,-2.656389236450195]]],[[[107.83276557922363,-2.534999847412109],[108.26582527160645,-2.755556106567383],[108.07332038879395,-3.23527717590332],[107.60942268371582,-3.211387634277344],[107.83276557922363,-2.534999847412109]]],[[[100.03109931945801,-2.841943740844727],[99.9871997833252,-2.489166259765625],[100.21415901184082,-2.718610763549805],[100.03109931945801,-2.841943740844727]]],[[[133.59497261047363,-2.525554656982422],[133.499116897583,-2.425556182861328],[133.61441230773926,-2.477499008178711],[133.59497261047363,-2.525554656982422]]],[[[99.74109077453613,-2.376388549804688],[99.70359992980957,-2.342777252197266],[99.7371997833252,-2.350276947021484],[99.74109077453613,-2.376388549804688]]],[[[134.567476272583,-2.453054428100586],[134.51666450500488,-2.396944046020508],[134.56884956359863,-2.292778015136719],[134.567476272583,-2.453054428100586]]],[[[123.16693305969238,-2.19416618347168],[123.15165901184082,-2.19416618347168],[123.16805458068848,-2.176387786865234],[123.16693305969238,-2.19416618347168]]],[[[123.44978523254395,-2.125568389892578],[123.43802833557129,-2.11138916015625],[123.45610237121582,-2.115554809570313],[123.44978523254395,-2.125568389892578]]],[[[99.85971260070801,-2.370832443237305],[99.56999397277832,-2.222221374511719],[99.56860542297363,-2.029167175292969],[99.85971260070801,-2.370832443237305]]],[[[123.88553810119629,-2.075555801391602],[123.84443855285645,-2.053888320922852],[123.86499214172363,-2.008609771728516],[123.88553810119629,-2.075555801391602]]],[[[134.36883735656738,-2.158054351806641],[134.325532913208,-2.08860969543457],[134.38580513000488,-2.003889083862305],[134.36883735656738,-2.158054351806641]]],[[[123.76776313781738,-2.04749870300293],[123.75833320617676,-2.02027702331543],[123.7774829864502,-1.998332977294922],[123.76776313781738,-2.04749870300293]]],[[[126.05664253234863,-2.482500076293945],[125.89470863342285,-2.213333129882813],[125.91805458068848,-1.972221374511719],[126.05664253234863,-2.482500076293945]]],[[[124.36665534973145,-2.011388778686523],[124.30081367492676,-1.976943969726563],[124.35721015930176,-1.966110229492188],[124.36665534973145,-2.011388778686523]]],[[[123.4780445098877,-1.946109771728516],[123.46692848205566,-1.943611145019531],[123.48471260070801,-1.935277938842773],[123.4780445098877,-1.946109771728516]]],[[[123.54498481750488,-1.927778244018555],[123.5355396270752,-1.924999237060547],[123.54305458068848,-1.913331985473633],[123.54498481750488,-1.927778244018555]]],[[[123.6594181060791,-1.963333129882813],[123.6513843536377,-1.953887939453125],[123.65416145324707,-1.901666641235352],[123.6594181060791,-1.963333129882813]]],[[[123.71692848205566,-1.955833435058594],[123.70054817199707,-1.936666488647461],[123.73221015930176,-1.899721145629883],[123.71692848205566,-1.955833435058594]]],[[[123.69109535217285,-1.914167404174805],[123.67249488830566,-1.899721145629883],[123.67249488830566,-1.884721755981445],[123.69109535217285,-1.914167404174805]]],[[[123.8288745880127,-2.010555267333984],[123.78276252746582,-1.878610610961914],[123.85550880432129,-1.954446792602539],[123.8288745880127,-2.010555267333984]]],[[[123.76500129699707,-1.877222061157227],[123.75749397277832,-1.873611450195313],[123.76721382141113,-1.862777709960938],[123.76500129699707,-1.877222061157227]]],[[[123.38690376281738,-1.883857727050781],[123.36693000793457,-1.875831604003906],[123.36831855773926,-1.856388092041016],[123.38690376281738,-1.883857727050781]]],[[[125.43831062316895,-1.806667327880859],[126.34915351867676,-1.823055267333984],[125.46666145324707,-1.939998626708984],[125.43831062316895,-1.806667327880859]]],[[[99.28610420227051,-1.826389312744141],[99.25193977355957,-1.820833206176758],[99.26915168762207,-1.789999008178711],[99.28610420227051,-1.826389312744141]]],[[[123.07916450500488,-1.906389236450195],[123.12082099914551,-1.754444122314453],[123.15416145324707,-1.832500457763672],[123.07916450500488,-1.906389236450195]]],[[[134.17608833312988,-1.944999694824219],[134.16052436828613,-1.845556259155273],[134.2338581085205,-1.740833282470703],[134.17608833312988,-1.944999694824219]]],[[[125.00665473937988,-1.718889236450195],[125.32332038879395,-1.887222290039063],[124.32747840881348,-1.879720687866211],[125.00665473937988,-1.718889236450195]]],[[[108.69693183898926,-1.723054885864258],[108.68193244934082,-1.699722290039063],[108.77971076965332,-1.704442977905273],[108.69693183898926,-1.723054885864258]]],[[[130.188570022583,-2.064167022705078],[129.7157917022705,-1.885831832885742],[130.3505573272705,-1.680204391479492],[130.188570022583,-2.064167022705078]]],[[[123.29776191711426,-1.791389465332031],[123.26748847961426,-1.766944885253906],[123.36971473693848,-1.673053741455078],[123.29776191711426,-1.791389465332031]]],[[[136.29358100891113,-1.688610076904297],[136.902193069458,-1.799165725708008],[135.41803169250488,-1.60999870300293],[136.29358100891113,-1.688610076904297]]],[[[108.84915351867676,-1.670831680297852],[108.79971504211426,-1.568056106567383],[108.93054389953613,-1.544166564941406],[108.84915351867676,-1.670831680297852]]],[[[106.09082221984863,-1.771665573120117],[106.31833076477051,-2.435832977294922],[106.78166389465332,-2.591943740844727],[106.60193061828613,-2.913055419921875],[106.71776008605957,-3.098333358764648],[105.97831916809082,-2.822776794433594],[105.74471473693848,-2.129165649414063],[105.13220405578613,-2.067499160766602],[105.57361030578613,-1.529167175292969],[106.09082221984863,-1.771665573120117]]],[[[135.13830757141113,-1.48527717590332],[135.33081245422363,-1.492776870727539],[135.09442329406738,-1.512777328491211],[135.13830757141113,-1.48527717590332]]],[[[127.87943458557129,-1.426942825317383],[128.14526557922363,-1.68055534362793],[127.3783130645752,-1.633888244628906],[127.87943458557129,-1.426942825317383]]],[[[127.32832527160645,-1.439998626708984],[127.27277565002441,-1.413331985473633],[127.36665534973145,-1.366109848022461],[127.32832527160645,-1.439998626708984]]],[[[109.14499092102051,-1.316665649414063],[109.10471534729004,-1.289999008178711],[109.1718921661377,-1.257776260375977],[109.14499092102051,-1.316665649414063]]],[[[123.19497871398926,-1.29749870300293],[123.53137397766113,-1.434720993041992],[122.8611011505127,-1.581110000610352],[122.89749336242676,-1.186666488647461],[123.19497871398926,-1.29749870300293]]],[[[127.61470222473145,-1.257778167724609],[127.45583534240723,-1.234443664550781],[127.55053901672363,-1.171667098999023],[127.61470222473145,-1.257778167724609]]],[[[109.22859382629395,-1.233331680297852],[109.21971321105957,-1.192777633666992],[109.25804328918457,-1.169443130493164],[109.22859382629395,-1.233331680297852]]],[[[129.92886543273926,-1.211387634277344],[129.74051094055176,-1.208610534667969],[129.86664009094238,-1.142778396606445],[129.92886543273926,-1.211387634277344]]],[[[109.62378883361816,-0.984834671020508],[109.77887153625488,-1.13861083984375],[109.41858863830566,-1.263334274291992],[109.49247932434082,-0.979721069335938],[109.62378883361816,-0.984834671020508]]],[[[98.92915534973145,-0.950277328491211],[99.23887825012207,-1.78388786315918],[98.6030445098877,-1.223054885864258],[98.92915534973145,-0.950277328491211]]],[[[134.92248725891113,-1.138055801391602],[134.84301948547363,-0.941944122314453],[134.993013381958,-1.023611068725586],[134.92248725891113,-1.138055801391602]]],[[[130.9313678741455,-0.93638801574707],[130.96441841125488,-1.357221603393555],[130.6388874053955,-0.983888626098633],[130.9313678741455,-0.93638801574707]]],[[[130.91638374328613,-0.794721603393555],[130.3969440460205,-0.926387786865234],[130.48663520812988,-0.835277557373047],[130.91638374328613,-0.794721603393555]]],[[[135.48773384094238,-0.675556182861328],[136.38611030578613,-1.120832443237305],[135.89221382141113,-1.191389083862305],[135.48773384094238,-0.675556182861328]]],[[[127.28109931945801,-0.808332443237305],[127.15358924865723,-0.770000457763672],[127.20443916320801,-0.619167327880859],[127.28109931945801,-0.808332443237305]]],[[[98.5152759552002,-0.632221221923828],[98.4891529083252,-0.599443435668945],[98.50972175598145,-0.600831985473633],[98.5152759552002,-0.632221221923828]]],[[[130.60608100891113,-0.541110992431641],[130.45581245422363,-0.468610763549805],[130.660249710083,-0.426666259765625],[130.60608100891113,-0.541110992431641]]],[[[121.91330909729004,-0.475276947021484],[121.64333534240723,-0.548055648803711],[121.74136543273926,-0.418609619140625],[121.91330909729004,-0.475276947021484]]],[[[104.22831916809082,-0.417221069335938],[104.19748115539551,-0.395832061767578],[104.23166084289551,-0.391666412353516],[104.22831916809082,-0.417221069335938]]],[[[133.111909866333,-0.536388397216797],[134.11108589172363,-0.835277557373047],[134.15970039367676,-2.31944465637207],[134.466646194458,-2.864444732666016],[134.63611030578613,-2.513889312744141],[135.00415229797363,-3.341388702392578],[135.4919147491455,-3.358333587646484],[136.35663032531738,-2.253889083862305],[137.190523147583,-2.103054046630859],[137.1310749053955,-1.792778015136719],[137.85663032531738,-1.47166633605957],[141.00247383117676,-2.607084274291992],[141.00702095031738,-9.128467559814453],[139.98523139953613,-8.193611145019531],[140.146089553833,-7.884721755981445],[138.90860176086426,-8.296667098999023],[139.09552192687988,-7.564165115356445],[138.6611042022705,-7.203332901000977],[139.22247505187988,-7.162500381469727],[138.56192207336426,-6.90888786315918],[139.1894245147705,-6.969444274902344],[138.68191719055176,-6.720554351806641],[138.0644245147705,-5.406110763549805],[134.64358711242676,-4.121387481689453],[134.96551704406738,-3.939722061157227],[134.2157917022705,-3.963054656982422],[133.63748359680176,-3.491666793823242],[133.82885932922363,-2.961666107177734],[133.44970893859863,-3.871389389038086],[132.90164375305176,-4.091388702392578],[132.81802558898926,-3.303054809570313],[131.95581245422363,-2.783611297607422],[132.722749710083,-2.817222595214844],[133.238862991333,-2.416110992431641],[133.68414497375488,-2.716388702392578],[133.936372756958,-2.103054046630859],[132.301362991333,-2.269443511962891],[131.88244819641113,-1.642221450805664],[130.9635944366455,-1.403055191040039],[131.25555610656738,-0.822776794433594],[132.26971626281738,-0.384166717529297],[133.111909866333,-0.536388397216797]],[[133.61969184875488,-3.449443817138672],[133.62329292297363,-3.429473876953125],[133.61023139953613,-3.435832977294922],[133.61969184875488,-3.449443817138672]]],[[[104.49609565734863,-0.626943588256836],[104.28804206848145,-0.393888473510742],[104.53109931945801,-0.37388801574707],[104.49609565734863,-0.626943588256836]]],[[[122.01138496398926,-0.414443969726563],[121.85443305969238,-0.365833282470703],[122.04443550109863,-0.33277702331543],[122.01138496398926,-0.414443969726563]]],[[[127.57499885559082,-0.323331832885742],[127.81775856018066,-0.870832443237305],[127.30359077453613,-0.519166946411133],[127.57499885559082,-0.323331832885742]]],[[[104.44413948059082,-0.32611083984375],[104.4024829864502,-0.285554885864258],[104.48803901672363,-0.278055191040039],[104.44413948059082,-0.32611083984375]]],[[[122.08333015441895,-0.4102783203125],[122.0869312286377,-0.265556335449219],[122.14026832580566,-0.382221221923828],[122.08333015441895,-0.4102783203125]]],[[[127.18303871154785,-0.528888702392578],[127.10498237609863,-0.297222137451172],[127.23387336730957,-0.256111145019531],[127.18303871154785,-0.528888702392578]]],[[[98.50166511535645,-0.539722442626953],[98.32609748840332,-0.539722442626953],[98.43026924133301,-0.246389389038086],[98.50166511535645,-0.539722442626953]]],[[[103.61914253234863,-0.389720916748047],[103.45471382141113,-0.362220764160156],[103.53333473205566,-0.234167098999023],[103.75972175598145,-0.312221527099609],[103.61914253234863,-0.389720916748047]]],[[[122.36360359191895,-0.28416633605957],[122.22387886047363,-0.200555801391602],[122.32805061340332,-0.230833053588867],[122.36360359191895,-0.28416633605957]]],[[[122.22580909729004,-0.278055191040039],[122.14026832580566,-0.229442596435547],[122.18887519836426,-0.197221755981445],[122.22580909729004,-0.278055191040039]]],[[[103.55330848693848,-0.196388244628906],[103.50139045715332,-0.194999694824219],[103.53465461730957,-0.184232711791992],[103.55330848693848,-0.196388244628906]]],[[[104.7402515411377,-0.136943817138672],[104.92943000793457,-0.334165573120117],[104.43248176574707,-0.201944351196289],[104.7402515411377,-0.136943817138672]]],[[[121.61387825012207,-0.206666946411133],[121.56247901916504,-0.156665802001953],[121.63192939758301,-0.123056411743164],[121.61387825012207,-0.206666946411133]]],[[[97.87664985656738,-0.105278015136719],[97.82388496398926,-0.067777633666992],[97.86693000793457,-0.064167022705078],[97.87664985656738,-0.105278015136719]]],[[[104.87663459777832,-0.065555572509766],[104.83191871643066,-0.060832977294922],[104.84219551086426,-0.024442672729492],[104.87663459777832,-0.065555572509766]]],[[[130.87744331359863,-0.019166946411133],[131.25555610656738,-0.387777328491211],[130.68829536437988,-0.079442977905273],[130.91580390930176,-0.40888786315918],[130.21328926086426,-0.206666946411133],[130.87744331359863,-0.019166946411133]],[[130.66971015930176,-0.328887939453125],[130.66638374328613,-0.315832138061523],[130.662202835083,-0.325277328491211],[130.66971015930176,-0.328887939453125]]],[[[98.54748725891113,-0.370555877685547],[98.29193305969238,-0.012222290039063],[98.44413948059082,-0.06138801574707],[98.54748725891113,-0.370555877685547]]],[[[129.55468940734863,-0.21360969543457],[129.2883014678955,0.041391372680664],[129.54052925109863,-0.138889312744141],[129.55468940734863,-0.21360969543457]]],[[[127.45720863342285,-0.012222290039063],[127.39276313781738,0.00694465637207],[127.4105396270752,0.144166946411133],[127.45720863342285,-0.012222290039063]]],[[[98.83474922180176,0.107778549194336],[98.51335334777832,0.133058547973633],[98.76280403137207,0.171667098999023],[98.83474922180176,0.107778549194336]]],[[[104.48193550109863,0.023611068725586],[104.40721321105957,0.090002059936523],[104.40915107727051,0.171667098999023],[104.48193550109863,0.023611068725586]]],[[[104.70192909240723,0.023611068725586],[104.4913501739502,0.237222671508789],[104.54496955871582,0.22166633605957],[104.70192909240723,0.023611068725586]]],[[[104.41191291809082,0.29222297668457],[104.34276008605957,0.370832443237305],[104.42637825012207,0.323610305786133],[104.41191291809082,0.29222297668457]]],[[[127.3852710723877,0.270833969116211],[127.32776832580566,0.336668014526367],[127.38860511779785,0.378610610961914],[127.3852710723877,0.270833969116211]]],[[[103.07359504699707,0.57166862487793],[103.03801918029785,0.654722213745117],[103.06607246398926,0.646390914916992],[103.07359504699707,0.57166862487793]]],[[[104.28164863586426,0.623056411743164],[104.2371997833252,0.689443588256836],[104.28164863586426,0.665555953979492],[104.28164863586426,0.623056411743164]]],[[[103.48359870910645,0.616945266723633],[103.46555519104004,0.630556106567383],[103.51360511779785,0.699167251586914],[103.48359870910645,0.616945266723633]]],[[[103.18524360656738,0.508054733276367],[103.22302436828613,0.703332901000977],[103.29692268371582,0.553888320922852],[103.18524360656738,0.508054733276367]]],[[[127.40387153625488,0.619722366333008],[127.38388252258301,0.751943588256836],[127.44637489318848,0.712778091430664],[127.40387153625488,0.619722366333008]]],[[[104.29414558410645,0.706666946411133],[104.18997383117676,0.775278091430664],[104.27361488342285,0.791669845581055],[104.29414558410645,0.706666946411133]]],[[[104.59831428527832,0.758054733276367],[104.50859260559082,0.756113052368164],[104.55164527893066,0.795000076293945],[104.59831428527832,0.758054733276367]]],[[[103.0941333770752,0.72389030456543],[103.07718849182129,0.750555038452148],[103.1052417755127,0.79777717590332],[103.0941333770752,0.72389030456543]]],[[[103.7158145904541,0.792501449584961],[103.70414924621582,0.759443283081055],[103.66219520568848,0.832223892211914],[103.7158145904541,0.792501449584961]]],[[[127.32222175598145,0.750001907348633],[127.32415962219238,0.864168167114258],[127.37497901916504,0.812223434448242],[127.32222175598145,0.750001907348633]]],[[[103.52580451965332,0.80000114440918],[103.41913032531738,0.871110916137695],[103.48969459533691,0.845834732055664],[103.52580451965332,0.80000114440918]]],[[[103.93636512756348,0.766389846801758],[103.81997871398926,0.886110305786133],[103.88913917541504,0.859445571899414],[103.93636512756348,0.766389846801758]]],[[[103.83220100402832,0.756113052368164],[103.73413276672363,0.886945724487305],[103.81997871398926,0.825834274291992],[103.83220100402832,0.756113052368164]]],[[[103.43692207336426,0.647222518920898],[103.37996101379395,0.891668319702148],[103.50747871398926,0.746389389038086],[103.43692207336426,0.647222518920898]]],[[[103.47857856750488,0.86833381652832],[103.40524482727051,0.908891677856445],[103.46135902404785,0.915834426879883],[103.47857856750488,0.86833381652832]]],[[[104.24273872375488,0.819723129272461],[104.17553901672363,0.790834426879883],[104.09471321105957,0.947221755981445],[104.24273872375488,0.819723129272461]]],[[[102.62423133850098,0.994138717651367],[103.04135322570801,0.714166641235352],[102.40608406066895,0.878057479858398],[102.62423133850098,0.994138717651367]]],[[[103.93496894836426,0.926111221313477],[103.8369083404541,1.010278701782227],[103.93857002258301,0.999166488647461],[103.93496894836426,0.926111221313477]]],[[[104.84305000305176,0.957502365112305],[104.79358863830566,1.024721145629883],[104.83943367004395,1.018613815307617],[104.84305000305176,0.957502365112305]]],[[[107.55664253234863,0.96583366394043],[107.55053901672363,1.037778854370117],[107.59636878967285,1.008054733276367],[107.55664253234863,0.96583366394043]]],[[[103.03719520568848,1.037778854370117],[103.14692878723145,0.837499618530273],[102.65775489807129,1.054166793823242],[103.03719520568848,1.037778854370117]]],[[[120.67720222473145,1.035554885864258],[120.61638069152832,1.071943283081055],[120.63889503479004,1.076112747192383],[120.67720222473145,1.035554885864258]]],[[[120.38804817199707,1.020002365112305],[120.36609077453613,1.032224655151367],[120.38611030578613,1.080835342407227],[120.38804817199707,1.020002365112305]]],[[[104.66689491271973,1.023828506469727],[104.58331489562988,0.81916618347168],[104.23026466369629,1.084169387817383],[104.66689491271973,1.023828506469727]]],[[[103.43968391418457,0.98750114440918],[103.31970405578613,1.040277481079102],[103.34163856506348,1.119722366333008],[103.43968391418457,0.98750114440918]]],[[[104.03360176086426,0.982221603393555],[103.90136909484863,1.093889236450195],[104.11942481994629,1.183610916137695],[104.03360176086426,0.982221603393555]]],[[[102.39525032043457,0.923891067504883],[102.2130298614502,1.405000686645508],[102.4760684967041,1.226667404174805],[102.39525032043457,0.923891067504883]]],[[[97.52636909484863,1.41722297668457],[97.93635749816895,0.978055953979492],[97.81079292297363,0.549722671508789],[97.11468696594238,1.393335342407227],[97.52636909484863,1.41722297668457]]],[[[125.21499824523926,1.389165878295898],[125.16638374328613,1.395280838012695],[125.2994556427002,1.526079177856445],[125.21499824523926,1.389165878295898]]],[[[102.49608039855957,1.444723129272461],[102.49191474914551,1.259721755981445],[101.99442481994629,1.611112594604492],[102.49608039855957,1.444723129272461]]],[[[98.5997486114502,1.625555038452148],[98.42746162414551,1.678888320922852],[98.55505561828613,1.681665420532227],[98.5997486114502,1.625555038452148]]],[[[125.14166450500488,1.421388626098633],[124.24609565734863,0.375001907348633],[120.2422046661377,0.344999313354492],[120.06609535217285,-0.613054275512695],[120.66638374328613,-1.395553588867188],[121.08305549621582,-1.423610687255859],[121.6222095489502,-0.805000305175781],[121.92775917053223,-0.963333129882813],[123.07083320617676,-0.559720993041992],[123.4477481842041,-0.835277557373047],[123.33138465881348,-1.057222366333008],[122.81999397277832,-0.913331985473633],[121.67165565490723,-1.922222137451172],[121.29802894592285,-1.803054809570313],[122.47747993469238,-3.158054351806641],[122.19497871398926,-3.571109771728516],[122.89554023742676,-4.396389007568359],[122.10471534729004,-4.526111602783203],[122.0888843536377,-4.84083366394043],[121.55304145812988,-4.746665954589844],[121.61470222473145,-4.064722061157227],[120.8813648223877,-3.536945343017578],[121.07610511779785,-2.758888244628906],[120.77192878723145,-2.612499237060547],[120.20027351379395,-2.965000152587891],[120.46277046203613,-5.624164581298828],[119.46499824523926,-5.563610076904297],[119.50610542297363,-3.5272216796875],[118.92221260070801,-3.569721221923828],[118.75916481018066,-2.774166107177734],[119.35331916809082,-1.938888549804688],[119.51721382141113,-0.876388549804688],[119.71859931945801,-0.653610229492188],[119.86303901672363,-0.843889236450195],[119.62275886535645,-0.005277633666992],[119.83305549621582,-0.0897216796875],[120.03249549865723,0.712778091430664],[120.28720283508301,0.989721298217773],[120.57303810119629,0.775278091430664],[120.95054817199707,1.342500686645508],[123.83915901184082,0.829446792602539],[124.97110176086426,1.694723129272461],[125.14166450500488,1.421388626098633]]],[[[97.11718940734863,2.011110305786133],[97.09274482727051,2.11250114440918],[97.14831733703613,2.065832138061523],[97.11718940734863,2.011110305786133]]],[[[101.60164070129395,1.709165573120117],[101.39803504943848,1.989168167114258],[101.6455249786377,2.120000839233398],[101.60164070129395,1.709165573120117]]],[[[96.64108467102051,2.065832138061523],[96.61079597473145,2.121946334838867],[96.66913032531738,2.108888626098633],[96.64108467102051,2.065832138061523]]],[[[96.64053535461426,2.152776718139648],[96.59802436828613,2.191110610961914],[96.64859199523926,2.178888320922852],[96.64053535461426,2.152776718139648]]],[[[127.89499092102051,1.796667098999023],[127.79358863830566,0.795000076293945],[128.18829536437988,1.378057479858398],[128.72635078430176,1.556943893432617],[128.6974811553955,1.101945877075195],[128.21023750305176,0.784723281860352],[128.9052448272705,0.200277328491211],[127.87664985656738,0.310556411743164],[128.39526557922363,-0.894721984863281],[127.66609382629395,-0.225831985473633],[127.39499092102051,1.054723739624023],[128.05468940734863,2.195276260375977],[127.89499092102051,1.796667098999023]]],[[[97.32776069641113,2.032224655151367],[97.10357856750488,2.219999313354492],[97.28802680969238,2.22416877746582],[97.32776069641113,2.032224655151367]]],[[[127.79498481750488,2.205556869506836],[127.75665473937988,2.27055549621582],[127.81360054016113,2.261667251586914],[127.79498481750488,2.205556869506836]]],[[[118.57138252258301,2.316389083862305],[118.64972114562988,2.176668167114258],[118.56053352355957,2.264444351196289],[118.57138252258301,2.316389083862305]]],[[[125.43081855773926,2.313055038452148],[125.36775398254395,2.369165420532227],[125.4508228302002,2.379446029663086],[125.43081855773926,2.313055038452148]]],[[[128.1611042022705,2.282224655151367],[128.1191120147705,2.338335037231445],[128.16302680969238,2.404165267944336],[128.1611042022705,2.282224655151367]]],[[[109.06749153137207,2.485002517700195],[108.97318458557129,2.540163040161133],[109.10748481750488,2.530000686645508],[109.06749153137207,2.485002517700195]]],[[[128.4980182647705,2.05000114440918],[128.23217964172363,2.306112289428711],[128.56469917297363,2.632776260375977],[128.4980182647705,2.05000114440918]]],[[[125.40637397766113,2.626665115356445],[125.35471534729004,2.724443435668945],[125.41443061828613,2.807222366333008],[125.40637397766113,2.626665115356445]]],[[[106.24498176574707,2.736665725708008],[106.1977481842041,2.812223434448242],[106.24304389953613,2.78666877746582],[106.24498176574707,2.736665725708008]]],[[[96.43219184875488,2.343057632446289],[95.6969165802002,2.818891525268555],[95.8833179473877,2.918889999389648],[96.43219184875488,2.343057632446289]]],[[[108.83249092102051,2.844999313354492],[108.77361488342285,2.891389846801758],[108.88333320617676,3.001668930053711],[108.83249092102051,2.844999313354492]]],[[[107.75943183898926,2.97416877746582],[107.76555061340332,3.021665573120117],[107.81218910217285,3.00111198425293],[107.75943183898926,2.97416877746582]]],[[[105.7249927520752,2.833890914916992],[105.69832038879395,3.060556411743164],[105.84887886047363,2.979166030883789],[105.7249927520752,2.833890914916992]]],[[[106.28943061828613,3.159723281860352],[106.21277046203613,3.121389389038086],[106.20332527160645,3.226667404174805],[106.28943061828613,3.159723281860352]]],[[[117.52304267883301,3.285554885864258],[117.41137886047363,3.302778244018555],[117.4619312286377,3.343889236450195],[117.52304267883301,3.285554885864258]]],[[[106.28055000305176,3.230833053588867],[106.23471260070801,3.256113052368164],[106.2874927520752,3.373334884643555],[106.28055000305176,3.230833053588867]]],[[[117.66414833068848,3.28416633605957],[117.53943061828613,3.426668167114258],[117.67249488830566,3.419721603393555],[117.66414833068848,3.28416633605957]]],[[[117.60748481750488,3.47722053527832],[117.43332099914551,3.559167861938477],[117.58748817443848,3.524446487426758],[117.60748481750488,3.47722053527832]]],[[[117.39082527160645,3.561944961547852],[117.51748847961426,3.474443435668945],[117.21666145324707,3.545557022094727],[117.39082527160645,3.561944961547852]]],[[[117.88553810119629,3.456666946411133],[117.78970527648926,3.577779769897461],[117.86580848693848,3.548891067504883],[117.88553810119629,3.456666946411133]]],[[[125.88388252258301,3.362222671508789],[125.66359901428223,3.718332290649414],[125.91137886047363,3.491666793823242],[125.88388252258301,3.362222671508789]]],[[[117.82527351379395,3.740556716918945],[117.78830909729004,3.750001907348633],[117.81553840637207,3.755556106567383],[117.82527351379395,3.740556716918945]]],[[[126.84414863586426,3.738054275512695],[126.79221534729004,3.733335494995117],[126.73887825012207,3.842222213745117],[126.84414863586426,3.738054275512695]]],[[[117.84776496887207,3.797224044799805],[117.73082160949707,3.863611221313477],[117.80193519592285,3.855279922485352],[117.84776496887207,3.797224044799805]]],[[[126.71138191223145,3.798055648803711],[126.60803413391113,4.041109085083008],[126.72360420227051,3.91166877746582],[126.71138191223145,3.798055648803711]]],[[[117.68969917297363,3.97416877746582],[117.6463794708252,4.140279769897461],[117.75000190734863,4.068609237670898],[117.68969917297363,3.97416877746582]]],[[[117.88693428039551,4.026945114135742],[117.68692207336426,4.168336868286133],[117.72664833068848,4.169721603393555],[117.9035587310791,4.174043655395508],[117.88693428039551,4.026945114135742]]],[[[108.18166542053223,3.647500991821289],[108.18166542053223,4.196386337280273],[108.40693855285645,3.875833511352539],[108.18166542053223,3.647500991821289]]],[[[116.04942512512207,4.279443740844727],[117.5920581817627,4.169820785522461],[117.39276313781738,4.107500076293945],[117.82805061340332,3.70222282409668],[117.03027534484863,3.594167709350586],[117.44413948059082,3.43055534362793],[117.27304267883301,3.222776412963867],[118.09665107727051,2.30555534362793],[117.87191963195801,1.876668930053711],[119.00861549377441,0.980833053588867],[118.34387397766113,0.843057632446289],[117.89444160461426,1.119722366333008],[118.03499031066895,0.810277938842773],[117.46748542785645,0.103612899780273],[117.62248420715332,-0.779722213745117],[116.9236011505127,-1.254444122314453],[116.74331855773926,-1.024166107177734],[116.75554847717285,-1.367500305175781],[116.22249031066895,-1.779167175292969],[116.60415840148926,-2.229721069335938],[115.98387336730957,-3.588888168334961],[114.70665168762207,-4.176944732666016],[114.48108863830566,-3.498611450195313],[113.67109870910645,-3.476110458374023],[113.06469917297363,-2.993888854980469],[111.88942909240723,-3.573888778686523],[111.74971199035645,-2.741943359375],[111.55026435852051,-3.024444580078125],[110.23748970031738,-2.979442596435547],[109.90358924865723,-1.828332901000977],[110.05774879455566,-1.333889007568359],[109.72971534729004,-0.953611373901367],[109.27249336242676,-0.854999542236328],[109.51442909240723,-0.726943969726563],[109.12024879455566,-0.502222061157227],[108.84549140930176,0.810564041137695],[109.26500129699707,1.393335342407227],[108.98193550109863,1.211668014526367],[109.06694221496582,1.532224655151367],[109.64856910705566,2.073408126831055],[109.66998481750488,1.613054275512695],[110.55525398254395,0.853891372680664],[111.82721138000488,0.998613357543945],[112.47276496887207,1.568056106567383],[113.65833473205566,1.224721908569336],[114.5627613067627,1.433610916137695],[114.8047046661377,2.24888801574707],[115.2371997833252,2.522500991821289],[115.13971138000488,2.906110763549805],[115.49553108215332,3.040002822875977],[115.68525886535645,4.171945571899414],[116.04942512512207,4.279443740844727]],[[117.29553413391113,-0.878332138061523],[117.2885913848877,-0.831666946411133],[117.27221870422363,-0.876943588256836],[117.29553413391113,-0.878332138061523]]],[[[126.75972175598145,3.985834121704102],[126.74054145812988,4.54194450378418],[126.91609382629395,4.273611068725586],[126.75972175598145,3.985834121704102]]],[[[125.49136543273926,4.732778549194336],[125.47886848449707,4.734445571899414],[125.49193000793457,4.745553970336914],[125.49136543273926,4.732778549194336]]],[[[107.96443367004395,4.674722671508789],[107.93831062316895,4.701944351196289],[108.00470924377441,4.772222518920898],[107.96443367004395,4.674722671508789]]],[[[95.73857307434082,5.58527946472168],[96.34774971008301,5.222776412963867],[97.51886177062988,5.246667861938477],[98.2705249786377,4.142499923706055],[99.97775459289551,2.947500228881836],[100.00164985656738,2.601945877075195],[100.20913887023926,2.703332901000977],[100.94246101379395,1.820554733276367],[100.79720497131348,2.214445114135742],[101.05552864074707,2.28639030456543],[102.42191505432129,0.800554275512695],[102.93245887756348,0.695001602172852],[103.08191871643066,0.445554733276367],[102.53996467590332,0.166669845581055],[103.3510913848877,0.536111831665039],[103.73969459533691,0.281110763549805],[103.81419563293457,-0.001028060913086],[103.26970863342285,-0.258888244628906],[103.49080848693848,-0.216943740844727],[103.34236335754395,-0.364095687866211],[103.5999927520752,-0.441110610961914],[103.36081123352051,-0.702220916748047],[104.37915229797363,-1.041389465332031],[104.48943519592285,-1.924999237060547],[104.87943458557129,-2.146944046020508],[104.53249549865723,-2.772777557373047],[104.8621997833252,-2.289443969726563],[105.61248970031738,-2.394166946411133],[106.05525398254395,-3.031389236450195],[105.73248481750488,-5.89777946472168],[105.26860237121582,-5.44416618347168],[105.13971138000488,-5.796110153198242],[104.54498481750488,-5.506389617919922],[104.56077766418457,-5.929746627807617],[101.62692451477051,-3.246110916137695],[100.29358863830566,-0.806388854980469],[99.63582038879395,0.076944351196289],[99.1361255645752,0.261388778686523],[98.77086067199707,1.748613357543945],[97.75192451477051,2.269166946411133],[96.88025093078613,3.677499771118164],[95.53108406066895,4.682775497436523],[95.23080635070801,5.570833206176758],[95.73857307434082,5.58527946472168]],[[104.2138843536377,-1.039443969726563],[104.24331855773926,-1.023611068725586],[104.2008228302002,-1.037221908569336],[104.2138843536377,-1.039443969726563]],[[102.85970497131348,0.274446487426758],[102.92691230773926,0.322221755981445],[102.83386421203613,0.281110763549805],[102.85970497131348,0.274446487426758]]],[[[95.15802192687988,5.594724655151367],[95.10885810852051,5.61250114440918],[95.1424732208252,5.660833358764648],[95.15802192687988,5.594724655151367]]],[[[95.11969184875488,5.670278549194336],[95.00802803039551,5.73527717590332],[95.06358528137207,5.749444961547852],[95.11969184875488,5.670278549194336]]],[[[95.34247016906738,5.774168014526367],[95.21774482727051,5.913053512573242],[95.38163948059082,5.849721908569336],[95.34247016906738,5.774168014526367]]]]}},{"type":"Feature","properties":{"name":"Guadeloupe","iso2":"GP","iso3":"GLP"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-61.24556,15.871666],[-61.329445,15.92861],[-61.266945,16.014999],[-61.24556,15.871666]]],[[[-61.037224,16.311108],[-61.08667,16.29583],[-60.988617,16.346107000000146],[-61.037224,16.311108]]],[[[-61.346115,16.334164],[-61.695007,15.949165],[-61.783615,16.333054],[-61.346115,16.334164]]],[[[-62.811394,17.888332],[-62.869171,17.929722000000154],[-62.79084,17.912498],[-62.811394,17.888332]]]]}},{"type":"Feature","properties":{"name":"Netherlands Antilles","iso2":"AN","iso3":"ANT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.19528198242188,12.221109390258789],[-68.25111389160156,12.02055549621582],[-68.41612243652344,12.25694465637207],[-68.19528198242188,12.221109390258789]]],[[[-68.96556091308594,12.198888778686523],[-69.16361999511719,12.366388320922852],[-68.7469482421875,12.040277481079102],[-68.96556091308594,12.198888778686523]]],[[[-62.96111297607422,17.460832595825195],[-62.996673583984375,17.52055549621582],[-62.93861389160156,17.490278244018555],[-62.96111297607422,17.460832595825195]]]]}},{"type":"Feature","properties":{"name":"United Arab Emirates","iso2":"AE","iso3":"ARE"},"geometry":{"type":"MultiPolygon","coordinates":[[[[53.965271000000115,24.176666],[53.62388600000011,24.162777],[53.85110500000022,24.269165],[53.965271000000115,24.176666]]],[[[53.324165,24.267776],[53.243607,24.276665],[53.341110000000214,24.328888],[53.324165,24.267776]]],[[[53.10971800000013,24.311386],[53.079437,24.32555400000011],[53.085831,24.352776],[53.10971800000013,24.311386]]],[[[54.264717000000104,24.288887],[54.174438,24.324997],[54.231384,24.35083],[54.264717000000104,24.288887]]],[[[52.616104,24.268608],[52.572777,24.339722],[52.639717,24.3722190000001],[52.616104,24.268608]]],[[[53.3980480000001,24.324718],[53.387497,24.368889],[53.428329000000105,24.366943],[53.3980480000001,24.324718]]],[[[54.472496,24.418888],[54.328331,24.45972100000013],[54.380272,24.502499],[54.472496,24.418888]]],[[[54.515549,24.504719],[54.48555,24.509163],[54.469719,24.536942],[54.515549,24.504719]]],[[[54.440826,24.50111],[54.400833,24.514721],[54.465553,24.589996],[54.440826,24.50111]]],[[[55.61749300000011,25.57],[55.609718000000186,25.569443],[55.620552,25.583611],[55.61749300000011,25.57]]],[[[56.183331,25.654989],[56.269722,25.636015],[56.373528,24.979382],[56.104164,24.734722000000104],[56.037498,24.938889],[55.7794420000001,24.563889000000145],[56.024719,24.076111],[55.510277000000116,23.97277500000014],[55.199165000000136,22.699718],[52.583328,22.938890000000114],[51.583611000000104,24.25972],[52.080551,23.955555],[54.118607,24.139442],[54.424164,24.281666],[54.650276000000105,24.746944],[55.863609,25.72333100000013],[56.079941,26.065559],[56.183331,25.654989]]]]}},{"type":"Feature","properties":{"name":"Timor-Leste","iso2":"TL","iso3":"TLS"},"geometry":{"type":"MultiPolygon","coordinates":[[[[124.44572729730143,-9.184801455158606],[124.34309325995272,-9.463379556533425],[124.04616116616907,-9.339979205869994],[124.44572729730143,-9.184801455158606]]],[[[127.25305200000011,-8.477499],[125.1279887712715,-9.435955217796248],[125.16404989666458,-9.066142474253581],[124.94544874451074,-8.95403931930285],[125.844147,-8.481667],[127.25305200000011,-8.477499]]]]}},{"type":"Feature","properties":{"name":"Pitcairn Islands","iso2":"PN","iso3":"PCN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-130.076935,-25.079723],[-130.107483,-25.063335],[-130.065002,-25.063335],[-130.076935,-25.079723]]],[[[-124.780853,-24.675835],[-124.795853,-24.666115],[-124.77252199999987,-24.666946],[-124.780853,-24.675835]]],[[[-128.289185,-24.409721],[-128.336945,-24.329166],[-128.303894,-24.33028],[-128.289185,-24.409721]]]]}},{"type":"Feature","properties":{"name":"Palau","iso2":"PW","iso3":"PLW"},"geometry":{"type":"MultiPolygon","coordinates":[[[[132.226624,5.292777000000129],[132.20831300000012,5.31111],[132.230255,5.307221],[132.226624,5.292777000000129]]],[[[134.166077,6.885277],[134.139435,6.934721000000124],[134.174988,6.923888],[134.166077,6.885277]]],[[[134.274994,7.010278],[134.227753,6.987777],[134.27832,7.070833],[134.274994,7.010278]]],[[[134.392761,7.140277],[134.353851,7.168055000000109],[134.381897,7.192498],[134.392761,7.140277]]],[[[134.377747,7.215833],[134.344116,7.269444],[134.438873,7.278888],[134.377747,7.215833]]],[[[134.470795,7.36111],[134.5174870000001,7.308054],[134.448303,7.331944],[134.470795,7.36111]]],[[[134.561371,7.371943],[134.485229,7.438054000000108],[134.634155,7.729444],[134.561371,7.371943]]]]}},{"type":"Feature","properties":{"name":"Marshall Islands","iso2":"MH","iso3":"MHL"},"geometry":{"type":"MultiPolygon","coordinates":[[[[168.113586,5.600277],[168.094971,5.613333],[168.12439,5.641666000000114],[168.113586,5.600277]]],[[[168.09024,5.630554000000146],[168.074982,5.631943],[168.077148,5.650265],[168.09024,5.630554000000146]]],[[[171.75192300000012,6.080555],[171.727173,6.086110000000147],[171.733582,6.096388],[171.75192300000012,6.080555]]],[[[172.090515,6.219721],[172.07412700000012,6.222221000000104],[172.080261,6.229721],[172.090515,6.219721]]],[[[171.914154,7.092499000000117],[171.89413500000015,7.101665],[171.929962,7.133888],[171.914154,7.092499000000117]]],[[[168.768036,7.298332],[168.78637700000016,7.288888],[168.670258,7.328888],[168.768036,7.298332]]],[[[168.574677,7.398055000000113],[168.554962,7.423055],[168.5585940000001,7.471388],[168.574677,7.398055000000113]]],[[[168.967194,7.574166],[168.944427,7.615276],[168.974976,7.60111],[168.967194,7.574166]]],[[[168.251373,7.749443],[168.233582,7.74861],[168.220245,7.766944],[168.251373,7.749443]]],[[[167.738861,8.725275],[167.724396,8.729719],[167.740784,8.747776],[167.738861,8.725275]]],[[[170.844971,8.886944],[170.834961,8.893332],[170.846924,8.916109],[170.844971,8.886944]]],[[[165.536926,9.19722],[165.522491,9.207775],[165.5269170000001,9.218609000000143],[165.536926,9.19722]]],[[[166.829956,9.32222],[166.811646,9.336943],[166.830261,9.335831],[166.829956,9.32222]]],[[[170.248016,9.544722],[170.244965,9.533609000000112],[170.233307,9.55888700000014],[170.248016,9.544722]]],[[[170.15387,9.639442],[170.1355290000001,9.633333],[170.161652,9.645277],[170.15387,9.639442]]],[[[169.97161900000017,10.436386],[169.96386700000014,10.43333200000015],[169.944122,10.451109],[169.97161900000017,10.436386]]],[[[166.885254,11.144722],[166.841339,11.153332],[166.900543,11.168610000000115],[166.885254,11.144722]]],[[[169.866913,11.232775],[169.85553,11.231941],[169.858856,11.241386],[169.866913,11.232775]]],[[[162.33828700000012,11.351942],[162.323578,11.354164],[162.341644,11.362219],[162.33828700000012,11.351942]]],[[[167.520813,11.377775],[167.512207,11.393888],[167.5260930000002,11.386665],[167.520813,11.377775]]],[[[165.55609100000018,11.615831],[165.5130310000002,11.638611],[165.547211,11.634443000000104],[165.55609100000018,11.615831]]],[[[165.29165600000013,11.700554],[165.27191200000013,11.706387],[165.284698,11.714165],[165.29165600000013,11.700554]]],[[[168.987732,14.580832],[168.974976,14.58111],[169.003876,14.598053],[168.987732,14.580832]]]]}},{"type":"Feature","properties":{"name":"Saint Pierre and Miquelon","iso2":"PM","iso3":"SPM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-56.150833,46.758049],[-56.23722099999986,46.763885000000144],[-56.173889,46.80999],[-56.150833,46.758049]]],[[[-56.271111,46.994156],[-56.368332,46.784721],[-56.390282,47.118881],[-56.271111,46.994156]]]]}},{"type":"Feature","properties":{"name":"Saint Helena","iso2":"SH","iso3":"SHN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-9.892223,-40.390839],[-10.028611999999896,-40.309448],[-9.95222299999989,-40.306671],[-9.892223,-40.390839]]],[[[-12.206389999999885,-37.112503],[-12.331666999999868,-37.107506],[-12.259445,-37.05278],[-12.206389999999885,-37.112503]]],[[[-5.662222999999869,-15.987501],[-5.793056,-15.994167],[-5.704167,-15.903057],[-5.662222999999869,-15.987501]]],[[[-14.36389,-7.979723],[-14.381945,-7.883612],[-14.293056,-7.945278],[-14.36389,-7.979723]]]]}},{"type":"Feature","properties":{"name":"San Marino","iso2":"SM","iso3":"SMR"},"geometry":{"type":"MultiPolygon","coordinates":[[[[12.415798,43.957954],[12.509998,43.986938],[12.459166,43.896111],[12.415798,43.957954]]]]}},{"type":"Feature","properties":{"name":"Turks and Caicos Islands","iso2":"TC","iso3":"TCA"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-71.140289,21.431942],[-71.150558,21.470833],[-71.135559,21.511108000000107],[-71.140289,21.431942]]],[[[-72.460556,21.629719],[-72.45667999999989,21.699718000000118],[-72.433624,21.713333],[-72.460556,21.629719]]],[[[-71.468903,21.654999],[-71.53334,21.734444],[-71.462784,21.720833],[-71.468903,21.654999]]],[[[-71.657791,21.82333],[-71.65888999999987,21.739719000000107],[-71.850571,21.845833],[-71.657791,21.82333]]],[[[-72.2622219999999,21.75111],[-72.327225,21.855831],[-72.247787,21.795555],[-72.2622219999999,21.75111]]],[[[-71.88417099999987,21.847221],[-72.03334,21.942776],[-71.912231,21.943333],[-71.88417099999987,21.847221]]]]}},{"type":"Feature","properties":{"name":"Western Sahara","iso2":"EH","iso3":"ESH"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-15.741997,21.338284],[-16.953056,21.338333],[-17.05233,20.764095000000125],[-16.917225,21.943054],[-16.719448,22.26083],[-16.491112,22.334164],[-16.075558,23.324444],[-15.766668,23.781666],[-15.777225,23.908882],[-16.00639,23.6675],[-15.838058,23.896938],[-14.901112,24.688053],[-14.480278,26.171108],[-13.574167,26.731667],[-13.174961,27.666958],[-8.666668,27.666664],[-8.66679,27.290459],[-8.666944999999885,26.000275000000116],[-12.000557,26],[-12.000278,23.454441000000102],[-13.105278,22.893055],[-12.999723,21.338055000000125],[-15.741997,21.338284]]]]}},{"type":"Feature","properties":{"name":"Serbia","iso2":"RS","iso3":"SRB"},"geometry":{"type":"MultiPolygon","coordinates":[[[[20.071423,42.560913],[20.348888,42.886383],[19.228809,43.513214],[19.51083,43.679718],[19.237019,44.011009],[19.620476,44.048454],[19.104443,44.355827],[19.371387,44.88916],[19.039719,44.861382],[19.423885,45.22583],[18.980324000000138,45.378624],[18.81702,45.912964],[20.261024,46.114853],[21.513611,45.151108],[21.400398,44.780823],[22.146385,44.479164],[22.479164,44.710274],[22.764893,44.559006],[22.457333,44.474358],[22.681435,44.224701],[22.367222,43.826942],[23.004997,43.192772],[22.442219,42.821663],[22.365276,42.323883],[20.589642,41.882187],[20.071423,42.560913]]]]}},{"type":"Feature","properties":{"name":"Holy See (Vatican City)","iso2":"VA","iso3":"VAT"},"geometry":{"type":"MultiPolygon","coordinates":[[[[12.445090330888661,41.90311752178489],[12.45165333958056,41.907989033391274],[12.456660170953796,41.901426024699205],[12.445090330888661,41.90311752178489]]]]}},{"type":"Feature","properties":{"name":"Svalbard","iso2":"SJ","iso3":"SJM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-8.290895462036133,70.97415351867676],[-9.120058059692383,70.85775947570801],[-7.927001953125,71.15081977844238],[-8.290895462036133,70.97415351867676]]],[[[19.18194007873535,74.35971260070801],[18.79194450378418,74.48166084289551],[19.29972267150879,74.4749927520752],[19.18194007873535,74.35971260070801]]],[[[25.016111373901367,76.46638679504395],[24.936384201049805,76.4488697052002],[25.58222007751465,76.70665168762207],[25.016111373901367,76.46638679504395]]],[[[23.285554885864258,77.26471138000488],[23.13527488708496,77.23526191711426],[23.036386489868164,77.25999641418457],[23.285554885864258,77.26471138000488]]],[[[23.336111068725586,78.19748115539551],[23.059720993041992,78.01609992980957],[24.910276412963867,77.74971199035645],[22.6411075592041,77.25305366516113],[22.407499313354492,77.42082405090332],[22.77833366394043,77.54776191711426],[20.858888626098633,77.46249580383301],[21.64499855041504,77.9124927520752],[20.903051376342773,78.11499214172363],[23.336111068725586,78.19748115539551]]],[[[21.501665115356445,78.56553840637207],[22.028886795043945,78.5808277130127],[22.271944046020508,78.26361274719238],[20.671110153198242,78.18748664855957],[20.124719619750977,78.47221565246582],[21.501665115356445,78.56553840637207]]],[[[26.847497940063477,78.70749092102051],[26.396387100219727,78.77083015441895],[27.017499923706055,78.69304084777832],[26.847497940063477,78.70749092102051]]],[[[11.271944046020508,78.60693550109863],[12.163610458374023,78.19970893859863],[10.488611221313477,78.8963794708252],[11.271944046020508,78.60693550109863]]],[[[29.030553817749023,78.91609382629395],[29.708051681518555,78.8963794708252],[28.01972007751465,78.86747932434082],[29.030553817749023,78.91609382629395]]],[[[30.209440231323242,78.97638130187988],[30.06694221496582,79.00110054016113],[30.336111068725586,78.98887825012207],[30.209440231323242,78.97638130187988]]],[[[21.226106643676758,79.0374927520752],[20.98249626159668,79.01416206359863],[20.923608779907227,79.02998542785645],[21.226106643676758,79.0374927520752]]],[[[20.83305549621582,79.05415534973145],[20.046110153198242,79.0374927520752],[20.19972038269043,79.12469673156738],[20.83305549621582,79.05415534973145]]],[[[20.00750160217285,79.2422046661377],[19.9547176361084,79.22665596008301],[20.168886184692383,79.31915473937988],[20.00750160217285,79.2422046661377]]],[[[20.10944175720215,79.36581611633301],[20.18027687072754,79.3388843536377],[19.628332138061523,79.3883228302002],[20.10944175720215,79.36581611633301]]],[[[10.92277717590332,79.65109443664551],[10.712221145629883,79.71360969543457],[11.076108932495117,79.66276741027832],[10.92277717590332,79.65109443664551]]],[[[11.000555038452148,79.74026679992676],[10.639165878295898,79.75000190734863],[10.756109237670898,79.78332710266113],[11.000555038452148,79.74026679992676]]],[[[16.81916618347168,79.8722095489502],[18.09833335876465,79.72026252746582],[17.63555335998535,79.37248420715332],[18.356943130493164,79.6283130645752],[18.92055320739746,79.16415596008301],[21.549165725708008,78.76776313781738],[18.965551376342773,78.45610237121582],[19.092222213745117,78.09553718566895],[18.410829544067383,78.02165412902832],[18.292776107788086,77.50638008117676],[17.73832893371582,77.47110176086426],[16.919164657592773,76.79971504211426],[17.198331832885742,76.69470405578613],[16.612775802612305,76.57054328918457],[15.498052597045898,76.87997627258301],[16.51972007751465,76.99859809875488],[14.467222213745117,77.1716480255127],[13.914167404174805,77.52777290344238],[16.223051071166992,77.43498420715332],[14.739164352416992,77.65860176086426],[17.0061092376709,77.93136787414551],[13.94194221496582,77.71666145324707],[13.588888168334961,78.04942512512207],[17.301664352416992,78.42025947570801],[16.328886032104492,78.45221138000488],[16.83111000061035,78.67192268371582],[15.464166641235352,78.45166206359863],[15.193330764770508,78.58804512023926],[15.379999160766602,78.84471321105957],[14.385557174682617,78.49775886535645],[14.726388931274414,78.38388252258301],[13.00666618347168,78.19748115539551],[12.360555648803711,78.48027229309082],[13.198610305786133,78.54081916809082],[11.333333969116211,78.96054267883301],[12.505556106567383,78.90803718566895],[11.755277633666992,79.0758228302002],[12.113054275512695,79.29582405090332],[11.236387252807617,79.09305000305176],[10.676942825317383,79.54498481750488],[13.82472038269043,79.8752613067627],[12.447778701782227,79.56637763977051],[13.484441757202148,79.5808277130127],[13.257223129272461,79.47137641906738],[14.058889389038086,79.2602710723877],[13.886945724487305,79.54136848449707],[14.584997177124023,79.80415534973145],[16.44999885559082,78.90387153625488],[15.638055801391602,79.82721138000488],[16.307775497436523,80.0627613067627],[16.81916618347168,79.8722095489502]]],[[[27.837778091430664,80.11026191711426],[27.674165725708008,80.12275886535645],[28.07444190979004,80.14415168762207],[27.837778091430664,80.11026191711426]]],[[[36.84916114807129,80.13998603820801],[36.59054756164551,80.15498542785645],[36.76027870178223,80.16081428527832],[36.84916114807129,80.13998603820801]]],[[[32.36638832092285,80.09443855285645],[31.44944190979004,80.08581733703613],[33.63749885559082,80.21331977844238],[32.36638832092285,80.09443855285645]]],[[[18.55333137512207,80.24553108215332],[18.119443893432617,80.28471565246582],[18.75861167907715,80.30192756652832],[18.55333137512207,80.24553108215332]]],[[[24.335832595825195,80.38415718078613],[24.128610610961914,80.39305305480957],[24.196943283081055,80.45416450500488],[24.335832595825195,80.38415718078613]]],[[[19.933332443237305,80.47747993469238],[21.86055564880371,80.26776313781738],[21.598608016967773,80.11831855773926],[22.22638511657715,79.97915840148926],[22.578611373901367,80.2986011505127],[22.361108779907227,80.41026496887207],[22.88694190979004,80.49026679992676],[23.360830307006836,80.42943000793457],[23.101388931274414,80.12082099914551],[24.83638572692871,80.35081672668457],[27.244997024536133,79.90498542785645],[23.511667251586914,79.17886543273926],[19.63555335998535,79.60386848449707],[22.312498092651367,79.79693794250488],[18.771387100219727,79.71748542785645],[18.154165267944336,79.90999031066895],[18.8094425201416,79.99470710754395],[17.783056259155273,80.12776374816895],[19.34055519104004,80.08638191223145],[19.584165573120117,80.1513843536377],[18.979997634887695,80.33665657043457],[19.837778091430664,80.2138843536377],[19.46333122253418,80.45471382141113],[19.933332443237305,80.47747993469238]]],[[[24.26500129699707,80.47110176086426],[23.97443962097168,80.49054145812988],[24.174997329711914,80.50915718078613],[24.26500129699707,80.47110176086426]]],[[[19.933332443237305,80.47747993469238],[19.8447208404541,80.50305366516113],[20.130277633666992,80.51277351379395],[19.933332443237305,80.47747993469238]]],[[[20.753610610961914,80.62137031555176],[20.499162673950195,80.65776252746582],[20.793333053588867,80.64749336242676],[20.753610610961914,80.62137031555176]]],[[[21.330278396606445,80.70027351379395],[21.364999771118164,80.67886543273926],[21.02638816833496,80.6816577911377],[21.330278396606445,80.70027351379395]]],[[[20.81916618347168,80.71914863586426],[20.51833152770996,80.75999641418457],[21.00666618347168,80.70138740539551],[20.81916618347168,80.71914863586426]]]]}},{"type":"Feature","properties":{"name":"Saint Martin","iso2":"MF","iso3":"MAF"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-63.00666799999988,18.080555],[-63.01145899999989,18.067276],[-63.139839,18.058601],[-63.00666799999988,18.080555]]]]}},{"type":"Feature","properties":{"name":"Saint Barthelemy","iso2":"BL","iso3":"BLM"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-63.028336,18.015553],[-63.139839,18.058601],[-63.01145899999989,18.067276],[-63.028336,18.015553]]]]}},{"type":"Feature","properties":{"name":"Guernsey","iso2":"GG","iso3":"GGY"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-2.590834,49.422493],[-2.670278,49.434166000000104],[-2.501667,49.507774],[-2.590834,49.422493]]]]}},{"type":"Feature","properties":{"name":"Jersey","iso2":"JE","iso3":"JEY"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-2.015,49.214165],[-2.205278,49.180832],[-2.247222,49.253052],[-2.015,49.214165]]]]}},{"type":"Feature","properties":{"name":"South Georgia South Sandwich Islands","iso2":"GS","iso3":"SGS"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-27.325836,-59.427223],[-27.298058,-59.473061],[-27.412502,-59.434448],[-27.325836,-59.427223]]],[[[-26.582779,-59.070007],[-26.665001,-59.025841],[-26.501114,-59.036949],[-26.582779,-59.070007]]],[[[-26.246391,-58.407501],[-26.24889,-58.498611],[-26.459167,-58.427223],[-26.246391,-58.407501]]],[[[-26.41278099999988,-57.80806],[-26.512222,-57.771118],[-26.443336,-57.743896],[-26.41278099999988,-57.80806]]],[[[-26.660835,-57.086395],[-26.728888999999896,-57.062782],[-26.675835,-57.056396],[-26.660835,-57.086395]]],[[[-27.10861199999988,-56.717506],[-27.209724,-56.693611],[-27.129448,-56.682228],[-27.10861199999988,-56.717506]]],[[[-27.563892,-56.320557],[-27.600002,-56.281113],[-27.549446,-56.27417],[-27.563892,-56.320557]]],[[[-37.038612,-54.511673],[-37.083618,-54.512779],[-37.105835,-54.471115],[-37.038612,-54.511673]]],[[[-37.495003,-54.010559],[-36.288063,-54.266396],[-35.782501,-54.765556],[-36.115837,-54.887222],[-37.411392,-54.268333],[-37.239448999999865,-54.147781],[-38.033058,-54.048889],[-37.495003,-54.010559]]]]}},{"type":"Feature","properties":{"name":"Taiwan","iso2":"TW","iso3":"TWN"},"geometry":{"type":"MultiPolygon","coordinates":[[[[121.576393,22.001389],[121.490257,22.078609],[121.546944,22.078053],[121.576393,22.001389]]],[[[119.66943400000011,23.549999],[119.526703,23.535461],[119.59832800000018,23.606941],[119.66943400000011,23.549999]]],[[[118.223602,24.40416300000011],[118.207489,24.412495000000106],[118.241364,24.445827],[118.223602,24.40416300000011]]],[[[118.4191440000001,24.395828],[118.275543,24.399162],[118.401657,24.521664],[118.4191440000001,24.395828]]],[[[121.734711,25.138885],[122.002213,25.006943000000106],[121.839706,24.476383000000126],[120.71637700000011,21.928051],[120.05275700000018,23.044998],[120.111366,23.620274],[121.00916300000014,25.008888000000113],[121.734711,25.138885]]],[[[119.92942800000012,26.134995],[119.909416,26.159439],[119.95247700000019,26.159996000000106],[119.92942800000012,26.134995]]],[[[119.96720900000017,26.187496000000138],[119.956383,26.215549],[120.006104,26.219162],[119.96720900000017,26.187496000000138]]]]}}]} \ No newline at end of file diff --git a/src/plugins/tile_map/public/__tests__/blues.png b/src/plugins/tile_map/public/__tests__/blues.png deleted file mode 100644 index 89d6734eb123a0033cf7bb712d4894a0205019ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14095 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 LJz4H}{rCR@yo?jZ diff --git a/src/plugins/tile_map/public/__tests__/coordinate_maps_visualization.js b/src/plugins/tile_map/public/__tests__/coordinate_maps_visualization.js deleted file mode 100644 index f2830e58e0eea..0000000000000 --- a/src/plugins/tile_map/public/__tests__/coordinate_maps_visualization.js +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import expect from '@kbn/expect'; -import ngMock from 'ng_mock'; -import { ImageComparator } from 'test_utils/image_comparator'; -import dummyESResponse from './dummy_es_response.json'; -import initial from './initial.png'; -import blues from './blues.png'; -import shadedGeohashGrid from './shaded_geohash_grid.png'; -import heatmapRaw from './heatmap_raw.png'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_CATALOGUE from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_manifest.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_FILES from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_files.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_TILES from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_tiles.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_STYLE_ROAD_MAP_BRIGHT from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_style_bright'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_STYLE_ROAD_MAP_DESATURATED from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_style_desaturated'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_STYLE_DARK_MAP from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_style_dark'; - -import { createTileMapVisualization } from '../tile_map_visualization'; -import { createTileMapTypeDefinition } from '../tile_map_type'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ExprVis } from '../../../visualizations/public/expressions/vis'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { BaseVisType } from '../../../visualizations/public/vis_types/base_vis_type'; -import { - getPrecision, - getZoomPrecision, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../maps_legacy/public/map/precision'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ServiceSettings } from '../../../maps_legacy/public/map/service_settings'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { KibanaMap } from '../../../maps_legacy/public/map/kibana_map'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { BaseMapsVisualizationProvider } from '../../../maps_legacy/public/map/base_maps_visualization'; - -function mockRawData() { - const stack = [dummyESResponse]; - let node; - do { - node = stack.pop(); - if (typeof node === 'object') { - // eslint-disable-next-line guard-for-in - for (const key in node) { - if (node.hasOwnProperty(key)) { - if (key === 'aggConfig') { - node[key].makeLabel = () => 'foobar'; - } - } - stack.push(node[key]); - } - } - } while (stack.length); -} -mockRawData(); - -const THRESHOLD = 0.45; -const PIXEL_DIFF = 64; - -describe('CoordinateMapsVisualizationTest', function () { - let domNode; - let CoordinateMapsVisualization; - let vis; - let dependencies; - let visType; - - let imageComparator; - - let getManifestStub; - beforeEach(ngMock.module('kibana')); - beforeEach( - ngMock.inject((Private, $injector) => { - const mapConfig = { - emsFileApiUrl: '', - emsTileApiUrl: '', - emsLandingPageUrl: '', - }; - const tilemapsConfig = { - options: { - attribution: '123', - }, - }; - - const serviceSettings = new ServiceSettings(mapConfig, tilemapsConfig); - const BaseMapsVisualization = new BaseMapsVisualizationProvider( - (...args) => new KibanaMap(...args), - serviceSettings - ); - const uiSettings = $injector.get('config'); - - dependencies = { - getZoomPrecision, - getPrecision, - BaseMapsVisualization, - uiSettings, - serviceSettings, - }; - - visType = new BaseVisType(createTileMapTypeDefinition(dependencies)); - - CoordinateMapsVisualization = createTileMapVisualization(dependencies); - - getManifestStub = serviceSettings.__debugStubManifestCalls(async (url) => { - //simulate network calls - if (url.startsWith('https://foobar')) { - return EMS_CATALOGUE; - } else if (url.startsWith('https://tiles.foobar')) { - return EMS_TILES; - } else if (url.startsWith('https://files.foobar')) { - return EMS_FILES; - } else if (url.startsWith('https://raster-style.foobar')) { - if (url.includes('osm-bright-desaturated')) { - return EMS_STYLE_ROAD_MAP_DESATURATED; - } else if (url.includes('osm-bright')) { - return EMS_STYLE_ROAD_MAP_BRIGHT; - } else if (url.includes('dark-matter')) { - return EMS_STYLE_DARK_MAP; - } - } - }); - }) - ); - - afterEach(() => { - getManifestStub.removeStub(); - }); - - describe('CoordinateMapsVisualization - basics', function () { - beforeEach(async function () { - setupDOM('512px', '512px'); - - imageComparator = new ImageComparator(); - vis = new ExprVis({ - type: visType, - }); - vis.params = { - mapType: 'Scaled Circle Markers', - isDesaturated: true, - addTooltip: true, - heatClusterSize: 1.5, - legendPosition: 'bottomright', - mapZoom: 2, - mapCenter: [0, 0], - dimensions: { - metric: { - accessor: 1, - label: 'test', - format: { id: 'string' }, - }, - bucket: { - accessor: 0, - }, - }, - }; - const mockAggs = { - byType: (type) => { - return mockAggs.aggs.find((agg) => agg.type.type === type); - }, - aggs: [ - { - type: { - type: 'metrics', - }, - fieldFormatter: (x) => { - return x; - }, - makeLabel: () => { - return 'foobar'; - }, - }, - { - type: { - type: 'buckets', - }, - params: { useGeoCentroid: true }, - }, - ], - }; - vis.getAggConfig = function () { - return mockAggs; - }; - vis.aggs = mockAggs; - }); - - afterEach(function () { - teardownDOM(); - imageComparator.destroy(); - }); - - it('should initialize OK (may fail in dev env)', async function () { - const coordinateMapVisualization = new CoordinateMapsVisualization(domNode, vis); - await coordinateMapVisualization.render(dummyESResponse, vis.params, { - resize: false, - params: true, - aggs: true, - data: true, - uiState: false, - }); - - const mismatchedPixels = await compareImage(initial, 0); - coordinateMapVisualization.destroy(); - expect(mismatchedPixels).to.be.lessThan(PIXEL_DIFF); - }); - - it('should toggle to Heatmap OK', async function () { - const coordinateMapVisualization = new CoordinateMapsVisualization(domNode, vis); - await coordinateMapVisualization.render(dummyESResponse, vis.params, { - resize: false, - params: true, - aggs: true, - data: true, - uiState: false, - }); - - vis.params.mapType = 'Heatmap'; - await coordinateMapVisualization.render(dummyESResponse, vis.params, { - resize: false, - params: true, - aggs: false, - data: false, - uiState: false, - }); - - const mismatchedPixels = await compareImage(heatmapRaw, 1); - coordinateMapVisualization.destroy(); - expect(mismatchedPixels).to.be.lessThan(PIXEL_DIFF); - }); - - it('should toggle back&forth OK between mapTypes (may fail in dev env)', async function () { - const coordinateMapVisualization = new CoordinateMapsVisualization(domNode, vis); - await coordinateMapVisualization.render(dummyESResponse, vis.params, { - resize: false, - params: true, - aggs: true, - data: true, - uiState: false, - }); - - vis.params.mapType = 'Heatmap'; - await coordinateMapVisualization.render(dummyESResponse, vis.params, { - resize: false, - params: true, - aggs: false, - data: false, - uiState: false, - }); - - vis.params.mapType = 'Scaled Circle Markers'; - await coordinateMapVisualization.render(dummyESResponse, vis.params, { - resize: false, - params: true, - aggs: false, - data: false, - uiState: false, - }); - - const mismatchedPixels = await compareImage(initial, 0); - coordinateMapVisualization.destroy(); - expect(mismatchedPixels).to.be.lessThan(PIXEL_DIFF); - }); - - it('should toggle to different color schema ok (may fail in dev env)', async function () { - const coordinateMapVisualization = new CoordinateMapsVisualization(domNode, vis); - await coordinateMapVisualization.render(dummyESResponse, vis.params, { - resize: false, - params: true, - aggs: true, - data: true, - uiState: false, - }); - - vis.params.colorSchema = 'Blues'; - await coordinateMapVisualization.render(dummyESResponse, vis.params, { - resize: false, - params: true, - aggs: false, - data: false, - uiState: false, - }); - - const mismatchedPixels = await compareImage(blues, 0); - coordinateMapVisualization.destroy(); - expect(mismatchedPixels).to.be.lessThan(PIXEL_DIFF); - }); - - it('should toggle to different color schema and maptypes ok', async function () { - const coordinateMapVisualization = new CoordinateMapsVisualization(domNode, vis); - await coordinateMapVisualization.render(dummyESResponse, vis.params, { - resize: false, - params: true, - aggs: true, - data: true, - uiState: false, - }); - - vis.params.colorSchema = 'Greens'; - vis.params.mapType = 'Shaded Geohash Grid'; - await coordinateMapVisualization.render(dummyESResponse, vis.params, { - resize: false, - params: true, - aggs: false, - data: false, - uiState: false, - }); - - const mismatchedPixels = await compareImage(shadedGeohashGrid, 0); - coordinateMapVisualization.destroy(); - expect(mismatchedPixels).to.be.lessThan(PIXEL_DIFF); - }); - }); - - async function compareImage(expectedImageSource, index) { - const elementList = domNode.querySelectorAll('canvas'); - const firstCanvasOnMap = elementList[index]; - return imageComparator.compareImage(firstCanvasOnMap, expectedImageSource, THRESHOLD); - } - - function setupDOM(width, height) { - domNode = document.createElement('div'); - domNode.style.top = '0'; - domNode.style.left = '0'; - domNode.style.width = width; - domNode.style.height = height; - domNode.style.position = 'fixed'; - domNode.style.border = '1px solid blue'; - domNode.style['pointer-events'] = 'none'; - document.body.appendChild(domNode); - } - - function teardownDOM() { - domNode.innerHTML = ''; - document.body.removeChild(domNode); - } -}); diff --git a/src/plugins/tile_map/public/__tests__/dummy_es_response.json b/src/plugins/tile_map/public/__tests__/dummy_es_response.json deleted file mode 100644 index 1c54857f9d67a..0000000000000 --- a/src/plugins/tile_map/public/__tests__/dummy_es_response.json +++ /dev/null @@ -1,1810 +0,0 @@ -{ - "featureCollection": { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.9070567265153, - 36.36630680412054 - ] - }, - "properties": { - "geohash": "dn", - "doc_count": 715, - "geohash_meta": { - "center": [ - 36.5625, - -84.375 - ], - "rectangle": [ - [ - 33.75, - -90 - ], - [ - 33.75, - -78.75 - ], - [ - 39.375, - -78.75 - ], - [ - 39.375, - -90 - ] - ] - }, - "value": 715 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.9149083904922, - 41.58417354337871 - ] - }, - "properties": { - "geohash": "dp", - "doc_count": 657, - "geohash_meta": { - "center": [ - 42.1875, - -84.375 - ], - "rectangle": [ - [ - 39.375, - -90 - ], - [ - 39.375, - -78.75 - ], - [ - 45, - -78.75 - ], - [ - 45, - -90 - ] - ] - }, - "value": 657 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -95.05993634462357, - 36.32617760449648 - ] - }, - "properties": { - "geohash": "9y", - "doc_count": 623, - "geohash_meta": { - "center": [ - 36.5625, - -95.625 - ], - "rectangle": [ - [ - 33.75, - -101.25 - ], - [ - 33.75, - -90 - ], - [ - 39.375, - -90 - ], - [ - 39.375, - -101.25 - ] - ] - }, - "value": 623 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -73.9467297680676, - 42.102721743285656 - ] - }, - "properties": { - "geohash": "dr", - "doc_count": 576, - "geohash_meta": { - "center": [ - 42.1875, - -73.125 - ], - "rectangle": [ - [ - 39.375, - -78.75 - ], - [ - 39.375, - -67.5 - ], - [ - 45, - -67.5 - ], - [ - 45, - -78.75 - ] - ] - }, - "value": 576 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -95.22280854173005, - 41.98196731042117 - ] - }, - "properties": { - "geohash": "9z", - "doc_count": 555, - "geohash_meta": { - "center": [ - 42.1875, - -95.625 - ], - "rectangle": [ - [ - 39.375, - -101.25 - ], - [ - 39.375, - -90 - ], - [ - 45, - -90 - ], - [ - 45, - -101.25 - ] - ] - }, - "value": 555 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -84.76328378543258, - 31.699854251928627 - ] - }, - "properties": { - "geohash": "dj", - "doc_count": 528, - "geohash_meta": { - "center": [ - 30.9375, - -84.375 - ], - "rectangle": [ - [ - 28.125, - -90 - ], - [ - 28.125, - -78.75 - ], - [ - 33.75, - -78.75 - ], - [ - 33.75, - -90 - ] - ] - }, - "value": 528 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -95.2651846781373, - 31.394152916036546 - ] - }, - "properties": { - "geohash": "9v", - "doc_count": 510, - "geohash_meta": { - "center": [ - 30.9375, - -95.625 - ], - "rectangle": [ - [ - 28.125, - -101.25 - ], - [ - 28.125, - -90 - ], - [ - 33.75, - -90 - ], - [ - 33.75, - -101.25 - ] - ] - }, - "value": 510 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -118.95955030806363, - 36.473086257465184 - ] - }, - "properties": { - "geohash": "9q", - "doc_count": 390, - "geohash_meta": { - "center": [ - 36.5625, - -118.125 - ], - "rectangle": [ - [ - 33.75, - -123.75 - ], - [ - 33.75, - -112.5 - ], - [ - 39.375, - -112.5 - ], - [ - 39.375, - -123.75 - ] - ] - }, - "value": 390 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -106.9422698020935, - 36.371589582413435 - ] - }, - "properties": { - "geohash": "9w", - "doc_count": 257, - "geohash_meta": { - "center": [ - 36.5625, - -106.875 - ], - "rectangle": [ - [ - 33.75, - -112.5 - ], - [ - 33.75, - -101.25 - ], - [ - 39.375, - -101.25 - ], - [ - 39.375, - -112.5 - ] - ] - }, - "value": 257 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -95.21766104735434, - 46.71993430238217 - ] - }, - "properties": { - "geohash": "cb", - "doc_count": 248, - "geohash_meta": { - "center": [ - 47.8125, - -95.625 - ], - "rectangle": [ - [ - 45, - -101.25 - ], - [ - 45, - -90 - ], - [ - 50.625, - -90 - ], - [ - 50.625, - -101.25 - ] - ] - }, - "value": 248 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -119.4527724198997, - 47.01064535882324 - ] - }, - "properties": { - "geohash": "c2", - "doc_count": 241, - "geohash_meta": { - "center": [ - 47.8125, - -118.125 - ], - "rectangle": [ - [ - 45, - -123.75 - ], - [ - 45, - -112.5 - ], - [ - 50.625, - -112.5 - ], - [ - 50.625, - -123.75 - ] - ] - }, - "value": 241 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -106.35303659364581, - 41.90058804117143 - ] - }, - "properties": { - "geohash": "9x", - "doc_count": 233, - "geohash_meta": { - "center": [ - 42.1875, - -106.875 - ], - "rectangle": [ - [ - 39.375, - -112.5 - ], - [ - 39.375, - -101.25 - ], - [ - 45, - -101.25 - ], - [ - 45, - -112.5 - ] - ] - }, - "value": 233 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -119.78077582083642, - 42.019549501128495 - ] - }, - "properties": { - "geohash": "9r", - "doc_count": 202, - "geohash_meta": { - "center": [ - 42.1875, - -118.125 - ], - "rectangle": [ - [ - 39.375, - -123.75 - ], - [ - 39.375, - -112.5 - ], - [ - 45, - -112.5 - ], - [ - 45, - -123.75 - ] - ] - }, - "value": 202 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -77.02892781235278, - 37.012665029615164 - ] - }, - "properties": { - "geohash": "dq", - "doc_count": 188, - "geohash_meta": { - "center": [ - 36.5625, - -73.125 - ], - "rectangle": [ - [ - 33.75, - -78.75 - ], - [ - 33.75, - -67.5 - ], - [ - 39.375, - -67.5 - ], - [ - 39.375, - -78.75 - ] - ] - }, - "value": 188 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -106.99090437032282, - 47.078339285217226 - ] - }, - "properties": { - "geohash": "c8", - "doc_count": 158, - "geohash_meta": { - "center": [ - 47.8125, - -106.875 - ], - "rectangle": [ - [ - 45, - -112.5 - ], - [ - 45, - -101.25 - ], - [ - 50.625, - -101.25 - ], - [ - 50.625, - -112.5 - ] - ] - }, - "value": 158 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -107.13654454797506, - 32.61927543673664 - ] - }, - "properties": { - "geohash": "9t", - "doc_count": 138, - "geohash_meta": { - "center": [ - 30.9375, - -106.875 - ], - "rectangle": [ - [ - 28.125, - -112.5 - ], - [ - 28.125, - -101.25 - ], - [ - 33.75, - -101.25 - ], - [ - 33.75, - -112.5 - ] - ] - }, - "value": 138 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -152.64550829306245, - 59.914903342723846 - ] - }, - "properties": { - "geohash": "bd", - "doc_count": 126, - "geohash_meta": { - "center": [ - 59.0625, - -151.875 - ], - "rectangle": [ - [ - 56.25, - -157.5 - ], - [ - 56.25, - -146.25 - ], - [ - 61.875, - -146.25 - ], - [ - 61.875, - -157.5 - ] - ] - }, - "value": 126 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -81.2875135615468, - 26.6619403520599 - ] - }, - "properties": { - "geohash": "dh", - "doc_count": 96, - "geohash_meta": { - "center": [ - 25.3125, - -84.375 - ], - "rectangle": [ - [ - 22.5, - -90 - ], - [ - 22.5, - -78.75 - ], - [ - 28.125, - -78.75 - ], - [ - 28.125, - -90 - ] - ] - }, - "value": 96 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -161.96613382548094, - 60.42251357808709 - ] - }, - "properties": { - "geohash": "b6", - "doc_count": 95, - "geohash_meta": { - "center": [ - 59.0625, - -163.125 - ], - "rectangle": [ - [ - 56.25, - -168.75 - ], - [ - 56.25, - -157.5 - ], - [ - 61.875, - -157.5 - ], - [ - 61.875, - -168.75 - ] - ] - }, - "value": 95 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -162.01718556694686, - 64.50348428450525 - ] - }, - "properties": { - "geohash": "b7", - "doc_count": 83, - "geohash_meta": { - "center": [ - 64.6875, - -163.125 - ], - "rectangle": [ - [ - 61.875, - -168.75 - ], - [ - 61.875, - -157.5 - ], - [ - 67.5, - -157.5 - ], - [ - 67.5, - -168.75 - ] - ] - }, - "value": 83 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -152.76569221168756, - 64.75516308099031 - ] - }, - "properties": { - "geohash": "be", - "doc_count": 77, - "geohash_meta": { - "center": [ - 64.6875, - -151.875 - ], - "rectangle": [ - [ - 61.875, - -157.5 - ], - [ - 61.875, - -146.25 - ], - [ - 67.5, - -146.25 - ], - [ - 67.5, - -157.5 - ] - ] - }, - "value": 77 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -86.92213883623481, - 45.67713766358793 - ] - }, - "properties": { - "geohash": "f0", - "doc_count": 70, - "geohash_meta": { - "center": [ - 47.8125, - -84.375 - ], - "rectangle": [ - [ - 45, - -90 - ], - [ - 45, - -78.75 - ], - [ - 50.625, - -78.75 - ], - [ - 50.625, - -90 - ] - ] - }, - "value": 70 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -115.65346693620086, - 33.081501605920494 - ] - }, - "properties": { - "geohash": "9m", - "doc_count": 61, - "geohash_meta": { - "center": [ - 30.9375, - -118.125 - ], - "rectangle": [ - [ - 28.125, - -123.75 - ], - [ - 28.125, - -112.5 - ], - [ - 33.75, - -112.5 - ], - [ - 33.75, - -123.75 - ] - ] - }, - "value": 61 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -65.73361264541745, - 18.2236089091748 - ] - }, - "properties": { - "geohash": "de", - "doc_count": 41, - "geohash_meta": { - "center": [ - 19.6875, - -61.875 - ], - "rectangle": [ - [ - 16.875, - -67.5 - ], - [ - 16.875, - -56.25 - ], - [ - 22.5, - -56.25 - ], - [ - 22.5, - -67.5 - ] - ] - }, - "value": 41 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -143.12310453504324, - 64.18042578734457 - ] - }, - "properties": { - "geohash": "bg", - "doc_count": 39, - "geohash_meta": { - "center": [ - 64.6875, - -140.625 - ], - "rectangle": [ - [ - 61.875, - -146.25 - ], - [ - 61.875, - -135 - ], - [ - 67.5, - -135 - ], - [ - 67.5, - -146.25 - ] - ] - }, - "value": 39 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -124.1186392866075, - 42.33813495375216 - ] - }, - "properties": { - "geohash": "9p", - "doc_count": 37, - "geohash_meta": { - "center": [ - 42.1875, - -129.375 - ], - "rectangle": [ - [ - 39.375, - -135 - ], - [ - 39.375, - -123.75 - ], - [ - 45, - -123.75 - ], - [ - 45, - -135 - ] - ] - }, - "value": 37 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -137.9709525872022, - 59.20598397497088 - ] - }, - "properties": { - "geohash": "bf", - "doc_count": 36, - "geohash_meta": { - "center": [ - 59.0625, - -140.625 - ], - "rectangle": [ - [ - 56.25, - -146.25 - ], - [ - 56.25, - -135 - ], - [ - 61.875, - -135 - ], - [ - 61.875, - -146.25 - ] - ] - }, - "value": 36 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -132.43937451392412, - 55.6085482891649 - ] - }, - "properties": { - "geohash": "c1", - "doc_count": 35, - "geohash_meta": { - "center": [ - 53.4375, - -129.375 - ], - "rectangle": [ - [ - 50.625, - -135 - ], - [ - 50.625, - -123.75 - ], - [ - 56.25, - -123.75 - ], - [ - 56.25, - -135 - ] - ] - }, - "value": 35 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -98.05168284103274, - 27.216137498617172 - ] - }, - "properties": { - "geohash": "9u", - "doc_count": 33, - "geohash_meta": { - "center": [ - 25.3125, - -95.625 - ], - "rectangle": [ - [ - 22.5, - -101.25 - ], - [ - 22.5, - -90 - ], - [ - 28.125, - -90 - ], - [ - 28.125, - -101.25 - ] - ] - }, - "value": 33 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -133.99208377115428, - 57.29258285835385 - ] - }, - "properties": { - "geohash": "c4", - "doc_count": 30, - "geohash_meta": { - "center": [ - 59.0625, - -129.375 - ], - "rectangle": [ - [ - 56.25, - -135 - ], - [ - 56.25, - -123.75 - ], - [ - 61.875, - -123.75 - ], - [ - 61.875, - -135 - ] - ] - }, - "value": 30 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -68.79461143165827, - 45.693174339830875 - ] - }, - "properties": { - "geohash": "f2", - "doc_count": 24, - "geohash_meta": { - "center": [ - 47.8125, - -73.125 - ], - "rectangle": [ - [ - 45, - -78.75 - ], - [ - 45, - -67.5 - ], - [ - 50.625, - -67.5 - ], - [ - 50.625, - -78.75 - ] - ] - }, - "value": 24 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -163.01397004164755, - 54.89952846430242 - ] - }, - "properties": { - "geohash": "b3", - "doc_count": 24, - "geohash_meta": { - "center": [ - 53.4375, - -163.125 - ], - "rectangle": [ - [ - 50.625, - -168.75 - ], - [ - 50.625, - -157.5 - ], - [ - 56.25, - -157.5 - ], - [ - 56.25, - -168.75 - ] - ] - }, - "value": 24 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -156.45671758800745, - 20.677654556930065 - ] - }, - "properties": { - "geohash": "8e", - "doc_count": 21, - "geohash_meta": { - "center": [ - 19.6875, - -151.875 - ], - "rectangle": [ - [ - 16.875, - -157.5 - ], - [ - 16.875, - -146.25 - ], - [ - 22.5, - -146.25 - ], - [ - 22.5, - -157.5 - ] - ] - }, - "value": 21 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -151.52415155433118, - 68.92314183991402 - ] - }, - "properties": { - "geohash": "bs", - "doc_count": 18, - "geohash_meta": { - "center": [ - 70.3125, - -151.875 - ], - "rectangle": [ - [ - 67.5, - -157.5 - ], - [ - 67.5, - -146.25 - ], - [ - 73.125, - -146.25 - ], - [ - 73.125, - -157.5 - ] - ] - }, - "value": 18 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -124.08633585087955, - 46.76067248918116 - ] - }, - "properties": { - "geohash": "c0", - "doc_count": 13, - "geohash_meta": { - "center": [ - 47.8125, - -129.375 - ], - "rectangle": [ - [ - 45, - -135 - ], - [ - 45, - -123.75 - ], - [ - 50.625, - -123.75 - ], - [ - 50.625, - -135 - ] - ] - }, - "value": 13 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -158.69247693568468, - 21.67966120876372 - ] - }, - "properties": { - "geohash": "87", - "doc_count": 12, - "geohash_meta": { - "center": [ - 19.6875, - -163.125 - ], - "rectangle": [ - [ - 16.875, - -168.75 - ], - [ - 16.875, - -157.5 - ], - [ - 22.5, - -157.5 - ], - [ - 22.5, - -168.75 - ] - ] - }, - "value": 12 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -169.91430887952447, - 14.246335001662374 - ] - }, - "properties": { - "geohash": "84", - "doc_count": 12, - "geohash_meta": { - "center": [ - 14.0625, - -174.375 - ], - "rectangle": [ - [ - 11.25, - -180 - ], - [ - 11.25, - -168.75 - ], - [ - 16.875, - -168.75 - ], - [ - 16.875, - -180 - ] - ] - }, - "value": 12 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -145.1541736163199, - 14.100071671418846 - ] - }, - "properties": { - "geohash": "8f", - "doc_count": 10, - "geohash_meta": { - "center": [ - 14.0625, - -140.625 - ], - "rectangle": [ - [ - 11.25, - -146.25 - ], - [ - 11.25, - -135 - ], - [ - 16.875, - -135 - ], - [ - 16.875, - -146.25 - ] - ] - }, - "value": 10 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -163.34791378118098, - 69.16283434722573 - ] - }, - "properties": { - "geohash": "bk", - "doc_count": 9, - "geohash_meta": { - "center": [ - 70.3125, - -163.125 - ], - "rectangle": [ - [ - 67.5, - -168.75 - ], - [ - 67.5, - -157.5 - ], - [ - 73.125, - -157.5 - ], - [ - 73.125, - -168.75 - ] - ] - }, - "value": 9 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -67.16800019145012, - 44.8411110509187 - ] - }, - "properties": { - "geohash": "dx", - "doc_count": 6, - "geohash_meta": { - "center": [ - 42.1875, - -61.875 - ], - "rectangle": [ - [ - 39.375, - -67.5 - ], - [ - 39.375, - -56.25 - ], - [ - 45, - -56.25 - ], - [ - 45, - -67.5 - ] - ] - }, - "value": 6 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -169.80291330255568, - 56.72484784852713 - ] - }, - "properties": { - "geohash": "b4", - "doc_count": 4, - "geohash_meta": { - "center": [ - 59.0625, - -174.375 - ], - "rectangle": [ - [ - 56.25, - -180 - ], - [ - 56.25, - -168.75 - ], - [ - 61.875, - -168.75 - ], - [ - 61.875, - -180 - ] - ] - }, - "value": 4 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -145.57611141353846, - 68.11608082149178 - ] - }, - "properties": { - "geohash": "bu", - "doc_count": 3, - "geohash_meta": { - "center": [ - 70.3125, - -140.625 - ], - "rectangle": [ - [ - 67.5, - -146.25 - ], - [ - 67.5, - -135 - ], - [ - 73.125, - -135 - ], - [ - 73.125, - -146.25 - ] - ] - }, - "value": 3 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -171.11272992566228, - 63.72657997068018 - ] - }, - "properties": { - "geohash": "b5", - "doc_count": 2, - "geohash_meta": { - "center": [ - 64.6875, - -174.375 - ], - "rectangle": [ - [ - 61.875, - -180 - ], - [ - 61.875, - -168.75 - ], - [ - 67.5, - -168.75 - ], - [ - 67.5, - -180 - ] - ] - }, - "value": 2 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -174.20635032467544, - 52.220348292030394 - ] - }, - "properties": { - "geohash": "b1", - "doc_count": 2, - "geohash_meta": { - "center": [ - 53.4375, - -174.375 - ], - "rectangle": [ - [ - 50.625, - -180 - ], - [ - 50.625, - -168.75 - ], - [ - 56.25, - -168.75 - ], - [ - 56.25, - -180 - ] - ] - }, - "value": 2 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -145.76861112378538, - 18.1244444148615 - ] - }, - "properties": { - "geohash": "8g", - "doc_count": 2, - "geohash_meta": { - "center": [ - 19.6875, - -140.625 - ], - "rectangle": [ - [ - 16.875, - -146.25 - ], - [ - 16.875, - -135 - ], - [ - 22.5, - -135 - ], - [ - 22.5, - -146.25 - ] - ] - }, - "value": 2 - } - }, - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -123.75373472459614, - 39.26203776150942 - ] - }, - "properties": { - "geohash": "9n", - "doc_count": 1, - "geohash_meta": { - "center": [ - 36.5625, - -129.375 - ], - "rectangle": [ - [ - 33.75, - -135 - ], - [ - 33.75, - -123.75 - ], - [ - 39.375, - -123.75 - ], - [ - 39.375, - -135 - ] - ] - }, - "value": 1 - } - } - ] - }, - "meta": { - "min": 1, - "max": 715, - "geohashPrecision": 2, - "geohashGridDimensionsAtEquator": [ - 1252300, - 624100 - ] - } -} diff --git a/src/plugins/tile_map/public/__tests__/geohash_layer.js b/src/plugins/tile_map/public/__tests__/geohash_layer.js deleted file mode 100644 index 000a0e16dd16b..0000000000000 --- a/src/plugins/tile_map/public/__tests__/geohash_layer.js +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import expect from '@kbn/expect'; -import { GeohashLayer } from '../geohash_layer'; -// import heatmapPng from './heatmap.png'; -import scaledCircleMarkersPng from './scaled_circle_markers.png'; -// import shadedCircleMarkersPng from './shadedCircleMarkers.png'; -import { ImageComparator } from 'test_utils/image_comparator'; -import GeoHashSampleData from './dummy_es_response.json'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { KibanaMap } from '../../../maps_legacy/public/map/kibana_map'; - -describe('geohash_layer', function () { - let domNode; - let expectCanvas; - let kibanaMap; - let imageComparator; - - function setupDOM() { - domNode = document.createElement('div'); - domNode.style.top = '0'; - domNode.style.left = '0'; - domNode.style.width = '512px'; - domNode.style.height = '512px'; - domNode.style.position = 'fixed'; - domNode.style['pointer-events'] = 'none'; - document.body.appendChild(domNode); - - expectCanvas = document.createElement('canvas'); - document.body.appendChild(expectCanvas); - } - - function teardownDOM() { - domNode.innerHTML = ''; - document.body.removeChild(domNode); - document.body.removeChild(expectCanvas); - } - - describe('GeohashGridLayer', function () { - beforeEach(async function () { - setupDOM(); - imageComparator = new ImageComparator(); - kibanaMap = new KibanaMap(domNode, { - minZoom: 1, - maxZoom: 10, - }); - kibanaMap.setZoomLevel(3); - kibanaMap.setCenter({ - lon: -100, - lat: 40, - }); - }); - - afterEach(function () { - // return; - kibanaMap.destroy(); - teardownDOM(); - imageComparator.destroy(); - }); - - [ - { - options: { mapType: 'Scaled Circle Markers', colorRamp: 'Yellow to Red' }, - expected: scaledCircleMarkersPng, - }, - // https://github.com/elastic/kibana/issues/19393 - // { - // options: { mapType: 'Shaded Circle Markers', colorRamp: 'Yellow to Red' }, - // expected: shadedCircleMarkersPng - // }, - // FAILING: https://github.com/elastic/kibana/issues/33323 - // { - // options: { - // mapType: 'Heatmap', - // heatmap: { - // heatClusterSize: '2' - // } - // }, - // expected: heatmapPng - // } - ].forEach(function (test) { - it(`${test.options.mapType} (may fail in dev env)`, async function () { - const geohashGridOptions = test.options; - const geohashLayer = new GeohashLayer( - GeoHashSampleData.featureCollection, - GeoHashSampleData.meta, - geohashGridOptions, - kibanaMap.getZoomLevel(), - kibanaMap - ); - kibanaMap.addLayer(geohashLayer); - - const elementList = domNode.querySelectorAll('canvas'); - expect(elementList.length).to.equal(1); - const canvas = elementList[0]; - - const mismatchedPixels = await imageComparator.compareImage(canvas, test.expected, 0.1); - expect(mismatchedPixels).to.be.lessThan(16); - }); - }); - - it('should not throw when fitting on empty-data layer', function () { - const geohashLayer = new GeohashLayer( - { - type: 'FeatureCollection', - features: [], - }, - {}, - { mapType: 'Scaled Circle Markers', colorRamp: 'Yellow to Red' }, - kibanaMap.getZoomLevel(), - kibanaMap - ); - kibanaMap.addLayer(geohashLayer); - - expect(() => { - kibanaMap.fitToData(); - }).to.not.throwException(); - }); - - it('should not throw when resizing to 0 on heatmap', function () { - const geohashGridOptions = { - mapType: 'Heatmap', - heatmap: { - heatClusterSize: '2', - }, - }; - - const geohashLayer = new GeohashLayer( - GeoHashSampleData.featureCollection, - GeoHashSampleData.meta, - geohashGridOptions, - kibanaMap.getZoomLevel(), - kibanaMap - ); - kibanaMap.addLayer(geohashLayer); - domNode.style.width = 0; - domNode.style.height = 0; - expect(() => { - kibanaMap.resize(); - }).to.not.throwException(); - }); - }); -}); diff --git a/src/plugins/tile_map/public/__tests__/heatmap.png b/src/plugins/tile_map/public/__tests__/heatmap.png deleted file mode 100644 index b355849c117669a114c679c4f30793a863e63aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87025 zcmY&o+{!LqU8Qe&z!QAr2{XV5FD zL+g`Isejg73RT4v0Ni2bFy{*+$LO6YpC-{Ui7}d&VfC! z+M^`{;@|#T=J0r6n^AQd)*)yv5tSHhD)lVVh~GT4g~UVrxr+h5Eek+l)SBQ|1El`6%`I(rqwxb z+prCQwYYeo{%#CngCfxK2**iffCYR9^@q7>H3Zb+a&`D*eRa@wX7sM`XM(m zbK?os&}ir5@1PzfyiKPK8W8o4aIfp(F7)JEkAHsYxAF5%S8%$ia6>QE*TqbSVN<}e7LL~ zvvWynmcVWdjB`D_N^ME4rWE*cFHuP0p9I@15V!qI*=hchps)sZMAePomx@ya2@q)c z8-W;Dp0%)^#)d22DRxT6xpJi_0!42+14LfE0pD5m*M1?av4tyUT3U%#1X}~DMc5{o@#ufB40|aq3Sz=e3dw^i9{xka#HI;2+yQX1 zMDBx$Ce1J82~}7{V&|GhilN3p45M#Ltf0`+nyGL_> z2E^6U0`qoJ@!_I&)Xtt4%*jeX+S+4>psi7XX|46qaFHHy&o?7Q(D$Wkh6l8En}|ML z0EOwFxl|Rh^Ms!{0M>wX32N{VeDRd$-GOkJDtOrljxn;D1mDrR@MS-~tbp zXyHKXy-^nyd<+1khq3(IS`_MaMY>>ydH1L+LEBL6*4PdtJ({3S0#r5E#^6d!|KAG)e{G<&1o{l;2J(k79pgyFTT%*Pqfh|T zA6*-0Y9{PYYcvERfBs+msQ-E*kq`9DrTuQ&wg#;U9G!l_L^8$U(IPj+f)H~g;7b=M z%$*%o^(W-WBbUUXxXB-$%K&D-_eUi|@f=7}(cZ2gVB14R?3*mX(Cg2BJzheyfa2O8 zGCITG(N@qx+xML-czg^W-Ni{6zICE!mJ%eZp57q>s&5}@I#BtadoTT^j1eI~uEgCi z5%zX!kfSA0?au(&EjgcKhF25Y2ofN_R)>~zz{t|Rfpfp%oc0UOa{fm;lw(l72JUNV z2uiv7Zt{wF!3{~UIh~>wW{%N5qCxu{VFA2Y$OQiX*8!ku%pTlN-7WZ251)gUFqTM2 zL;ZuX{JWzr+j{st;I=vKJCmui_H7mK7RUZvy(?I*7@7i1pVG=GE#DeWu?b3gEHeT3 z3cL7jpKbcL^os;_G#MNluhSf!6B+lT*nH~>u4xv($0!WyKwz$@)79r**a!yI^cW` z6!OEa{^PzLL>$s2_d+z$C?P#UW-NDAuED&U4ZZ#>o>_r39UKwT!45P z?CYN}Ta-kwffT3wJEY7QL?}Ev0vduBm)FzofK3;t?R+ROpV6{u++o zIRb4Y(GA{hK>%cgM#t9FbF%vKFDp?n+L7|Bpq`b*a&AM8#C-%^ZUT|F7dcpO2nx8G zH2=!~zm3(K!b6~B@V1&2*@l8a2tKv&Ki*_LIW_V+5-=SBRQNNY^`FGv48GmL zlqs@X45%vB$H9vA6$t`GW7#dEB@m5vNP!VJFB07dmD zB!IntGuw=MWXoUw161bbboo*pFDh@>T37N@3t~((v+suZ(wp50?Cl*` zQCz@ALgex=RDV@EXh~|2QV*&yey@cjmw&st>7z+TGYa?0e>Q8scz53d-))c8wgJE2 zuWaKv4JHo#bU8o0+f0_tJNydgxSq-ky?~5Futlw$KR2MQwu!I_MC)= zwcN&O`|VhL#FCfh@tHN;!-;Rdp^DHY+~l*QOh^*l6U1)YVyJPD0$N2}FCAPYc;p9W z&~IetI=hh?D}WBwN1Xs^XkD%g=lT!lzZ`Yp4CS^9O;bImI$v%5ox;_WBX?L$6Jk>& zcm(R+NrCm%-x=BjP6wG|u58I^fi(AG$}P(nD}aHttsg#z&?Qc4nPt~sH=!e-$_*mvM?~HYPwqf*w*`0+G_AIpF^4W;-S8B@od9L>7!L_BY#*09vMcLi zTt-XNY4AZ00xGs$PwsrvH(L2`vb5B$OtmDGGbJ#=TOP^}1_TMRvTY0XIk$~kz59%u zB5TKrj&4n?Nwnz)G`C4~-xX5rKm)N71gz1!TdO-^+~_JiOq>h}0XxgCnm+!)aq~H@ z94HA6ROAsCgC};CL|+GLw#U8v2yjXiGUM2QpZLOp`Kc4OhyP7I6c7MF)=fXCD& zZCyBvhYK!oEu`IaDnv0RwoagkNyBLan7cZdrnxFUuC@0j_Z--0TC7~of9JZ>EO{Ue z0rWG!PYD4NAOT(DwaJI|d-$D9zN zHfvno$PltU$DW(b8$=WL1!k29*@~s9E+(uQ2?-U~a(s}dXcL~w#W`O(ZbU|cjD8Z! zNdY_GP-#JCNoy=XJB#i{X&&zm7c|vGx&7#;?N$lvGC!5`C0whpo|smvwZt&LQ$-nk zx>r7!&%+fxxbP?EGpWe#BYXy#;Aa-Z<3(0`I=$=C$>4wu{t#dR`LeuNA~5yFBR6Id zfw70HCU+47$QukwED;|kvUPqRyAv1*I!Jg0lLys^n@@?Em(h%=4}_U(KDxl>d~PQT zx-NA!c)`UQ^e=x5s^>+y{{!6HixNbv{*PN9e&4$&TnAKu(JqGJz;c^P%Im#7HpSY#)yX$A7%~oNQ>a1d)QWj_o`>@`6X|vk@LG)ArUG0?&{* zB(|w>N;HHA75-Vf9GcLnK+1|TkQ4!(H~+iC|4y5S`_4bO-#7yDgyF_> zx(0w5DIEG#{h$rGv=0`jv6w*XL$pnuO+0mBI}J-#TVab_d-G4hz*DFO9(pj>6 ztgW4s2(Sf9fz5s2mbVvaU@okLNe-Q+0RGVJLeJq*PkR$_@vk+X1eX#FfZT1Ooe0&k z{Nj{Yyn0OoC?N3B;=$j+W-nZ0SK#qoe#U}1tF{#x{AuaW1wlxQ0`u0kOxqR)_C6+E zs5{!ZK+w;j2DshbaS%kC31JQWN%v=dwu-t;Wy2Uh#{QXVjBmhd?tsB_&YFSyV zzyRdT$u)kjx|a-&fVCT_7z!&{jZ)ZOMKS3D(>Xw!@g#`HNY4O{I^L-S!>B){oreSX z4j>&8WH~Igp?^pINZ5vC9>NF`)JusMpx6EoGmjgaDsQ;Hi7(}J{jez_v0e7@VyVa5 zBF4i%oTM7s1JQuUz;3}O3ID5_DReK>TeBW196 z)e-us{gyRVwr}S;UBOdGI#k~M-)pZ`o+StnT(=#c$#;0eUJj{B4bYfnR^=ZmBXVoba-c@?M@R$V#&#LtE*JMhO6U-1F~YTF9FdvUQ_nN@?O z(%eDJ(wOuEwuY`L04yrj`zXy1KSgooTw6%&Vk{0e>`voRr#>3Kr(&M^Te} zLhA!K2SJezJ1D&Y&q~KkfXs`^gV6dqb*N#G5iOWbNnuNm7nMG9p56fR}Flwd_B$LodRA6&Kk$B|(Pz zfFnE!X zEK|z1A$`$Z`BZgfY$SMndZ$qMCLV_6rP4s$ET$3Cll*YBgxh7wFo2?<7x#b*Mj}ma zkj4VTq z@+F`Ckn{i2Ql6Gq<*o|k^)AZObaf9<4Z$8}gSlD2toNZ85sMEB5J*3sOELerl&lp- z77znq*-z}Q_&H&+0`ht*Umtb%!2`93CYxiF2S08pC*A;l4Z z_eCO7P+Ru~kBW2uP;qy#4;-L_;{}Jl#Jy63W8#`3MZBpTHyez}^&lr|ya10kTXM$q zvdwVDvfEOovIG}rvOFjgm?t*10I5(npQ2R^b0OJQIyre>wAO-*SoM71VXHOU4ZIGowW_&%%rr^hP7FH|{N`JeqYxKYMsXg3I6dkHy zC{~|8+usosnM&wC8G(=7!BUO_NCglH(gO2zDDXuAs&E^dnNge8>uKnz@@gsq0Or)+ zF`mX?RY2&u$C#!_4)S;=U~ri{Z~t3L$mFRYoJe1X3B}TOy}8l*z#yUw+nQo*kPc<8 zef_KR@>O8vqFvtGt>~sLASnSK4rm40f?_H!;HI+M-aRsq7H<*ZtACeVKe)5S!1FxG zrZBI(K5N!tj;&w4r3ScdqHb~vyHw!?@vY{P)&jg+3TeW!WU3>b0ihVl4Y|8~yb!v2 zA&fmV0;P}35A^=FEtgkpGrzB1vx@-ZVC`9{t=Q854a8NQ8zr@r44?Hniz^`nBYw(^ z>-wBfp+AD*_&JDVlp1G&FYGZSqUzdCrf}qG6itXxu=x_r_i+k0=p^to{NP#%m}3-@Jeib-+astGES=H~;g-MG~Aa{IhXDm|*u!AyHSXApVhd6{P2FvA(!1F(M9M zB^~G(V63|BTxqzY4K^|&Z@p;H)vb%}}tM`lWlo71%9enO@Bp&1;Q47EM zfHg|=9CVy-QUYn6rdAe>BIV#5k(lwrf!2IvCEJBdn=)|T8T(@p`<-iUO+BABfWWtx zbE@{zubuHB{gzB_{?aeCFYm#Ckxo%@s&{Zt>FFN8DC0D!Li7~4F*QzPd)Qv1;(s#7 z&6Z()yH2h19Q%YypBqlD-Db*GuG78ai;YF?+3P6&UF#8`wL%Q#&!0 z<-tq0?|O%=8<7)VW@oSoer8~KaUVla)>Mh`6#A;4jA6+I(r&$ zETzT^JJ3hNbqajT2NVc*IZZ{st0_GmDK!`RzM&t$D|g4q;P8aUL!9hCir%yK+Ndq4p<;nE{Vj`=ZD)yc76ZPx@YFRW9tvl1!fM~ zbW_$1(bOZHkN zqRTVutuHowyNbE(bs9?YX=_b9$)5R#mDq!ATex+_k%=sP5j&KM4&qL|fpUaTg^UR9 zXGwOTX$x*Fls~iLBB+;A&lf|Ig^xkWbF|DILyR#nqjTV&N=2h3Y^1sfM`l{LyOaTlj(a5<+IhfU2CNA=PM#1RCF*G zTgp|N!`$TO*nl{W;G{K=2Y>@@UY0mCLgJ74V2RWIrF+o*e(49Sz7R}B(C4E4@(J41 z4%4Tx2-!BT_gWW$`1kFuMFzk{wufp^VBauF34CZ)6~uYiNLiI=#&HwZ{U|F!&=o)hv&W*tiocsZ|3AgZUbBevdQkom}Z0TI^ zB*v!13l>Y@d_Kon2zaCbUI$d;f+9x@cP&9=^I8AwL^BV!Us*#E8=7A0x+L;GM|3)e z&}%^Om!g-}D*{rb1$R>4a73s+Pg#eaBoT()i&hVY7<-*C!#&Z~h}@Gpa1c0ZRJ+c% zvo#|ek2XfBoCY}6y)V!rD}|X*@+uhk;o}WK&J@HGZV$C>ZFFP!YPG}(Zr(Y!6V!@< zhSWRf03$lFLhiTLb2%M=lCPUx;EJrfJ8|0%P&bEb2&}d_I&CKB!R#h#F1AI{I=#U& z(pb6>ic#4W?mw}`i-MQs>{y$>%@F^^USAmc9t4~^02;5!K*3DNES=>JYyd+L+q*z5 zl-j<9FOvbSwXN8kPL`+D5E}ZqCwYEx=Vs(588FlQ(|pWtHF0k;FGw6cJ_-)RSX4x$N9H$*&!I}YF&E~FSQQ#^k&q$Y>C$PLvT^NfG}u4kWh>co*7fjQ+o$3oi#w3U z+bqj$u>telpAG^6H@X>UN1>0zz!s2TIJ1IX0hMnaBsM}qD5-

R{amHEp_Xs~Hr>KaJW1ev#=vg=QI&*T}15>o3`K)CWxzS*HmBQh~N| z(J*_?_eXD1WhE2=kuWWt{jx%MSoB#2hIjR(_R4-D5e?3^+Ljsbw4Vm)wd@4^aD z+fD71&~Gj2_%jPY4Mu)mnwqNzqmD-OmQzYklovE`+Am>pow=P`ax$I@2l)OSkR_yb zRm}Y+2nTrtf$W}Z0KlfN*D3L(?Ug?gwQlyAsLnbI7_54j)&OZHXhjiT!x%E@vN9?- zjqj&#{_kYK68g){Tf;jC)UQZ<0902lkjq3 zc+9V6@!xhC387E9!rL-Kbqfoe*dt2*RhM@h1Cop}15%(Nbkd&KN=mRkLC%Hc69lN< zbb7;m04)|JrUTprf%>;R{ao6_wF*XuNIm?co;5nchcGMu6ZpnMb>d&|PINvAlNisa-P8vYj8O4;874{*u)PIU82x%kg|19(0xwqN;k?$GaO>Q% z#N&ohk^77~pEr@N|H^(PR^+m6S7lNTfYu)4N*A@WzqNfwpMjQfP$+a_N#m+xAjxGw zse@PDSLDghVee2o{ApSAZApSB!Ur25ac9ahkn}sHOTv$ra>WHScLTUJPrt-A3~aXO zBDiYWOo1TsQ#U_&X0QBag0qhnSoI;R28ny3Qg)r~Gl+bcES=Ls@}OrWW{C3Y$;6t+ zN0%OKDF4bqMgs6hm$>im8RW2fHQy`E$>BV1ZjzP(oiePka>>uaVJ!^<$hMNu_E~jm zFcJOP{4cYvkoOjz*N&b@og0@jLYBGlF|{t0%*L4e#aO!LDCQ?N{B4u`#mL8sK7}Ik zz2scgz~3PY?RN0O^$OXBOQ`bXOP*j3?XomHrB7r0n0JZc-&PQ_Q3hp=h8ybPJf8=~or~HGy=`%_wiZiGr`E)G045Skmv5lhmc$K)2#57^Dmq zx;7y-?#W2o?KhV)a&{r=@36QvRGVjBN!xft>OFg>h~fKH5-+w8TRS&BCl%YB~yb_Hx0KUaB&n*N(WzHz^SQS({0U% zc*5$I4Jxc}F&&7(+*;ds^l~&@yuK(Dit&@H3^Q>zx-_*`!uK_s`3bd(uvF(Y$JpsiV9Ey}M49)}xjbuZc`6i25Yx&+Mz=l3qOP zQhjdcL2Vl*<&g^q#o}g%kUF{Fnn)z*;$cnw!BtvHQPjv}j1LG0AJ5S+>UwawhI4w< z0Cn3eYWapMt+f!&_V{0_+HilD^f zgoO~lpDS8|uL=iU22n`*VY;Wwa<5j%T36#n#afYF_h;tI_JED7!`#D5ly{+(BT|pc zzVB99^VXy%zbYsH$at6YniWsX68-uj%V{F;M_1kKQz|NjDgpD=*T;D!(|CO}jHkO& z$+v_@UJWM7J&g;9xzUn-scw7iIm4^I!NZB>@d+=@sDq1BPK+icQ=56zhrkby&V~=J znq)znXRfE`UNrP&&4=L^(u{P9v~)&5bnzwH_v8AUlSsVdVEt3nE8QOnqWqC+@Q@pPUqD`B@pcMtLSIF5s98JXb zaUVfD&70$1L?eG7tYRHs$^0voT$j;*`Kxy05xTxmm`}XpgxJd7kiX{Z1H!Ye^*`Dc z`LuZuOmmE5Z6|tyY4Sk-n<_zM+7%H6oy!Y}voCbKJqWWUkH^ajlk|k5`P$4vRh6+~ znQBF|A(o?{OZ=R)^ov)JoyD6O+o}(_YGN+Y8$Mo3oyS6=^LmZ?*6tR%=WcjDPOCsp z3ttPflT!!J8ohpG&u^n^1g?wff;QQ4ofq_J zQf5B)Cm!8!q<867Ol4J8?f2EX6m}~r6z9H{T1x3`3tBxpcwp&CdL?Z$Oj*NTK#dJ!_| z4EBi7Grd!gGFq@O&{W92du-J@ErYM_huG(bTe=oWrelptpb8_q%1D!@Vo`EMUZAP4 zUdo#Wkj+d3D=X0njDmzbze(dYKNKLPcWBPRT1(PIwkp{XSZs%t?N0__N8mm1TLxG# z`|NA{N8F^koEWjIE_uPmC81tXY2c<>v$};<|CByK-%6l1rcx1w#`FF3p=XRw7pvtc zrsmH+$(Xu&FmYg6@F$Gn6$#lR$t_(;wxYkjU3qo=u(*c3nhfD_{OJpqX?8=szS)Nh zh>pvLE{_rmD?;ivQV0f+buonkOjGJb7*fW<(k1#bINN1|H^HOmWbtZ6=3sbXLVo>- z4=Lh7uV?m`DXQffiWg?w z%{yu%`qSbTpZpY(w$|)s4RX^{6*yl98Vpx$cKnVf7RQIC|Z5 znB0(=dDeULn9^f}-LvGmw8qqa!y?oR&Ott#z4VY>4^`YEni2ytf#M4eK8UWi?~LMc zm5^um?DZy+qkGmbDrTfIgz^{C|%1*UMMEK0>`x1v%kxN8s%ud zP7H-B&uEja?y?o@6wv{xrN6h%@Oinrq?~QS<4Kl#EO52UE0Qb2pT~5A_KCG72zZgE z+Z@zGVT4#6s{4`>~PU<32Osas2p8GQLWa{e2{6{{~ zWr|oO&ALKAJ^9&U?AGm#Do3l6%{uol_g9sBI*ctVe;PQuM=M1~F{}4Y1(F<*f7Dob zWY6^1+hbEaP8=A`W=t505>%22))}SF?x=QM3cCEx%D1aY`sPl3tpd!3#;PxfU=Po! zkiI5QC3JpPknw93-2#j}@v<>N)y0vgpUpU%0eW$SAyY!~onj?y?z$8Ex&= z^(dhd@C{fnIv=uGI5aV}$MY#RZ{m?SMY0xR*gljNVIrz(l6^(1djtO@DD+1fuF4YJ z1^!rY&cFs14`+JBBJVxe=PfsDp0bhZC~kBBn=NcA?;-Y5Yfb+&Pl*i%CO+0sBmxhP zPELR7jQsfe-`4j3O@$jWCZh#!osiZ5GaPIYWS;}xEUhB1SJlJfxuv`3k$fTtWBi}u zsU3#K!m8n6;oywh(UtCEe_8+Q6As%xoGM7QD}^(az=SF?_`|G=TjQoR>LK$m5@%{) z7X2Em56hPN#;R=aH?d4jO8Dex7FPX9fLS*eG5Q)4Xc|-A#BAKqE=|oVpG`%rEO-qx z)MYFdj0}ut^@C657qd4WS)EC4I-Ih8L?Gg@3htFTHXg$_kMg2-lCuwoGV6#s_E_6hxDE+3k56kCUypxFPW{Q#ZnnM{Ookb*G=rxYf%z%QWFmYcWU#HxUl_&g_I4(&Co zVC0(_b3$siT{c45VeO6M5`%i!!W!o6I2tT!^J2`H%DTUC3LSf}=^y5Wv}WP$Y`30~ zgun!Iuin^(c{R9>eJm)@Xiu37nA3Z+;sWE5tXy*4fV1D?>YMsZ)>xBG^Iu8dMeGdE zytH+bN+d)Z3m5LyP9^ScFZ73Ly8B31?o!kMPZ_L>vn)jP=(!&G1wBC&$&!AHBG1;^ zEP|NAv%?Ewn?dp&Mo$^n9rg|st3FR&%glRyeRN(1X;Jja=AFu^2Jog!M#sgI?@Slk z8$ar}ewLacG}U^?MNWk8Beu*NhOjR}*CiB}6d->;1h|$>QWvRGJ!uRd)A!!3=)#FS znqY)u&55;~vtZSUTJTSIR!)z9*JqKWi3(r5eBAqWVGa`NKcJMFJjXrE>zYBX$#hA2 zfHPhF(^eMS-R|e+VPAyS^P+RHI-@l!7WYMnPS|<0zqL!Fpvj${7nQ><7Xa z^$MG6=?ZI;XLl&%vMh0--@&hsBo^fY>$R(lC_r+!T^fTfV-@E;S!sAjx~2TVB;eOp_GArStlm ziM)ZKQ_662tKuLw_xLLTC*x+slDP$z;mc3IHZvJnY<_C}uC$QSQqj1n=c$-RMt><# zw12STWaMZerb!W+%PD{1S$GSJoKdUBj=Y>dn&yTj`5?JboU|AXJs-eWE>0VFeGT0r z>N=yJ?eCGcalHX+1$DZ+{oa^<+&=5DR!%_WNXEKBxFXsw^;}j}xFe-T6MVuaV?AbW+K@Qmsuo`n=ek2VoH|m4Axsxqm44+b&4MmrMiKYiU`z3yI%IxXO_kK{U?7HlR~`eBlgOO6}Bl|87@x# zdGN8gRrc9Oi@k=yPZPhNoJ*wXZcG8kr`tDJZ-_cnDzLD=3WDJ>L zu`ddF=H|9US z)>{XYr@8NfGb?@e$b`-;rA4WtqMnYYs}H}O_r6FF#Dsh5Re{-do-=B!j8@#MC*BXh z12t~?8e!_pFHaHprbxc72$1QR7UH@|lq%K9Wv_Z6!DtREOKi_fLVhISjrqM988MoW zt$}5d1e|#&xVrF-OGCb6l4rO!I)6j!!}r!!G_ae1?v7LdBf@BTZ{HiEIy6t6mU(IU zeT-wxU)FB-ze6L?)$605Phrswd@*ue%jF3_Lm;q;%m5cP-12*j~xYZSrlLt|SAd87SmE$3?SUy}E`zfb}#Zcc9nMwq$v^%|}wXV)t) zTUbT#Rf8hEYAg@V)XDr?KpiDTLj|fUn^s zDmOR=?ej74E1N1n4b3Vs_)^?8AEt5`dzGVUmfeexnF`sn$A1zUBl#v3sG3FBHK1}5 z+0e+NjC%03e;hyNo*%CmNfUhY9nUxD;tjCkf$>n)EAv-Ia-{P(U1kei5f!!B^?G+1 z1V(!yiXpi_nxd$yL|w!*s!{~bgE_PNeombQ_`}SQJBcE5!Z+fm10TN=Znazs;!vL&Fhs2B6+e zxcF;w_LIlv?){Sq^4(S9%&wm?>FK-_|I*%kfxzH_W_mkNU)-DMcW+Ke*@FAi||!7MWatA(fYs>bgE_P>UOi z=soWDBAZ0vVJDfCpZ6Wh=|RyV{w0sfF{HlSG8U&)$$S7jU|q9n=& zCrX4zAEf|YWXfZ;zxVts+L--xx^b$Mu{@75 zZk{-y^i63vCjxi8&qy=nr0@DR)4Xi80$s45rU=n0It;_yqC>j`%~9I1d#CW2{&$dQ zgvhi3I9#TQ^!@8yWE3WGtL-Wkxi3GB5=joTe~xXhS`ny@D-mcmzj;u!gb*^scW>lKYVn5GFXPE_9Lb# zqD1J7)KzRNP5icH&bcOW_%rV{(m(f08K#&2)ul4V-|crz%ef$hm2uhMkSe8+$s-N$ za2tCa-_V~A1TZH9GejLUpM`#%U-B4D%YΛ@$hcZ?F3D+~o84oD&^_bppDOBflR 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≻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 Q&tU)pPgg&ebxsLQ03Wch;{X5v diff --git a/src/plugins/tile_map/public/__tests__/heatmap_raw.png b/src/plugins/tile_map/public/__tests__/heatmap_raw.png deleted file mode 100644 index 6737c9d0dc8073816f4566523d515995200b78ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16071 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

m6%XZLoqh|8xrLCaZWO{LZm;Y*$ZrwUs2`n~Ls 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 diff --git a/src/plugins/tile_map/public/__tests__/initial.png b/src/plugins/tile_map/public/__tests__/initial.png deleted file mode 100644 index d108407c5838878f466470753eae908f218c0bff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14011 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 E561!B@Bjb+ diff --git a/src/plugins/tile_map/public/__tests__/shaded_geohash_grid.png b/src/plugins/tile_map/public/__tests__/shaded_geohash_grid.png deleted file mode 100644 index e0b19dc61932346d404040124bcafa448f502f89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10196 zcmeI2eNYbR|*lU67oVraFcDv-M40b&b-Zi27^V#MT{Oq)&uQNxP?Oauf9B)JVF2J&*Vn;Y6~f9#x{{j+o2{Ud+; za_@O^@9%k@@8^4;+~0i?9kJSNgBuQqTfP6|eZR)x9I3XC>k8zX7ygmI$Kmj}{rlcO zoSmqaD|-}%1hE#%Op2)mx%z11tuNX#+UaMVSPgHg0>b2%`nSBbzC?HJ zq;rhNRUeZ}bJOVXe0!Z|o5xcc9|CGz}veTBH-xqQfJm!}7{cGcJ_NBhwt;=*d| z5Vjk(vcYPj2x|vS956k^=zwAr(ZggfDzMlEnAP_`TWH}a^z?2&@*cjafA;(N@1;{b z3NyXBaUftj)o7A+$Riox{Nw8}Q#l}b0M%31-G2`6CYriQw{ORvu2m}J3ZTD!PcKNy zTpTJ7D}27#!EY~^lbKBsmY~gQAS0Ddr{4qtL*G-rKDWR!|Hq*nduETC^X#lXwyC(0 zlBN4WQ^lO_Q`AhnwHclx5O$~O?&&&P3-rT2fOVLZ0Jia&Cw3Xkyf_#xV=2PAfjny% zzy8*!ROgMkVWPrBET!3>f8AxUhr&sr48-bsD@&*V& z>uhGOc-9e#s^iwd&+e@!*Tnl*wwK76Vs1ihaDM)6>zE(1R46pFW8yZ@`p6%!wsQ;8 zJG;BOs6K9TCeLZhyYwn$}ZIRPmoiyva%SxTDY5~QMC-s z%~cZkS!tI*h+(fWr{XNii%^-1Op|eHI9{@jDicxz3xcC$1h4jzNA8u0v0+Oba%8!0 zZfXSxjQ=>%BaRVkd`a_Fo27cn>Gv*nCFaZwY-3sqfJ#(B4tpniQ_0aWP3pb0Mj82O zjq{`uo)%?Tg#iUiXmPc2Eu*EhJ*;%&Q*SPJ5>nnuTTrP-HuDYjkom6lvp})Sv*oK> zfz*q`_+Pmm)H1wf6)Iw{#)h*4HzctG&+2xf&oRf2IZy_Z^C^R_kEQ72OmVSuNnE|Q zG;Yhsq`jyZukbqWE#K|*t0Z&tjSB7ha_izF+ENDC_9Rtd97{6)_@K!&1iyl&2v6)n0(A!`Bp_lK zk~?)UXga%J%^~s5oPiV>s?yd(&LjjH2(%&7W`0mYt(kCyx$38s<80ZyHzI2O;wMN= zxFL`l`9FsgLIM#NT!a}U!+lv#%RufLX|4ED^G&a#GFZ&oB+(j%T-H`tVXjpx0~R@e z+3W)-m2cS1%&dEWdpl@0Rg!|!RQLWgdAui1lv)7rcLfKt*Z776kl9a@2teW7G|4hY z;=L}JwHie3cG~;f7*rMn=4C=ZD5{uJU~b-4wI7F zI3vFRI`;;7H}j<@hc&uy8}TSeJ)i$#is*-qBL5SGFWDNtK)Lzp4k-gt zsifM5e}_T`N=4gvK$OyCGuK`mM&D9RFI78;y0X5F=HH^*^+{Yf`!|VFwS9&b{)Zys z#cJ7c`}nQ+0m7^K+|z#cw)@(tB(A?^lbu1XhY<)}9b$&sCDP+pc*)mOx>wPd;n%(` zB3{2!H?q1U8A$g@fZ&1ZR`_(P+C!?_25G{!K`j-L89lgZTBgTc@+^VekjS z*&p`Kyt905Cmkq9a>BaS+b4sEki?#fF1H(hr?(O3|6q<+i!$5e^K~B7L(E(|Ve!~4 zVp+rr73)QtQekp~DJljHJF_t^VqC Date: Mon, 10 Aug 2020 15:30:22 -0400 Subject: [PATCH 031/113] [Bug][Security_Solution][Telemetry] Capitalize S in macOS (#74688) --- .../plugins/security_solution/server/usage/endpoints/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/server/usage/endpoints/index.ts b/x-pack/plugins/security_solution/server/usage/endpoints/index.ts index 19beda4554d93..f1ce9d3ad6ff3 100644 --- a/x-pack/plugins/security_solution/server/usage/endpoints/index.ts +++ b/x-pack/plugins/security_solution/server/usage/endpoints/index.ts @@ -33,7 +33,7 @@ export interface EndpointUsage { policies: PoliciesTelemetry; } -type EndpointOSNames = 'Linux' | 'Windows' | 'macOs'; +type EndpointOSNames = 'Linux' | 'Windows' | 'macOS'; export interface AgentLocalMetadata extends AgentMetadata { elastic: { @@ -129,7 +129,7 @@ export const updateEndpointPolicyTelemetry = ( ): PoliciesTelemetry => { const policyHostTypeToPolicyType = { Linux: 'linux', - macOs: 'mac', + macOS: 'mac', Windows: 'windows', }; const enabledMalwarePolicyTypes = ['prevent', 'detect']; From 8f15621cbd4f5fb2c5af8d3972865ba5e0e44ed5 Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper Date: Mon, 10 Aug 2020 14:35:44 -0500 Subject: [PATCH 032/113] [Metrics UI] Fix No Data preview pluralization (#74399) Co-authored-by: Elastic Machine --- .../common/components/alert_preview.tsx | 17 +++++++++++++++-- .../translations/translations/ja-JP.json | 3 ++- .../translations/translations/zh-CN.json | 3 ++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/infra/public/alerting/common/components/alert_preview.tsx b/x-pack/plugins/infra/public/alerting/common/components/alert_preview.tsx index 9d28ef71a5518..877d047c941d4 100644 --- a/x-pack/plugins/infra/public/alerting/common/components/alert_preview.tsx +++ b/x-pack/plugins/infra/public/alerting/common/components/alert_preview.tsx @@ -186,9 +186,22 @@ export const AlertPreview: React.FC = (props) => { {showNoDataResults && previewResult.resultTotals.noData ? ( {previewResult.resultTotals.noData}, + boldedResultsNumber: ( + + {i18n.translate( + 'xpack.infra.metrics.alertFlyout.alertPreviewNoDataResultNumber', + { + defaultMessage: + '{noData, plural, one {was # result} other {were # results}}', + values: { + noData: previewResult.resultTotals.noData, + }, + } + )} + + ), }} /> ) : null}{' '} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c2f180f5268d4..05f709f04aa88 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8830,7 +8830,8 @@ "xpack.infra.metrics.alertFlyout.alertPreviewErrorResult": "一部のデータを評価するときにエラーが発生しました。", "xpack.infra.metrics.alertFlyout.alertPreviewGroups": "{numberOfGroups} {groupName}", "xpack.infra.metrics.alertFlyout.alertPreviewGroupsAcross": "すべてを対象にする", - "xpack.infra.metrics.alertFlyout.alertPreviewNoDataResult": "データがない {noData}結果がありました。", + "xpack.infra.metrics.alertFlyout.alertPreviewNoDataResult": "データがない {boldedResultsNumber}結果がありました。", + "xpack.infra.metrics.alertFlyout.alertPreviewNoDataResultNumber": "{noData}", "xpack.infra.metrics.alertFlyout.alertPreviewResult": "このアラートは{firedTimes}回発生しました", "xpack.infra.metrics.alertFlyout.alertPreviewResultLookback": "過去{lookback}", "xpack.infra.metrics.alertFlyout.conditions": "条件", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 84c3eab8db9e7..bd0066eeb419f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8832,7 +8832,8 @@ "xpack.infra.metrics.alertFlyout.alertPreviewErrorResult": "尝试评估部分数据时发生错误。", "xpack.infra.metrics.alertFlyout.alertPreviewGroups": "{numberOfGroups} 个{groupName}", "xpack.infra.metrics.alertFlyout.alertPreviewGroupsAcross": "在", - "xpack.infra.metrics.alertFlyout.alertPreviewNoDataResult": "存在 {noData} 个无数据结果。", + "xpack.infra.metrics.alertFlyout.alertPreviewNoDataResult": "存在 {boldedResultsNumber} 个无数据结果。", + "xpack.infra.metrics.alertFlyout.alertPreviewNoDataResultNumber": "{noData}", "xpack.infra.metrics.alertFlyout.alertPreviewResult": "此告警将发生 {firedTimes}", "xpack.infra.metrics.alertFlyout.alertPreviewResultLookback": "在过去 {lookback}。", "xpack.infra.metrics.alertFlyout.conditions": "条件", From 4ee483be235ce9a0105d95e22c392e8dded68d41 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Mon, 10 Aug 2020 17:18:36 -0400 Subject: [PATCH 033/113] [ML] ML on Kibana Management: Add ability to pass a group ID filter to job management page (#74533) * handle group id in url for anomaly detection * filter analytics list by group id. * handle list of groupIds * ensure analytics can handle jobid in url. rename util function * add tests for getSelectedIdFromUrl and getGroupQueryText * keep groupIds as array of strings and jobId as single string * fix tests and update types --- .../analytics_list/analytics_list.tsx | 25 ++++++---- .../components/analytics_list/use_columns.tsx | 4 +- .../job_filter_bar/job_filter_bar.js | 26 ++++++---- .../components/jobs_list/job_description.js | 17 +++++-- .../components/jobs_list/jobs_list.js | 8 ++-- .../jobs/jobs_list/components/utils.d.ts | 4 +- .../jobs/jobs_list/components/utils.js | 21 +++++++-- .../jobs/jobs_list/components/utils.test.ts | 47 +++++++++++++++++++ .../public/application/util/get_job_id_url.ts | 20 -------- .../application/util/get_selected_ids_url.ts | 39 +++++++++++++++ 10 files changed, 160 insertions(+), 51 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.test.ts delete mode 100644 x-pack/plugins/ml/public/application/util/get_job_id_url.ts create mode 100644 x-pack/plugins/ml/public/application/util/get_selected_ids_url.ts diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx index 90e24f6da5d0a..0652ec5f8acb1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx @@ -38,7 +38,10 @@ import { getTaskStateBadge, getJobTypeBadge, useColumns } from './use_columns'; import { ExpandedRow } from './expanded_row'; import { AnalyticStatsBarStats, StatsBar } from '../../../../../components/stats_bar'; import { CreateAnalyticsButton } from '../create_analytics_button'; -import { getSelectedJobIdFromUrl } from '../../../../../jobs/jobs_list/components/utils'; +import { + getSelectedIdFromUrl, + getGroupQueryText, +} from '../../../../../jobs/jobs_list/components/utils'; import { SourceSelection } from '../source_selection'; function getItemIdToExpandedRowMap( @@ -99,16 +102,22 @@ export const DataFrameAnalyticsList: FC = ({ // Query text/job_id based on url but only after getAnalytics is done first // selectedJobIdFromUrlInitialized makes sure the query is only run once since analytics is being refreshed constantly - const [selectedJobIdFromUrlInitialized, setSelectedJobIdFromUrlInitialized] = useState(false); + const [selectedIdFromUrlInitialized, setSelectedIdFromUrlInitialized] = useState(false); useEffect(() => { - if (selectedJobIdFromUrlInitialized === false && analytics.length > 0) { - const selectedJobIdFromUrl = getSelectedJobIdFromUrl(window.location.href); - if (selectedJobIdFromUrl !== undefined) { - setSelectedJobIdFromUrlInitialized(true); - setSearchQueryText(selectedJobIdFromUrl); + if (selectedIdFromUrlInitialized === false && analytics.length > 0) { + const { jobId, groupIds } = getSelectedIdFromUrl(window.location.href); + let queryText = ''; + + if (groupIds !== undefined) { + queryText = getGroupQueryText(groupIds); + } else if (jobId !== undefined) { + queryText = jobId; } + + setSelectedIdFromUrlInitialized(true); + setSearchQueryText(queryText); } - }, [selectedJobIdFromUrlInitialized, analytics]); + }, [selectedIdFromUrlInitialized, analytics]); // Subscribe to the refresh observable to trigger reloading the analytics list. useRefreshAnalyticsList({ diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_columns.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_columns.tsx index 9ed87ff9f8312..7001681b6917a 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_columns.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_columns.tsx @@ -19,7 +19,7 @@ import { EuiLink, RIGHT_ALIGNMENT, } from '@elastic/eui'; -import { getJobIdUrl } from '../../../../../util/get_job_id_url'; +import { getJobIdUrl, TAB_IDS } from '../../../../../util/get_selected_ids_url'; import { getAnalysisType, DataFrameAnalyticsId } from '../../../../common'; import { @@ -137,7 +137,7 @@ export const progressColumn = { }; export const getDFAnalyticsJobIdLink = (item: DataFrameAnalyticsListRow) => ( - {item.id} + {item.id} ); export const useColumns = ( diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.js index b274a8d572adb..6eb7b00e5620c 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.js @@ -9,7 +9,7 @@ import React, { Component, Fragment } from 'react'; import { ml } from '../../../../services/ml_api_service'; import { JobGroup } from '../job_group'; -import { getSelectedJobIdFromUrl, clearSelectedJobIdFromUrl } from '../utils'; +import { getGroupQueryText, getSelectedIdFromUrl, clearSelectedJobIdFromUrl } from '../utils'; import { EuiSearchBar, EuiFlexGroup, EuiFlexItem, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -54,15 +54,23 @@ export class JobFilterBar extends Component { componentDidMount() { // If job id is selected in url, filter table to that id - const selectedId = getSelectedJobIdFromUrl(window.location.href); - if (selectedId !== undefined) { + let defaultQueryText; + const { jobId, groupIds } = getSelectedIdFromUrl(window.location.href); + + if (groupIds !== undefined) { + defaultQueryText = getGroupQueryText(groupIds); + } else if (jobId !== undefined) { + defaultQueryText = jobId; + } + + if (defaultQueryText !== undefined) { this.setState( { - selectedId, + defaultQueryText, }, () => { // trigger onChange with query for job id to trigger table filter - const query = EuiSearchBar.Query.parse(selectedId); + const query = EuiSearchBar.Query.parse(defaultQueryText); this.onChange({ query }); } ); @@ -87,7 +95,7 @@ export class JobFilterBar extends Component { }; render() { - const { error, selectedId } = this.state; + const { error, defaultQueryText } = this.state; const filters = [ { type: 'field_value_toggle_group', @@ -147,7 +155,7 @@ export class JobFilterBar extends Component { return ( - {selectedId === undefined && ( + {defaultQueryText === undefined && ( )} - {selectedId !== undefined && ( + {defaultQueryText !== undefined && (

); } JobDescription.propTypes = { job: PropTypes.object.isRequired, + isManagementTable: PropTypes.bool, }; diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list/jobs_list.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list/jobs_list.js index 23b68551ca0f5..f90bbf3cf3fe6 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list/jobs_list.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list/jobs_list.js @@ -14,7 +14,7 @@ import { toLocaleString } from '../../../../util/string_utils'; import { ResultLinks, actionsMenuContent } from '../job_actions'; import { JobDescription } from './job_description'; import { JobIcon } from '../../../../components/job_message_icon'; -import { getJobIdUrl } from '../../../../util/get_job_id_url'; +import { getJobIdUrl, TAB_IDS } from '../../../../util/get_selected_ids_url'; import { TIME_FORMAT } from '../../../../../../common/constants/time_format'; import { EuiBadge, EuiBasicTable, EuiButtonIcon, EuiLink, EuiScreenReaderOnly } from '@elastic/eui'; @@ -71,7 +71,7 @@ export class JobsList extends Component { return id; } - return {id}; + return {id}; } getPageOfJobs(index, size, sortField, sortDirection) { @@ -189,7 +189,9 @@ export class JobsList extends Component { sortable: true, field: 'description', 'data-test-subj': 'mlJobListColumnDescription', - render: (description, item) => , + render: (description, item) => ( + + ), textOnly: true, width: '20%', }, diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.d.ts b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.d.ts index 5f72d155cbd5a..cf4fad9513de5 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.d.ts +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.d.ts @@ -3,5 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -export function getSelectedJobIdFromUrl(str: string): string; + +export function getSelectedIdFromUrl(str: string): { groupIds?: string[]; jobId?: string }; +export function getGroupQueryText(arr: string[]): string; export function clearSelectedJobIdFromUrl(str: string): void; diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js index 6fabd0299a936..913727bda67df 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js @@ -370,21 +370,34 @@ function getUrlVars(url) { return vars; } -export function getSelectedJobIdFromUrl(url) { +export function getSelectedIdFromUrl(url) { + const result = {}; if (typeof url === 'string') { + const isGroup = url.includes('groupIds'); url = decodeURIComponent(url); - if (url.includes('mlManagement') && url.includes('jobId')) { + + if (url.includes('mlManagement')) { const urlParams = getUrlVars(url); const decodedJson = rison.decode(urlParams.mlManagement); - return decodedJson.jobId; + + if (isGroup) { + result.groupIds = decodedJson.groupIds; + } else { + result.jobId = decodedJson.jobId; + } } } + return result; +} + +export function getGroupQueryText(groupIds) { + return `groups:(${groupIds.join(' or ')})`; } export function clearSelectedJobIdFromUrl(url) { if (typeof url === 'string') { url = decodeURIComponent(url); - if (url.includes('mlManagement') && url.includes('jobId')) { + if (url.includes('mlManagement') && (url.includes('jobId') || url.includes('groupIds'))) { const urlParams = getUrlVars(url); const clearedParams = `ml#/jobs?_g=${urlParams._g}`; window.history.replaceState({}, document.title, clearedParams); diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.test.ts b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.test.ts new file mode 100644 index 0000000000000..e4c3c21c5a54a --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.test.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getGroupQueryText, getSelectedIdFromUrl } from './utils'; + +describe('ML - Jobs List utils', () => { + const jobId = 'test_job_id_1'; + const jobIdUrl = `http://localhost:5601/aql/app/ml#/jobs?mlManagement=(jobId:${jobId})`; + const groupIdOne = 'test_group_id_1'; + const groupIdTwo = 'test_group_id_2'; + const groupIdsUrl = `http://localhost:5601/aql/app/ml#/jobs?mlManagement=(groupIds:!(${groupIdOne},${groupIdTwo}))`; + const groupIdUrl = `http://localhost:5601/aql/app/ml#/jobs?mlManagement=(groupIds:!(${groupIdOne}))`; + + describe('getSelectedIdFromUrl', () => { + it('should get selected job id from the url', () => { + const actual = getSelectedIdFromUrl(jobIdUrl); + expect(actual).toStrictEqual({ jobId }); + }); + + it('should get selected group ids from the url', () => { + const expected = { groupIds: [groupIdOne, groupIdTwo] }; + const actual = getSelectedIdFromUrl(groupIdsUrl); + expect(actual).toStrictEqual(expected); + }); + + it('should get selected group id from the url', () => { + const expected = { groupIds: [groupIdOne] }; + const actual = getSelectedIdFromUrl(groupIdUrl); + expect(actual).toStrictEqual(expected); + }); + }); + + describe('getGroupQueryText', () => { + it('should get query string for selected group ids', () => { + const actual = getGroupQueryText([groupIdOne, groupIdTwo]); + expect(actual).toBe(`groups:(${groupIdOne} or ${groupIdTwo})`); + }); + + it('should get query string for selected group id', () => { + const actual = getGroupQueryText([groupIdOne]); + expect(actual).toBe(`groups:(${groupIdOne})`); + }); + }); +}); diff --git a/x-pack/plugins/ml/public/application/util/get_job_id_url.ts b/x-pack/plugins/ml/public/application/util/get_job_id_url.ts deleted file mode 100644 index a6ca575f21b50..0000000000000 --- a/x-pack/plugins/ml/public/application/util/get_job_id_url.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import rison from 'rison-node'; - -import { getBasePath } from './dependency_cache'; - -export function getJobIdUrl(tabId: string, jobId: string): string { - // Create url for filtering by job id for kibana management table - const settings = { - jobId, - }; - const encoded = rison.encode(settings); - const url = `?mlManagement=${encoded}`; - const basePath = getBasePath(); - - return `${basePath.get()}/app/ml#/${tabId}${url}`; -} diff --git a/x-pack/plugins/ml/public/application/util/get_selected_ids_url.ts b/x-pack/plugins/ml/public/application/util/get_selected_ids_url.ts new file mode 100644 index 0000000000000..806626577008e --- /dev/null +++ b/x-pack/plugins/ml/public/application/util/get_selected_ids_url.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import rison from 'rison-node'; +import { getBasePath } from './dependency_cache'; + +export enum TAB_IDS { + DATA_FRAME_ANALYTICS = 'data_frame_analytics', + ANOMALY_DETECTION = 'jobs', +} + +function getSelectedIdsUrl(tabId: TAB_IDS, settings: { [key: string]: string | string[] }): string { + // Create url for filtering by job id or group ids for kibana management table + const encoded = rison.encode(settings); + const url = `?mlManagement=${encoded}`; + const basePath = getBasePath(); + + return `${basePath.get()}/app/ml#/${tabId}${url}`; +} + +// Create url for filtering by group ids for kibana management table +export function getGroupIdsUrl(tabId: TAB_IDS, ids: string[]): string { + const settings = { + groupIds: ids, + }; + + return getSelectedIdsUrl(tabId, settings); +} + +// Create url for filtering by job id for kibana management table +export function getJobIdUrl(tabId: TAB_IDS, id: string): string { + const settings = { + jobId: id, + }; + + return getSelectedIdsUrl(tabId, settings); +} From ae529879f26e415794e5f82bbfac7199b2f7fa55 Mon Sep 17 00:00:00 2001 From: Joel Griffith Date: Mon, 10 Aug 2020 16:07:12 -0700 Subject: [PATCH 034/113] Allow any hostname for chromium proxy bypass (#74693) * Allow any hostname for chromium proxy bypass * Adds a test for the proxy bypass config * Add wildcard to test --- .../reporting/server/config/schema.test.ts | 28 +++++++++++++++++++ .../plugins/reporting/server/config/schema.ts | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/reporting/server/config/schema.test.ts b/x-pack/plugins/reporting/server/config/schema.test.ts index ddd5491b661bc..69e4d443cf040 100644 --- a/x-pack/plugins/reporting/server/config/schema.test.ts +++ b/x-pack/plugins/reporting/server/config/schema.test.ts @@ -126,6 +126,34 @@ describe('Reporting Config Schema', () => { ).toMatchObject({ hostname: 'Frodo' }); }); + it('allows setting a wildcard for chrome proxy bypass', () => { + expect( + ConfigSchema.validate({ + capture: { + browser: { + chromium: { + proxy: { + enabled: true, + server: 'http://example.com:8080', + bypass: ['*.example.com', '*bar.example.com', 'bats.example.com'], + }, + }, + }, + }, + }).capture.browser.chromium.proxy + ).toMatchInlineSnapshot(` + Object { + "bypass": Array [ + "*.example.com", + "*bar.example.com", + "bats.example.com", + ], + "enabled": true, + "server": "http://example.com:8080", + } + `); + }); + it(`logs the proper validation messages`, () => { // kibanaServer const throwValidationErr = () => ConfigSchema.validate({ kibanaServer: { hostname: '0' } }); diff --git a/x-pack/plugins/reporting/server/config/schema.ts b/x-pack/plugins/reporting/server/config/schema.ts index 2f77aff0020d5..33249f20757e2 100644 --- a/x-pack/plugins/reporting/server/config/schema.ts +++ b/x-pack/plugins/reporting/server/config/schema.ts @@ -97,7 +97,7 @@ const CaptureSchema = schema.object({ bypass: schema.conditional( schema.siblingRef('enabled'), true, - schema.arrayOf(schema.string({ hostname: true })), + schema.arrayOf(schema.string()), schema.maybe(schema.never()) ), }), From 6bea373e8f61ca7ecf7cd81e93f7204a4173f015 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Tue, 11 Aug 2020 08:47:26 +0100 Subject: [PATCH 035/113] [ML] Adding initial file analysis overrides (#74376) * [ML] Adding initial file analysis overrides * using common default sample lines * correcting bottom padding * adding missed padding * code clean up * fixing translations Co-authored-by: Elastic Machine --- .../file_datavisualizer_view.js | 73 +++++++++++-------- .../file_error_callouts.tsx | 69 ++++++++++++------ .../file_based/components/utils/index.ts | 1 + .../file_based/components/utils/utils.ts | 2 +- 4 files changed, 91 insertions(+), 54 deletions(-) diff --git a/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_datavisualizer_view.js b/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_datavisualizer_view.js index 7cb545cd5a776..56b81e36f1e92 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_datavisualizer_view.js +++ b/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_datavisualizer_view.js @@ -20,6 +20,7 @@ import { EditFlyout } from '../edit_flyout'; import { ExplanationFlyout } from '../explanation_flyout'; import { ImportView } from '../import_view'; import { + DEFAULT_LINES_TO_SAMPLE, getMaxBytes, readFile, createUrlOverrides, @@ -55,7 +56,9 @@ export class FileDataVisualizerView extends Component { this.overrides = {}; this.previousOverrides = {}; - this.originalSettings = {}; + this.originalSettings = { + linesToSample: DEFAULT_LINES_TO_SAMPLE, + }; this.maxFileUploadBytes = getMaxBytes(); } @@ -129,7 +132,7 @@ export class FileDataVisualizerView extends Component { const serverSettings = processResults(resp); const serverOverrides = resp.overrides; - this.previousOverrides = this.overrides; + this.previousOverrides = overrides; this.overrides = {}; if (serverSettings.format === 'xml') { @@ -185,9 +188,8 @@ export class FileDataVisualizerView extends Component { serverError: error, }); - // as long as the previous overrides are different to the current overrides, // reload the results with the previous overrides - if (overrides !== undefined && isEqual(this.previousOverrides, overrides) === false) { + if (isRetry === false) { this.setState({ loading: true, loaded: false, @@ -244,6 +246,11 @@ export class FileDataVisualizerView extends Component { }; onCancel = () => { + this.overrides = {}; + this.previousOverrides = {}; + this.originalSettings = { + linesToSample: DEFAULT_LINES_TO_SAMPLE, + }; this.changeMode(MODE.READ); this.onFilePickerChange([]); }; @@ -276,7 +283,7 @@ export class FileDataVisualizerView extends Component { return (
{mode === MODE.READ && ( - + <> {!loading && !loaded && } {loading && } @@ -286,10 +293,14 @@ export class FileDataVisualizerView extends Component { )} {fileCouldNotBeRead && loading === false && ( - - + <> + - + )} {loaded && ( @@ -298,8 +309,8 @@ export class FileDataVisualizerView extends Component { explanation={explanation} fileName={fileName} data={fileContents} - showEditFlyout={() => this.showEditFlyout()} - showExplanationFlyout={() => this.showExplanationFlyout()} + showEditFlyout={this.showEditFlyout} + showExplanationFlyout={this.showExplanationFlyout} disableButtons={isEditFlyoutVisible || isExplanationFlyoutVisible} /> )} @@ -317,19 +328,20 @@ export class FileDataVisualizerView extends Component { )} {bottomBarVisible && loaded && ( - + <> + + + )} - - - + )} {mode === MODE.IMPORT && ( - + <> {bottomBarVisible && ( - + <> + + + )} - - - + )}
); @@ -360,10 +373,10 @@ export class FileDataVisualizerView extends Component { function BottomPadding() { // padding for the BottomBar return ( - + <> - + ); } diff --git a/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_error_callouts.tsx b/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_error_callouts.tsx index 7333c96a0d8ea..d869676e48827 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_error_callouts.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_error_callouts.tsx @@ -7,7 +7,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import React, { FC } from 'react'; -import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { EuiCallOut, EuiSpacer, EuiButtonEmpty, EuiHorizontalRule } from '@elastic/eui'; import numeral from '@elastic/numeral'; import { ErrorResponse } from '../../../../../../common/types/errors'; @@ -77,34 +77,57 @@ export const FileTooLarge: FC = ({ fileSize, maxFileSize }) = interface FileCouldNotBeReadProps { error: ErrorResponse; loaded: boolean; + showEditFlyout(): void; } -export const FileCouldNotBeRead: FC = ({ error, loaded }) => { +export const FileCouldNotBeRead: FC = ({ + error, + loaded, + showEditFlyout, +}) => { const message = error?.body?.message || ''; return ( - - } - color="danger" - iconType="cross" - data-test-subj="mlFileUploadErrorCallout fileCouldNotBeRead" - > - {message} - - {loaded && ( - <> - + <> + - - )} - + } + color="danger" + iconType="cross" + data-test-subj="mlFileUploadErrorCallout fileCouldNotBeRead" + > + {loaded === false && ( + <> + +
+ + + + + + )} + {message} + + {loaded && ( + <> + + + + )} +
+ ); }; diff --git a/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/index.ts b/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/index.ts index 492a797f7a2f2..67d5b1176459b 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/index.ts +++ b/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/index.ts @@ -11,4 +11,5 @@ export { readFile, getMaxBytes, getMaxBytesFormatted, + DEFAULT_LINES_TO_SAMPLE, } from './utils'; diff --git a/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/utils.ts b/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/utils.ts index 49ee5ec6b90b0..781f400180b10 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/utils.ts +++ b/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/utils.ts @@ -18,7 +18,7 @@ import { import { getUiSettings } from '../../../../util/dependency_cache'; import { FILE_DATA_VISUALIZER_MAX_FILE_SIZE } from '../../../../../../common/constants/settings'; -const DEFAULT_LINES_TO_SAMPLE = 1000; +export const DEFAULT_LINES_TO_SAMPLE = 1000; const UPLOAD_SIZE_MB = 5; const overrideDefaults = { From 01d8f00b50fdb1ec48df9f5ffa48b6c9c18f6c18 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Tue, 11 Aug 2020 08:53:16 +0100 Subject: [PATCH 036/113] [ML] Refactor in preparation for new es client (#74552) * [ML] Refactor in preparation for new es client * removing commented out code Co-authored-by: Elastic Machine --- .../server/lib/license/ml_server_license.ts | 29 ++++- .../plugins/ml/server/routes/annotations.ts | 20 ++- .../ml/server/routes/anomaly_detectors.ts | 76 ++++++------ x-pack/plugins/ml/server/routes/calendars.ts | 52 ++++---- .../ml/server/routes/data_frame_analytics.ts | 115 +++++++----------- .../ml/server/routes/data_visualizer.ts | 26 ++-- x-pack/plugins/ml/server/routes/datafeeds.ts | 40 +++--- .../ml/server/routes/fields_service.ts | 18 +-- .../ml/server/routes/file_data_visualizer.ts | 22 ++-- x-pack/plugins/ml/server/routes/filters.ts | 54 ++++---- x-pack/plugins/ml/server/routes/indices.ts | 4 +- .../ml/server/routes/job_audit_messages.ts | 8 +- .../plugins/ml/server/routes/job_service.ts | 80 ++++++------ .../ml/server/routes/job_validation.ts | 22 ++-- x-pack/plugins/ml/server/routes/modules.ts | 62 +++++++--- .../ml/server/routes/notification_settings.ts | 4 +- .../ml/server/routes/results_service.ts | 46 +++---- x-pack/plugins/ml/server/routes/system.ts | 30 ++--- 18 files changed, 369 insertions(+), 339 deletions(-) diff --git a/x-pack/plugins/ml/server/lib/license/ml_server_license.ts b/x-pack/plugins/ml/server/lib/license/ml_server_license.ts index 382e785b39ca3..bd0a29721248a 100644 --- a/x-pack/plugins/ml/server/lib/license/ml_server_license.ts +++ b/x-pack/plugins/ml/server/lib/license/ml_server_license.ts @@ -6,30 +6,47 @@ import { KibanaRequest, KibanaResponseFactory, - RequestHandler, RequestHandlerContext, + ILegacyScopedClusterClient, + IScopedClusterClient, + RequestHandler, } from 'kibana/server'; import { MlLicense } from '../../../common/license'; +type Handler = (handlerParams: { + legacyClient: ILegacyScopedClusterClient; + client: IScopedClusterClient; + request: KibanaRequest; + response: KibanaResponseFactory; + context: RequestHandlerContext; +}) => ReturnType; + export class MlServerLicense extends MlLicense { - public fullLicenseAPIGuard(handler: RequestHandler) { + public fullLicenseAPIGuard(handler: Handler) { return guard(() => this.isFullLicense(), handler); } - public basicLicenseAPIGuard(handler: RequestHandler) { + public basicLicenseAPIGuard(handler: Handler) { return guard(() => this.isMinimumLicense(), handler); } } -function guard(check: () => boolean, handler: RequestHandler) { +function guard(check: () => boolean, handler: Handler) { return ( context: RequestHandlerContext, - request: KibanaRequest, + request: KibanaRequest, response: KibanaResponseFactory ) => { if (check() === false) { return response.forbidden(); } - return handler(context, request, response); + + return handler({ + legacyClient: context.ml!.mlClient, + client: context.core.elasticsearch.client, + request, + response, + context, + }); }; } diff --git a/x-pack/plugins/ml/server/routes/annotations.ts b/x-pack/plugins/ml/server/routes/annotations.ts index 3e496eb31dcc5..a6de80bb7e5e2 100644 --- a/x-pack/plugins/ml/server/routes/annotations.ts +++ b/x-pack/plugins/ml/server/routes/annotations.ts @@ -58,9 +58,9 @@ export function annotationRoutes( tags: ['access:ml:canGetAnnotations'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { getAnnotations } = annotationServiceProvider(context.ml!.mlClient); + const { getAnnotations } = annotationServiceProvider(legacyClient); const resp = await getAnnotations(request.body); return response.ok({ @@ -91,16 +91,14 @@ export function annotationRoutes( tags: ['access:ml:canCreateAnnotation'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const annotationsFeatureAvailable = await isAnnotationsFeatureAvailable( - context.ml!.mlClient - ); + const annotationsFeatureAvailable = await isAnnotationsFeatureAvailable(legacyClient); if (annotationsFeatureAvailable === false) { throw getAnnotationsFeatureUnavailableErrorMessage(); } - const { indexAnnotation } = annotationServiceProvider(context.ml!.mlClient); + const { indexAnnotation } = annotationServiceProvider(legacyClient); const currentUser = securityPlugin !== undefined ? securityPlugin.authc.getCurrentUser(request) : {}; @@ -136,17 +134,15 @@ export function annotationRoutes( tags: ['access:ml:canDeleteAnnotation'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const annotationsFeatureAvailable = await isAnnotationsFeatureAvailable( - context.ml!.mlClient - ); + const annotationsFeatureAvailable = await isAnnotationsFeatureAvailable(legacyClient); if (annotationsFeatureAvailable === false) { throw getAnnotationsFeatureUnavailableErrorMessage(); } const annotationId = request.params.annotationId; - const { deleteAnnotation } = annotationServiceProvider(context.ml!.mlClient); + const { deleteAnnotation } = annotationServiceProvider(legacyClient); const resp = await deleteAnnotation(annotationId); return response.ok({ diff --git a/x-pack/plugins/ml/server/routes/anomaly_detectors.ts b/x-pack/plugins/ml/server/routes/anomaly_detectors.ts index 8a59c174eb8e7..c6bdb32b262e4 100644 --- a/x-pack/plugins/ml/server/routes/anomaly_detectors.ts +++ b/x-pack/plugins/ml/server/routes/anomaly_detectors.ts @@ -43,9 +43,9 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.jobs'); + const results = await legacyClient.callAsInternalUser('ml.jobs'); return response.ok({ body: results, }); @@ -74,10 +74,10 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { jobId } = request.params; - const results = await context.ml!.mlClient.callAsInternalUser('ml.jobs', { jobId }); + const results = await legacyClient.callAsInternalUser('ml.jobs', { jobId }); return response.ok({ body: results, }); @@ -105,9 +105,9 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.jobStats'); + const results = await legacyClient.callAsInternalUser('ml.jobStats'); return response.ok({ body: results, }); @@ -136,10 +136,10 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { jobId } = request.params; - const results = await context.ml!.mlClient.callAsInternalUser('ml.jobStats', { jobId }); + const results = await legacyClient.callAsInternalUser('ml.jobStats', { jobId }); return response.ok({ body: results, }); @@ -172,10 +172,10 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { jobId } = request.params; - const results = await context.ml!.mlClient.callAsInternalUser('ml.addJob', { + const results = await legacyClient.callAsInternalUser('ml.addJob', { jobId, body: request.body, }); @@ -209,10 +209,10 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canUpdateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { jobId } = request.params; - const results = await context.ml!.mlClient.callAsInternalUser('ml.updateJob', { + const results = await legacyClient.callAsInternalUser('ml.updateJob', { jobId, body: request.body, }); @@ -244,10 +244,10 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canOpenJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { jobId } = request.params; - const results = await context.ml!.mlClient.callAsInternalUser('ml.openJob', { + const results = await legacyClient.callAsInternalUser('ml.openJob', { jobId, }); return response.ok({ @@ -278,7 +278,7 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCloseJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const options: { jobId: string; force?: boolean } = { jobId: request.params.jobId, @@ -287,7 +287,7 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { if (force !== undefined) { options.force = force; } - const results = await context.ml!.mlClient.callAsInternalUser('ml.closeJob', options); + const results = await legacyClient.callAsInternalUser('ml.closeJob', options); return response.ok({ body: results, }); @@ -316,7 +316,7 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canDeleteJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const options: { jobId: string; force?: boolean } = { jobId: request.params.jobId, @@ -325,7 +325,7 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { if (force !== undefined) { options.force = force; } - const results = await context.ml!.mlClient.callAsInternalUser('ml.deleteJob', options); + const results = await legacyClient.callAsInternalUser('ml.deleteJob', options); return response.ok({ body: results, }); @@ -352,9 +352,9 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.validateDetector', { + const results = await legacyClient.callAsInternalUser('ml.validateDetector', { body: request.body, }); return response.ok({ @@ -387,11 +387,11 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canForecastJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const jobId = request.params.jobId; const duration = request.body.duration; - const results = await context.ml!.mlClient.callAsInternalUser('ml.forecast', { + const results = await legacyClient.callAsInternalUser('ml.forecast', { jobId, duration, }); @@ -428,9 +428,9 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.records', { + const results = await legacyClient.callAsInternalUser('ml.records', { jobId: request.params.jobId, body: request.body, }); @@ -467,9 +467,9 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.buckets', { + const results = await legacyClient.callAsInternalUser('ml.buckets', { jobId: request.params.jobId, timestamp: request.params.timestamp, body: request.body, @@ -507,9 +507,9 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.overallBuckets', { + const results = await legacyClient.callAsInternalUser('ml.overallBuckets', { jobId: request.params.jobId, top_n: request.body.topN, bucket_span: request.body.bucketSpan, @@ -544,9 +544,9 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.categories', { + const results = await legacyClient.callAsInternalUser('ml.categories', { jobId: request.params.jobId, categoryId: request.params.categoryId, }); @@ -578,9 +578,9 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.modelSnapshots', { + const results = await legacyClient.callAsInternalUser('ml.modelSnapshots', { jobId: request.params.jobId, }); return response.ok({ @@ -611,9 +611,9 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.modelSnapshots', { + const results = await legacyClient.callAsInternalUser('ml.modelSnapshots', { jobId: request.params.jobId, snapshotId: request.params.snapshotId, }); @@ -647,9 +647,9 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.updateModelSnapshot', { + const results = await legacyClient.callAsInternalUser('ml.updateModelSnapshot', { jobId: request.params.jobId, snapshotId: request.params.snapshotId, body: request.body, @@ -682,9 +682,9 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.deleteModelSnapshot', { + const results = await legacyClient.callAsInternalUser('ml.deleteModelSnapshot', { jobId: request.params.jobId, snapshotId: request.params.snapshotId, }); diff --git a/x-pack/plugins/ml/server/routes/calendars.ts b/x-pack/plugins/ml/server/routes/calendars.ts index f5d129abd515e..3beb6e437b2ee 100644 --- a/x-pack/plugins/ml/server/routes/calendars.ts +++ b/x-pack/plugins/ml/server/routes/calendars.ts @@ -4,39 +4,43 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RequestHandlerContext } from 'kibana/server'; +import { ILegacyScopedClusterClient } from 'kibana/server'; import { wrapError } from '../client/error_wrapper'; import { RouteInitialization } from '../types'; import { calendarSchema, calendarIdSchema, calendarIdsSchema } from './schemas/calendars_schema'; import { CalendarManager, Calendar, FormCalendar } from '../models/calendar'; -function getAllCalendars(context: RequestHandlerContext) { - const cal = new CalendarManager(context.ml!.mlClient); +function getAllCalendars(legacyClient: ILegacyScopedClusterClient) { + const cal = new CalendarManager(legacyClient); return cal.getAllCalendars(); } -function getCalendar(context: RequestHandlerContext, calendarId: string) { - const cal = new CalendarManager(context.ml!.mlClient); +function getCalendar(legacyClient: ILegacyScopedClusterClient, calendarId: string) { + const cal = new CalendarManager(legacyClient); return cal.getCalendar(calendarId); } -function newCalendar(context: RequestHandlerContext, calendar: FormCalendar) { - const cal = new CalendarManager(context.ml!.mlClient); +function newCalendar(legacyClient: ILegacyScopedClusterClient, calendar: FormCalendar) { + const cal = new CalendarManager(legacyClient); return cal.newCalendar(calendar); } -function updateCalendar(context: RequestHandlerContext, calendarId: string, calendar: Calendar) { - const cal = new CalendarManager(context.ml!.mlClient); +function updateCalendar( + legacyClient: ILegacyScopedClusterClient, + calendarId: string, + calendar: Calendar +) { + const cal = new CalendarManager(legacyClient); return cal.updateCalendar(calendarId, calendar); } -function deleteCalendar(context: RequestHandlerContext, calendarId: string) { - const cal = new CalendarManager(context.ml!.mlClient); +function deleteCalendar(legacyClient: ILegacyScopedClusterClient, calendarId: string) { + const cal = new CalendarManager(legacyClient); return cal.deleteCalendar(calendarId); } -function getCalendarsByIds(context: RequestHandlerContext, calendarIds: string) { - const cal = new CalendarManager(context.ml!.mlClient); +function getCalendarsByIds(legacyClient: ILegacyScopedClusterClient, calendarIds: string) { + const cal = new CalendarManager(legacyClient); return cal.getCalendarsByIds(calendarIds); } @@ -56,9 +60,9 @@ export function calendars({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetCalendars'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, response }) => { try { - const resp = await getAllCalendars(context); + const resp = await getAllCalendars(legacyClient); return response.ok({ body: resp, @@ -88,15 +92,15 @@ export function calendars({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetCalendars'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { let returnValue; try { const calendarIds = request.params.calendarIds.split(','); if (calendarIds.length === 1) { - returnValue = await getCalendar(context, calendarIds[0]); + returnValue = await getCalendar(legacyClient, calendarIds[0]); } else { - returnValue = await getCalendarsByIds(context, calendarIds); + returnValue = await getCalendarsByIds(legacyClient, calendarIds); } return response.ok({ @@ -127,10 +131,10 @@ export function calendars({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateCalendar'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const body = request.body; - const resp = await newCalendar(context, body); + const resp = await newCalendar(legacyClient, body); return response.ok({ body: resp, @@ -162,11 +166,11 @@ export function calendars({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateCalendar'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { calendarId } = request.params; const body = request.body; - const resp = await updateCalendar(context, calendarId, body); + const resp = await updateCalendar(legacyClient, calendarId, body); return response.ok({ body: resp, @@ -196,10 +200,10 @@ export function calendars({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canDeleteCalendar'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { calendarId } = request.params; - const resp = await deleteCalendar(context, calendarId); + const resp = await deleteCalendar(legacyClient, calendarId); return response.ok({ body: resp, diff --git a/x-pack/plugins/ml/server/routes/data_frame_analytics.ts b/x-pack/plugins/ml/server/routes/data_frame_analytics.ts index 94feb21a6b5fb..3b964588bef19 100644 --- a/x-pack/plugins/ml/server/routes/data_frame_analytics.ts +++ b/x-pack/plugins/ml/server/routes/data_frame_analytics.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RequestHandlerContext } from 'kibana/server'; +import { RequestHandlerContext, ILegacyScopedClusterClient } from 'kibana/server'; import { wrapError } from '../client/error_wrapper'; import { analyticsAuditMessagesProvider } from '../models/data_frame_analytics/analytics_audit_messages'; import { RouteInitialization } from '../types'; @@ -36,13 +36,13 @@ function deleteDestIndexPatternById(context: RequestHandlerContext, indexPattern */ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitialization) { async function userCanDeleteIndex( - context: RequestHandlerContext, + legacyClient: ILegacyScopedClusterClient, destinationIndex: string ): Promise { if (!mlLicense.isSecurityEnabled()) { return true; } - const privilege = await context.ml!.mlClient.callAsCurrentUser('ml.privilegeCheck', { + const privilege = await legacyClient.callAsCurrentUser('ml.privilegeCheck', { body: { index: [ { @@ -76,9 +76,9 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canGetDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser('ml.getDataFrameAnalytics'); + const results = await legacyClient.callAsInternalUser('ml.getDataFrameAnalytics'); return response.ok({ body: results, }); @@ -107,10 +107,10 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canGetDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { analyticsId } = request.params; - const results = await context.ml!.mlClient.callAsInternalUser('ml.getDataFrameAnalytics', { + const results = await legacyClient.callAsInternalUser('ml.getDataFrameAnalytics', { analyticsId, }); return response.ok({ @@ -137,11 +137,9 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canGetDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser( - 'ml.getDataFrameAnalyticsStats' - ); + const results = await legacyClient.callAsInternalUser('ml.getDataFrameAnalyticsStats'); return response.ok({ body: results, }); @@ -170,15 +168,12 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canGetDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { analyticsId } = request.params; - const results = await context.ml!.mlClient.callAsInternalUser( - 'ml.getDataFrameAnalyticsStats', - { - analyticsId, - } - ); + const results = await legacyClient.callAsInternalUser('ml.getDataFrameAnalyticsStats', { + analyticsId, + }); return response.ok({ body: results, }); @@ -210,17 +205,14 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canCreateDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { analyticsId } = request.params; - const results = await context.ml!.mlClient.callAsInternalUser( - 'ml.createDataFrameAnalytics', - { - body: request.body, - analyticsId, - ...getAuthorizationHeader(request), - } - ); + const results = await legacyClient.callAsInternalUser('ml.createDataFrameAnalytics', { + body: request.body, + analyticsId, + ...getAuthorizationHeader(request), + }); return response.ok({ body: results, }); @@ -249,15 +241,12 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canGetDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser( - 'ml.evaluateDataFrameAnalytics', - { - body: request.body, - ...getAuthorizationHeader(request), - } - ); + const results = await legacyClient.callAsInternalUser('ml.evaluateDataFrameAnalytics', { + body: request.body, + ...getAuthorizationHeader(request), + }); return response.ok({ body: results, }); @@ -287,14 +276,11 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canCreateDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const results = await context.ml!.mlClient.callAsInternalUser( - 'ml.explainDataFrameAnalytics', - { - body: request.body, - } - ); + const results = await legacyClient.callAsInternalUser('ml.explainDataFrameAnalytics', { + body: request.body, + }); return response.ok({ body: results, }); @@ -324,7 +310,7 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canDeleteDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response, context }) => { try { const { analyticsId } = request.params; const { deleteDestIndex, deleteDestIndexPattern } = request.query; @@ -338,7 +324,7 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat // Check if analyticsId is valid and get destination index if (deleteDestIndex || deleteDestIndexPattern) { try { - const dfa = await context.ml!.mlClient.callAsInternalUser('ml.getDataFrameAnalytics', { + const dfa = await legacyClient.callAsInternalUser('ml.getDataFrameAnalytics', { analyticsId, }); if (Array.isArray(dfa.data_frame_analytics) && dfa.data_frame_analytics.length > 0) { @@ -351,11 +337,11 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat // If user checks box to delete the destinationIndex associated with the job if (destinationIndex && deleteDestIndex) { // Verify if user has privilege to delete the destination index - const userCanDeleteDestIndex = await userCanDeleteIndex(context, destinationIndex); + const userCanDeleteDestIndex = await userCanDeleteIndex(legacyClient, destinationIndex); // If user does have privilege to delete the index, then delete the index if (userCanDeleteDestIndex) { try { - await context.ml!.mlClient.callAsCurrentUser('indices.delete', { + await legacyClient.callAsCurrentUser('indices.delete', { index: destinationIndex, }); destIndexDeleted.success = true; @@ -384,7 +370,7 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat // Delete the data frame analytics try { - await context.ml!.mlClient.callAsInternalUser('ml.deleteDataFrameAnalytics', { + await legacyClient.callAsInternalUser('ml.deleteDataFrameAnalytics', { analyticsId, }); analyticsJobDeleted.success = true; @@ -427,15 +413,12 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canStartStopDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { analyticsId } = request.params; - const results = await context.ml!.mlClient.callAsInternalUser( - 'ml.startDataFrameAnalytics', - { - analyticsId, - } - ); + const results = await legacyClient.callAsInternalUser('ml.startDataFrameAnalytics', { + analyticsId, + }); return response.ok({ body: results, }); @@ -466,7 +449,7 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canStartStopDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const options: { analyticsId: string; force?: boolean | undefined } = { analyticsId: request.params.analyticsId, @@ -477,10 +460,7 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat options.force = request.url.query.force; } - const results = await context.ml!.mlClient.callAsInternalUser( - 'ml.stopDataFrameAnalytics', - options - ); + const results = await legacyClient.callAsInternalUser('ml.stopDataFrameAnalytics', options); return response.ok({ body: results, }); @@ -510,16 +490,13 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canCreateDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { analyticsId } = request.params; - const results = await context.ml!.mlClient.callAsInternalUser( - 'ml.updateDataFrameAnalytics', - { - body: request.body, - analyticsId, - } - ); + const results = await legacyClient.callAsInternalUser('ml.updateDataFrameAnalytics', { + body: request.body, + analyticsId, + }); return response.ok({ body: results, }); @@ -548,10 +525,10 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canGetDataFrameAnalytics'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { analyticsId } = request.params; - const { getAnalyticsAuditMessages } = analyticsAuditMessagesProvider(context.ml!.mlClient); + const { getAnalyticsAuditMessages } = analyticsAuditMessagesProvider(legacyClient); const results = await getAnalyticsAuditMessages(analyticsId); return response.ok({ diff --git a/x-pack/plugins/ml/server/routes/data_visualizer.ts b/x-pack/plugins/ml/server/routes/data_visualizer.ts index 818e981835ced..6355285127f06 100644 --- a/x-pack/plugins/ml/server/routes/data_visualizer.ts +++ b/x-pack/plugins/ml/server/routes/data_visualizer.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RequestHandlerContext } from 'kibana/server'; +import { ILegacyScopedClusterClient } from 'kibana/server'; import { wrapError } from '../client/error_wrapper'; import { DataVisualizer } from '../models/data_visualizer'; import { Field, HistogramField } from '../models/data_visualizer/data_visualizer'; @@ -17,7 +17,7 @@ import { import { RouteInitialization } from '../types'; function getOverallStats( - context: RequestHandlerContext, + legacyClient: ILegacyScopedClusterClient, indexPatternTitle: string, query: object, aggregatableFields: string[], @@ -27,7 +27,7 @@ function getOverallStats( earliestMs: number, latestMs: number ) { - const dv = new DataVisualizer(context.ml!.mlClient); + const dv = new DataVisualizer(legacyClient); return dv.getOverallStats( indexPatternTitle, query, @@ -41,7 +41,7 @@ function getOverallStats( } function getStatsForFields( - context: RequestHandlerContext, + legacyClient: ILegacyScopedClusterClient, indexPatternTitle: string, query: any, fields: Field[], @@ -52,7 +52,7 @@ function getStatsForFields( interval: number, maxExamples: number ) { - const dv = new DataVisualizer(context.ml!.mlClient); + const dv = new DataVisualizer(legacyClient); return dv.getStatsForFields( indexPatternTitle, query, @@ -67,13 +67,13 @@ function getStatsForFields( } function getHistogramsForFields( - context: RequestHandlerContext, + legacyClient: ILegacyScopedClusterClient, indexPatternTitle: string, query: any, fields: HistogramField[], samplerShardSize: number ) { - const dv = new DataVisualizer(context.ml!.mlClient); + const dv = new DataVisualizer(legacyClient); return dv.getHistogramsForFields(indexPatternTitle, query, fields, samplerShardSize); } @@ -104,7 +104,7 @@ export function dataVisualizerRoutes({ router, mlLicense }: RouteInitialization) tags: ['access:ml:canAccessML'], }, }, - mlLicense.basicLicenseAPIGuard(async (context, request, response) => { + mlLicense.basicLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { params: { indexPatternTitle }, @@ -112,7 +112,7 @@ export function dataVisualizerRoutes({ router, mlLicense }: RouteInitialization) } = request; const results = await getHistogramsForFields( - context, + legacyClient, indexPatternTitle, query, fields, @@ -151,7 +151,7 @@ export function dataVisualizerRoutes({ router, mlLicense }: RouteInitialization) tags: ['access:ml:canAccessML'], }, }, - mlLicense.basicLicenseAPIGuard(async (context, request, response) => { + mlLicense.basicLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { params: { indexPatternTitle }, @@ -168,7 +168,7 @@ export function dataVisualizerRoutes({ router, mlLicense }: RouteInitialization) } = request; const results = await getStatsForFields( - context, + legacyClient, indexPatternTitle, query, fields, @@ -216,7 +216,7 @@ export function dataVisualizerRoutes({ router, mlLicense }: RouteInitialization) tags: ['access:ml:canAccessML'], }, }, - mlLicense.basicLicenseAPIGuard(async (context, request, response) => { + mlLicense.basicLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { params: { indexPatternTitle }, @@ -232,7 +232,7 @@ export function dataVisualizerRoutes({ router, mlLicense }: RouteInitialization) } = request; const results = await getOverallStats( - context, + legacyClient, indexPatternTitle, query, aggregatableFields, diff --git a/x-pack/plugins/ml/server/routes/datafeeds.ts b/x-pack/plugins/ml/server/routes/datafeeds.ts index 855b64b0ffed0..47a9afc2244d9 100644 --- a/x-pack/plugins/ml/server/routes/datafeeds.ts +++ b/x-pack/plugins/ml/server/routes/datafeeds.ts @@ -33,9 +33,9 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetDatafeeds'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await context.ml!.mlClient.callAsInternalUser('ml.datafeeds'); + const resp = await legacyClient.callAsInternalUser('ml.datafeeds'); return response.ok({ body: resp, @@ -65,10 +65,10 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetDatafeeds'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const datafeedId = request.params.datafeedId; - const resp = await context.ml!.mlClient.callAsInternalUser('ml.datafeeds', { datafeedId }); + const resp = await legacyClient.callAsInternalUser('ml.datafeeds', { datafeedId }); return response.ok({ body: resp, @@ -94,9 +94,9 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetDatafeeds'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await context.ml!.mlClient.callAsInternalUser('ml.datafeedStats'); + const resp = await legacyClient.callAsInternalUser('ml.datafeedStats'); return response.ok({ body: resp, @@ -126,10 +126,10 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetDatafeeds'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const datafeedId = request.params.datafeedId; - const resp = await context.ml!.mlClient.callAsInternalUser('ml.datafeedStats', { + const resp = await legacyClient.callAsInternalUser('ml.datafeedStats', { datafeedId, }); @@ -163,10 +163,10 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateDatafeed'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const datafeedId = request.params.datafeedId; - const resp = await context.ml!.mlClient.callAsInternalUser('ml.addDatafeed', { + const resp = await legacyClient.callAsInternalUser('ml.addDatafeed', { datafeedId, body: request.body, ...getAuthorizationHeader(request), @@ -202,10 +202,10 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canUpdateDatafeed'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const datafeedId = request.params.datafeedId; - const resp = await context.ml!.mlClient.callAsInternalUser('ml.updateDatafeed', { + const resp = await legacyClient.callAsInternalUser('ml.updateDatafeed', { datafeedId, body: request.body, ...getAuthorizationHeader(request), @@ -241,7 +241,7 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canDeleteDatafeed'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const options: { datafeedId: string; force?: boolean } = { datafeedId: request.params.jobId, @@ -251,7 +251,7 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { options.force = force; } - const resp = await context.ml!.mlClient.callAsInternalUser('ml.deleteDatafeed', options); + const resp = await legacyClient.callAsInternalUser('ml.deleteDatafeed', options); return response.ok({ body: resp, @@ -283,12 +283,12 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canStartStopDatafeed'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const datafeedId = request.params.datafeedId; const { start, end } = request.body; - const resp = await context.ml!.mlClient.callAsInternalUser('ml.startDatafeed', { + const resp = await legacyClient.callAsInternalUser('ml.startDatafeed', { datafeedId, start, end, @@ -322,11 +322,11 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canStartStopDatafeed'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const datafeedId = request.params.datafeedId; - const resp = await context.ml!.mlClient.callAsInternalUser('ml.stopDatafeed', { + const resp = await legacyClient.callAsInternalUser('ml.stopDatafeed', { datafeedId, }); @@ -358,10 +358,10 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canPreviewDatafeed'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const datafeedId = request.params.datafeedId; - const resp = await context.ml!.mlClient.callAsInternalUser('ml.datafeedPreview', { + const resp = await legacyClient.callAsInternalUser('ml.datafeedPreview', { datafeedId, ...getAuthorizationHeader(request), }); diff --git a/x-pack/plugins/ml/server/routes/fields_service.ts b/x-pack/plugins/ml/server/routes/fields_service.ts index b83f846b1685d..0595b31d5bbbc 100644 --- a/x-pack/plugins/ml/server/routes/fields_service.ts +++ b/x-pack/plugins/ml/server/routes/fields_service.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RequestHandlerContext } from 'kibana/server'; +import { ILegacyScopedClusterClient } from 'kibana/server'; import { wrapError } from '../client/error_wrapper'; import { RouteInitialization } from '../types'; import { @@ -13,14 +13,14 @@ import { } from './schemas/fields_service_schema'; import { fieldsServiceProvider } from '../models/fields_service'; -function getCardinalityOfFields(context: RequestHandlerContext, payload: any) { - const fs = fieldsServiceProvider(context.ml!.mlClient); +function getCardinalityOfFields(legacyClient: ILegacyScopedClusterClient, payload: any) { + const fs = fieldsServiceProvider(legacyClient); const { index, fieldNames, query, timeFieldName, earliestMs, latestMs } = payload; return fs.getCardinalityOfFields(index, fieldNames, query, timeFieldName, earliestMs, latestMs); } -function getTimeFieldRange(context: RequestHandlerContext, payload: any) { - const fs = fieldsServiceProvider(context.ml!.mlClient); +function getTimeFieldRange(legacyClient: ILegacyScopedClusterClient, payload: any) { + const fs = fieldsServiceProvider(legacyClient); const { index, timeFieldName, query } = payload; return fs.getTimeFieldRange(index, timeFieldName, query); } @@ -50,9 +50,9 @@ export function fieldsService({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canAccessML'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await getCardinalityOfFields(context, request.body); + const resp = await getCardinalityOfFields(legacyClient, request.body); return response.ok({ body: resp, @@ -85,9 +85,9 @@ export function fieldsService({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canAccessML'], }, }, - mlLicense.basicLicenseAPIGuard(async (context, request, response) => { + mlLicense.basicLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await getTimeFieldRange(context, request.body); + const resp = await getTimeFieldRange(legacyClient, request.body); return response.ok({ body: resp, diff --git a/x-pack/plugins/ml/server/routes/file_data_visualizer.ts b/x-pack/plugins/ml/server/routes/file_data_visualizer.ts index b57eda5ad56a1..88949fecbc7df 100644 --- a/x-pack/plugins/ml/server/routes/file_data_visualizer.ts +++ b/x-pack/plugins/ml/server/routes/file_data_visualizer.ts @@ -5,7 +5,7 @@ */ import { schema } from '@kbn/config-schema'; -import { RequestHandlerContext } from 'kibana/server'; +import { ILegacyScopedClusterClient } from 'kibana/server'; import { MAX_FILE_SIZE_BYTES } from '../../common/constants/file_datavisualizer'; import { InputOverrides, @@ -28,13 +28,17 @@ import { importFileQuerySchema, } from './schemas/file_data_visualizer_schema'; -function analyzeFiles(context: RequestHandlerContext, data: InputData, overrides: InputOverrides) { - const { analyzeFile } = fileDataVisualizerProvider(context.ml!.mlClient); +function analyzeFiles( + legacyClient: ILegacyScopedClusterClient, + data: InputData, + overrides: InputOverrides +) { + const { analyzeFile } = fileDataVisualizerProvider(legacyClient); return analyzeFile(data, overrides); } function importData( - context: RequestHandlerContext, + legacyClient: ILegacyScopedClusterClient, id: string, index: string, settings: Settings, @@ -42,7 +46,7 @@ function importData( ingestPipeline: IngestPipelineWrapper, data: InputData ) { - const { importData: importDataFunc } = importDataProvider(context.ml!.mlClient); + const { importData: importDataFunc } = importDataProvider(legacyClient); return importDataFunc(id, index, settings, mappings, ingestPipeline, data); } @@ -74,9 +78,9 @@ export function fileDataVisualizerRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canFindFileStructure'], }, }, - mlLicense.basicLicenseAPIGuard(async (context, request, response) => { + mlLicense.basicLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const result = await analyzeFiles(context, request.body, request.query); + const result = await analyzeFiles(legacyClient, request.body, request.query); return response.ok({ body: result }); } catch (e) { return response.customError(wrapError(e)); @@ -109,7 +113,7 @@ export function fileDataVisualizerRoutes({ router, mlLicense }: RouteInitializat tags: ['access:ml:canFindFileStructure'], }, }, - mlLicense.basicLicenseAPIGuard(async (context, request, response) => { + mlLicense.basicLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { id } = request.query; const { index, data, settings, mappings, ingestPipeline } = request.body; @@ -122,7 +126,7 @@ export function fileDataVisualizerRoutes({ router, mlLicense }: RouteInitializat } const result = await importData( - context, + legacyClient, id, index, settings, diff --git a/x-pack/plugins/ml/server/routes/filters.ts b/x-pack/plugins/ml/server/routes/filters.ts index dcdb4caa6cd3b..bb4f8a2bebaa9 100644 --- a/x-pack/plugins/ml/server/routes/filters.ts +++ b/x-pack/plugins/ml/server/routes/filters.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RequestHandlerContext } from 'kibana/server'; +import { ILegacyScopedClusterClient } from 'kibana/server'; import { wrapError } from '../client/error_wrapper'; import { RouteInitialization } from '../types'; import { createFilterSchema, filterIdSchema, updateFilterSchema } from './schemas/filters_schema'; @@ -12,33 +12,37 @@ import { FilterManager, FormFilter } from '../models/filter'; // TODO - add function for returning a list of just the filter IDs. // TODO - add function for returning a list of filter IDs plus item count. -function getAllFilters(context: RequestHandlerContext) { - const mgr = new FilterManager(context.ml!.mlClient); +function getAllFilters(legacyClient: ILegacyScopedClusterClient) { + const mgr = new FilterManager(legacyClient); return mgr.getAllFilters(); } -function getAllFilterStats(context: RequestHandlerContext) { - const mgr = new FilterManager(context.ml!.mlClient); +function getAllFilterStats(legacyClient: ILegacyScopedClusterClient) { + const mgr = new FilterManager(legacyClient); return mgr.getAllFilterStats(); } -function getFilter(context: RequestHandlerContext, filterId: string) { - const mgr = new FilterManager(context.ml!.mlClient); +function getFilter(legacyClient: ILegacyScopedClusterClient, filterId: string) { + const mgr = new FilterManager(legacyClient); return mgr.getFilter(filterId); } -function newFilter(context: RequestHandlerContext, filter: FormFilter) { - const mgr = new FilterManager(context.ml!.mlClient); +function newFilter(legacyClient: ILegacyScopedClusterClient, filter: FormFilter) { + const mgr = new FilterManager(legacyClient); return mgr.newFilter(filter); } -function updateFilter(context: RequestHandlerContext, filterId: string, filter: FormFilter) { - const mgr = new FilterManager(context.ml!.mlClient); +function updateFilter( + legacyClient: ILegacyScopedClusterClient, + filterId: string, + filter: FormFilter +) { + const mgr = new FilterManager(legacyClient); return mgr.updateFilter(filterId, filter); } -function deleteFilter(context: RequestHandlerContext, filterId: string) { - const mgr = new FilterManager(context.ml!.mlClient); +function deleteFilter(legacyClient: ILegacyScopedClusterClient, filterId: string) { + const mgr = new FilterManager(legacyClient); return mgr.deleteFilter(filterId); } @@ -61,9 +65,9 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetFilters'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, response }) => { try { - const resp = await getAllFilters(context); + const resp = await getAllFilters(legacyClient); return response.ok({ body: resp, @@ -96,9 +100,9 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetFilters'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await getFilter(context, request.params.filterId); + const resp = await getFilter(legacyClient, request.params.filterId); return response.ok({ body: resp, }); @@ -130,10 +134,10 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateFilter'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const body = request.body; - const resp = await newFilter(context, body); + const resp = await newFilter(legacyClient, body); return response.ok({ body: resp, @@ -168,11 +172,11 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateFilter'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { filterId } = request.params; const body = request.body; - const resp = await updateFilter(context, filterId, body); + const resp = await updateFilter(legacyClient, filterId, body); return response.ok({ body: resp, @@ -202,10 +206,10 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canDeleteFilter'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { filterId } = request.params; - const resp = await deleteFilter(context, filterId); + const resp = await deleteFilter(legacyClient, filterId); return response.ok({ body: resp, @@ -235,9 +239,9 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetFilters'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, response }) => { try { - const resp = await getAllFilterStats(context); + const resp = await getAllFilterStats(legacyClient); return response.ok({ body: resp, diff --git a/x-pack/plugins/ml/server/routes/indices.ts b/x-pack/plugins/ml/server/routes/indices.ts index fb3ef7fc41c76..6a759cb97f308 100644 --- a/x-pack/plugins/ml/server/routes/indices.ts +++ b/x-pack/plugins/ml/server/routes/indices.ts @@ -31,7 +31,7 @@ export function indicesRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canAccessML'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { body: { index, fields: requestFields }, @@ -40,7 +40,7 @@ export function indicesRoutes({ router, mlLicense }: RouteInitialization) { requestFields !== undefined && Array.isArray(requestFields) ? requestFields.join(',') : '*'; - const result = await context.ml!.mlClient.callAsCurrentUser('fieldCaps', { index, fields }); + const result = await legacyClient.callAsCurrentUser('fieldCaps', { index, fields }); return response.ok({ body: result }); } catch (e) { return response.customError(wrapError(e)); diff --git a/x-pack/plugins/ml/server/routes/job_audit_messages.ts b/x-pack/plugins/ml/server/routes/job_audit_messages.ts index d4840ed650a32..2313decfabd5b 100644 --- a/x-pack/plugins/ml/server/routes/job_audit_messages.ts +++ b/x-pack/plugins/ml/server/routes/job_audit_messages.ts @@ -37,9 +37,9 @@ export function jobAuditMessagesRoutes({ router, mlLicense }: RouteInitializatio tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { getJobAuditMessages } = jobAuditMessagesProvider(context.ml!.mlClient); + const { getJobAuditMessages } = jobAuditMessagesProvider(legacyClient); const { jobId } = request.params; const { from } = request.query; const resp = await getJobAuditMessages(jobId, from); @@ -72,9 +72,9 @@ export function jobAuditMessagesRoutes({ router, mlLicense }: RouteInitializatio tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { getJobAuditMessages } = jobAuditMessagesProvider(context.ml!.mlClient); + const { getJobAuditMessages } = jobAuditMessagesProvider(legacyClient); const { from } = request.query; const resp = await getJobAuditMessages(undefined, from); diff --git a/x-pack/plugins/ml/server/routes/job_service.ts b/x-pack/plugins/ml/server/routes/job_service.ts index e03dbb40d623a..3d560fc857e95 100644 --- a/x-pack/plugins/ml/server/routes/job_service.ts +++ b/x-pack/plugins/ml/server/routes/job_service.ts @@ -48,9 +48,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canStartStopDatafeed'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { forceStartDatafeeds } = jobServiceProvider(context.ml!.mlClient); + const { forceStartDatafeeds } = jobServiceProvider(legacyClient); const { datafeedIds, start, end } = request.body; const resp = await forceStartDatafeeds(datafeedIds, start, end); @@ -82,9 +82,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canStartStopDatafeed'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { stopDatafeeds } = jobServiceProvider(context.ml!.mlClient); + const { stopDatafeeds } = jobServiceProvider(legacyClient); const { datafeedIds } = request.body; const resp = await stopDatafeeds(datafeedIds); @@ -116,9 +116,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canDeleteJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { deleteJobs } = jobServiceProvider(context.ml!.mlClient); + const { deleteJobs } = jobServiceProvider(legacyClient); const { jobIds } = request.body; const resp = await deleteJobs(jobIds); @@ -150,9 +150,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCloseJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { closeJobs } = jobServiceProvider(context.ml!.mlClient); + const { closeJobs } = jobServiceProvider(legacyClient); const { jobIds } = request.body; const resp = await closeJobs(jobIds); @@ -184,9 +184,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCloseJob', 'access:ml:canStartStopDatafeed'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { forceStopAndCloseJob } = jobServiceProvider(context.ml!.mlClient); + const { forceStopAndCloseJob } = jobServiceProvider(legacyClient); const { jobId } = request.body; const resp = await forceStopAndCloseJob(jobId); @@ -223,9 +223,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { jobsSummary } = jobServiceProvider(context.ml!.mlClient); + const { jobsSummary } = jobServiceProvider(legacyClient); const { jobIds } = request.body; const resp = await jobsSummary(jobIds); @@ -257,9 +257,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, response }) => { try { - const { jobsWithTimerange } = jobServiceProvider(context.ml!.mlClient); + const { jobsWithTimerange } = jobServiceProvider(legacyClient); const resp = await jobsWithTimerange(); return response.ok({ @@ -290,9 +290,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { createFullJobsList } = jobServiceProvider(context.ml!.mlClient); + const { createFullJobsList } = jobServiceProvider(legacyClient); const { jobIds } = request.body; const resp = await createFullJobsList(jobIds); @@ -320,9 +320,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, response }) => { try { - const { getAllGroups } = jobServiceProvider(context.ml!.mlClient); + const { getAllGroups } = jobServiceProvider(legacyClient); const resp = await getAllGroups(); return response.ok({ @@ -353,9 +353,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canUpdateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { updateGroups } = jobServiceProvider(context.ml!.mlClient); + const { updateGroups } = jobServiceProvider(legacyClient); const { jobs } = request.body; const resp = await updateGroups(jobs); @@ -383,9 +383,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, response }) => { try { - const { deletingJobTasks } = jobServiceProvider(context.ml!.mlClient); + const { deletingJobTasks } = jobServiceProvider(legacyClient); const resp = await deletingJobTasks(); return response.ok({ @@ -416,9 +416,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { jobsExist } = jobServiceProvider(context.ml!.mlClient); + const { jobsExist } = jobServiceProvider(legacyClient); const { jobIds } = request.body; const resp = await jobsExist(jobIds); @@ -449,12 +449,12 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response, context }) => { try { const { indexPattern } = request.params; const isRollup = request.query.rollup === 'true'; const savedObjectsClient = context.core.savedObjects.client; - const { newJobCaps } = jobServiceProvider(context.ml!.mlClient); + const { newJobCaps } = jobServiceProvider(legacyClient); const resp = await newJobCaps(indexPattern, isRollup, savedObjectsClient); return response.ok({ @@ -485,7 +485,7 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { indexPatternTitle, @@ -499,7 +499,7 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { splitFieldValue, } = request.body; - const { newJobLineChart } = jobServiceProvider(context.ml!.mlClient); + const { newJobLineChart } = jobServiceProvider(legacyClient); const resp = await newJobLineChart( indexPatternTitle, timeField, @@ -540,7 +540,7 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { indexPatternTitle, @@ -553,7 +553,7 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { splitFieldName, } = request.body; - const { newJobPopulationChart } = jobServiceProvider(context.ml!.mlClient); + const { newJobPopulationChart } = jobServiceProvider(legacyClient); const resp = await newJobPopulationChart( indexPatternTitle, timeField, @@ -589,9 +589,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, response }) => { try { - const { getAllJobAndGroupIds } = jobServiceProvider(context.ml!.mlClient); + const { getAllJobAndGroupIds } = jobServiceProvider(legacyClient); const resp = await getAllJobAndGroupIds(); return response.ok({ @@ -622,9 +622,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { getLookBackProgress } = jobServiceProvider(context.ml!.mlClient); + const { getLookBackProgress } = jobServiceProvider(legacyClient); const { jobId, start, end } = request.body; const resp = await getLookBackProgress(jobId, start, end); @@ -656,9 +656,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { validateCategoryExamples } = categorizationExamplesProvider(context.ml!.mlClient); + const { validateCategoryExamples } = categorizationExamplesProvider(legacyClient); const { indexPatternTitle, timeField, @@ -709,9 +709,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { topCategories } = jobServiceProvider(context.ml!.mlClient); + const { topCategories } = jobServiceProvider(legacyClient); const { jobId, count } = request.body; const resp = await topCategories(jobId, count); @@ -743,9 +743,9 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateJob', 'access:ml:canStartStopDatafeed'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { revertModelSnapshot } = jobServiceProvider(context.ml!.mlClient); + const { revertModelSnapshot } = jobServiceProvider(legacyClient); const { jobId, snapshotId, diff --git a/x-pack/plugins/ml/server/routes/job_validation.ts b/x-pack/plugins/ml/server/routes/job_validation.ts index e52c6b76e918b..6da052663a002 100644 --- a/x-pack/plugins/ml/server/routes/job_validation.ts +++ b/x-pack/plugins/ml/server/routes/job_validation.ts @@ -5,7 +5,7 @@ */ import Boom from 'boom'; -import { RequestHandlerContext } from 'kibana/server'; +import { ILegacyScopedClusterClient } from 'kibana/server'; import { TypeOf } from '@kbn/config-schema'; import { AnalysisConfig } from '../../common/types/anomaly_detection_jobs'; import { wrapError } from '../client/error_wrapper'; @@ -27,12 +27,12 @@ type CalculateModelMemoryLimitPayload = TypeOf; */ export function jobValidationRoutes({ router, mlLicense }: RouteInitialization, version: string) { function calculateModelMemoryLimit( - context: RequestHandlerContext, + legacyClient: ILegacyScopedClusterClient, payload: CalculateModelMemoryLimitPayload ) { const { analysisConfig, indexPattern, query, timeFieldName, earliestMs, latestMs } = payload; - return calculateModelMemoryLimitProvider(context.ml!.mlClient)( + return calculateModelMemoryLimitProvider(legacyClient)( analysisConfig as AnalysisConfig, indexPattern, query, @@ -61,10 +61,10 @@ export function jobValidationRoutes({ router, mlLicense }: RouteInitialization, tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { let errorResp; - const resp = await estimateBucketSpanFactory(context.ml!.mlClient)(request.body) + const resp = await estimateBucketSpanFactory(legacyClient)(request.body) // this catch gets triggered when the estimation code runs without error // but isn't able to come up with a bucket span estimation. // this doesn't return a HTTP error but an object with an error message @@ -109,9 +109,9 @@ export function jobValidationRoutes({ router, mlLicense }: RouteInitialization, tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await calculateModelMemoryLimit(context, request.body); + const resp = await calculateModelMemoryLimit(legacyClient, request.body); return response.ok({ body: resp, @@ -141,9 +141,9 @@ export function jobValidationRoutes({ router, mlLicense }: RouteInitialization, tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await validateCardinality(context.ml!.mlClient, request.body); + const resp = await validateCardinality(legacyClient, request.body); return response.ok({ body: resp, @@ -173,11 +173,11 @@ export function jobValidationRoutes({ router, mlLicense }: RouteInitialization, tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { // version corresponds to the version used in documentation links. const resp = await validateJob( - context.ml!.mlClient, + legacyClient, request.body, version, mlLicense.isSecurityEnabled() === false diff --git a/x-pack/plugins/ml/server/routes/modules.ts b/x-pack/plugins/ml/server/routes/modules.ts index 463babb86304f..23e37d2213029 100644 --- a/x-pack/plugins/ml/server/routes/modules.ts +++ b/x-pack/plugins/ml/server/routes/modules.ts @@ -6,7 +6,11 @@ import { TypeOf } from '@kbn/config-schema'; -import { RequestHandlerContext, KibanaRequest } from 'kibana/server'; +import { + ILegacyScopedClusterClient, + KibanaRequest, + SavedObjectsClientContract, +} from 'kibana/server'; import { DatafeedOverride, JobOverride } from '../../common/types/modules'; import { wrapError } from '../client/error_wrapper'; import { DataRecognizer } from '../models/data_recognizer'; @@ -19,16 +23,22 @@ import { import { RouteInitialization } from '../types'; function recognize( - context: RequestHandlerContext, + legacyClient: ILegacyScopedClusterClient, + savedObjectsClient: SavedObjectsClientContract, request: KibanaRequest, indexPatternTitle: string ) { - const dr = new DataRecognizer(context.ml!.mlClient, context.core.savedObjects.client, request); + const dr = new DataRecognizer(legacyClient, savedObjectsClient, request); return dr.findMatches(indexPatternTitle); } -function getModule(context: RequestHandlerContext, request: KibanaRequest, moduleId: string) { - const dr = new DataRecognizer(context.ml!.mlClient, context.core.savedObjects.client, request); +function getModule( + legacyClient: ILegacyScopedClusterClient, + savedObjectsClient: SavedObjectsClientContract, + request: KibanaRequest, + moduleId: string +) { + const dr = new DataRecognizer(legacyClient, savedObjectsClient, request); if (moduleId === undefined) { return dr.listModules(); } else { @@ -37,7 +47,8 @@ function getModule(context: RequestHandlerContext, request: KibanaRequest, modul } function setup( - context: RequestHandlerContext, + legacyClient: ILegacyScopedClusterClient, + savedObjectsClient: SavedObjectsClientContract, request: KibanaRequest, moduleId: string, prefix?: string, @@ -52,7 +63,7 @@ function setup( datafeedOverrides?: DatafeedOverride | DatafeedOverride[], estimateModelMemory?: boolean ) { - const dr = new DataRecognizer(context.ml!.mlClient, context.core.savedObjects.client, request); + const dr = new DataRecognizer(legacyClient, savedObjectsClient, request); return dr.setup( moduleId, prefix, @@ -70,11 +81,12 @@ function setup( } function dataRecognizerJobsExist( - context: RequestHandlerContext, + legacyClient: ILegacyScopedClusterClient, + savedObjectsClient: SavedObjectsClientContract, request: KibanaRequest, moduleId: string ) { - const dr = new DataRecognizer(context.ml!.mlClient, context.core.savedObjects.client, request); + const dr = new DataRecognizer(legacyClient, savedObjectsClient, request); return dr.dataRecognizerJobsExist(moduleId); } @@ -119,10 +131,15 @@ export function dataRecognizer({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response, context }) => { try { const { indexPatternTitle } = request.params; - const results = await recognize(context, request, indexPatternTitle); + const results = await recognize( + legacyClient, + context.core.savedObjects.client, + request, + indexPatternTitle + ); return response.ok({ body: results }); } catch (e) { @@ -249,7 +266,7 @@ export function dataRecognizer({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response, context }) => { try { let { moduleId } = request.params; if (moduleId === '') { @@ -257,7 +274,12 @@ export function dataRecognizer({ router, mlLicense }: RouteInitialization) { // the moduleId will be an empty string. moduleId = undefined; } - const results = await getModule(context, request, moduleId); + const results = await getModule( + legacyClient, + context.core.savedObjects.client, + request, + moduleId + ); return response.ok({ body: results }); } catch (e) { @@ -417,7 +439,7 @@ export function dataRecognizer({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canCreateJob'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response, context }) => { try { const { moduleId } = request.params; @@ -436,7 +458,8 @@ export function dataRecognizer({ router, mlLicense }: RouteInitialization) { } = request.body as TypeOf; const result = await setup( - context, + legacyClient, + context.core.savedObjects.client, request, moduleId, prefix, @@ -521,10 +544,15 @@ export function dataRecognizer({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response, context }) => { try { const { moduleId } = request.params; - const result = await dataRecognizerJobsExist(context, request, moduleId); + const result = await dataRecognizerJobsExist( + legacyClient, + context.core.savedObjects.client, + request, + moduleId + ); return response.ok({ body: result }); } catch (e) { diff --git a/x-pack/plugins/ml/server/routes/notification_settings.ts b/x-pack/plugins/ml/server/routes/notification_settings.ts index e4a9abb0784be..09c145d6257a8 100644 --- a/x-pack/plugins/ml/server/routes/notification_settings.ts +++ b/x-pack/plugins/ml/server/routes/notification_settings.ts @@ -26,13 +26,13 @@ export function notificationRoutes({ router, mlLicense }: RouteInitialization) { tags: ['access:ml:canAccessML'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, response }) => { try { const params = { includeDefaults: true, filterPath: '**.xpack.notification', }; - const resp = await context.ml!.mlClient.callAsCurrentUser('cluster.getSettings', params); + const resp = await legacyClient.callAsCurrentUser('cluster.getSettings', params); return response.ok({ body: resp, diff --git a/x-pack/plugins/ml/server/routes/results_service.ts b/x-pack/plugins/ml/server/routes/results_service.ts index c9370362816fa..0d619bf63b8e7 100644 --- a/x-pack/plugins/ml/server/routes/results_service.ts +++ b/x-pack/plugins/ml/server/routes/results_service.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RequestHandlerContext } from 'kibana/server'; +import { ILegacyScopedClusterClient } from 'kibana/server'; import { schema } from '@kbn/config-schema'; import { wrapError } from '../client/error_wrapper'; import { RouteInitialization } from '../types'; @@ -18,8 +18,8 @@ import { import { resultsServiceProvider } from '../models/results_service'; import { ML_RESULTS_INDEX_PATTERN } from '../../common/constants/index_patterns'; -function getAnomaliesTableData(context: RequestHandlerContext, payload: any) { - const rs = resultsServiceProvider(context.ml!.mlClient); +function getAnomaliesTableData(legacyClient: ILegacyScopedClusterClient, payload: any) { + const rs = resultsServiceProvider(legacyClient); const { jobIds, criteriaFields, @@ -48,25 +48,25 @@ function getAnomaliesTableData(context: RequestHandlerContext, payload: any) { ); } -function getCategoryDefinition(context: RequestHandlerContext, payload: any) { - const rs = resultsServiceProvider(context.ml!.mlClient); +function getCategoryDefinition(legacyClient: ILegacyScopedClusterClient, payload: any) { + const rs = resultsServiceProvider(legacyClient); return rs.getCategoryDefinition(payload.jobId, payload.categoryId); } -function getCategoryExamples(context: RequestHandlerContext, payload: any) { - const rs = resultsServiceProvider(context.ml!.mlClient); +function getCategoryExamples(legacyClient: ILegacyScopedClusterClient, payload: any) { + const rs = resultsServiceProvider(legacyClient); const { jobId, categoryIds, maxExamples } = payload; return rs.getCategoryExamples(jobId, categoryIds, maxExamples); } -function getMaxAnomalyScore(context: RequestHandlerContext, payload: any) { - const rs = resultsServiceProvider(context.ml!.mlClient); +function getMaxAnomalyScore(legacyClient: ILegacyScopedClusterClient, payload: any) { + const rs = resultsServiceProvider(legacyClient); const { jobIds, earliestMs, latestMs } = payload; return rs.getMaxAnomalyScore(jobIds, earliestMs, latestMs); } -function getPartitionFieldsValues(context: RequestHandlerContext, payload: any) { - const rs = resultsServiceProvider(context.ml!.mlClient); +function getPartitionFieldsValues(legacyClient: ILegacyScopedClusterClient, payload: any) { + const rs = resultsServiceProvider(legacyClient); const { jobId, searchTerm, criteriaFields, earliestMs, latestMs } = payload; return rs.getPartitionFieldsValues(jobId, searchTerm, criteriaFields, earliestMs, latestMs); } @@ -94,9 +94,9 @@ export function resultsServiceRoutes({ router, mlLicense }: RouteInitialization) tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await getAnomaliesTableData(context, request.body); + const resp = await getAnomaliesTableData(legacyClient, request.body); return response.ok({ body: resp, @@ -126,9 +126,9 @@ export function resultsServiceRoutes({ router, mlLicense }: RouteInitialization) tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await getCategoryDefinition(context, request.body); + const resp = await getCategoryDefinition(legacyClient, request.body); return response.ok({ body: resp, @@ -158,9 +158,9 @@ export function resultsServiceRoutes({ router, mlLicense }: RouteInitialization) tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await getMaxAnomalyScore(context, request.body); + const resp = await getMaxAnomalyScore(legacyClient, request.body); return response.ok({ body: resp, @@ -190,9 +190,9 @@ export function resultsServiceRoutes({ router, mlLicense }: RouteInitialization) tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await getCategoryExamples(context, request.body); + const resp = await getCategoryExamples(legacyClient, request.body); return response.ok({ body: resp, @@ -222,9 +222,9 @@ export function resultsServiceRoutes({ router, mlLicense }: RouteInitialization) tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const resp = await getPartitionFieldsValues(context, request.body); + const resp = await getPartitionFieldsValues(legacyClient, request.body); return response.ok({ body: resp, @@ -251,14 +251,14 @@ export function resultsServiceRoutes({ router, mlLicense }: RouteInitialization) tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { const body = { ...request.body, index: ML_RESULTS_INDEX_PATTERN, }; try { return response.ok({ - body: await context.ml!.mlClient.callAsInternalUser('search', body), + body: await legacyClient.callAsInternalUser('search', body), }); } catch (error) { return response.customError(wrapError(error)); diff --git a/x-pack/plugins/ml/server/routes/system.ts b/x-pack/plugins/ml/server/routes/system.ts index f2d8c89046178..99ba9519b6a34 100644 --- a/x-pack/plugins/ml/server/routes/system.ts +++ b/x-pack/plugins/ml/server/routes/system.ts @@ -7,7 +7,7 @@ import { schema } from '@kbn/config-schema'; import { Request } from 'hapi'; -import { RequestHandlerContext } from 'kibana/server'; +import { ILegacyScopedClusterClient } from 'kibana/server'; import { wrapError } from '../client/error_wrapper'; import { mlLog } from '../client/log'; import { capabilitiesProvider } from '../lib/capabilities'; @@ -21,9 +21,9 @@ export function systemRoutes( { router, mlLicense }: RouteInitialization, { spaces, cloud, resolveMlCapabilities }: SystemRouteDeps ) { - async function getNodeCount(context: RequestHandlerContext) { + async function getNodeCount(legacyClient: ILegacyScopedClusterClient) { const filterPath = 'nodes.*.attributes'; - const resp = await context.ml!.mlClient.callAsInternalUser('nodes.info', { + const resp = await legacyClient.callAsInternalUser('nodes.info', { filterPath, }); @@ -58,9 +58,9 @@ export function systemRoutes( tags: ['access:ml:canAccessML'], }, }, - mlLicense.basicLicenseAPIGuard(async (context, request, response) => { + mlLicense.basicLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const { callAsCurrentUser, callAsInternalUser } = context.ml!.mlClient; + const { callAsCurrentUser, callAsInternalUser } = legacyClient; let upgradeInProgress = false; try { const info = await callAsInternalUser('ml.info'); @@ -115,7 +115,7 @@ export function systemRoutes( path: '/api/ml/ml_capabilities', validate: false, }, - mlLicense.basicLicenseAPIGuard(async (context, request, response) => { + mlLicense.basicLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { // if spaces is disabled force isMlEnabledInSpace to be true const { isMlEnabledInSpace } = @@ -129,7 +129,7 @@ export function systemRoutes( } const { getCapabilities } = capabilitiesProvider( - context.ml!.mlClient, + legacyClient, mlCapabilities, mlLicense, isMlEnabledInSpace @@ -159,10 +159,10 @@ export function systemRoutes( }, }, - mlLicense.basicLicenseAPIGuard(async (context, request, response) => { + mlLicense.basicLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { return response.ok({ - body: await getNodeCount(context), + body: await getNodeCount(legacyClient), }); } catch (e) { return response.customError(wrapError(e)); @@ -185,9 +185,9 @@ export function systemRoutes( tags: ['access:ml:canAccessML'], }, }, - mlLicense.basicLicenseAPIGuard(async (context, request, response) => { + mlLicense.basicLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { - const info = await context.ml!.mlClient.callAsInternalUser('ml.info'); + const info = await legacyClient.callAsInternalUser('ml.info'); const cloudId = cloud && cloud.cloudId; return response.ok({ body: { ...info, cloudId }, @@ -216,10 +216,10 @@ export function systemRoutes( tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { return response.ok({ - body: await context.ml!.mlClient.callAsCurrentUser('search', request.body), + body: await legacyClient.callAsCurrentUser('search', request.body), }); } catch (error) { return response.customError(wrapError(error)); @@ -243,7 +243,7 @@ export function systemRoutes( tags: ['access:ml:canGetJobs'], }, }, - mlLicense.fullLicenseAPIGuard(async (context, request, response) => { + mlLicense.fullLicenseAPIGuard(async ({ legacyClient, request, response }) => { try { const { index } = request.body; @@ -255,7 +255,7 @@ export function systemRoutes( ignore: 404, }; - const fieldsResult = await context.ml!.mlClient.callAsCurrentUser('fieldCaps', options); + const fieldsResult = await legacyClient.callAsCurrentUser('fieldCaps', options); const result = { exists: false }; if (Array.isArray(fieldsResult.indices) && fieldsResult.indices.length !== 0) { From 8d9bafeb579208edcde6e9906718cd57286bfcf2 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Tue, 11 Aug 2020 09:01:19 +0100 Subject: [PATCH 037/113] [ML] Fixing schema for custom rule conditions (#74676) Co-authored-by: Elastic Machine --- .../ml/server/routes/schemas/anomaly_detectors_schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/ml/server/routes/schemas/anomaly_detectors_schema.ts b/x-pack/plugins/ml/server/routes/schemas/anomaly_detectors_schema.ts index 196e17d0984f9..9203c7cf997a6 100644 --- a/x-pack/plugins/ml/server/routes/schemas/anomaly_detectors_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/anomaly_detectors_schema.ts @@ -11,7 +11,7 @@ const customRulesSchema = schema.maybe( schema.maybe( schema.object({ actions: schema.arrayOf(schema.string()), - conditions: schema.arrayOf(schema.any()), + conditions: schema.maybe(schema.arrayOf(schema.any())), scope: schema.maybe(schema.any()), }) ) From ce6011e4d5aad67ec4cd22c28920fe6bac57bb8b Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 11 Aug 2020 10:05:44 +0200 Subject: [PATCH 038/113] Bump angular dependency from 1.7.9 to 1.8.0 (#74482) --- package.json | 8 ++--- packages/kbn-ui-shared-deps/package.json | 2 +- x-pack/package.json | 6 ++-- yarn.lock | 40 ++++++++++++------------ 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 0b5a6822e6afa..becd670e4ddcf 100644 --- a/package.json +++ b/package.json @@ -147,12 +147,12 @@ "JSONStream": "1.3.5", "abortcontroller-polyfill": "^1.4.0", "accept": "3.0.2", - "angular": "^1.7.9", - "angular-aria": "^1.7.9", + "angular": "^1.8.0", + "angular-aria": "^1.8.0", "angular-elastic": "^2.5.1", "angular-recursion": "^1.0.5", - "angular-route": "^1.7.9", - "angular-sanitize": "^1.7.9", + "angular-route": "^1.8.0", + "angular-sanitize": "^1.8.0", "angular-sortable-view": "^0.0.17", "autoprefixer": "^9.7.4", "babel-loader": "^8.0.6", diff --git a/packages/kbn-ui-shared-deps/package.json b/packages/kbn-ui-shared-deps/package.json index 3c03a52383f77..ae14777e8b44a 100644 --- a/packages/kbn-ui-shared-deps/package.json +++ b/packages/kbn-ui-shared-deps/package.json @@ -15,7 +15,7 @@ "@kbn/i18n": "1.0.0", "@kbn/monaco": "1.0.0", "abortcontroller-polyfill": "^1.4.0", - "angular": "^1.7.9", + "angular": "^1.8.0", "compression-webpack-plugin": "^4.0.0", "core-js": "^3.6.4", "custom-event-polyfill": "^0.3.0", diff --git a/x-pack/package.json b/x-pack/package.json index 83eb0910add11..7533741391f8e 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -227,9 +227,9 @@ "@turf/circle": "6.0.1", "@turf/distance": "6.0.1", "@turf/helpers": "6.0.1", - "angular": "^1.7.9", - "angular-resource": "1.7.9", - "angular-sanitize": "1.7.9", + "angular": "^1.8.0", + "angular-resource": "1.8.0", + "angular-sanitize": "1.8.0", "angular-ui-ace": "0.2.3", "apollo-cache-inmemory": "1.6.2", "apollo-client": "^2.3.8", diff --git a/yarn.lock b/yarn.lock index 7c397c33ad8a8..6f82c8126ac06 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6466,10 +6466,10 @@ ammo@3.x.x: dependencies: hoek "5.x.x" -angular-aria@^1.7.9: - version "1.7.9" - resolved "https://registry.yarnpkg.com/angular-aria/-/angular-aria-1.7.9.tgz#90c61895ffbd876e95915222b32a7bd0070af7e3" - integrity sha512-luI3Jemd1AbOQW0krdzfEG3fM0IFtLY0bSSqIDEx3POE0XjKIC1MkrO8Csyq9PPgueLphyAPofzUwZ8YeZ88SA== +angular-aria@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/angular-aria/-/angular-aria-1.8.0.tgz#97aec9b1e8bafd07d5fab30f98d8ec832e18e25d" + integrity sha512-eCQI6EwgY6bYHdzIUfDABHnZjoZ3bNYpCsnceQF4bLfbq1QtZ7raRPNca45sj6C9Pfjde6PNcEDvuLozFPYnrQ== angular-elastic@^2.5.1: version "2.5.1" @@ -6488,20 +6488,20 @@ angular-recursion@^1.0.5: resolved "https://registry.yarnpkg.com/angular-recursion/-/angular-recursion-1.0.5.tgz#cd405428a0bf55faf52eaa7988c1fe69cd930543" integrity sha1-zUBUKKC/Vfr1Lqp5iMH+ac2TBUM= -angular-resource@1.7.9: - version "1.7.9" - resolved "https://registry.yarnpkg.com/angular-resource/-/angular-resource-1.7.9.tgz#fa53623fae2c60debe2410d692447dcb0ba02396" - integrity sha512-rXXhCE2qT31Pn4Sl+2XL+ntv4zxnA2OzY+clCl8/pOp/s/gIzxpQlEtXipo3QK8Qur3glbIkeF/bJw+gjVAdUw== +angular-resource@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/angular-resource/-/angular-resource-1.8.0.tgz#578ef122e7cb7bcc6c0ad6c2451dc3d27fd570ba" + integrity sha512-9woUq3kDwoT7R6SjKX8vaJMhOplYBm9sqRAxKgDhDIdPyA8iBowqQIusf9+8Q+z/HlXb8ZXvKspJyKXrxmKdvg== -angular-route@^1.7.9: - version "1.7.9" - resolved "https://registry.yarnpkg.com/angular-route/-/angular-route-1.7.9.tgz#f9910a2af0ba3ad7a969c5dd369b8360d0d5e4ef" - integrity sha512-vRoj5hzdQtWbODhWJqDzD1iNOEfCKshO6GFBuPVV7RHlPjzIc4R2dHCc7Qiv/8F3LDxJDohc6vSnTDMLHuaqeA== +angular-route@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/angular-route/-/angular-route-1.8.0.tgz#cb8066c5d34284ffd6a15ac7be1b3d51c5ad7bb2" + integrity sha512-ORvXAdVfCCA6XFwyjSkVQFFGufj0mNGiCvBR93Qsii8+7t/6Ioy6wheUoCj1x4NWUv7hAq3nYYGCVO6QEKb1BQ== -angular-sanitize@1.7.9, angular-sanitize@^1.7.9: - version "1.7.9" - resolved "https://registry.yarnpkg.com/angular-sanitize/-/angular-sanitize-1.7.9.tgz#6b4d5e826abdabd352b13a7c65c8c74daf6a7b15" - integrity sha512-nB/xe7JQWF9nLvhHommAICQ3eWrfRETo0EVGFESi952CDzDa+GAJ/2BFBNw44QqQPxj1Xua/uYKrbLsOGWZdbQ== +angular-sanitize@1.8.0, angular-sanitize@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/angular-sanitize/-/angular-sanitize-1.8.0.tgz#9f80782d3afeec3bcc0bb92b3ca6f1f421cfbca6" + integrity sha512-j5GiOPCvfcDWK5svEOVoPb11X3UDVy/mdHPRWuy14Iyw86xaq+Bb+x/em2sAOa5MQQeY5ciLXbF3RRp8iCKcNg== angular-sortable-view@^0.0.17: version "0.0.17" @@ -6513,10 +6513,10 @@ angular-ui-ace@0.2.3: resolved "https://registry.yarnpkg.com/angular-ui-ace/-/angular-ui-ace-0.2.3.tgz#3cb903428100621a367fc7f641440e97a42a26d0" integrity sha1-PLkDQoEAYho2f8f2QUQOl6QqJtA= -angular@>=1.0.6, angular@^1.7.9: - version "1.7.9" - resolved "https://registry.yarnpkg.com/angular/-/angular-1.7.9.tgz#e52616e8701c17724c3c238cfe4f9446fd570bc4" - integrity sha512-5se7ZpcOtu0MBFlzGv5dsM1quQDoDeUTwZrWjGtTNA7O88cD8TEk5IEKCTDa3uECV9XnvKREVUr7du1ACiWGFQ== +angular@>=1.0.6, angular@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/angular/-/angular-1.8.0.tgz#b1ec179887869215cab6dfd0df2e42caa65b1b51" + integrity sha512-VdaMx+Qk0Skla7B5gw77a8hzlcOakwF8mjlW13DpIWIDlfqwAbSSLfd8N/qZnzEmQF4jC4iofInd3gE7vL8ZZg== ansi-align@^2.0.0: version "2.0.0" From 92289b63ef1d3960f49bcd22eedca442ac230c7c Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 11 Aug 2020 10:05:54 +0200 Subject: [PATCH 039/113] [Ingest Node Pipelines] Sentence-case processor names (#74645) * wip on fixing processor names * added comment * fix Jest test element selector Co-authored-by: Elastic Machine --- .../pipeline_processors_editor.helpers.tsx | 4 +- .../pipeline_processors_editor_item.tsx | 4 +- .../processor_settings_form.tsx | 7 +- .../common_fields/processor_type_field.tsx | 116 +++++++++++++++--- .../components/shared/index.ts | 11 ++ .../map_processor_type_to_form.tsx | 16 +-- 6 files changed, 126 insertions(+), 32 deletions(-) create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/shared/index.ts rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => shared}/map_processor_type_to_form.tsx (95%) diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx index 227513dcdaacc..5ac43953e79bc 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx @@ -89,7 +89,7 @@ const createActions = (testBed: TestBed) => { async addProcessor(processorsSelector: string, type: string, options: Record) { find(`${processorsSelector}.addProcessorButton`).simulate('click'); await act(async () => { - find('processorTypeSelector').simulate('change', [{ value: type, label: type }]); + find('processorTypeSelector.input').simulate('change', [{ value: type, label: type }]); }); component.update(); await act(async () => { @@ -129,7 +129,7 @@ const createActions = (testBed: TestBed) => { find(`${processorSelector}.moreMenu.button`).simulate('click'); find(`${processorSelector}.moreMenu.addOnFailureButton`).simulate('click'); await act(async () => { - find('processorTypeSelector').simulate('change', [{ value: type, label: type }]); + find('processorTypeSelector.input').simulate('change', [{ value: type, label: type }]); }); component.update(); await act(async () => { diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx index b43e2bc1342c3..edabbe277e5d9 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx @@ -22,6 +22,8 @@ import { ProcessorsDispatch } from '../../processors_reducer'; import { ProcessorInfo } from '../processors_tree'; +import { getProcessorDescriptor } from '../shared'; + import './pipeline_processors_editor_item.scss'; import { InlineTextInput } from './inline_text_input'; @@ -139,7 +141,7 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( className="pipelineProcessorsEditor__item__processorTypeLabel" color={isDimmed ? 'subdued' : undefined} > - {processor.type} + {getProcessorDescriptor(processor.type)?.label ?? processor.type} diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.tsx index 015adae83e71e..b5b3a38bb6a6c 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.tsx @@ -23,8 +23,9 @@ import { import { Form, FormDataProvider, FormHook } from '../../../../../shared_imports'; import { ProcessorInternal } from '../../types'; +import { getProcessorDescriptor } from '../shared'; + import { DocumentationButton } from './documentation_button'; -import { getProcessorFormDescriptor } from './map_processor_type_to_form'; import { CommonProcessorFields, ProcessorTypeField } from './processors/common_fields'; import { Custom } from './processors/custom'; @@ -88,7 +89,7 @@ export const ProcessorSettingsForm: FunctionComponent = memo( {({ type }) => { - const formDescriptor = getProcessorFormDescriptor(type as any); + const formDescriptor = getProcessorDescriptor(type as any); if (formDescriptor) { return ( @@ -114,7 +115,7 @@ export const ProcessorSettingsForm: FunctionComponent = memo( const { type } = arg; if (type?.length) { - const formDescriptor = getProcessorFormDescriptor(type as any); + const formDescriptor = getProcessorDescriptor(type as any); if (formDescriptor?.FieldsComponent) { return ( diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/processor_type_field.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/processor_type_field.tsx index 4b82fbfad9b52..71ee4a714a28e 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/processor_type_field.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/processor_type_field.tsx @@ -3,16 +3,42 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { EuiComboBox, EuiComboBoxOptionOption, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { FunctionComponent } from 'react'; +import { flow } from 'fp-ts/lib/function'; +import { map } from 'fp-ts/lib/Array'; + import { FIELD_TYPES, FieldConfig, UseField, fieldValidators, - ComboBoxField, } from '../../../../../../../shared_imports'; -import { types } from '../../map_processor_type_to_form'; + +import { getProcessorDescriptor, mapProcessorTypeToDescriptor } from '../../../shared'; +import { + FieldValidateResponse, + VALIDATION_TYPES, +} from '../../../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib'; + +const extractProcessorTypesAndLabels = flow( + Object.entries, + map(([type, { label }]) => ({ + label, + value: type, + })), + (arr) => arr.sort((a, b) => a.label.localeCompare(b.label)) +); + +interface ProcessorTypeAndLabel { + value: string; + label: string; +} + +const processorTypesAndLabels: ProcessorTypeAndLabel[] = extractProcessorTypesAndLabels( + mapProcessorTypeToDescriptor +); interface Props { initialType?: string; @@ -47,22 +73,76 @@ const typeConfig: FieldConfig = { export const ProcessorTypeField: FunctionComponent = ({ initialType }) => { return ( - ({ label: type, value: type })), - noSuggestions: false, - singleSelection: { - asPlainText: true, - }, - }, + + {(typeField) => { + let selectedOptions: ProcessorTypeAndLabel[]; + if ((typeField.value as string[]).length) { + const [type] = typeField.value as string[]; + const descriptor = getProcessorDescriptor(type); + selectedOptions = descriptor + ? [{ label: descriptor.label, value: type }] + : // If there is no label for this processor type, just use the type as the label + [{ label: type, value: type }]; + } else { + selectedOptions = []; + } + + const error = typeField.getErrorsMessages(); + const isInvalid = error ? Boolean(error.length) : false; + + const onCreateComboOption = (value: string) => { + // Note: for now, all validations for a comboBox array item have to be synchronous + // If there is a need to support asynchronous validation, we'll work on it (and will need to update the logic). + const { isValid } = typeField.validate({ + value, + validationType: VALIDATION_TYPES.ARRAY_ITEM, + }) as FieldValidateResponse; + + if (!isValid) { + // Return false to explicitly reject the user's input. + return false; + } + + const newValue = [...(typeField.value as string[]), value]; + + typeField.setValue(newValue); + }; + + return ( + + { + typeField.setValue(options.map(({ value }) => value)); + }} + noSuggestions={false} + singleSelection={{ + asPlainText: true, + }} + data-test-subj="input" + /> + + ); }} - /> + ); }; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/shared/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/shared/index.ts new file mode 100644 index 0000000000000..1b4b975b5305e --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/shared/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { + getProcessorDescriptor, + mapProcessorTypeToDescriptor, + ProcessorType, +} from './map_processor_type_to_form'; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/map_processor_type_to_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/shared/map_processor_type_to_form.tsx similarity index 95% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/map_processor_type_to_form.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/shared/map_processor_type_to_form.tsx index 5993d7fb3f87a..7055721fc8b07 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/map_processor_type_to_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/shared/map_processor_type_to_form.tsx @@ -10,7 +10,7 @@ import { FunctionComponent } from 'react'; // import { SetProcessor } from './processors/set'; // import { Gsub } from './processors/gsub'; -interface FieldsFormDescriptor { +interface FieldDescriptor { FieldsComponent?: FunctionComponent; docLinkPath: string; /** @@ -19,7 +19,9 @@ interface FieldsFormDescriptor { label: string; } -const mapProcessorTypeToFormDescriptor: Record = { +type MapProcessorTypeToDescriptor = Record; + +export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = { append: { FieldsComponent: undefined, // TODO: Implement docLinkPath: '/append-processor.html', @@ -262,12 +264,10 @@ const mapProcessorTypeToFormDescriptor: Record = { }, }; -export const types = Object.keys(mapProcessorTypeToFormDescriptor).sort(); - -export type ProcessorType = keyof typeof mapProcessorTypeToFormDescriptor; +export type ProcessorType = keyof typeof mapProcessorTypeToDescriptor; -export const getProcessorFormDescriptor = ( +export const getProcessorDescriptor = ( type: ProcessorType | string -): FieldsFormDescriptor | undefined => { - return mapProcessorTypeToFormDescriptor[type as ProcessorType]; +): FieldDescriptor | undefined => { + return mapProcessorTypeToDescriptor[type as ProcessorType]; }; From a4ec4332c665956727ec264c171ef5f4c48dbb9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yulia=20=C4=8Cech?= <6585477+yuliacech@users.noreply.github.com> Date: Tue, 11 Aug 2020 11:32:05 +0200 Subject: [PATCH 040/113] [ILM] Convert node details flyout to TS (#73707) * [ILM] Convert node allocation component to TS and use hooks * [ILM] Fix jest tests * [ILM] Fix i18n check * [ILM] Implement code review suggestions * [ILM] Fix type check, docs link and button maxWidth in NodeAllocation component * Fix internaliation error * [ILM] Convert node details flyout to TS * [ILM] Fix useState declaration * [ILM] Fix useState declaration * [ILM] Fix jest test * [ILM] Change error message when unable to load node attributes * [ILM] Change error message when unable to load node details * [ILM] Delete a period in error callout * [ILM] Delete a period in error callout * [ILM] Convert node details flyout to TS * [ILM] Fix i18n check * [ILM] Fix useState declaration * [ILM] Fix useState declaration * [ILM] Fix jest test * [ILM] Change error message when unable to load node details * [ILM] Delete a period in error callout Co-authored-by: Elastic Machine --- .../__jest__/components/edit_policy.test.js | 14 ++- .../components/helpers/http_requests.ts | 9 ++ .../components/cold_phase/cold_phase.js | 3 - .../node_allocation/node_allocation.tsx | 18 ++- .../node_attrs_details/{index.js => index.ts} | 2 +- .../node_attrs_details.container.js | 18 --- .../node_attrs_details/node_attrs_details.js | 81 ------------- .../node_attrs_details/node_attrs_details.tsx | 106 ++++++++++++++++++ .../components/warm_phase/warm_phase.js | 3 - .../sections/edit_policy/edit_policy.js | 16 --- .../public/application/services/api.ts | 9 +- .../public/application/store/actions/nodes.js | 24 ---- .../application/store/reducers/nodes.js | 23 +--- .../application/store/selectors/nodes.js | 14 --- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 16 files changed, 149 insertions(+), 193 deletions(-) rename x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/{index.js => index.ts} (78%) delete mode 100644 x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.container.js delete mode 100644 x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.js create mode 100644 x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.tsx diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.js b/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.js index c6da347ed8cfe..4fe3d5c66696e 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.js +++ b/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.js @@ -253,6 +253,9 @@ describe('edit policy', () => { beforeEach(() => { server.respondImmediately = true; httpRequestsMockHelpers.setNodesListResponse({}); + httpRequestsMockHelpers.setNodesDetailsResponse('attribute:true', [ + { nodeId: 'testNodeId', stats: { name: 'testNodeName', host: 'testHost' } }, + ]); }); test('should show number required error when trying to save empty warm phase', async () => { @@ -395,7 +398,9 @@ describe('edit policy', () => { rendered.update(); const flyoutButton = findTestSubject(rendered, 'warm-viewNodeDetailsFlyoutButton'); expect(flyoutButton.exists()).toBeTruthy(); - flyoutButton.simulate('click'); + await act(async () => { + await flyoutButton.simulate('click'); + }); rendered.update(); expect(rendered.find('.euiFlyout').exists()).toBeTruthy(); }); @@ -404,6 +409,9 @@ describe('edit policy', () => { beforeEach(() => { server.respondImmediately = true; httpRequestsMockHelpers.setNodesListResponse({}); + httpRequestsMockHelpers.setNodesDetailsResponse('attribute:true', [ + { nodeId: 'testNodeId', stats: { name: 'testNodeName', host: 'testHost' } }, + ]); }); test('should allow 0 for phase timing', async () => { const rendered = mountWithIntl(component); @@ -470,7 +478,9 @@ describe('edit policy', () => { rendered.update(); const flyoutButton = findTestSubject(rendered, 'cold-viewNodeDetailsFlyoutButton'); expect(flyoutButton.exists()).toBeTruthy(); - flyoutButton.simulate('click'); + await act(async () => { + await flyoutButton.simulate('click'); + }); rendered.update(); expect(rendered.find('.euiFlyout').exists()).toBeTruthy(); }); diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/components/helpers/http_requests.ts b/x-pack/plugins/index_lifecycle_management/__jest__/components/helpers/http_requests.ts index b5c941beef181..668cbedbf0c95 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/components/helpers/http_requests.ts +++ b/x-pack/plugins/index_lifecycle_management/__jest__/components/helpers/http_requests.ts @@ -25,9 +25,18 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { ]); }; + const setNodesDetailsResponse = (nodeAttributes: string, response: HttpResponse = []) => { + server.respondWith(`/api/index_lifecycle_management/nodes/${nodeAttributes}/details`, [ + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(response), + ]); + }; + return { setPoliciesResponse, setNodesListResponse, + setNodesDetailsResponse, }; }; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/cold_phase/cold_phase.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/cold_phase/cold_phase.js index d5c0744e5eb07..200bf0e767d9d 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/cold_phase/cold_phase.js +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/cold_phase/cold_phase.js @@ -34,7 +34,6 @@ import { SetPriorityInput } from '../set_priority_input'; export class ColdPhase extends PureComponent { static propTypes = { setPhaseData: PropTypes.func.isRequired, - showNodeDetailsFlyout: PropTypes.func.isRequired, isShowingErrors: PropTypes.bool.isRequired, errors: PropTypes.object.isRequired, @@ -42,7 +41,6 @@ export class ColdPhase extends PureComponent { render() { const { setPhaseData, - showNodeDetailsFlyout, phaseData, errors, isShowingErrors, @@ -114,7 +112,6 @@ export class ColdPhase extends PureComponent { void; - showNodeDetailsFlyout: (nodeAttrs: any) => void; errors: any; phaseData: any; isShowingErrors: boolean; @@ -48,13 +48,16 @@ const learnMoreLink = ( export const NodeAllocation: React.FunctionComponent = ({ phase, setPhaseData, - showNodeDetailsFlyout, errors, phaseData, isShowingErrors, }) => { const { isLoading, data: nodes, error, sendRequest } = useLoadNodes(); + const [selectedNodeAttrsForDetails, setSelectedNodeAttrsForDetails] = useState( + null + ); + if (isLoading) { return ( @@ -162,7 +165,7 @@ export const NodeAllocation: React.FunctionComponent = ({ data-test-subj={`${phase}-viewNodeDetailsFlyoutButton`} flush="left" iconType="eye" - onClick={() => showNodeDetailsFlyout(phaseData[PHASE_NODE_ATTRS])} + onClick={() => setSelectedNodeAttrsForDetails(phaseData[PHASE_NODE_ATTRS])} > = ({ ) : null} {learnMoreLink} + + {selectedNodeAttrsForDetails ? ( + setSelectedNodeAttrsForDetails(null)} + /> + ) : null} ); }; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/index.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/index.ts similarity index 78% rename from x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/index.js rename to x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/index.ts index 885e965c46c4b..056d2f2f600f3 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/index.js +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { NodeAttrsDetails } from './node_attrs_details.container'; +export { NodeAttrsDetails } from './node_attrs_details'; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.container.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.container.js deleted file mode 100644 index ca7c310723b62..0000000000000 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.container.js +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { connect } from 'react-redux'; - -import { getNodeDetails } from '../../../../store/selectors'; -import { fetchNodeDetails } from '../../../../store/actions'; -import { NodeAttrsDetails as PresentationComponent } from './node_attrs_details'; - -export const NodeAttrsDetails = connect( - (state, ownProps) => ({ - details: getNodeDetails(state, ownProps.selectedNodeAttrs), - }), - { fetchNodeDetails } -)(PresentationComponent); diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.js deleted file mode 100644 index 67bc8f0386abf..0000000000000 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.js +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { PureComponent } from 'react'; -import PropTypes from 'prop-types'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; - -import { - EuiFlyoutBody, - EuiFlyout, - EuiTitle, - EuiInMemoryTable, - EuiSpacer, - EuiPortal, -} from '@elastic/eui'; - -export class NodeAttrsDetails extends PureComponent { - static propTypes = { - fetchNodeDetails: PropTypes.func.isRequired, - close: PropTypes.func.isRequired, - - details: PropTypes.array, - selectedNodeAttrs: PropTypes.string.isRequired, - }; - - UNSAFE_componentWillMount() { - this.props.fetchNodeDetails(this.props.selectedNodeAttrs); - } - - render() { - const { selectedNodeAttrs, details, close } = this.props; - - return ( - - - - -

- -

-
- - -
-
-
- ); - } -} diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.tsx new file mode 100644 index 0000000000000..6fcbd94dc5e9a --- /dev/null +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/node_attrs_details/node_attrs_details.tsx @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { + EuiFlyoutBody, + EuiFlyout, + EuiTitle, + EuiInMemoryTable, + EuiSpacer, + EuiPortal, + EuiLoadingContent, + EuiCallOut, + EuiButton, +} from '@elastic/eui'; + +import { useLoadNodeDetails } from '../../../../services/api'; + +interface Props { + close: () => void; + selectedNodeAttrs: string; +} + +export const NodeAttrsDetails: React.FunctionComponent = ({ close, selectedNodeAttrs }) => { + const { data, isLoading, error, sendRequest } = useLoadNodeDetails(selectedNodeAttrs); + let content; + if (isLoading) { + content = ; + } else if (error) { + const { statusCode, message } = error; + content = ( + + } + color="danger" + > +

+ {message} ({statusCode}) +

+ + + +
+ ); + } else { + content = ( + + ); + } + return ( + + + + +

+ +

+
+ + {content} +
+
+
+ ); +}; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/warm_phase/warm_phase.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/warm_phase/warm_phase.js index 55aec88c8bcab..60b5ab4781b6d 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/warm_phase/warm_phase.js +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/warm_phase/warm_phase.js @@ -38,7 +38,6 @@ import { MinAgeInput } from '../min_age_input'; export class WarmPhase extends PureComponent { static propTypes = { setPhaseData: PropTypes.func.isRequired, - showNodeDetailsFlyout: PropTypes.func.isRequired, isShowingErrors: PropTypes.bool.isRequired, errors: PropTypes.object.isRequired, @@ -47,7 +46,6 @@ export class WarmPhase extends PureComponent { render() { const { setPhaseData, - showNodeDetailsFlyout, phaseData, errors, isShowingErrors, @@ -152,7 +150,6 @@ export class WarmPhase extends PureComponent { { - this.setState({ isShowingNodeDetailsFlyout: true, selectedNodeAttrsForDetails }); - }; - togglePolicyJsonFlyout = () => { this.setState(({ isShowingPolicyJsonFlyout }) => ({ isShowingPolicyJsonFlyout: !isShowingPolicyJsonFlyout, @@ -291,7 +284,6 @@ export class EditPolicy extends Component { @@ -299,7 +291,6 @@ export class EditPolicy extends Component { @@ -370,13 +361,6 @@ export class EditPolicy extends Component {
- {this.state.isShowingNodeDetailsFlyout ? ( - this.setState({ isShowingNodeDetailsFlyout: false })} - /> - ) : null} - {this.state.isShowingPolicyJsonFlyout ? ( { }); }; -export async function loadNodeDetails(selectedNodeAttrs: string) { - return await sendGet(`nodes/${selectedNodeAttrs}/details`); -} +export const useLoadNodeDetails = (selectedNodeAttrs: string) => { + return useRequest({ + path: `nodes/${selectedNodeAttrs}/details`, + method: 'get', + }); +}; export async function loadIndexTemplates() { return await sendGet(`templates`); diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/actions/nodes.js b/x-pack/plugins/index_lifecycle_management/public/application/store/actions/nodes.js index 0b4026f019210..3f1c00db621a7 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/store/actions/nodes.js +++ b/x-pack/plugins/index_lifecycle_management/public/application/store/actions/nodes.js @@ -3,33 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { i18n } from '@kbn/i18n'; import { createAction } from 'redux-actions'; -import { showApiError } from '../../services/api_errors'; -import { loadNodeDetails } from '../../services/api'; import { SET_SELECTED_NODE_ATTRS } from '../../constants'; export const setSelectedNodeAttrs = createAction(SET_SELECTED_NODE_ATTRS); export const setSelectedPrimaryShardCount = createAction('SET_SELECTED_PRIMARY_SHARED_COUNT'); export const setSelectedReplicaCount = createAction('SET_SELECTED_REPLICA_COUNT'); - -export const fetchedNodeDetails = createAction( - 'FETCHED_NODE_DETAILS', - (selectedNodeAttrs, details) => ({ - selectedNodeAttrs, - details, - }) -); -export const fetchNodeDetails = (selectedNodeAttrs) => async (dispatch) => { - let details; - try { - details = await loadNodeDetails(selectedNodeAttrs); - } catch (err) { - const title = i18n.translate('xpack.indexLifecycleMgmt.editPolicy.nodeDetailErrorMessage', { - defaultMessage: 'Error loading node attribute details', - }); - showApiError(err, title); - return false; - } - dispatch(fetchedNodeDetails(selectedNodeAttrs, details)); -}; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/reducers/nodes.js b/x-pack/plugins/index_lifecycle_management/public/application/store/reducers/nodes.js index 06d173e9901f8..383e61b5aacde 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/store/reducers/nodes.js +++ b/x-pack/plugins/index_lifecycle_management/public/application/store/reducers/nodes.js @@ -5,12 +5,7 @@ */ import { handleActions } from 'redux-actions'; -import { - setSelectedNodeAttrs, - setSelectedPrimaryShardCount, - setSelectedReplicaCount, - fetchedNodeDetails, -} from '../actions/nodes'; +import { setSelectedPrimaryShardCount, setSelectedReplicaCount } from '../actions'; const defaultState = { isLoading: false, @@ -23,22 +18,6 @@ const defaultState = { export const nodes = handleActions( { - [fetchedNodeDetails](state, { payload }) { - const { selectedNodeAttrs, details } = payload; - return { - ...state, - details: { - ...state.details, - [selectedNodeAttrs]: details, - }, - }; - }, - [setSelectedNodeAttrs](state, { payload: selectedNodeAttrs }) { - return { - ...state, - selectedNodeAttrs, - }; - }, [setSelectedPrimaryShardCount](state, { payload }) { let selectedPrimaryShardCount = parseInt(payload); if (isNaN(selectedPrimaryShardCount)) { diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/selectors/nodes.js b/x-pack/plugins/index_lifecycle_management/public/application/store/selectors/nodes.js index 561681bf7d93d..72bfd4b15a78a 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/store/selectors/nodes.js +++ b/x-pack/plugins/index_lifecycle_management/public/application/store/selectors/nodes.js @@ -10,17 +10,3 @@ export const getSelectedPrimaryShardCount = (state) => state.nodes.selectedPrima export const getSelectedReplicaCount = (state) => state.nodes.selectedReplicaCount !== undefined ? state.nodes.selectedReplicaCount : 1; - -export const getSelectedNodeAttrs = (state) => state.nodes.selectedNodeAttrs; - -export const getNodesFromSelectedNodeAttrs = (state) => { - const nodes = getNodes(state)[getSelectedNodeAttrs(state)]; - if (nodes) { - return nodes.length; - } - return null; -}; - -export const getNodeDetails = (state, selectedNodeAttrs) => { - return state.nodes.details[selectedNodeAttrs]; -}; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 05f709f04aa88..c796aacda10a0 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8206,7 +8206,6 @@ "xpack.indexLifecycleMgmt.editPolicy.nodeAllocationLabel": "シャードの割当をコントロールするノード属性を選択", "xpack.indexLifecycleMgmt.editPolicy.nodeAttributesMissingDescription": "ノード属性なしではシャードの割り当てをコントロールできません。", "xpack.indexLifecycleMgmt.editPolicy.nodeAttributesMissingLabel": "elasticsearch.yml でノード属性が構成されていません", - "xpack.indexLifecycleMgmt.editPolicy.nodeDetailErrorMessage": "ノード属性の詳細の読み込み中にエラーが発生しました", "xpack.indexLifecycleMgmt.editPolicy.numberRequiredError": "数字が必要です。", "xpack.indexLifecycleMgmt.editPolicy.phaseCold.minimumAgeLabel": "コールドフェーズのタイミング", "xpack.indexLifecycleMgmt.editPolicy.phaseCold.minimumAgeUnitsAriaLabel": "コールドフェーズのタイミングの単位", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index bd0066eeb419f..4c48a66b3c3c8 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8208,7 +8208,6 @@ "xpack.indexLifecycleMgmt.editPolicy.nodeAllocationLabel": "选择节点属性来控制分片分配", "xpack.indexLifecycleMgmt.editPolicy.nodeAttributesMissingDescription": "没有节点属性,将无法控制分片分配。", "xpack.indexLifecycleMgmt.editPolicy.nodeAttributesMissingLabel": "elasticsearch.yml 中未配置任何节点属性", - "xpack.indexLifecycleMgmt.editPolicy.nodeDetailErrorMessage": "加载节点属性详细信息时出错", "xpack.indexLifecycleMgmt.editPolicy.numberRequiredError": "数字必填。", "xpack.indexLifecycleMgmt.editPolicy.phaseCold.minimumAgeLabel": "冷阶段计时", "xpack.indexLifecycleMgmt.editPolicy.phaseCold.minimumAgeUnitsAriaLabel": "冷阶段计时单位", From 0c16ca464936547f83b770dc630de20a9f1652e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Tue, 11 Aug 2020 10:44:32 +0100 Subject: [PATCH 041/113] [Telemetry][API Integration] size_in_bytes to be a number (#74664) --- test/api_integration/apis/telemetry/telemetry_local.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/api_integration/apis/telemetry/telemetry_local.js b/test/api_integration/apis/telemetry/telemetry_local.js index 88e6b3a29052e..8b10f412fae27 100644 --- a/test/api_integration/apis/telemetry/telemetry_local.js +++ b/test/api_integration/apis/telemetry/telemetry_local.js @@ -90,7 +90,7 @@ export default function ({ getService }) { expect(stats.stack_stats.data[0].index_count).to.be(1); expect(stats.stack_stats.data[0].doc_count).to.be(0); expect(stats.stack_stats.data[0].ecs_index_count).to.be(0); - expect(stats.stack_stats.data[0].size_in_bytes).to.be.greaterThan(0); + expect(stats.stack_stats.data[0].size_in_bytes).to.be.a('number'); }); it('should pull local stats and validate fields', async () => { From 5665ce2cd2773f7db83d1de7d4b362470e9f8840 Mon Sep 17 00:00:00 2001 From: igoristic Date: Tue, 11 Aug 2020 06:40:22 -0400 Subject: [PATCH 042/113] Fixed grammar (#74725) --- TYPESCRIPT.md | 2 +- rfcs/text/0001_lifecycle_setup.md | 2 +- src/plugins/data/public/search/search_interceptor.ts | 2 +- .../plugins/data_enhanced/public/search/search_interceptor.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/TYPESCRIPT.md b/TYPESCRIPT.md index 7be9a5e4f3b17..ae23768558f9d 100644 --- a/TYPESCRIPT.md +++ b/TYPESCRIPT.md @@ -62,7 +62,7 @@ declare module '@elastic/eui' { 1. Open up the file and see how easy it would be to convert to TypeScript. 2. If it's very straightforward, go for it. 3. If it's not and you wish to stay focused on your own PR, get around the error by adding a type definition file in the same folder as the dependency, with the same name. -4. Minimally you will need to type what you are using in your PR. No need to go crazy to fully type the thing or you might be there for awhile depending on what's available. +4. Minimally you will need to type what you are using in your PR. No need to go crazy to fully type the thing or you might be there for a while depending on what's available. For example: diff --git a/rfcs/text/0001_lifecycle_setup.md b/rfcs/text/0001_lifecycle_setup.md index 01343b42f9a2d..bff200ca76472 100644 --- a/rfcs/text/0001_lifecycle_setup.md +++ b/rfcs/text/0001_lifecycle_setup.md @@ -124,7 +124,7 @@ all services and plugins, and then adding an empty `start` where it is necessary. Functionality can then be moved from `setup`->`start` on a case-by-case. -If this change doesn't happen for awhile, then it might make sense to follow +If this change doesn't happen for a while, then it might make sense to follow the reverse process to ensure the least impact. The migration guide will be updated to reflect the `setup` and `start` diff --git a/src/plugins/data/public/search/search_interceptor.ts b/src/plugins/data/public/search/search_interceptor.ts index e6eca16c5ca4b..677ad0ccea677 100644 --- a/src/plugins/data/public/search/search_interceptor.ts +++ b/src/plugins/data/public/search/search_interceptor.ts @@ -170,7 +170,7 @@ export class SearchInterceptor { if (this.longRunningToast) return; this.longRunningToast = this.deps.toasts.addInfo( { - title: 'Your query is taking awhile', + title: 'Your query is taking a while', text: getLongQueryNotification({ application: this.deps.application, }), diff --git a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts index 927dc91f365b7..9662b9e17248b 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts @@ -51,7 +51,7 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { if (this.longRunningToast) return; this.longRunningToast = this.deps.toasts.addInfo( { - title: 'Your query is taking awhile', + title: 'Your query is taking a while', text: getLongQueryNotification({ cancel: this.cancelPending, runBeyondTimeout: this.runBeyondTimeout, From 53828dab35a95191ffb3467c33f5731847bb22f2 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Tue, 11 Aug 2020 15:24:21 +0300 Subject: [PATCH 043/113] [telemetry] update README to downplay ui_metrics (#74635) Co-authored-by: Elastic Machine --- src/plugins/usage_collection/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/usage_collection/README.md b/src/plugins/usage_collection/README.md index a828096f86042..4f0f10703c5e9 100644 --- a/src/plugins/usage_collection/README.md +++ b/src/plugins/usage_collection/README.md @@ -10,8 +10,6 @@ To integrate with the telemetry services for usage collection of your feature, t All you need to provide is a `type` for organizing your fields, `schema` field to define the expected types of usage fields reported, and a `fetch` method for returning your usage data. Then you need to make the Telemetry service aware of the collector by registering it. -### New Platform - 1. Make sure `usageCollection` is in your optional Plugins: ```json @@ -205,6 +203,10 @@ There are a few ways you can test that your usage collector is working properly. # UI Metric app +The UI metrics implementation in its current state is not useful. We are working on improving the implementation to enable teams to use the data to visualize and gather information from what is being reported. Please refer to the telemetry team if you are interested in adding ui_metrics to your plugin. + +**Until a better implementation is introduced, please defer from adding any new ui metrics.** + ## Purpose The purpose of the UI Metric app is to provide a tool for gathering data on how users interact with From d91e024f66b4a8c71749f599e392b8de7a5cd6e7 Mon Sep 17 00:00:00 2001 From: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Date: Tue, 11 Aug 2020 08:52:38 -0400 Subject: [PATCH 044/113] [SECURITY] Bugs css/inspect (#74711) * Fix inspection button when using topN * css left over --- .../components/configure_cases/index.tsx | 3 +++ .../common/components/header_global/index.tsx | 6 ++++-- .../public/common/components/top_n/index.tsx | 2 +- .../containers/use_global_time/index.test.tsx | 21 ++++++++++++++++++- .../containers/use_global_time/index.tsx | 8 ++++--- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx index e2e3a600a95ff..63b271b8cce78 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx @@ -42,6 +42,9 @@ const FormWrapper = styled.div` padding-top: ${theme.eui.paddingSizes.xl}; padding-bottom: ${theme.eui.paddingSizes.xl}; + .euiFlyout { + z-index: ${theme.eui.euiZNavigation + 1}; + } `} `; diff --git a/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx b/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx index fbc3d62768d00..e05e3c2e9aeb1 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx @@ -41,14 +41,15 @@ const FlexItem = styled(EuiFlexItem)` `; FlexItem.displayName = 'FlexItem'; -const FlexGroup = styled(EuiFlexGroup)<{ $globalFullScreen: boolean }>` - ${({ $globalFullScreen, theme }) => ` +const FlexGroup = styled(EuiFlexGroup)<{ $globalFullScreen: boolean; $hasSibling: boolean }>` + ${({ $globalFullScreen, $hasSibling, theme }) => ` border-bottom: ${theme.eui.euiBorderThin}; margin-bottom: 1px; padding-bottom: 4px; padding-left: ${theme.eui.paddingSizes.l}; padding-right: ${gutterTimeline}; ${$globalFullScreen ? 'display: none;' : ''} + ${$hasSibling ? `border-bottom: ${theme.eui.euiBorderThin};` : 'border-bottom-width: 0px;'} `} `; FlexGroup.displayName = 'FlexGroup'; @@ -75,6 +76,7 @@ export const HeaderGlobal = React.memo(({ hideDetectionEngine diff --git a/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx b/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx index 807f1839973fa..d71242329bcda 100644 --- a/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx @@ -104,7 +104,7 @@ const StatefulTopNComponent: React.FC = ({ value, }) => { const kibana = useKibana(); - const { from, deleteQuery, setQuery, to } = useGlobalTime(); + const { from, deleteQuery, setQuery, to } = useGlobalTime(false); const options = getOptions( timelineId === TimelineId.active ? activeTimelineEventType : undefined diff --git a/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.test.tsx b/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.test.tsx index 9d5f1740b0276..07ce3551e3289 100644 --- a/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.test.tsx @@ -8,17 +8,22 @@ import { act, renderHook } from '@testing-library/react-hooks'; import { useGlobalTime } from '.'; +const mockDispatch = jest.fn(); + jest.mock('react-redux', () => { const originalModule = jest.requireActual('react-redux'); return { ...originalModule, - useDispatch: jest.fn().mockReturnValue(jest.fn()), + useDispatch: () => mockDispatch, useSelector: jest.fn().mockReturnValue({ from: 0, to: 0 }), }; }); describe('useGlobalTime', () => { + beforeEach(() => { + mockDispatch.mockReset(); + }); test('returns memoized value', () => { const { result, rerender } = renderHook(() => useGlobalTime()); @@ -30,4 +35,18 @@ describe('useGlobalTime', () => { expect(result1.from).toBe(0); expect(result1.to).toBe(0); }); + + test('clear all queries at unmount', () => { + const { rerender } = renderHook(() => useGlobalTime()); + act(() => rerender()); + expect(mockDispatch.mock.calls[0][0].type).toEqual( + 'x-pack/security_solution/local/inputs/DELETE_ALL_QUERY' + ); + }); + + test('do NOT clear all queries at unmount', () => { + const { rerender } = renderHook(() => useGlobalTime(false)); + act(() => rerender()); + expect(mockDispatch.mock.calls.length).toBe(0); + }); }); diff --git a/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.tsx b/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.tsx index b63616ecbcf56..52825caf9ce74 100644 --- a/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.tsx @@ -11,7 +11,7 @@ import { inputsSelectors } from '../../store'; import { inputsActions } from '../../store/actions'; import { SetQuery, DeleteQuery } from './types'; -export const useGlobalTime = () => { +export const useGlobalTime = (clearAllQuery: boolean = true) => { const dispatch = useDispatch(); const { from, to } = useSelector(inputsSelectors.globalTimeRangeSelector); const [isInitializing, setIsInitializing] = useState(true); @@ -32,9 +32,11 @@ export const useGlobalTime = () => { setIsInitializing(false); } return () => { - dispatch(inputsActions.deleteAllQuery({ id: 'global' })); + if (clearAllQuery) { + dispatch(inputsActions.deleteAllQuery({ id: 'global' })); + } }; - }, [dispatch, isInitializing]); + }, [clearAllQuery, dispatch, isInitializing]); const memoizedReturn = useMemo( () => ({ From 6c63b0d40b2a83ba07822790622769bfd2f56d8d Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Tue, 11 Aug 2020 07:54:58 -0500 Subject: [PATCH 045/113] Index pattern field list - transition away from extending array - introduce and use getAll() (#74718) - Introduce `indexPattern.fields.getAll()` and use where possible - Rename `index_patterns/fields/fields.mocks.ts.ts => index_patterns/fields/fields.mocks.ts` - FieldSpec - make `count` and `scripted` fields optional - use `indexPattern.fields.getByName` instead of filter where possible --- ...in-plugins-data-public.fieldlist.getall.md | 11 ++ ...na-plugin-plugins-data-public.fieldlist.md | 1 + ...ta-public.iindexpatternfieldlist.getall.md | 15 +++ ...gins-data-public.iindexpatternfieldlist.md | 1 + .../es_query/filters/exists_filter.test.ts | 2 +- .../es_query/filters/get_filter_field.test.ts | 2 +- .../es_query/filters/phrases_filter.test.ts | 2 +- .../index_patterns/fields/field_list.ts | 2 + .../{fields.mocks.ts.ts => fields.mocks.ts} | 0 .../fields/index_pattern_field.ts | 4 +- .../index_patterns/index_pattern.ts | 4 +- .../data/common/index_patterns/mocks.ts | 2 +- .../data/common/index_patterns/types.ts | 4 +- src/plugins/data/public/public.api.md | 4 + .../lib/get_index_pattern_field_list.ts | 6 +- .../components/table/table.test.tsx | 68 ++++++------ .../application/components/table/table.tsx | 8 +- .../edit_index_pattern/edit_index_pattern.tsx | 6 +- .../edit_index_pattern/tabs/tabs.tsx | 2 +- .../edit_index_pattern/tabs/utils.ts | 4 +- .../__snapshots__/field_editor.test.tsx.snap | 101 ++++-------------- .../components/scripting_help/test_script.tsx | 1 + .../field_editor/field_editor.test.tsx | 21 ++-- .../components/field_editor/field_editor.tsx | 8 +- .../public/control/list_control_factory.ts | 2 +- .../public/test_utils/get_deps_mock.tsx | 1 + .../public/helpers/arg_value_suggestions.ts | 3 + .../components/autocomplete/field.test.tsx | 2 +- .../autocomplete/field_value_lists.test.tsx | 2 +- .../autocomplete/field_value_match.test.tsx | 2 +- .../field_value_match_any.test.tsx | 2 +- .../components/autocomplete/helpers.test.ts | 2 +- .../use_field_value_autocomplete.test.ts | 2 +- .../components/autocomplete/operator.test.tsx | 2 +- .../exceptions/builder/entry_item.test.tsx | 2 +- .../builder/exception_item.test.tsx | 2 +- .../exceptions/builder/helpers.test.tsx | 2 +- .../exceptions/builder/index.test.tsx | 2 +- 38 files changed, 143 insertions(+), 164 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getall.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md rename src/plugins/data/common/index_patterns/fields/{fields.mocks.ts.ts => fields.mocks.ts} (100%) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getall.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getall.md new file mode 100644 index 0000000000000..da29a4de9acc8 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getall.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) > [getAll](./kibana-plugin-plugins-data-public.fieldlist.getall.md) + +## FieldList.getAll property + +Signature: + +```typescript +readonly getAll: () => IndexPatternField[]; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md index ef740575dff4e..012b069430290 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md @@ -21,6 +21,7 @@ export declare class FieldList extends Array implements IInde | Property | Modifiers | Type | Description | | --- | --- | --- | --- | | [add](./kibana-plugin-plugins-data-public.fieldlist.add.md) | | (field: FieldSpec) => void | | +| [getAll](./kibana-plugin-plugins-data-public.fieldlist.getall.md) | | () => IndexPatternField[] | | | [getByName](./kibana-plugin-plugins-data-public.fieldlist.getbyname.md) | | (name: IndexPatternField['name']) => IndexPatternField | undefined | | | [getByType](./kibana-plugin-plugins-data-public.fieldlist.getbytype.md) | | (type: IndexPatternField['type']) => any[] | | | [remove](./kibana-plugin-plugins-data-public.fieldlist.remove.md) | | (field: IFieldType) => void | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md new file mode 100644 index 0000000000000..070e36e303a80 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IIndexPatternFieldList](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.md) > [getAll](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md) + +## IIndexPatternFieldList.getAll() method + +Signature: + +```typescript +getAll(): IndexPatternField[]; +``` +Returns: + +`IndexPatternField[]` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md index 4ab012a2601d2..b068c4804c0dd 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md @@ -15,6 +15,7 @@ export interface IIndexPatternFieldList extends Array | Method | Description | | --- | --- | | [add(field)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.add.md) | | +| [getAll()](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md) | | | [getByName(name)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbyname.md) | | | [getByType(type)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbytype.md) | | | [remove(field)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.remove.md) | | diff --git a/src/plugins/data/common/es_query/filters/exists_filter.test.ts b/src/plugins/data/common/es_query/filters/exists_filter.test.ts index 065301986726d..298ea7f49da5e 100644 --- a/src/plugins/data/common/es_query/filters/exists_filter.test.ts +++ b/src/plugins/data/common/es_query/filters/exists_filter.test.ts @@ -19,7 +19,7 @@ import { buildExistsFilter, getExistsFilterField } from './exists_filter'; import { IIndexPattern } from '../../index_patterns'; -import { fields } from '../../index_patterns/fields/fields.mocks.ts'; +import { fields } from '../../index_patterns/fields/fields.mocks'; describe('exists filter', function () { const indexPattern: IIndexPattern = ({ diff --git a/src/plugins/data/common/es_query/filters/get_filter_field.test.ts b/src/plugins/data/common/es_query/filters/get_filter_field.test.ts index 4329a45f84ef9..3b27aa98cf5f6 100644 --- a/src/plugins/data/common/es_query/filters/get_filter_field.test.ts +++ b/src/plugins/data/common/es_query/filters/get_filter_field.test.ts @@ -21,7 +21,7 @@ import { buildPhraseFilter } from './phrase_filter'; import { buildQueryFilter } from './query_string_filter'; import { getFilterField } from './get_filter_field'; import { IIndexPattern } from '../../index_patterns'; -import { fields } from '../../index_patterns/fields/fields.mocks.ts'; +import { fields } from '../../index_patterns/fields/fields.mocks'; describe('getFilterField', function () { const indexPattern: IIndexPattern = ({ diff --git a/src/plugins/data/common/es_query/filters/phrases_filter.test.ts b/src/plugins/data/common/es_query/filters/phrases_filter.test.ts index 7fbab263ac040..ed42b63be7ecc 100644 --- a/src/plugins/data/common/es_query/filters/phrases_filter.test.ts +++ b/src/plugins/data/common/es_query/filters/phrases_filter.test.ts @@ -19,7 +19,7 @@ import { buildPhrasesFilter, getPhrasesFilterField } from './phrases_filter'; import { IIndexPattern } from '../../index_patterns'; -import { fields } from '../../index_patterns/fields/fields.mocks.ts'; +import { fields } from '../../index_patterns/fields/fields.mocks'; describe('phrases filter', function () { const indexPattern: IIndexPattern = ({ diff --git a/src/plugins/data/common/index_patterns/fields/field_list.ts b/src/plugins/data/common/index_patterns/fields/field_list.ts index 207002f42bbce..172da9f9ca43f 100644 --- a/src/plugins/data/common/index_patterns/fields/field_list.ts +++ b/src/plugins/data/common/index_patterns/fields/field_list.ts @@ -27,6 +27,7 @@ type FieldMap = Map; export interface IIndexPatternFieldList extends Array { add(field: FieldSpec): void; + getAll(): IndexPatternField[]; getByName(name: IndexPatternField['name']): IndexPatternField | undefined; getByType(type: IndexPatternField['type']): IndexPatternField[]; remove(field: IFieldType): void; @@ -72,6 +73,7 @@ export class FieldList extends Array implements IIndexPattern specs.map((field) => this.add(field)); } + public readonly getAll = () => [...this.byName.values()]; public readonly getByName = (name: IndexPatternField['name']) => this.byName.get(name); public readonly getByType = (type: IndexPatternField['type']) => [ ...(this.groups.get(type) || new Map()).values(), diff --git a/src/plugins/data/common/index_patterns/fields/fields.mocks.ts.ts b/src/plugins/data/common/index_patterns/fields/fields.mocks.ts similarity index 100% rename from src/plugins/data/common/index_patterns/fields/fields.mocks.ts.ts rename to src/plugins/data/common/index_patterns/fields/fields.mocks.ts diff --git a/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts b/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts index 4e22332bef141..679de103f8019 100644 --- a/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts +++ b/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts @@ -62,7 +62,7 @@ export class IndexPatternField implements IFieldType { // writable attrs public get count() { - return this.spec.count; + return this.spec.count || 0; } public set count(count) { @@ -107,7 +107,7 @@ export class IndexPatternField implements IFieldType { } public get scripted() { - return this.spec.scripted; + return !!this.spec.scripted; } public get searchable() { diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts b/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts index 211919e8e6b53..4e484dce7826f 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts @@ -403,11 +403,11 @@ export class IndexPattern implements IIndexPattern { } getNonScriptedFields() { - return [...this.fields.filter((field) => !field.scripted)]; + return [...this.fields.getAll().filter((field) => !field.scripted)]; } getScriptedFields() { - return [...this.fields.filter((field) => field.scripted)]; + return [...this.fields.getAll().filter((field) => field.scripted)]; } isTimeBased(): boolean { diff --git a/src/plugins/data/common/index_patterns/mocks.ts b/src/plugins/data/common/index_patterns/mocks.ts index 6036c08fa2b10..faf1b8307ea2e 100644 --- a/src/plugins/data/common/index_patterns/mocks.ts +++ b/src/plugins/data/common/index_patterns/mocks.ts @@ -17,4 +17,4 @@ * under the License. */ -export * from './fields/fields.mocks.ts'; +export * from './fields/fields.mocks'; diff --git a/src/plugins/data/common/index_patterns/types.ts b/src/plugins/data/common/index_patterns/types.ts index 3a7cf54843dfc..a771113acd231 100644 --- a/src/plugins/data/common/index_patterns/types.ts +++ b/src/plugins/data/common/index_patterns/types.ts @@ -149,7 +149,7 @@ export interface FieldSpecExportFmt { } export interface FieldSpec { - count: number; + count?: number; script?: string; lang?: string; conflictDescriptions?: Record; @@ -158,7 +158,7 @@ export interface FieldSpec { name: string; type: string; esTypes?: string[]; - scripted: boolean; + scripted?: boolean; searchable: boolean; aggregatable: boolean; readFromDocValues?: boolean; diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 76f88df4dd6fc..adff7b205b931 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -585,6 +585,8 @@ export class FieldList extends Array implements IIndexPattern // (undocumented) readonly add: (field: FieldSpec) => void; // (undocumented) + readonly getAll: () => IndexPatternField[]; + // (undocumented) readonly getByName: (name: IndexPatternField['name']) => IndexPatternField | undefined; // (undocumented) readonly getByType: (type: IndexPatternField['type']) => any[]; @@ -879,6 +881,8 @@ export interface IIndexPatternFieldList extends Array { // (undocumented) add(field: FieldSpec): void; // (undocumented) + getAll(): IndexPatternField[]; + // (undocumented) getByName(name: IndexPatternField['name']): IndexPatternField | undefined; // (undocumented) getByType(type: IndexPatternField['type']): IndexPatternField[]; diff --git a/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts b/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts index 751a59d982153..00e00aa8e2991 100644 --- a/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts +++ b/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { difference, map } from 'lodash'; +import { difference } from 'lodash'; import { IndexPattern, IndexPatternField } from 'src/plugins/data/public'; export function getIndexPatternFieldList( @@ -26,7 +26,7 @@ export function getIndexPatternFieldList( if (!indexPattern || !fieldCounts) return []; const fieldNamesInDocs = Object.keys(fieldCounts); - const fieldNamesInIndexPattern = map(indexPattern.fields, 'name'); + const fieldNamesInIndexPattern = indexPattern.fields.getAll().map((fld) => fld.name); const unknownTypes: IndexPatternField[] = []; difference(fieldNamesInDocs, fieldNamesInIndexPattern).forEach((unknownFieldName) => { @@ -36,5 +36,5 @@ export function getIndexPatternFieldList( } as IndexPatternField); }); - return [...indexPattern.fields, ...unknownTypes]; + return [...indexPattern.fields.getAll(), ...unknownTypes]; } diff --git a/src/plugins/discover/public/application/components/table/table.test.tsx b/src/plugins/discover/public/application/components/table/table.test.tsx index 0793072fd0cf4..29659b3969365 100644 --- a/src/plugins/discover/public/application/components/table/table.test.tsx +++ b/src/plugins/discover/public/application/components/table/table.test.tsx @@ -24,45 +24,47 @@ import { DocViewTable } from './table'; import { indexPatterns, IndexPattern } from '../../../../../data/public'; const indexPattern = { - fields: [ - { - name: '_index', - type: 'string', - scripted: false, - filterable: true, - }, - { - name: 'message', - type: 'string', - scripted: false, - filterable: false, - }, - { - name: 'extension', - type: 'string', - scripted: false, - filterable: true, - }, - { - name: 'bytes', - type: 'number', - scripted: false, - filterable: true, - }, - { - name: 'scripted', - type: 'number', - scripted: true, - filterable: false, - }, - ], + fields: { + getAll: () => [ + { + name: '_index', + type: 'string', + scripted: false, + filterable: true, + }, + { + name: 'message', + type: 'string', + scripted: false, + filterable: false, + }, + { + name: 'extension', + type: 'string', + scripted: false, + filterable: true, + }, + { + name: 'bytes', + type: 'number', + scripted: false, + filterable: true, + }, + { + name: 'scripted', + type: 'number', + scripted: true, + filterable: false, + }, + ], + }, metaFields: ['_index', '_score'], flattenHit: undefined, formatHit: jest.fn((hit) => hit._source), } as IndexPattern; indexPattern.fields.getByName = (name: string) => { - return indexPattern.fields.find((field) => field.name === name); + return indexPattern.fields.getAll().find((field) => field.name === name); }; indexPattern.flattenHit = indexPatterns.flattenHitWrapper(indexPattern, indexPattern.metaFields); diff --git a/src/plugins/discover/public/application/components/table/table.tsx b/src/plugins/discover/public/application/components/table/table.tsx index 9b95f2fc6bd27..628045bd32f61 100644 --- a/src/plugins/discover/public/application/components/table/table.tsx +++ b/src/plugins/discover/public/application/components/table/table.tsx @@ -104,15 +104,13 @@ export function DocViewTable({ // to the index pattern, but that has its own complications which you can read more about in the following // issue: https://github.com/elastic/kibana/issues/54957 const isNestedField = - !indexPattern.fields.find((patternField) => patternField.name === field) && - !!indexPattern.fields.find((patternField) => { + !indexPattern.fields.getByName(field) && + !!indexPattern.fields.getAll().find((patternField) => { // We only want to match a full path segment const nestedRootRegex = new RegExp(escapeRegExp(field) + '(\\.|$)'); return nestedRootRegex.test(patternField.subType?.nested?.path ?? ''); }); - const fieldType = isNestedField - ? 'nested' - : indexPattern.fields.find((patternField) => patternField.name === field)?.type; + const fieldType = isNestedField ? 'nested' : indexPattern.fields.getByName(field)?.type; return ( ().services; const [fields, setFields] = useState(indexPattern.getNonScriptedFields()); const [conflictedFields, setConflictedFields] = useState( - indexPattern.fields.filter((field) => field.type === 'conflict') + indexPattern.fields.getAll().filter((field) => field.type === 'conflict') ); const [defaultIndex, setDefaultIndex] = useState(uiSettings.get('defaultIndex')); const [tags, setTags] = useState([]); useEffect(() => { setFields(indexPattern.getNonScriptedFields()); - setConflictedFields(indexPattern.fields.filter((field) => field.type === 'conflict')); + setConflictedFields( + indexPattern.fields.getAll().filter((field) => field.type === 'conflict') + ); }, [indexPattern]); useEffect(() => { diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx index a59dca80a3684..f32eb63ad04b4 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx @@ -87,7 +87,7 @@ export function Tabs({ indexPattern, fields, history, location }: TabsProps) { const refreshFilters = useCallback(() => { const tempIndexedFieldTypes: string[] = []; const tempScriptedFieldLanguages: string[] = []; - indexPattern.fields.forEach((field) => { + indexPattern.fields.getAll().forEach((field) => { if (field.scripted) { if (field.lang) { tempScriptedFieldLanguages.push(field.lang); diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts index 5ab9c695caaa0..b422de93de7a9 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts @@ -84,9 +84,9 @@ export function getTabs( fieldFilter: string, indexPatternListProvider: IndexPatternManagementStart['list'] ) { - const totalCount = getCounts(indexPattern.fields, indexPattern.getSourceFiltering()); + const totalCount = getCounts(indexPattern.fields.getAll(), indexPattern.getSourceFiltering()); const filteredCount = getCounts( - indexPattern.fields, + indexPattern.fields.getAll(), indexPattern.getSourceFiltering(), fieldFilter ); diff --git a/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap b/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap index c22160bc4036d..3f4190eed9170 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap @@ -25,11 +25,10 @@ exports[`FieldEditor should render create new scripted field correctly 1`] = ` executeScript={[Function]} indexPattern={ Object { - "fields": Array [ - Object { - "name": "foobar", - }, - ], + "fields": Object { + "getAll": [Function], + "getByName": [Function], + }, "getFormatterForField": [Function], } } @@ -261,19 +260,10 @@ exports[`FieldEditor should render edit scripted field correctly 1`] = ` executeScript={[Function]} indexPattern={ Object { - "fields": Array [ - Object { - "name": "foobar", - }, - Object { - "format": Format {}, - "lang": "painless", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - ], + "fields": Object { + "getAll": [Function], + "getByName": [Function], + }, "getFormatterForField": [Function], } } @@ -504,27 +494,10 @@ exports[`FieldEditor should show conflict field warning 1`] = ` executeScript={[Function]} indexPattern={ Object { - "fields": Array [ - Object { - "name": "foobar", - }, - Object { - "format": Format {}, - "lang": "painless", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - Object { - "format": Format {}, - "lang": "testlang", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - ], + "fields": Object { + "getAll": [Function], + "getByName": [Function], + }, "getFormatterForField": [Function], } } @@ -784,27 +757,10 @@ exports[`FieldEditor should show deprecated lang warning 1`] = ` executeScript={[Function]} indexPattern={ Object { - "fields": Array [ - Object { - "name": "foobar", - }, - Object { - "format": Format {}, - "lang": "painless", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - Object { - "format": Format {}, - "lang": "testlang", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - ], + "fields": Object { + "getAll": [Function], + "getByName": [Function], + }, "getFormatterForField": [Function], } } @@ -1116,27 +1072,10 @@ exports[`FieldEditor should show multiple type field warning with a table contai executeScript={[Function]} indexPattern={ Object { - "fields": Array [ - Object { - "name": "foobar", - }, - Object { - "format": Format {}, - "lang": "painless", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - Object { - "format": Format {}, - "lang": "testlang", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - ], + "fields": Object { + "getAll": [Function], + "getByName": [Function], + }, "getFormatterForField": [Function], } } diff --git a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx index cb1d5a25c01ae..77c6698fdc337 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx @@ -188,6 +188,7 @@ export class TestScript extends Component { const fields: EuiComboBoxOptionOption[] = []; this.props.indexPattern.fields + .getAll() .filter((field) => { const isMultiField = field.subType && field.subType.multi; return !field.name.startsWith('_') && !isMultiField && !field.scripted; diff --git a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx index ba1f2ff4b665d..96d3fc549ece0 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx @@ -17,12 +17,7 @@ * under the License. */ -import { - IndexPattern, - IndexPatternField, - IIndexPatternFieldList, - FieldFormatInstanceType, -} from 'src/plugins/data/public'; +import { IndexPattern, IndexPatternField, FieldFormatInstanceType } from 'src/plugins/data/public'; jest.mock('brace/mode/groovy', () => ({})); @@ -71,15 +66,19 @@ jest.mock('./components/field_format_editor', () => ({ FieldFormatEditor: 'field-format-editor', })); -const fields: IndexPatternField[] = [ +const fieldList = [ { name: 'foobar', } as IndexPatternField, ]; +const fields = { + getAll: () => fieldList, +}; + // @ts-ignore fields.getByName = (name: string) => { - return fields.find((field) => field.name === name); + return fields.getAll().find((field) => field.name === name); }; class Format { @@ -112,7 +111,7 @@ describe('FieldEditor', () => { beforeEach(() => { indexPattern = ({ - fields: fields as IIndexPatternFieldList, + fields, getFormatterForField: () => ({ params: () => ({}) }), } as unknown) as IndexPattern; }); @@ -139,7 +138,7 @@ describe('FieldEditor', () => { name: 'test', script: 'doc.test.value', }; - indexPattern.fields.push(testField as IndexPatternField); + fieldList.push(testField as IndexPatternField); indexPattern.fields.getByName = (name) => { const flds = { [testField.name]: testField, @@ -169,7 +168,7 @@ describe('FieldEditor', () => { script: 'doc.test.value', lang: 'testlang', }; - indexPattern.fields.push((testField as unknown) as IndexPatternField); + fieldList.push((testField as unknown) as IndexPatternField); indexPattern.fields.getByName = (name) => { const flds = { [testField.name]: testField, diff --git a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx index d78e1e1014581..6a3f632a9582e 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx @@ -155,7 +155,7 @@ export class FieldEditor extends PureComponent f.name), + existingFieldNames: indexPattern.fields.getAll().map((f: IFieldType) => f.name), fieldFormatId: undefined, fieldFormatParams: {}, showScriptingHelp: false, @@ -197,7 +197,7 @@ export class FieldEditor extends PureComponent f.name === spec.name), + isCreating: !indexPattern.fields.getByName(spec.name), isDeprecatedLang: this.deprecatedLangs.includes(spec.lang || ''), errors: [], scriptingLangs, @@ -804,11 +804,11 @@ export class FieldEditor extends PureComponent f.name === field.name); + const fieldExists = !!indexPattern.fields.getByName(field.name); let oldField: IndexPatternField['spec']; - if (index > -1) { + if (fieldExists) { oldField = indexPattern.fields.getByName(field.name)!.spec; indexPattern.fields.update(field); } else { diff --git a/src/plugins/input_control_vis/public/control/list_control_factory.ts b/src/plugins/input_control_vis/public/control/list_control_factory.ts index 65a3e37a93edf..acbbf08c7d004 100644 --- a/src/plugins/input_control_vis/public/control/list_control_factory.ts +++ b/src/plugins/input_control_vis/public/control/list_control_factory.ts @@ -216,7 +216,7 @@ export async function listControlFactory( // dynamic options are only allowed on String fields but the setting defaults to true so it could // be enabled for non-string fields (since UI input is hidden for non-string fields). // If field is not string, then disable dynamic options. - const field = indexPattern.fields.find(({ name }) => name === controlParams.fieldName); + const field = indexPattern.fields.getAll().find(({ name }) => name === controlParams.fieldName); if (field && field.type !== 'string') { controlParams.options.dynamicOptions = false; } diff --git a/src/plugins/input_control_vis/public/test_utils/get_deps_mock.tsx b/src/plugins/input_control_vis/public/test_utils/get_deps_mock.tsx index feedcab1850eb..f72bc96f9e7c1 100644 --- a/src/plugins/input_control_vis/public/test_utils/get_deps_mock.tsx +++ b/src/plugins/input_control_vis/public/test_utils/get_deps_mock.tsx @@ -26,6 +26,7 @@ fields.push({ name: 'myField' } as any); fields.getByName = (name: any) => { return fields.find(({ name: n }: { name: string }) => n === name); }; +fields.getAll = () => [...fields]; export const getDepsMock = ({ searchSource = { diff --git a/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts b/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts index 19ec46bd7f659..85d41aab5859d 100644 --- a/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts +++ b/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts @@ -117,6 +117,7 @@ export function getArgValueSuggestions() { const valueSplit = partial.split(':'); return indexPattern.fields + .getAll() .filter((field) => { return ( field.aggregatable && @@ -136,6 +137,7 @@ export function getArgValueSuggestions() { } return indexPattern.fields + .getAll() .filter((field) => { return ( field.aggregatable && @@ -155,6 +157,7 @@ export function getArgValueSuggestions() { } return indexPattern.fields + .getAll() .filter((field) => { return ( 'date' === field.type && diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/field.test.tsx b/x-pack/plugins/security_solution/public/common/components/autocomplete/field.test.tsx index 30864f246071b..a678deae41542 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/field.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/field.test.tsx @@ -12,7 +12,7 @@ import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { fields, getField, -} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { FieldComponent } from './field'; describe('FieldComponent', () => { diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_lists.test.tsx b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_lists.test.tsx index eca38b9effe1b..eef6e09d496db 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_lists.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_lists.test.tsx @@ -11,7 +11,7 @@ import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; // we don't have the types for waitFor just yet, so using "as waitFor" until when we do import { wait as waitFor } from '@testing-library/react'; -import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { ListSchema } from '../../../lists_plugin_deps'; import { getFoundListSchemaMock } from '../../../../../lists/common/schemas/response/found_list_schema.mock'; import { getListResponseMock } from '../../../../../lists/common/schemas/response/list_schema.mock'; diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.test.tsx b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.test.tsx index 998ed1f3351c8..94040ccb639be 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.test.tsx @@ -12,7 +12,7 @@ import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { fields, getField, -} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { AutocompleteFieldMatchComponent } from './field_value_match'; import { useFieldValueAutocomplete } from './hooks/use_field_value_autocomplete'; jest.mock('./hooks/use_field_value_autocomplete'); diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match_any.test.tsx b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match_any.test.tsx index 0a0281a9c4a51..4074150f76d06 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match_any.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match_any.test.tsx @@ -12,7 +12,7 @@ import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { fields, getField, -} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { AutocompleteFieldMatchAnyComponent } from './field_value_match_any'; import { useFieldValueAutocomplete } from './hooks/use_field_value_autocomplete'; jest.mock('./hooks/use_field_value_autocomplete'); diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.test.ts b/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.test.ts index 289cdd5e87c00..bbcbcbcf928b3 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.test.ts @@ -5,7 +5,7 @@ */ import '../../../common/mock/match_media'; -import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { EXCEPTION_OPERATORS, diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/hooks/use_field_value_autocomplete.test.ts b/x-pack/plugins/security_solution/public/common/components/autocomplete/hooks/use_field_value_autocomplete.test.ts index a76b50d11a875..82e9c21f6b839 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/hooks/use_field_value_autocomplete.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/hooks/use_field_value_autocomplete.test.ts @@ -13,7 +13,7 @@ import { } from './use_field_value_autocomplete'; import { useKibana } from '../../../../common/lib/kibana'; import { stubIndexPatternWithFields } from '../../../../../../../../src/plugins/data/common/index_patterns/index_pattern.stub'; -import { getField } from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +import { getField } from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { OperatorTypeEnum } from '../../../../lists_plugin_deps'; jest.mock('../../../../common/lib/kibana'); diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/operator.test.tsx b/x-pack/plugins/security_solution/public/common/components/autocomplete/operator.test.tsx index 737be199e2481..e6f6227811085 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/operator.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/operator.test.tsx @@ -9,7 +9,7 @@ import { mount } from 'enzyme'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { OperatorComponent } from './operator'; import { isOperator, isNotOperator } from './operators'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.test.tsx index 2a116c4cd8acf..59a5db2a09779 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.test.tsx @@ -22,7 +22,7 @@ import { import { fields, getField, -} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { getFoundListSchemaMock } from '../../../../../../lists/common/schemas/response/found_list_schema.mock'; import { getEmptyValue } from '../../empty_value'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.test.tsx index e90639a2c0285..0f9be25e046b2 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.test.tsx @@ -10,7 +10,7 @@ import { mount } from 'enzyme'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import { useKibana } from '../../../../common/lib/kibana'; -import { fields } from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +import { fields } from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { getExceptionListItemSchemaMock } from '../../../../../../lists/common/schemas/response/exception_list_item_schema.mock'; import { getEntryMatchMock } from '../../../../../../lists/common/schemas/types/entry_match.mock'; import { getEntryMatchAnyMock } from '../../../../../../lists/common/schemas/types/entry_match_any.mock'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx index 04ab9ee7216f7..9bfd04cc19d72 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx @@ -6,7 +6,7 @@ import { fields, getField, -} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { getEntryNestedMock } from '../../../../../../lists/common/schemas/types/entry_nested.mock'; import { getEntryMatchMock } from '../../../../../../lists/common/schemas/types/entry_match.mock'; import { getEntryMatchAnyMock } from '../../../../../../lists/common/schemas/types/entry_match_any.mock'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.test.tsx index 3fa0e59f9acb0..2d389a7dbcee1 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.test.tsx @@ -13,7 +13,7 @@ import { wait as waitFor } from '@testing-library/react'; import { fields, getField, -} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { getExceptionListItemSchemaMock } from '../../../../../../lists/common/schemas/response/exception_list_item_schema.mock'; import { getEntryMatchAnyMock } from '../../../../../../lists/common/schemas/types/entry_match_any.mock'; From 9782ac4b7ff9374e32500afcf6c25470b7b4b00f Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Tue, 11 Aug 2020 06:47:33 -0700 Subject: [PATCH 046/113] Bump chalk to 4.1.0 (#73397) https://github.com/chalk/chalk/releases Signed-off-by: Tyler Smalley Co-authored-by: Elastic Machine --- packages/kbn-dev-utils/package.json | 2 +- packages/kbn-es/package.json | 2 +- packages/kbn-plugin-generator/package.json | 2 +- packages/kbn-pm/dist/index.js | 20099 +++++++++++-------- packages/kbn-pm/package.json | 2 +- packages/kbn-test/package.json | 2 +- packages/kbn-ui-framework/package.json | 2 +- src/dev/typescript/exec_in_projects.ts | 2 +- x-pack/package.json | 2 +- yarn.lock | 8 +- 10 files changed, 11448 insertions(+), 8675 deletions(-) diff --git a/packages/kbn-dev-utils/package.json b/packages/kbn-dev-utils/package.json index 83a7a7607816c..7ce433f80bed0 100644 --- a/packages/kbn-dev-utils/package.json +++ b/packages/kbn-dev-utils/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "axios": "^0.19.0", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "dedent": "^0.7.0", "execa": "^4.0.2", "exit-hook": "^2.2.0", diff --git a/packages/kbn-es/package.json b/packages/kbn-es/package.json index f53eb694ec712..c3670f648d309 100644 --- a/packages/kbn-es/package.json +++ b/packages/kbn-es/package.json @@ -8,7 +8,7 @@ "@elastic/elasticsearch": "7.9.0-rc.1", "@kbn/dev-utils": "1.0.0", "abort-controller": "^2.0.3", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "dedent": "^0.7.0", "del": "^5.1.0", "execa": "^4.0.2", diff --git a/packages/kbn-plugin-generator/package.json b/packages/kbn-plugin-generator/package.json index 5c1e98cd869de..0803e498279f3 100644 --- a/packages/kbn-plugin-generator/package.json +++ b/packages/kbn-plugin-generator/package.json @@ -4,7 +4,7 @@ "private": true, "version": "1.0.0", "dependencies": { - "chalk": "^2.4.2", + "chalk": "^4.1.0", "dedent": "^0.7.0", "execa": "^4.0.2", "getopts": "^2.2.4", diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index b8794124ad197..ee141e1d8ab7a 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -94,21 +94,21 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _cli__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "run", function() { return _cli__WEBPACK_IMPORTED_MODULE_0__["run"]; }); -/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(498); +/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(511); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["buildProductionProjects"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getProjects", function() { return _utils_projects__WEBPACK_IMPORTED_MODULE_2__["getProjects"]; }); -/* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(162); +/* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(163); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Project", function() { return _utils_project__WEBPACK_IMPORTED_MODULE_3__["Project"]; }); -/* harmony import */ var _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(271); +/* harmony import */ var _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(287); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "copyWorkspacePackages", function() { return _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__["copyWorkspacePackages"]; }); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(272); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(288); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getProjectPaths", function() { return _config__WEBPACK_IMPORTED_MODULE_5__["getProjectPaths"]; }); /* @@ -151,9 +151,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5); /* harmony import */ var _kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(126); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(490); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(142); +/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(127); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(503); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(143); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -568,10 +568,10 @@ var tooling_log_1 = __webpack_require__(6); Object.defineProperty(exports, "ToolingLog", { enumerable: true, get: function () { return tooling_log_1.ToolingLog; } }); var tooling_log_text_writer_1 = __webpack_require__(110); Object.defineProperty(exports, "ToolingLogTextWriter", { enumerable: true, get: function () { return tooling_log_text_writer_1.ToolingLogTextWriter; } }); -var log_levels_1 = __webpack_require__(124); +var log_levels_1 = __webpack_require__(125); Object.defineProperty(exports, "pickLevelFromFlags", { enumerable: true, get: function () { return log_levels_1.pickLevelFromFlags; } }); Object.defineProperty(exports, "parseLogLevel", { enumerable: true, get: function () { return log_levels_1.parseLogLevel; } }); -var tooling_log_collecting_writer_1 = __webpack_require__(125); +var tooling_log_collecting_writer_1 = __webpack_require__(126); Object.defineProperty(exports, "ToolingLogCollectingWriter", { enumerable: true, get: function () { return tooling_log_collecting_writer_1.ToolingLogCollectingWriter; } }); @@ -6594,7 +6594,7 @@ exports.ToolingLogTextWriter = void 0; const tslib_1 = __webpack_require__(7); const util_1 = __webpack_require__(111); const chalk_1 = tslib_1.__importDefault(__webpack_require__(112)); -const log_levels_1 = __webpack_require__(124); +const log_levels_1 = __webpack_require__(125); const { magentaBright, yellow, red, blue, green, dim } = chalk_1.default; const PREFIX_INDENT = ' '.repeat(6); const MSG_PREFIXES = { @@ -6672,233 +6672,234 @@ module.exports = require("util"); "use strict"; -const escapeStringRegexp = __webpack_require__(113); -const ansiStyles = __webpack_require__(114); -const stdoutColor = __webpack_require__(120).stdout; - -const template = __webpack_require__(123); +const ansiStyles = __webpack_require__(113); +const {stdout: stdoutColor, stderr: stderrColor} = __webpack_require__(119); +const { + stringReplaceAll, + stringEncaseCRLFWithFirstIndex +} = __webpack_require__(123); -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); +const {isArray} = Array; // `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; - -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); +const levelMapping = [ + 'ansi', + 'ansi', + 'ansi256', + 'ansi16m' +]; const styles = Object.create(null); -function applyOptions(obj, options) { - options = options || {}; +const applyOptions = (object, options = {}) => { + if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) { + throw new Error('The `level` option should be an integer from 0 to 3'); + } // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; + const colorLevel = stdoutColor ? stdoutColor.level : 0; + object.level = options.level === undefined ? colorLevel : options.level; +}; + +class ChalkClass { + constructor(options) { + // eslint-disable-next-line no-constructor-return + return chalkFactory(options); + } } -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); +const chalkFactory = options => { + const chalk = {}; + applyOptions(chalk, options); - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; + chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_); - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); - chalk.template.constructor = Chalk; + chalk.template.constructor = () => { + throw new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.'); + }; - return chalk.template; - } + chalk.template.Instance = ChalkClass; - applyOptions(this, options); -} + return chalk.template; +}; -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; +function Chalk(options) { + return chalkFactory(options); } -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - - styles[key] = { +for (const [styleName, style] of Object.entries(ansiStyles)) { + styles[styleName] = { get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + const builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty); + Object.defineProperty(this, styleName, {value: builder}); + return builder; } }; } styles.visible = { get() { - return build.call(this, this._styles || [], true, 'visible'); + const builder = createBuilder(this, this._styler, true); + Object.defineProperty(this, 'visible', {value: builder}); + return builder; } }; -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } +const usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256']; +for (const model of usedModels) { styles[model] = { get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + const {level} = this; + return function (...arguments_) { + const styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler); + return createBuilder(this, styler, this._isEmpty); }; } }; } -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; - } - +for (const model of usedModels) { const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); styles[bgModel] = { get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + const {level} = this; + return function (...arguments_) { + const styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler); + return createBuilder(this, styler, this._isEmpty); }; } }; } -const proto = Object.defineProperties(() => {}, styles); - -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; - - builder._styles = _styles; - builder._empty = _empty; - - const self = this; - - Object.defineProperty(builder, 'level', { +const proto = Object.defineProperties(() => {}, { + ...styles, + level: { enumerable: true, get() { - return self.level; + return this._generator.level; }, set(level) { - self.level = level; + this._generator.level = level; } - }); + } +}); - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; +const createStyler = (open, close, parent) => { + let openAll; + let closeAll; + if (parent === undefined) { + openAll = open; + closeAll = close; + } else { + openAll = parent.openAll + open; + closeAll = close + parent.closeAll; + } + + return { + open, + close, + openAll, + closeAll, + parent + }; +}; + +const createBuilder = (self, _styler, _isEmpty) => { + const builder = (...arguments_) => { + if (isArray(arguments_[0]) && isArray(arguments_[0].raw)) { + // Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}` + return applyStyle(builder, chalkTag(builder, ...arguments_)); } - }); - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + // Single argument is hot path, implicit coercion is faster than anything + // eslint-disable-next-line no-implicit-coercion + return applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' ')); + }; - // `__proto__` is used because we must return a function, but there is + // We alter the prototype because we must return a function, but there is // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto + Object.setPrototypeOf(builder, proto); - return builder; -} + builder._generator = self; + builder._styler = _styler; + builder._isEmpty = _isEmpty; -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); + return builder; +}; - if (argsLen === 0) { - return ''; +const applyStyle = (self, string) => { + if (self.level <= 0 || !string) { + return self._isEmpty ? '' : string; } - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } + let styler = self._styler; - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; + if (styler === undefined) { + return string; } - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } + const {openAll, closeAll} = styler; + if (string.indexOf('\u001B') !== -1) { + while (styler !== undefined) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + string = stringReplaceAll(string, styler.close, styler.open); - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; + styler = styler.parent; + } + } - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + // We can move both next actions out of loop, because remaining actions in loop won't have + // any/visible effect on parts we add here. Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92 + const lfIndex = string.indexOf('\n'); + if (lfIndex !== -1) { + string = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex); } - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; + return openAll + string + closeAll; +}; - return str; -} +let template; +const chalkTag = (chalk, ...strings) => { + const [firstString] = strings; -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { + if (!isArray(firstString) || !isArray(firstString.raw)) { // If chalk() was called by itself or with a string, // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); + return strings.join(' '); } - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; + const arguments_ = strings.slice(1); + const parts = [firstString.raw[0]]; - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); + for (let i = 1; i < firstString.length; i++) { + parts.push( + String(arguments_[i - 1]).replace(/[{}\\]/g, '\\$&'), + String(firstString.raw[i]) + ); + } + + if (template === undefined) { + template = __webpack_require__(124); } return template(chalk, parts.join('')); -} +}; Object.defineProperties(Chalk.prototype, styles); -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript +const chalk = Chalk(); // eslint-disable-line new-cap +chalk.supportsColor = stdoutColor; +chalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap +chalk.stderr.supportsColor = stderrColor; + +module.exports = chalk; /***/ }), @@ -6906,40 +6907,64 @@ module.exports.default = module.exports; // For TypeScript /***/ (function(module, exports, __webpack_require__) { "use strict"; +/* WEBPACK VAR INJECTION */(function(module) { +const wrapAnsi16 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${code + offset}m`; +}; -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; - -module.exports = function (str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } +const wrapAnsi256 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${38 + offset};5;${code}m`; +}; - return str.replace(matchOperatorsRe, '\\$&'); +const wrapAnsi16m = (fn, offset) => (...args) => { + const rgb = fn(...args); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; }; +const ansi2ansi = n => n; +const rgb2rgb = (r, g, b) => [r, g, b]; -/***/ }), -/* 114 */ -/***/ (function(module, exports, __webpack_require__) { +const setLazyProperty = (object, property, get) => { + Object.defineProperty(object, property, { + get: () => { + const value = get(); -"use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(116); + Object.defineProperty(object, property, { + value, + enumerable: true, + configurable: true + }); -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; + return value; + }, + enumerable: true, + configurable: true + }); }; -const wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; -}; +/** @type {typeof import('color-convert')} */ +let colorConvert; +const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => { + if (colorConvert === undefined) { + colorConvert = __webpack_require__(115); + } -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; + const offset = isBackground ? 10 : 0; + const styles = {}; + + for (const [sourceSpace, suite] of Object.entries(colorConvert)) { + const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace; + if (sourceSpace === targetSpace) { + styles[name] = wrap(identity, offset); + } else if (typeof suite === 'object') { + styles[name] = wrap(suite[targetSpace], offset); + } + } + + return styles; }; function assembleStyles() { @@ -6965,9 +6990,9 @@ function assembleStyles() { magenta: [35, 39], cyan: [36, 39], white: [37, 39], - gray: [90, 39], // Bright color + blackBright: [90, 39], redBright: [91, 39], greenBright: [92, 39], yellowBright: [93, 39], @@ -6998,15 +7023,14 @@ function assembleStyles() { } }; - // Fix humans - styles.color.grey = styles.color.gray; - - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; - - for (const styleName of Object.keys(group)) { - const style = group[styleName]; + // Alias bright black as gray (and grey) + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { styles[styleName] = { open: `\u001B[${style[0]}m`, close: `\u001B[${style[1]}m` @@ -7021,65 +7045,22 @@ function assembleStyles() { value: group, enumerable: false }); - - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); } - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); styles.color.close = '\u001B[39m'; styles.bgColor.close = '\u001B[49m'; - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; - - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; - - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; - } - - const suite = colorConvert[key]; - - if (key === 'ansi16') { - key = 'ansi'; - } - - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } - - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } - - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); - } - } + setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false)); + setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true)); return styles; } @@ -7090,10 +7071,10 @@ Object.defineProperty(module, 'exports', { get: assembleStyles }); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(115)(module))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) /***/ }), -/* 115 */ +/* 114 */ /***/ (function(module, exports) { module.exports = function(module) { @@ -7121,30 +7102,31 @@ module.exports = function(module) { /***/ }), -/* 116 */ +/* 115 */ /***/ (function(module, exports, __webpack_require__) { -var conversions = __webpack_require__(117); -var route = __webpack_require__(119); +const conversions = __webpack_require__(116); +const route = __webpack_require__(118); -var convert = {}; +const convert = {}; -var models = Object.keys(conversions); +const models = Object.keys(conversions); function wrapRaw(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; + const wrappedFn = function (...args) { + const arg0 = args[0]; + if (arg0 === undefined || arg0 === null) { + return arg0; } - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); + if (arg0.length > 1) { + args = arg0; } return fn(args); }; - // preserve .conversion property if there is one + // Preserve .conversion property if there is one if ('conversion' in fn) { wrappedFn.conversion = fn.conversion; } @@ -7153,22 +7135,24 @@ function wrapRaw(fn) { } function wrapRounded(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; + const wrappedFn = function (...args) { + const arg0 = args[0]; + + if (arg0 === undefined || arg0 === null) { + return arg0; } - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); + if (arg0.length > 1) { + args = arg0; } - var result = fn(args); + const result = fn(args); - // we're assuming the result is an array here. + // We're assuming the result is an array here. // see notice in conversions.js; don't use box types // in conversion functions. if (typeof result === 'object') { - for (var len = result.length, i = 0; i < len; i++) { + for (let len = result.length, i = 0; i < len; i++) { result[i] = Math.round(result[i]); } } @@ -7176,7 +7160,7 @@ function wrapRounded(fn) { return result; }; - // preserve .conversion property if there is one + // Preserve .conversion property if there is one if ('conversion' in fn) { wrappedFn.conversion = fn.conversion; } @@ -7184,17 +7168,17 @@ function wrapRounded(fn) { return wrappedFn; } -models.forEach(function (fromModel) { +models.forEach(fromModel => { convert[fromModel] = {}; Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); - var routes = route(fromModel); - var routeModels = Object.keys(routes); + const routes = route(fromModel); + const routeModels = Object.keys(routes); - routeModels.forEach(function (toModel) { - var fn = routes[toModel]; + routeModels.forEach(toModel => { + const fn = routes[toModel]; convert[fromModel][toModel] = wrapRounded(fn); convert[fromModel][toModel].raw = wrapRaw(fn); @@ -7205,24 +7189,23 @@ module.exports = convert; /***/ }), -/* 117 */ +/* 116 */ /***/ (function(module, exports, __webpack_require__) { /* MIT license */ -var cssKeywords = __webpack_require__(118); +/* eslint-disable no-mixed-operators */ +const cssKeywords = __webpack_require__(117); // NOTE: conversions should only return primitive values (i.e. arrays, or // values that give correct `typeof` results). // do not use box values types (i.e. Number(), String(), etc.) -var reverseKeywords = {}; -for (var key in cssKeywords) { - if (cssKeywords.hasOwnProperty(key)) { - reverseKeywords[cssKeywords[key]] = key; - } +const reverseKeywords = {}; +for (const key of Object.keys(cssKeywords)) { + reverseKeywords[cssKeywords[key]] = key; } -var convert = module.exports = { +const convert = { rgb: {channels: 3, labels: 'rgb'}, hsl: {channels: 3, labels: 'hsl'}, hsv: {channels: 3, labels: 'hsv'}, @@ -7240,40 +7223,38 @@ var convert = module.exports = { gray: {channels: 1, labels: ['gray']} }; -// hide .channels and .labels properties -for (var model in convert) { - if (convert.hasOwnProperty(model)) { - if (!('channels' in convert[model])) { - throw new Error('missing channels property: ' + model); - } +module.exports = convert; - if (!('labels' in convert[model])) { - throw new Error('missing channel labels property: ' + model); - } +// Hide .channels and .labels properties +for (const model of Object.keys(convert)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } - if (convert[model].labels.length !== convert[model].channels) { - throw new Error('channel and label counts mismatch: ' + model); - } + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } - var channels = convert[model].channels; - var labels = convert[model].labels; - delete convert[model].channels; - delete convert[model].labels; - Object.defineProperty(convert[model], 'channels', {value: channels}); - Object.defineProperty(convert[model], 'labels', {value: labels}); + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); } + + const {channels, labels} = convert[model]; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); } convert.rgb.hsl = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h; - var s; - var l; + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const min = Math.min(r, g, b); + const max = Math.max(r, g, b); + const delta = max - min; + let h; + let s; if (max === min) { h = 0; @@ -7291,7 +7272,7 @@ convert.rgb.hsl = function (rgb) { h += 360; } - l = (min + max) / 2; + const l = (min + max) / 2; if (max === min) { s = 0; @@ -7305,49 +7286,58 @@ convert.rgb.hsl = function (rgb) { }; convert.rgb.hsv = function (rgb) { - var r = rgb[0]; - var g = rgb[1]; - var b = rgb[2]; - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h; - var s; - var v; + let rdif; + let gdif; + let bdif; + let h; + let s; + + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const v = Math.max(r, g, b); + const diff = v - Math.min(r, g, b); + const diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; - if (max === 0) { + if (diff === 0) { + h = 0; s = 0; } else { - s = (delta / max * 1000) / 10; - } - - if (max === min) { - h = 0; - } else if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else if (b === max) { - h = 4 + (r - g) / delta; - } - - h = Math.min(h * 60, 360); + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } - if (h < 0) { - h += 360; + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } } - v = ((max / 255) * 1000) / 10; - - return [h, s, v]; + return [ + h * 360, + s * 100, + v * 100 + ]; }; convert.rgb.hwb = function (rgb) { - var r = rgb[0]; - var g = rgb[1]; - var b = rgb[2]; - var h = convert.rgb.hsl(rgb)[0]; - var w = 1 / 255 * Math.min(r, Math.min(g, b)); + const r = rgb[0]; + const g = rgb[1]; + let b = rgb[2]; + const h = convert.rgb.hsl(rgb)[0]; + const w = 1 / 255 * Math.min(r, Math.min(g, b)); b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); @@ -7355,54 +7345,48 @@ convert.rgb.hwb = function (rgb) { }; convert.rgb.cmyk = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var c; - var m; - var y; - var k; + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; - k = Math.min(1 - r, 1 - g, 1 - b); - c = (1 - r - k) / (1 - k) || 0; - m = (1 - g - k) / (1 - k) || 0; - y = (1 - b - k) / (1 - k) || 0; + const k = Math.min(1 - r, 1 - g, 1 - b); + const c = (1 - r - k) / (1 - k) || 0; + const m = (1 - g - k) / (1 - k) || 0; + const y = (1 - b - k) / (1 - k) || 0; return [c * 100, m * 100, y * 100, k * 100]; }; -/** - * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance - * */ function comparativeDistance(x, y) { + /* + See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + */ return ( - Math.pow(x[0] - y[0], 2) + - Math.pow(x[1] - y[1], 2) + - Math.pow(x[2] - y[2], 2) + ((x[0] - y[0]) ** 2) + + ((x[1] - y[1]) ** 2) + + ((x[2] - y[2]) ** 2) ); } convert.rgb.keyword = function (rgb) { - var reversed = reverseKeywords[rgb]; + const reversed = reverseKeywords[rgb]; if (reversed) { return reversed; } - var currentClosestDistance = Infinity; - var currentClosestKeyword; + let currentClosestDistance = Infinity; + let currentClosestKeyword; - for (var keyword in cssKeywords) { - if (cssKeywords.hasOwnProperty(keyword)) { - var value = cssKeywords[keyword]; + for (const keyword of Object.keys(cssKeywords)) { + const value = cssKeywords[keyword]; - // Compute comparative distance - var distance = comparativeDistance(rgb, value); + // Compute comparative distance + const distance = comparativeDistance(rgb, value); - // Check if its less, if so set as closest - if (distance < currentClosestDistance) { - currentClosestDistance = distance; - currentClosestKeyword = keyword; - } + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; } } @@ -7414,55 +7398,50 @@ convert.keyword.rgb = function (keyword) { }; convert.rgb.xyz = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; + let r = rgb[0] / 255; + let g = rgb[1] / 255; + let b = rgb[2] / 255; - // assume sRGB - r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); - g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); - b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + // Assume sRGB + r = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92); + g = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92); + b = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92); - var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); - var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); - var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + const x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + const y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + const z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); return [x * 100, y * 100, z * 100]; }; convert.rgb.lab = function (rgb) { - var xyz = convert.rgb.xyz(rgb); - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; + const xyz = convert.rgb.xyz(rgb); + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; x /= 95.047; y /= 100; z /= 108.883; - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); + const l = (116 * y) - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); return [l, a, b]; }; convert.hsl.rgb = function (hsl) { - var h = hsl[0] / 360; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var t1; - var t2; - var t3; - var rgb; - var val; + const h = hsl[0] / 360; + const s = hsl[1] / 100; + const l = hsl[2] / 100; + let t2; + let t3; + let val; if (s === 0) { val = l * 255; @@ -7475,14 +7454,15 @@ convert.hsl.rgb = function (hsl) { t2 = l + s - l * s; } - t1 = 2 * l - t2; + const t1 = 2 * l - t2; - rgb = [0, 0, 0]; - for (var i = 0; i < 3; i++) { + const rgb = [0, 0, 0]; + for (let i = 0; i < 3; i++) { t3 = h + 1 / 3 * -(i - 1); if (t3 < 0) { t3++; } + if (t3 > 1) { t3--; } @@ -7504,33 +7484,31 @@ convert.hsl.rgb = function (hsl) { }; convert.hsl.hsv = function (hsl) { - var h = hsl[0]; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var smin = s; - var lmin = Math.max(l, 0.01); - var sv; - var v; + const h = hsl[0]; + let s = hsl[1] / 100; + let l = hsl[2] / 100; + let smin = s; + const lmin = Math.max(l, 0.01); l *= 2; s *= (l <= 1) ? l : 2 - l; smin *= lmin <= 1 ? lmin : 2 - lmin; - v = (l + s) / 2; - sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); + const v = (l + s) / 2; + const sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); return [h, sv * 100, v * 100]; }; convert.hsv.rgb = function (hsv) { - var h = hsv[0] / 60; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var hi = Math.floor(h) % 6; - - var f = h - Math.floor(h); - var p = 255 * v * (1 - s); - var q = 255 * v * (1 - (s * f)); - var t = 255 * v * (1 - (s * (1 - f))); + const h = hsv[0] / 60; + const s = hsv[1] / 100; + let v = hsv[2] / 100; + const hi = Math.floor(h) % 6; + + const f = h - Math.floor(h); + const p = 255 * v * (1 - s); + const q = 255 * v * (1 - (s * f)); + const t = 255 * v * (1 - (s * (1 - f))); v *= 255; switch (hi) { @@ -7550,16 +7528,15 @@ convert.hsv.rgb = function (hsv) { }; convert.hsv.hsl = function (hsv) { - var h = hsv[0]; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var vmin = Math.max(v, 0.01); - var lmin; - var sl; - var l; + const h = hsv[0]; + const s = hsv[1] / 100; + const v = hsv[2] / 100; + const vmin = Math.max(v, 0.01); + let sl; + let l; l = (2 - s) * v; - lmin = (2 - s) * vmin; + const lmin = (2 - s) * vmin; sl = s * vmin; sl /= (lmin <= 1) ? lmin : 2 - lmin; sl = sl || 0; @@ -7570,87 +7547,83 @@ convert.hsv.hsl = function (hsv) { // http://dev.w3.org/csswg/css-color/#hwb-to-rgb convert.hwb.rgb = function (hwb) { - var h = hwb[0] / 360; - var wh = hwb[1] / 100; - var bl = hwb[2] / 100; - var ratio = wh + bl; - var i; - var v; - var f; - var n; + const h = hwb[0] / 360; + let wh = hwb[1] / 100; + let bl = hwb[2] / 100; + const ratio = wh + bl; + let f; - // wh + bl cant be > 1 + // Wh + bl cant be > 1 if (ratio > 1) { wh /= ratio; bl /= ratio; } - i = Math.floor(6 * h); - v = 1 - bl; + const i = Math.floor(6 * h); + const v = 1 - bl; f = 6 * h - i; if ((i & 0x01) !== 0) { f = 1 - f; } - n = wh + f * (v - wh); // linear interpolation + const n = wh + f * (v - wh); // Linear interpolation - var r; - var g; - var b; + let r; + let g; + let b; + /* eslint-disable max-statements-per-line,no-multi-spaces */ switch (i) { default: case 6: - case 0: r = v; g = n; b = wh; break; - case 1: r = n; g = v; b = wh; break; - case 2: r = wh; g = v; b = n; break; - case 3: r = wh; g = n; b = v; break; - case 4: r = n; g = wh; b = v; break; - case 5: r = v; g = wh; b = n; break; + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; } + /* eslint-enable max-statements-per-line,no-multi-spaces */ return [r * 255, g * 255, b * 255]; }; convert.cmyk.rgb = function (cmyk) { - var c = cmyk[0] / 100; - var m = cmyk[1] / 100; - var y = cmyk[2] / 100; - var k = cmyk[3] / 100; - var r; - var g; - var b; + const c = cmyk[0] / 100; + const m = cmyk[1] / 100; + const y = cmyk[2] / 100; + const k = cmyk[3] / 100; - r = 1 - Math.min(1, c * (1 - k) + k); - g = 1 - Math.min(1, m * (1 - k) + k); - b = 1 - Math.min(1, y * (1 - k) + k); + const r = 1 - Math.min(1, c * (1 - k) + k); + const g = 1 - Math.min(1, m * (1 - k) + k); + const b = 1 - Math.min(1, y * (1 - k) + k); return [r * 255, g * 255, b * 255]; }; convert.xyz.rgb = function (xyz) { - var x = xyz[0] / 100; - var y = xyz[1] / 100; - var z = xyz[2] / 100; - var r; - var g; - var b; + const x = xyz[0] / 100; + const y = xyz[1] / 100; + const z = xyz[2] / 100; + let r; + let g; + let b; r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - // assume sRGB + // Assume sRGB r = r > 0.0031308 - ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + ? ((1.055 * (r ** (1.0 / 2.4))) - 0.055) : r * 12.92; g = g > 0.0031308 - ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + ? ((1.055 * (g ** (1.0 / 2.4))) - 0.055) : g * 12.92; b = b > 0.0031308 - ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + ? ((1.055 * (b ** (1.0 / 2.4))) - 0.055) : b * 12.92; r = Math.min(Math.max(0, r), 1); @@ -7661,43 +7634,40 @@ convert.xyz.rgb = function (xyz) { }; convert.xyz.lab = function (xyz) { - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; x /= 95.047; y /= 100; z /= 108.883; - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); + const l = (116 * y) - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); return [l, a, b]; }; convert.lab.xyz = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var x; - var y; - var z; + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let x; + let y; + let z; y = (l + 16) / 116; x = a / 500 + y; z = y - b / 200; - var y2 = Math.pow(y, 3); - var x2 = Math.pow(x, 3); - var z2 = Math.pow(z, 3); + const y2 = y ** 3; + const x2 = x ** 3; + const z2 = z ** 3; y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; @@ -7710,45 +7680,38 @@ convert.lab.xyz = function (lab) { }; convert.lab.lch = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var hr; - var h; - var c; + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let h; - hr = Math.atan2(b, a); + const hr = Math.atan2(b, a); h = hr * 360 / 2 / Math.PI; if (h < 0) { h += 360; } - c = Math.sqrt(a * a + b * b); + const c = Math.sqrt(a * a + b * b); return [l, c, h]; }; convert.lch.lab = function (lch) { - var l = lch[0]; - var c = lch[1]; - var h = lch[2]; - var a; - var b; - var hr; + const l = lch[0]; + const c = lch[1]; + const h = lch[2]; - hr = h / 360 * 2 * Math.PI; - a = c * Math.cos(hr); - b = c * Math.sin(hr); + const hr = h / 360 * 2 * Math.PI; + const a = c * Math.cos(hr); + const b = c * Math.sin(hr); return [l, a, b]; }; -convert.rgb.ansi16 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; - var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization +convert.rgb.ansi16 = function (args, saturation = null) { + const [r, g, b] = args; + let value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization value = Math.round(value / 50); @@ -7756,7 +7719,7 @@ convert.rgb.ansi16 = function (args) { return 30; } - var ansi = 30 + let ansi = 30 + ((Math.round(b / 255) << 2) | (Math.round(g / 255) << 1) | Math.round(r / 255)); @@ -7769,17 +7732,17 @@ convert.rgb.ansi16 = function (args) { }; convert.hsv.ansi16 = function (args) { - // optimization here; we already know the value and don't need to get + // Optimization here; we already know the value and don't need to get // it converted for us. return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); }; convert.rgb.ansi256 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; + const r = args[0]; + const g = args[1]; + const b = args[2]; - // we use the extended greyscale palette here, with the exception of + // We use the extended greyscale palette here, with the exception of // black and white. normal palette only has 4 greyscale shades. if (r === g && g === b) { if (r < 8) { @@ -7793,7 +7756,7 @@ convert.rgb.ansi256 = function (args) { return Math.round(((r - 8) / 247) * 24) + 232; } - var ansi = 16 + const ansi = 16 + (36 * Math.round(r / 255 * 5)) + (6 * Math.round(g / 255 * 5)) + Math.round(b / 255 * 5); @@ -7802,9 +7765,9 @@ convert.rgb.ansi256 = function (args) { }; convert.ansi16.rgb = function (args) { - var color = args % 10; + let color = args % 10; - // handle greyscale + // Handle greyscale if (color === 0 || color === 7) { if (args > 50) { color += 3.5; @@ -7815,71 +7778,71 @@ convert.ansi16.rgb = function (args) { return [color, color, color]; } - var mult = (~~(args > 50) + 1) * 0.5; - var r = ((color & 1) * mult) * 255; - var g = (((color >> 1) & 1) * mult) * 255; - var b = (((color >> 2) & 1) * mult) * 255; + const mult = (~~(args > 50) + 1) * 0.5; + const r = ((color & 1) * mult) * 255; + const g = (((color >> 1) & 1) * mult) * 255; + const b = (((color >> 2) & 1) * mult) * 255; return [r, g, b]; }; convert.ansi256.rgb = function (args) { - // handle greyscale + // Handle greyscale if (args >= 232) { - var c = (args - 232) * 10 + 8; + const c = (args - 232) * 10 + 8; return [c, c, c]; } args -= 16; - var rem; - var r = Math.floor(args / 36) / 5 * 255; - var g = Math.floor((rem = args % 36) / 6) / 5 * 255; - var b = (rem % 6) / 5 * 255; + let rem; + const r = Math.floor(args / 36) / 5 * 255; + const g = Math.floor((rem = args % 36) / 6) / 5 * 255; + const b = (rem % 6) / 5 * 255; return [r, g, b]; }; convert.rgb.hex = function (args) { - var integer = ((Math.round(args[0]) & 0xFF) << 16) + const integer = ((Math.round(args[0]) & 0xFF) << 16) + ((Math.round(args[1]) & 0xFF) << 8) + (Math.round(args[2]) & 0xFF); - var string = integer.toString(16).toUpperCase(); + const string = integer.toString(16).toUpperCase(); return '000000'.substring(string.length) + string; }; convert.hex.rgb = function (args) { - var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); if (!match) { return [0, 0, 0]; } - var colorString = match[0]; + let colorString = match[0]; if (match[0].length === 3) { - colorString = colorString.split('').map(function (char) { + colorString = colorString.split('').map(char => { return char + char; }).join(''); } - var integer = parseInt(colorString, 16); - var r = (integer >> 16) & 0xFF; - var g = (integer >> 8) & 0xFF; - var b = integer & 0xFF; + const integer = parseInt(colorString, 16); + const r = (integer >> 16) & 0xFF; + const g = (integer >> 8) & 0xFF; + const b = integer & 0xFF; return [r, g, b]; }; convert.rgb.hcg = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var max = Math.max(Math.max(r, g), b); - var min = Math.min(Math.min(r, g), b); - var chroma = (max - min); - var grayscale; - var hue; + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const max = Math.max(Math.max(r, g), b); + const min = Math.min(Math.min(r, g), b); + const chroma = (max - min); + let grayscale; + let hue; if (chroma < 1) { grayscale = min / (1 - chroma); @@ -7896,7 +7859,7 @@ convert.rgb.hcg = function (rgb) { if (max === g) { hue = 2 + (b - r) / chroma; } else { - hue = 4 + (r - g) / chroma + 4; + hue = 4 + (r - g) / chroma; } hue /= 6; @@ -7906,17 +7869,12 @@ convert.rgb.hcg = function (rgb) { }; convert.hsl.hcg = function (hsl) { - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var c = 1; - var f = 0; + const s = hsl[1] / 100; + const l = hsl[2] / 100; - if (l < 0.5) { - c = 2.0 * s * l; - } else { - c = 2.0 * s * (1.0 - l); - } + const c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l)); + let f = 0; if (c < 1.0) { f = (l - 0.5 * c) / (1.0 - c); } @@ -7925,11 +7883,11 @@ convert.hsl.hcg = function (hsl) { }; convert.hsv.hcg = function (hsv) { - var s = hsv[1] / 100; - var v = hsv[2] / 100; + const s = hsv[1] / 100; + const v = hsv[2] / 100; - var c = s * v; - var f = 0; + const c = s * v; + let f = 0; if (c < 1.0) { f = (v - c) / (1 - c); @@ -7939,20 +7897,21 @@ convert.hsv.hcg = function (hsv) { }; convert.hcg.rgb = function (hcg) { - var h = hcg[0] / 360; - var c = hcg[1] / 100; - var g = hcg[2] / 100; + const h = hcg[0] / 360; + const c = hcg[1] / 100; + const g = hcg[2] / 100; if (c === 0.0) { return [g * 255, g * 255, g * 255]; } - var pure = [0, 0, 0]; - var hi = (h % 1) * 6; - var v = hi % 1; - var w = 1 - v; - var mg = 0; + const pure = [0, 0, 0]; + const hi = (h % 1) * 6; + const v = hi % 1; + const w = 1 - v; + let mg = 0; + /* eslint-disable max-statements-per-line */ switch (Math.floor(hi)) { case 0: pure[0] = 1; pure[1] = v; pure[2] = 0; break; @@ -7967,6 +7926,7 @@ convert.hcg.rgb = function (hcg) { default: pure[0] = 1; pure[1] = 0; pure[2] = w; } + /* eslint-enable max-statements-per-line */ mg = (1.0 - c) * g; @@ -7978,11 +7938,11 @@ convert.hcg.rgb = function (hcg) { }; convert.hcg.hsv = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; + const c = hcg[1] / 100; + const g = hcg[2] / 100; - var v = c + g * (1.0 - c); - var f = 0; + const v = c + g * (1.0 - c); + let f = 0; if (v > 0.0) { f = c / v; @@ -7992,11 +7952,11 @@ convert.hcg.hsv = function (hcg) { }; convert.hcg.hsl = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; + const c = hcg[1] / 100; + const g = hcg[2] / 100; - var l = g * (1.0 - c) + 0.5 * c; - var s = 0; + const l = g * (1.0 - c) + 0.5 * c; + let s = 0; if (l > 0.0 && l < 0.5) { s = c / (2 * l); @@ -8009,18 +7969,18 @@ convert.hcg.hsl = function (hcg) { }; convert.hcg.hwb = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; - var v = c + g * (1.0 - c); + const c = hcg[1] / 100; + const g = hcg[2] / 100; + const v = c + g * (1.0 - c); return [hcg[0], (v - c) * 100, (1 - v) * 100]; }; convert.hwb.hcg = function (hwb) { - var w = hwb[1] / 100; - var b = hwb[2] / 100; - var v = 1 - b; - var c = v - w; - var g = 0; + const w = hwb[1] / 100; + const b = hwb[2] / 100; + const v = 1 - b; + const c = v - w; + let g = 0; if (c < 1) { g = (v - c) / (1 - c); @@ -8041,10 +8001,12 @@ convert.gray.rgb = function (args) { return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; }; -convert.gray.hsl = convert.gray.hsv = function (args) { +convert.gray.hsl = function (args) { return [0, 0, args[0]]; }; +convert.gray.hsv = convert.gray.hsl; + convert.gray.hwb = function (gray) { return [0, 100, gray[0]]; }; @@ -8058,21 +8020,21 @@ convert.gray.lab = function (gray) { }; convert.gray.hex = function (gray) { - var val = Math.round(gray[0] / 100 * 255) & 0xFF; - var integer = (val << 16) + (val << 8) + val; + const val = Math.round(gray[0] / 100 * 255) & 0xFF; + const integer = (val << 16) + (val << 8) + val; - var string = integer.toString(16).toUpperCase(); + const string = integer.toString(16).toUpperCase(); return '000000'.substring(string.length) + string; }; convert.rgb.gray = function (rgb) { - var val = (rgb[0] + rgb[1] + rgb[2]) / 3; + const val = (rgb[0] + rgb[1] + rgb[2]) / 3; return [val / 255 * 100]; }; /***/ }), -/* 118 */ +/* 117 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8231,13 +8193,13 @@ module.exports = { /***/ }), -/* 119 */ +/* 118 */ /***/ (function(module, exports, __webpack_require__) { -var conversions = __webpack_require__(117); +const conversions = __webpack_require__(116); /* - this function routes a model to all other models. + This function routes a model to all other models. all functions that are routed have a property `.conversion` attached to the returned synthetic function. This property is an array @@ -8248,11 +8210,11 @@ var conversions = __webpack_require__(117); */ function buildGraph() { - var graph = {}; + const graph = {}; // https://jsperf.com/object-keys-vs-for-in-with-closure/3 - var models = Object.keys(conversions); + const models = Object.keys(conversions); - for (var len = models.length, i = 0; i < len; i++) { + for (let len = models.length, i = 0; i < len; i++) { graph[models[i]] = { // http://jsperf.com/1-vs-infinity // micro-opt, but this is simple. @@ -8266,18 +8228,18 @@ function buildGraph() { // https://en.wikipedia.org/wiki/Breadth-first_search function deriveBFS(fromModel) { - var graph = buildGraph(); - var queue = [fromModel]; // unshift -> queue -> pop + const graph = buildGraph(); + const queue = [fromModel]; // Unshift -> queue -> pop graph[fromModel].distance = 0; while (queue.length) { - var current = queue.pop(); - var adjacents = Object.keys(conversions[current]); + const current = queue.pop(); + const adjacents = Object.keys(conversions[current]); - for (var len = adjacents.length, i = 0; i < len; i++) { - var adjacent = adjacents[i]; - var node = graph[adjacent]; + for (let len = adjacents.length, i = 0; i < len; i++) { + const adjacent = adjacents[i]; + const node = graph[adjacent]; if (node.distance === -1) { node.distance = graph[current].distance + 1; @@ -8297,10 +8259,10 @@ function link(from, to) { } function wrapConversion(toModel, graph) { - var path = [graph[toModel].parent, toModel]; - var fn = conversions[graph[toModel].parent][toModel]; + const path = [graph[toModel].parent, toModel]; + let fn = conversions[graph[toModel].parent][toModel]; - var cur = graph[toModel].parent; + let cur = graph[toModel].parent; while (graph[cur].parent) { path.unshift(graph[cur].parent); fn = link(conversions[graph[cur].parent][cur], fn); @@ -8312,16 +8274,16 @@ function wrapConversion(toModel, graph) { } module.exports = function (fromModel) { - var graph = deriveBFS(fromModel); - var conversion = {}; + const graph = deriveBFS(fromModel); + const conversion = {}; - var models = Object.keys(graph); - for (var len = models.length, i = 0; i < len; i++) { - var toModel = models[i]; - var node = graph[toModel]; + const models = Object.keys(graph); + for (let len = models.length, i = 0; i < len; i++) { + const toModel = models[i]; + const node = graph[toModel]; if (node.parent === null) { - // no possible conversion, or this node is the source model. + // No possible conversion, or this node is the source model. continue; } @@ -8334,29 +8296,38 @@ module.exports = function (fromModel) { /***/ }), -/* 120 */ +/* 119 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(121); +const os = __webpack_require__(120); +const tty = __webpack_require__(121); const hasFlag = __webpack_require__(122); -const env = process.env; +const {env} = process; let forceColor; if (hasFlag('no-color') || hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; + hasFlag('color=false') || + hasFlag('color=never')) { + forceColor = 0; } else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true') || hasFlag('color=always')) { - forceColor = true; + forceColor = 1; } + if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; + if (env.FORCE_COLOR === 'true') { + forceColor = 1; + } else if (env.FORCE_COLOR === 'false') { + forceColor = 0; + } else { + forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); + } } function translateLevel(level) { @@ -8372,8 +8343,8 @@ function translateLevel(level) { }; } -function supportsColor(stream) { - if (forceColor === false) { +function supportsColor(haveStream, streamIsTTY) { + if (forceColor === 0) { return 0; } @@ -8387,26 +8358,21 @@ function supportsColor(stream) { return 2; } - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } + if (haveStream && !streamIsTTY && forceColor === undefined) { return 0; } - const min = forceColor ? 1 : 0; + const min = forceColor || 0; + + if (env.TERM === 'dumb') { + return min; + } if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. + // Windows 10 build 10586 is the first Windows release that supports 256 colors. + // Windows 10 build 14931 is the first release that supports 16m/TrueColor. const osRelease = os.release().split('.'); if ( - Number(process.versions.node.split('.')[0]) >= 8 && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586 ) { @@ -8428,6 +8394,10 @@ function supportsColor(stream) { return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; } + if ('GITHUB_ACTIONS' in env) { + return 1; + } + if (env.COLORTERM === 'truecolor') { return 3; } @@ -8448,7 +8418,7 @@ function supportsColor(stream) { return 2; } - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { return 1; } @@ -8456,43 +8426,45 @@ function supportsColor(stream) { return 1; } - if (env.TERM === 'dumb') { - return min; - } - return min; } function getSupportLevel(stream) { - const level = supportsColor(stream); + const level = supportsColor(stream, stream && stream.isTTY); return translateLevel(level); } module.exports = { supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) + stdout: translateLevel(supportsColor(true, tty.isatty(1))), + stderr: translateLevel(supportsColor(true, tty.isatty(2))) }; /***/ }), -/* 121 */ +/* 120 */ /***/ (function(module, exports) { module.exports = require("os"); +/***/ }), +/* 121 */ +/***/ (function(module, exports) { + +module.exports = require("tty"); + /***/ }), /* 122 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = (flag, argv) => { - argv = argv || process.argv; + +module.exports = (flag, argv = process.argv) => { const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); - const pos = argv.indexOf(prefix + flag); - const terminatorPos = argv.indexOf('--'); - return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf('--'); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); }; @@ -8502,10 +8474,56 @@ module.exports = (flag, argv) => { "use strict"; -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; + +const stringReplaceAll = (string, substring, replacer) => { + let index = string.indexOf(substring); + if (index === -1) { + return string; + } + + const substringLength = substring.length; + let endIndex = 0; + let returnValue = ''; + do { + returnValue += string.substr(endIndex, index - endIndex) + substring + replacer; + endIndex = index + substringLength; + index = string.indexOf(substring, endIndex); + } while (index !== -1); + + returnValue += string.substr(endIndex); + return returnValue; +}; + +const stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => { + let endIndex = 0; + let returnValue = ''; + do { + const gotCR = string[index - 1] === '\r'; + returnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\r\n' : '\n') + postfix; + endIndex = index + 1; + index = string.indexOf('\n', endIndex); + } while (index !== -1); + + returnValue += string.substr(endIndex); + return returnValue; +}; + +module.exports = { + stringReplaceAll, + stringEncaseCRLFWithFirstIndex +}; + + +/***/ }), +/* 124 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const TEMPLATE_REGEX = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; +const ESCAPE_REGEX = /\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi; const ESCAPES = new Map([ ['n', '\n'], @@ -8521,23 +8539,31 @@ const ESCAPES = new Map([ ]); function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + const u = c[0] === 'u'; + const bracket = c[1] === '{'; + + if ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) { return String.fromCharCode(parseInt(c.slice(1), 16)); } + if (u && bracket) { + return String.fromCodePoint(parseInt(c.slice(2, -1), 16)); + } + return ESCAPES.get(c) || c; } -function parseArguments(name, args) { +function parseArguments(name, arguments_) { const results = []; - const chunks = args.trim().split(/\s*,\s*/g); + const chunks = arguments_.trim().split(/\s*,\s*/g); let matches; for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); + const number = Number(chunk); + if (!Number.isNaN(number)) { + results.push(number); } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character)); } else { throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); } @@ -8576,36 +8602,34 @@ function buildStyle(chalk, styles) { } let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } + for (const [styleName, styles] of Object.entries(enabled)) { + if (!Array.isArray(styles)) { + continue; + } - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); } + + current = styles.length > 0 ? current[styleName](...styles) : current[styleName]; } return current; } -module.exports = (chalk, tmp) => { +module.exports = (chalk, temporary) => { const styles = []; const chunks = []; let chunk = []; // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); + temporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => { + if (escapeCharacter) { + chunk.push(unescape(escapeCharacter)); } else if (style) { - const str = chunk.join(''); + const string = chunk.join(''); chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + chunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string)); styles.push({inverse, styles: parseStyle(style)}); } else if (close) { if (styles.length === 0) { @@ -8616,15 +8640,15 @@ module.exports = (chalk, tmp) => { chunk = []; styles.pop(); } else { - chunk.push(chr); + chunk.push(character); } }); chunks.push(chunk.join('')); if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); + const errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMessage); } return chunks.join(''); @@ -8632,7 +8656,7 @@ module.exports = (chalk, tmp) => { /***/ }), -/* 124 */ +/* 125 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8689,7 +8713,7 @@ exports.parseLogLevel = parseLogLevel; /***/ }), -/* 125 */ +/* 126 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8733,16 +8757,16 @@ exports.ToolingLogCollectingWriter = ToolingLogCollectingWriter; /***/ }), -/* 126 */ +/* 127 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commands", function() { return commands; }); -/* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(127); -/* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(280); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(389); -/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(390); +/* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(128); +/* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(295); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(402); +/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(403); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -8773,18 +8797,18 @@ const commands = { }; /***/ }), -/* 127 */ +/* 128 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BootstrapCommand", function() { return BootstrapCommand; }); -/* harmony import */ var _utils_link_project_executables__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(128); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(142); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(144); -/* harmony import */ var _utils_project_checksums__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(273); -/* harmony import */ var _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(279); +/* harmony import */ var _utils_link_project_executables__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(129); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); +/* harmony import */ var _utils_project_checksums__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(289); +/* harmony import */ var _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(294); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -8887,7 +8911,7 @@ const BootstrapCommand = { }; /***/ }), -/* 128 */ +/* 129 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -8895,8 +8919,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkProjectExecutables", function() { return linkProjectExecutables; }); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(129); -/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(142); +/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(130); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -8958,7 +8982,7 @@ async function linkProjectExecutables(projectsByName, projectGraph) { } /***/ }), -/* 129 */ +/* 130 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -8972,11 +8996,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDirectory", function() { return isDirectory; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFile", function() { return isFile; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createSymlink", function() { return createSymlink; }); -/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(130); +/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(131); /* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cmd_shim__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(132); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(133); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(141); +/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(142); /* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ncp__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); @@ -9092,7 +9116,7 @@ async function forceCreate(src, dest, type) { } /***/ }), -/* 130 */ +/* 131 */ /***/ (function(module, exports, __webpack_require__) { // On windows, create a .cmd file. @@ -9108,11 +9132,11 @@ async function forceCreate(src, dest, type) { module.exports = cmdShim cmdShim.ifExists = cmdShimIfExists -var fs = __webpack_require__(131) +var fs = __webpack_require__(132) -var mkdir = __webpack_require__(139) +var mkdir = __webpack_require__(140) , path = __webpack_require__(4) - , toBatchSyntax = __webpack_require__(140) + , toBatchSyntax = __webpack_require__(141) , shebangExpr = /^#\!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+=[^ \t]+\s+)*\s*([^ \t]+)(.*)$/ function cmdShimIfExists (from, to, cb) { @@ -9345,13 +9369,13 @@ function times(n, ok, cb) { /***/ }), -/* 131 */ +/* 132 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(132) -var polyfills = __webpack_require__(133) -var legacy = __webpack_require__(135) -var clone = __webpack_require__(137) +var fs = __webpack_require__(133) +var polyfills = __webpack_require__(134) +var legacy = __webpack_require__(136) +var clone = __webpack_require__(138) var util = __webpack_require__(111) @@ -9430,7 +9454,7 @@ if (!global[gracefulQueue]) { if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { process.on('exit', function() { debug(global[gracefulQueue]) - __webpack_require__(138).equal(global[gracefulQueue].length, 0) + __webpack_require__(139).equal(global[gracefulQueue].length, 0) }) } } @@ -9697,16 +9721,16 @@ function retry () { /***/ }), -/* 132 */ +/* 133 */ /***/ (function(module, exports) { module.exports = require("fs"); /***/ }), -/* 133 */ +/* 134 */ /***/ (function(module, exports, __webpack_require__) { -var constants = __webpack_require__(134) +var constants = __webpack_require__(135) var origCwd = process.cwd var cwd = null @@ -10051,16 +10075,16 @@ function patch (fs) { /***/ }), -/* 134 */ +/* 135 */ /***/ (function(module, exports) { module.exports = require("constants"); /***/ }), -/* 135 */ +/* 136 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(136).Stream +var Stream = __webpack_require__(137).Stream module.exports = legacy @@ -10181,13 +10205,13 @@ function legacy (fs) { /***/ }), -/* 136 */ +/* 137 */ /***/ (function(module, exports) { module.exports = require("stream"); /***/ }), -/* 137 */ +/* 138 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10213,17 +10237,17 @@ function clone (obj) { /***/ }), -/* 138 */ +/* 139 */ /***/ (function(module, exports) { module.exports = require("assert"); /***/ }), -/* 139 */ +/* 140 */ /***/ (function(module, exports, __webpack_require__) { var path = __webpack_require__(4); -var fs = __webpack_require__(132); +var fs = __webpack_require__(133); var _0777 = parseInt('0777', 8); module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; @@ -10324,7 +10348,7 @@ mkdirP.sync = function sync (p, opts, made) { /***/ }), -/* 140 */ +/* 141 */ /***/ (function(module, exports) { exports.replaceDollarWithPercentPair = replaceDollarWithPercentPair @@ -10382,10 +10406,10 @@ function replaceDollarWithPercentPair(value) { /***/ }), -/* 141 */ +/* 142 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(132), +var fs = __webpack_require__(133), path = __webpack_require__(4); module.exports = ncp; @@ -10649,7 +10673,7 @@ function ncp (source, dest, options, callback) { /***/ }), -/* 142 */ +/* 143 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -10709,7 +10733,7 @@ const log = new Log(); /***/ }), -/* 143 */ +/* 144 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -10775,7 +10799,7 @@ async function parallelize(items, fn, concurrency = 4) { } /***/ }), -/* 144 */ +/* 145 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -10784,15 +10808,15 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProjectGraph", function() { return buildProjectGraph; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "topologicallyBatchProjects", function() { return topologicallyBatchProjects; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "includeTransitiveProjects", function() { return includeTransitiveProjects; }); -/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145); +/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(146); /* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(glob__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(111); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(161); -/* harmony import */ var _project__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(162); -/* harmony import */ var _workspaces__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(271); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(162); +/* harmony import */ var _project__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(163); +/* harmony import */ var _workspaces__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(287); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -10991,7 +11015,7 @@ function includeTransitiveProjects(subsetOfProjects, allProjects, { } /***/ }), -/* 145 */ +/* 146 */ /***/ (function(module, exports, __webpack_require__) { // Approach: @@ -11036,27 +11060,27 @@ function includeTransitiveProjects(subsetOfProjects, allProjects, { module.exports = glob -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(152) -var EE = __webpack_require__(154).EventEmitter +var inherits = __webpack_require__(153) +var EE = __webpack_require__(155).EventEmitter var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var globSync = __webpack_require__(156) -var common = __webpack_require__(157) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var globSync = __webpack_require__(157) +var common = __webpack_require__(158) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp -var inflight = __webpack_require__(158) +var inflight = __webpack_require__(159) var util = __webpack_require__(111) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(160) +var once = __webpack_require__(161) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -11787,7 +11811,7 @@ Glob.prototype._stat2 = function (f, abs, er, stat, cb) { /***/ }), -/* 146 */ +/* 147 */ /***/ (function(module, exports, __webpack_require__) { module.exports = realpath @@ -11797,13 +11821,13 @@ realpath.realpathSync = realpathSync realpath.monkeypatch = monkeypatch realpath.unmonkeypatch = unmonkeypatch -var fs = __webpack_require__(132) +var fs = __webpack_require__(133) var origRealpath = fs.realpath var origRealpathSync = fs.realpathSync var version = process.version var ok = /^v[0-5]\./.test(version) -var old = __webpack_require__(147) +var old = __webpack_require__(148) function newError (er) { return er && er.syscall === 'realpath' && ( @@ -11859,7 +11883,7 @@ function unmonkeypatch () { /***/ }), -/* 147 */ +/* 148 */ /***/ (function(module, exports, __webpack_require__) { // Copyright Joyent, Inc. and other Node contributors. @@ -11885,7 +11909,7 @@ function unmonkeypatch () { var pathModule = __webpack_require__(4); var isWindows = process.platform === 'win32'; -var fs = __webpack_require__(132); +var fs = __webpack_require__(133); // JavaScript implementation of realpath, ported from node pre-v6 @@ -12168,7 +12192,7 @@ exports.realpath = function realpath(p, cache, cb) { /***/ }), -/* 148 */ +/* 149 */ /***/ (function(module, exports, __webpack_require__) { module.exports = minimatch @@ -12180,7 +12204,7 @@ try { } catch (er) {} var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} -var expand = __webpack_require__(149) +var expand = __webpack_require__(150) var plTypes = { '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, @@ -13097,11 +13121,11 @@ function regExpEscape (s) { /***/ }), -/* 149 */ +/* 150 */ /***/ (function(module, exports, __webpack_require__) { -var concatMap = __webpack_require__(150); -var balanced = __webpack_require__(151); +var concatMap = __webpack_require__(151); +var balanced = __webpack_require__(152); module.exports = expandTop; @@ -13304,7 +13328,7 @@ function expand(str, isTop) { /***/ }), -/* 150 */ +/* 151 */ /***/ (function(module, exports) { module.exports = function (xs, fn) { @@ -13323,7 +13347,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 151 */ +/* 152 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13389,7 +13413,7 @@ function range(a, b, str) { /***/ }), -/* 152 */ +/* 153 */ /***/ (function(module, exports, __webpack_require__) { try { @@ -13399,12 +13423,12 @@ try { module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ - module.exports = __webpack_require__(153); + module.exports = __webpack_require__(154); } /***/ }), -/* 153 */ +/* 154 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -13437,13 +13461,13 @@ if (typeof Object.create === 'function') { /***/ }), -/* 154 */ +/* 155 */ /***/ (function(module, exports) { module.exports = require("events"); /***/ }), -/* 155 */ +/* 156 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13470,22 +13494,22 @@ module.exports.win32 = win32; /***/ }), -/* 156 */ +/* 157 */ /***/ (function(module, exports, __webpack_require__) { module.exports = globSync globSync.GlobSync = GlobSync -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(145).Glob +var Glob = __webpack_require__(146).Glob var util = __webpack_require__(111) var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var common = __webpack_require__(157) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var common = __webpack_require__(158) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts @@ -13962,7 +13986,7 @@ GlobSync.prototype._makeAbs = function (f) { /***/ }), -/* 157 */ +/* 158 */ /***/ (function(module, exports, __webpack_require__) { exports.alphasort = alphasort @@ -13980,8 +14004,8 @@ function ownProp (obj, field) { } var path = __webpack_require__(4) -var minimatch = __webpack_require__(148) -var isAbsolute = __webpack_require__(155) +var minimatch = __webpack_require__(149) +var isAbsolute = __webpack_require__(156) var Minimatch = minimatch.Minimatch function alphasorti (a, b) { @@ -14208,12 +14232,12 @@ function childrenIgnored (self, path) { /***/ }), -/* 158 */ +/* 159 */ /***/ (function(module, exports, __webpack_require__) { -var wrappy = __webpack_require__(159) +var wrappy = __webpack_require__(160) var reqs = Object.create(null) -var once = __webpack_require__(160) +var once = __webpack_require__(161) module.exports = wrappy(inflight) @@ -14268,7 +14292,7 @@ function slice (args) { /***/ }), -/* 159 */ +/* 160 */ /***/ (function(module, exports) { // Returns a wrapper function that returns a wrapped callback @@ -14307,10 +14331,10 @@ function wrappy (fn, cb) { /***/ }), -/* 160 */ +/* 161 */ /***/ (function(module, exports, __webpack_require__) { -var wrappy = __webpack_require__(159) +var wrappy = __webpack_require__(160) module.exports = wrappy(once) module.exports.strict = wrappy(onceStrict) @@ -14355,7 +14379,7 @@ function onceStrict (fn) { /***/ }), -/* 161 */ +/* 162 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -14388,22 +14412,22 @@ class CliError extends Error { } /***/ }), -/* 162 */ +/* 163 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Project", function() { return Project; }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(132); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(133); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(111); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(161); -/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(142); -/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(163); -/* harmony import */ var _scripts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(226); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(162); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(143); +/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(164); +/* harmony import */ var _scripts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(233); 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; } @@ -14640,7 +14664,7 @@ function normalizePath(path) { } /***/ }), -/* 163 */ +/* 164 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -14648,9 +14672,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readPackageJson", function() { return readPackageJson; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "writePackageJson", function() { return writePackageJson; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLinkDependency", function() { return isLinkDependency; }); -/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(164); +/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(165); /* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(read_pkg__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(206); +/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(213); /* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(write_pkg__WEBPACK_IMPORTED_MODULE_1__); /* * Licensed to Elasticsearch B.V. under one or more contributor @@ -14684,15 +14708,15 @@ function writePackageJson(path, json) { const isLinkDependency = depVersion => depVersion.startsWith('link:'); /***/ }), -/* 164 */ +/* 165 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(111); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); const path = __webpack_require__(4); -const parseJson = __webpack_require__(165); +const parseJson = __webpack_require__(166); const readFileAsync = promisify(fs.readFile); @@ -14707,7 +14731,7 @@ module.exports = async options => { const json = parseJson(await readFileAsync(filePath, 'utf8')); if (options.normalize) { - __webpack_require__(180)(json); + __webpack_require__(187)(json); } return json; @@ -14724,7 +14748,7 @@ module.exports.sync = options => { const json = parseJson(fs.readFileSync(filePath, 'utf8')); if (options.normalize) { - __webpack_require__(180)(json); + __webpack_require__(187)(json); } return json; @@ -14732,15 +14756,15 @@ module.exports.sync = options => { /***/ }), -/* 165 */ +/* 166 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const errorEx = __webpack_require__(166); -const fallback = __webpack_require__(168); -const {default: LinesAndColumns} = __webpack_require__(169); -const {codeFrameColumns} = __webpack_require__(170); +const errorEx = __webpack_require__(167); +const fallback = __webpack_require__(169); +const {default: LinesAndColumns} = __webpack_require__(170); +const {codeFrameColumns} = __webpack_require__(171); const JSONError = errorEx('JSONError', { fileName: errorEx.append('in %s'), @@ -14789,14 +14813,14 @@ module.exports = (string, reviver, filename) => { /***/ }), -/* 166 */ +/* 167 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(111); -var isArrayish = __webpack_require__(167); +var isArrayish = __webpack_require__(168); var errorEx = function errorEx(name, properties) { if (!name || name.constructor !== String) { @@ -14929,7 +14953,7 @@ module.exports = errorEx; /***/ }), -/* 167 */ +/* 168 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14946,7 +14970,7 @@ module.exports = function isArrayish(obj) { /***/ }), -/* 168 */ +/* 169 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14985,7 +15009,7 @@ function parseJson (txt, reviver, context) { /***/ }), -/* 169 */ +/* 170 */ /***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; @@ -15049,7 +15073,7 @@ var LinesAndColumns = (function () { /***/ }), -/* 170 */ +/* 171 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15061,7 +15085,7 @@ Object.defineProperty(exports, "__esModule", { exports.codeFrameColumns = codeFrameColumns; exports.default = _default; -var _highlight = _interopRequireWildcard(__webpack_require__(171)); +var _highlight = _interopRequireWildcard(__webpack_require__(172)); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } @@ -15222,7 +15246,7 @@ function _default(rawLines, lineNumber, colNumber, opts = {}) { } /***/ }), -/* 171 */ +/* 172 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15235,11 +15259,11 @@ exports.shouldHighlight = shouldHighlight; exports.getChalk = getChalk; exports.default = highlight; -var _jsTokens = _interopRequireWildcard(__webpack_require__(172)); +var _jsTokens = _interopRequireWildcard(__webpack_require__(173)); -var _helperValidatorIdentifier = __webpack_require__(173); +var _helperValidatorIdentifier = __webpack_require__(174); -var _chalk = _interopRequireDefault(__webpack_require__(176)); +var _chalk = _interopRequireDefault(__webpack_require__(177)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -15335,7 +15359,7 @@ function highlight(code, options = {}) { } /***/ }), -/* 172 */ +/* 173 */ /***/ (function(module, exports) { // Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell @@ -15364,7 +15388,7 @@ exports.matchToToken = function(match) { /***/ }), -/* 173 */ +/* 174 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15422,12 +15446,12 @@ Object.defineProperty(exports, "isKeyword", { } }); -var _identifier = __webpack_require__(174); +var _identifier = __webpack_require__(175); -var _keyword = __webpack_require__(175); +var _keyword = __webpack_require__(176); /***/ }), -/* 174 */ +/* 175 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15510,7 +15534,7 @@ function isIdentifierName(name) { } /***/ }), -/* 175 */ +/* 176 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15554,16 +15578,16 @@ function isKeyword(word) { } /***/ }), -/* 176 */ +/* 177 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(113); -const ansiStyles = __webpack_require__(177); -const stdoutColor = __webpack_require__(178).stdout; +const escapeStringRegexp = __webpack_require__(178); +const ansiStyles = __webpack_require__(179); +const stdoutColor = __webpack_require__(184).stdout; -const template = __webpack_require__(179); +const template = __webpack_require__(186); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); @@ -15789,12 +15813,30 @@ module.exports.default = module.exports; // For TypeScript /***/ }), -/* 177 */ +/* 178 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; + +module.exports = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } + + return str.replace(matchOperatorsRe, '\\$&'); +}; + + +/***/ }), +/* 179 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(116); +const colorConvert = __webpack_require__(180); const wrapAnsi16 = (fn, offset) => function () { const code = fn.apply(colorConvert, arguments); @@ -15959,3021 +16001,4252 @@ Object.defineProperty(module, 'exports', { get: assembleStyles }); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(115)(module))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) /***/ }), -/* 178 */ +/* 180 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var conversions = __webpack_require__(181); +var route = __webpack_require__(183); -const os = __webpack_require__(121); -const hasFlag = __webpack_require__(122); +var convert = {}; -const env = process.env; +var models = Object.keys(conversions); -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} +function wrapRaw(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } -function translateLevel(level) { - if (level === 0) { - return false; - } + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 + return fn(args); }; -} - -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; } - if (hasFlag('color=256')) { - return 2; - } + return wrappedFn; +} - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; +function wrapRounded(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; } - return 0; - } - - const min = forceColor ? 1 : 0; - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); } - return 1; - } + var result = fn(args); - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; + // we're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (var len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } } - return min; - } - - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } - - if (env.COLORTERM === 'truecolor') { - return 3; - } - - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + return result; + }; - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; } - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } + return wrappedFn; +} - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } +models.forEach(function (fromModel) { + convert[fromModel] = {}; - if ('COLORTERM' in env) { - return 1; - } + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); - if (env.TERM === 'dumb') { - return min; - } + var routes = route(fromModel); + var routeModels = Object.keys(routes); - return min; -} + routeModels.forEach(function (toModel) { + var fn = routes[toModel]; -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); +}); -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; +module.exports = convert; /***/ }), -/* 179 */ +/* 181 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; -const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; -const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; +/* MIT license */ +var cssKeywords = __webpack_require__(182); -const ESCAPES = new Map([ - ['n', '\n'], - ['r', '\r'], - ['t', '\t'], - ['b', '\b'], - ['f', '\f'], - ['v', '\v'], - ['0', '\0'], - ['\\', '\\'], - ['e', '\u001B'], - ['a', '\u0007'] -]); +// NOTE: conversions should only return primitive values (i.e. arrays, or +// values that give correct `typeof` results). +// do not use box values types (i.e. Number(), String(), etc.) -function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(parseInt(c.slice(1), 16)); +var reverseKeywords = {}; +for (var key in cssKeywords) { + if (cssKeywords.hasOwnProperty(key)) { + reverseKeywords[cssKeywords[key]] = key; } - - return ESCAPES.get(c) || c; } -function parseArguments(name, args) { - const results = []; - const chunks = args.trim().split(/\s*,\s*/g); - let matches; +var convert = module.exports = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} +}; - for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); - } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); +// hide .channels and .labels properties +for (var model in convert) { + if (convert.hasOwnProperty(model)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); } - } - - return results; -} - -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; - - const results = []; - let matches; - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); } - } - return results; + var channels = convert[model].channels; + var labels = convert[model].labels; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); + } } -function buildStyle(chalk, styles) { - const enabled = {}; +convert.rgb.hsl = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h; + var s; + var l; - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; } - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } + h = Math.min(h * 60, 360); - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } + if (h < 0) { + h += 360; } - return current; -} + l = (min + max) / 2; -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } + return [h, s * 100, l * 100]; +}; - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); - } - }); +convert.rgb.hsv = function (rgb) { + var rdif; + var gdif; + var bdif; + var h; + var s; - chunks.push(chunk.join('')); + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var v = Math.max(r, g, b); + var diff = v - Math.min(r, g, b); + var diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); + if (diff === 0) { + h = s = 0; + } else { + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } } - return chunks.join(''); + return [ + h * 360, + s * 100, + v * 100 + ]; }; +convert.rgb.hwb = function (rgb) { + var r = rgb[0]; + var g = rgb[1]; + var b = rgb[2]; + var h = convert.rgb.hsl(rgb)[0]; + var w = 1 / 255 * Math.min(r, Math.min(g, b)); -/***/ }), -/* 180 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = normalize + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); -var fixer = __webpack_require__(181) -normalize.fixer = fixer + return [h, w * 100, b * 100]; +}; -var makeWarning = __webpack_require__(204) +convert.rgb.cmyk = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var c; + var m; + var y; + var k; -var fieldsToFix = ['name','version','description','repository','modules','scripts' - ,'files','bin','man','bugs','keywords','readme','homepage','license'] -var otherThingsToFix = ['dependencies','people', 'typos'] + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; -var thingsToFix = fieldsToFix.map(function(fieldName) { - return ucFirst(fieldName) + "Field" -}) -// two ways to do this in CoffeeScript on only one line, sub-70 chars: -// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field" -// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix) -thingsToFix = thingsToFix.concat(otherThingsToFix) + return [c * 100, m * 100, y * 100, k * 100]; +}; -function normalize (data, warn, strict) { - if(warn === true) warn = null, strict = true - if(!strict) strict = false - if(!warn || data.private) warn = function(msg) { /* noop */ } - - if (data.scripts && - data.scripts.install === "node-gyp rebuild" && - !data.scripts.preinstall) { - data.gypfile = true - } - fixer.warn = function() { warn(makeWarning.apply(null, arguments)) } - thingsToFix.forEach(function(thingName) { - fixer["fix" + ucFirst(thingName)](data, strict) - }) - data._id = data.name + "@" + data.version +/** + * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + * */ +function comparativeDistance(x, y) { + return ( + Math.pow(x[0] - y[0], 2) + + Math.pow(x[1] - y[1], 2) + + Math.pow(x[2] - y[2], 2) + ); } -function ucFirst (string) { - return string.charAt(0).toUpperCase() + string.slice(1); -} +convert.rgb.keyword = function (rgb) { + var reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; + } + var currentClosestDistance = Infinity; + var currentClosestKeyword; -/***/ }), -/* 181 */ -/***/ (function(module, exports, __webpack_require__) { + for (var keyword in cssKeywords) { + if (cssKeywords.hasOwnProperty(keyword)) { + var value = cssKeywords[keyword]; -var semver = __webpack_require__(182) -var validateLicense = __webpack_require__(183); -var hostedGitInfo = __webpack_require__(188) -var isBuiltinModule = __webpack_require__(192).isCore -var depTypes = ["dependencies","devDependencies","optionalDependencies"] -var extractDescription = __webpack_require__(202) -var url = __webpack_require__(189) -var typos = __webpack_require__(203) + // Compute comparative distance + var distance = comparativeDistance(rgb, value); -var fixer = module.exports = { - // default warning function - warn: function() {}, + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } + } - fixRepositoryField: function(data) { - if (data.repositories) { - this.warn("repositories"); - data.repository = data.repositories[0] - } - if (!data.repository) return this.warn("missingRepository") - if (typeof data.repository === "string") { - data.repository = { - type: "git", - url: data.repository - } - } - var r = data.repository.url || "" - if (r) { - var hosted = hostedGitInfo.fromUrl(r) - if (hosted) { - r = data.repository.url - = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString() - } - } + return currentClosestKeyword; +}; - if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) { - this.warn("brokenGitUrl", r) - } - } +convert.keyword.rgb = function (keyword) { + return cssKeywords[keyword]; +}; -, fixTypos: function(data) { - Object.keys(typos.topLevel).forEach(function (d) { - if (data.hasOwnProperty(d)) { - this.warn("typo", d, typos.topLevel[d]) - } - }, this) - } +convert.rgb.xyz = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; -, fixScriptsField: function(data) { - if (!data.scripts) return - if (typeof data.scripts !== "object") { - this.warn("nonObjectScripts") - delete data.scripts - return - } - Object.keys(data.scripts).forEach(function (k) { - if (typeof data.scripts[k] !== "string") { - this.warn("nonStringScript") - delete data.scripts[k] - } else if (typos.script[k] && !data.scripts[typos.script[k]]) { - this.warn("typo", k, typos.script[k], "scripts") - } - }, this) - } + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); -, fixFilesField: function(data) { - var files = data.files - if (files && !Array.isArray(files)) { - this.warn("nonArrayFiles") - delete data.files - } else if (data.files) { - data.files = data.files.filter(function(file) { - if (!file || typeof file !== "string") { - this.warn("invalidFilename", file) - return false - } else { - return true - } - }, this) - } - } + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); -, fixBinField: function(data) { - if (!data.bin) return; - if (typeof data.bin === "string") { - var b = {} - var match - if (match = data.name.match(/^@[^/]+[/](.*)$/)) { - b[match[1]] = data.bin - } else { - b[data.name] = data.bin - } - data.bin = b - } - } + return [x * 100, y * 100, z * 100]; +}; -, fixManField: function(data) { - if (!data.man) return; - if (typeof data.man === "string") { - data.man = [ data.man ] - } - } -, fixBundleDependenciesField: function(data) { - var bdd = "bundledDependencies" - var bd = "bundleDependencies" - if (data[bdd] && !data[bd]) { - data[bd] = data[bdd] - delete data[bdd] - } - if (data[bd] && !Array.isArray(data[bd])) { - this.warn("nonArrayBundleDependencies") - delete data[bd] - } else if (data[bd]) { - data[bd] = data[bd].filter(function(bd) { - if (!bd || typeof bd !== 'string') { - this.warn("nonStringBundleDependency", bd) - return false - } else { - if (!data.dependencies) { - data.dependencies = {} - } - if (!data.dependencies.hasOwnProperty(bd)) { - this.warn("nonDependencyBundleDependency", bd) - data.dependencies[bd] = "*" - } - return true - } - }, this) - } - } +convert.rgb.lab = function (rgb) { + var xyz = convert.rgb.xyz(rgb); + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; -, fixDependencies: function(data, strict) { - var loose = !strict - objectifyDeps(data, this.warn) - addOptionalDepsToDeps(data, this.warn) - this.fixBundleDependenciesField(data) + x /= 95.047; + y /= 100; + z /= 108.883; - ;['dependencies','devDependencies'].forEach(function(deps) { - if (!(deps in data)) return - if (!data[deps] || typeof data[deps] !== "object") { - this.warn("nonObjectDependencies", deps) - delete data[deps] - return - } - Object.keys(data[deps]).forEach(function (d) { - var r = data[deps][d] - if (typeof r !== 'string') { - this.warn("nonStringDependency", d, JSON.stringify(r)) - delete data[deps][d] - } - var hosted = hostedGitInfo.fromUrl(data[deps][d]) - if (hosted) data[deps][d] = hosted.toString() - }, this) - }, this) - } + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); -, fixModulesField: function (data) { - if (data.modules) { - this.warn("deprecatedModules") - delete data.modules - } - } + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); -, fixKeywordsField: function (data) { - if (typeof data.keywords === "string") { - data.keywords = data.keywords.split(/,\s+/) - } - if (data.keywords && !Array.isArray(data.keywords)) { - delete data.keywords - this.warn("nonArrayKeywords") - } else if (data.keywords) { - data.keywords = data.keywords.filter(function(kw) { - if (typeof kw !== "string" || !kw) { - this.warn("nonStringKeyword"); - return false - } else { - return true - } - }, this) - } - } + return [l, a, b]; +}; -, fixVersionField: function(data, strict) { - // allow "loose" semver 1.0 versions in non-strict mode - // enforce strict semver 2.0 compliance in strict mode - var loose = !strict - if (!data.version) { - data.version = "" - return true - } - if (!semver.valid(data.version, loose)) { - throw new Error('Invalid version: "'+ data.version + '"') - } - data.version = semver.clean(data.version, loose) - return true - } +convert.hsl.rgb = function (hsl) { + var h = hsl[0] / 360; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var t1; + var t2; + var t3; + var rgb; + var val; -, fixPeople: function(data) { - modifyPeople(data, unParsePerson) - modifyPeople(data, parsePerson) - } + if (s === 0) { + val = l * 255; + return [val, val, val]; + } -, fixNameField: function(data, options) { - if (typeof options === "boolean") options = {strict: options} - else if (typeof options === "undefined") options = {} - var strict = options.strict - if (!data.name && !strict) { - data.name = "" - return - } - if (typeof data.name !== "string") { - throw new Error("name field must be a string.") - } - if (!strict) - data.name = data.name.trim() - ensureValidName(data.name, strict, options.allowLegacyCase) - if (isBuiltinModule(data.name)) - this.warn("conflictingName", data.name) - } + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } + t1 = 2 * l - t2; -, fixDescriptionField: function (data) { - if (data.description && typeof data.description !== 'string') { - this.warn("nonStringDescription") - delete data.description - } - if (data.readme && !data.description) - data.description = extractDescription(data.readme) - if(data.description === undefined) delete data.description; - if (!data.description) this.warn("missingDescription") - } + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } + if (t3 > 1) { + t3--; + } -, fixReadmeField: function (data) { - if (!data.readme) { - this.warn("missingReadme") - data.readme = "ERROR: No README data found!" - } - } + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } -, fixBugsField: function(data) { - if (!data.bugs && data.repository && data.repository.url) { - var hosted = hostedGitInfo.fromUrl(data.repository.url) - if(hosted && hosted.bugs()) { - data.bugs = {url: hosted.bugs()} - } - } - else if(data.bugs) { - var emailRe = /^.+@.*\..+$/ - if(typeof data.bugs == "string") { - if(emailRe.test(data.bugs)) - data.bugs = {email:data.bugs} - else if(url.parse(data.bugs).protocol) - data.bugs = {url: data.bugs} - else - this.warn("nonEmailUrlBugsString") - } - else { - bugsTypos(data.bugs, this.warn) - var oldBugs = data.bugs - data.bugs = {} - if(oldBugs.url) { - if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol) - data.bugs.url = oldBugs.url - else - this.warn("nonUrlBugsUrlField") - } - if(oldBugs.email) { - if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email)) - data.bugs.email = oldBugs.email - else - this.warn("nonEmailBugsEmailField") - } - } - if(!data.bugs.email && !data.bugs.url) { - delete data.bugs - this.warn("emptyNormalizedBugs") - } - } - } + rgb[i] = val * 255; + } -, fixHomepageField: function(data) { - if (!data.homepage && data.repository && data.repository.url) { - var hosted = hostedGitInfo.fromUrl(data.repository.url) - if (hosted && hosted.docs()) data.homepage = hosted.docs() - } - if (!data.homepage) return + return rgb; +}; - if(typeof data.homepage !== "string") { - this.warn("nonUrlHomepage") - return delete data.homepage - } - if(!url.parse(data.homepage).protocol) { - data.homepage = "http://" + data.homepage - } - } +convert.hsl.hsv = function (hsl) { + var h = hsl[0]; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var smin = s; + var lmin = Math.max(l, 0.01); + var sv; + var v; -, fixLicenseField: function(data) { - if (!data.license) { - return this.warn("missingLicense") - } else{ - if ( - typeof(data.license) !== 'string' || - data.license.length < 1 || - data.license.trim() === '' - ) { - this.warn("invalidLicense") - } else { - if (!validateLicense(data.license).validForNewPackages) - this.warn("invalidLicense") - } - } - } -} + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + v = (l + s) / 2; + sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); -function isValidScopedPackageName(spec) { - if (spec.charAt(0) !== '@') return false + return [h, sv * 100, v * 100]; +}; - var rest = spec.slice(1).split('/') - if (rest.length !== 2) return false +convert.hsv.rgb = function (hsv) { + var h = hsv[0] / 60; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var hi = Math.floor(h) % 6; - return rest[0] && rest[1] && - rest[0] === encodeURIComponent(rest[0]) && - rest[1] === encodeURIComponent(rest[1]) -} + var f = h - Math.floor(h); + var p = 255 * v * (1 - s); + var q = 255 * v * (1 - (s * f)); + var t = 255 * v * (1 - (s * (1 - f))); + v *= 255; -function isCorrectlyEncodedName(spec) { - return !spec.match(/[\/@\s\+%:]/) && - spec === encodeURIComponent(spec) -} + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +}; -function ensureValidName (name, strict, allowLegacyCase) { - if (name.charAt(0) === "." || - !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) || - (strict && (!allowLegacyCase) && name !== name.toLowerCase()) || - name.toLowerCase() === "node_modules" || - name.toLowerCase() === "favicon.ico") { - throw new Error("Invalid name: " + JSON.stringify(name)) - } -} +convert.hsv.hsl = function (hsv) { + var h = hsv[0]; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var vmin = Math.max(v, 0.01); + var lmin; + var sl; + var l; -function modifyPeople (data, fn) { - if (data.author) data.author = fn(data.author) - ;["maintainers", "contributors"].forEach(function (set) { - if (!Array.isArray(data[set])) return; - data[set] = data[set].map(fn) - }) - return data -} + l = (2 - s) * v; + lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; -function unParsePerson (person) { - if (typeof person === "string") return person - var name = person.name || "" - var u = person.url || person.web - var url = u ? (" ("+u+")") : "" - var e = person.email || person.mail - var email = e ? (" <"+e+">") : "" - return name+email+url -} + return [h, sl * 100, l * 100]; +}; -function parsePerson (person) { - if (typeof person !== "string") return person - var name = person.match(/^([^\(<]+)/) - var url = person.match(/\(([^\)]+)\)/) - var email = person.match(/<([^>]+)>/) - var obj = {} - if (name && name[0].trim()) obj.name = name[0].trim() - if (email) obj.email = email[1]; - if (url) obj.url = url[1]; - return obj -} +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +convert.hwb.rgb = function (hwb) { + var h = hwb[0] / 360; + var wh = hwb[1] / 100; + var bl = hwb[2] / 100; + var ratio = wh + bl; + var i; + var v; + var f; + var n; -function addOptionalDepsToDeps (data, warn) { - var o = data.optionalDependencies - if (!o) return; - var d = data.dependencies || {} - Object.keys(o).forEach(function (k) { - d[k] = o[k] - }) - data.dependencies = d -} + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } -function depObjectify (deps, type, warn) { - if (!deps) return {} - if (typeof deps === "string") { - deps = deps.trim().split(/[\n\r\s\t ,]+/) - } - if (!Array.isArray(deps)) return deps - warn("deprecatedArrayDependencies", type) - var o = {} - deps.filter(function (d) { - return typeof d === "string" - }).forEach(function(d) { - d = d.trim().split(/(:?[@\s><=])/) - var dn = d.shift() - var dv = d.join("") - dv = dv.trim() - dv = dv.replace(/^@/, "") - o[dn] = dv - }) - return o -} + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; -function objectifyDeps (data, warn) { - depTypes.forEach(function (type) { - if (!data[type]) return; - data[type] = depObjectify(data[type], type, warn) - }) -} + if ((i & 0x01) !== 0) { + f = 1 - f; + } -function bugsTypos(bugs, warn) { - if (!bugs) return - Object.keys(bugs).forEach(function (k) { - if (typos.bugs[k]) { - warn("typo", k, typos.bugs[k], "bugs") - bugs[typos.bugs[k]] = bugs[k] - delete bugs[k] - } - }) -} + n = wh + f * (v - wh); // linear interpolation + var r; + var g; + var b; + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } -/***/ }), -/* 182 */ -/***/ (function(module, exports) { + return [r * 255, g * 255, b * 255]; +}; -exports = module.exports = SemVer +convert.cmyk.rgb = function (cmyk) { + var c = cmyk[0] / 100; + var m = cmyk[1] / 100; + var y = cmyk[2] / 100; + var k = cmyk[3] / 100; + var r; + var g; + var b; -var debug -/* istanbul ignore next */ -if (typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG)) { - debug = function () { - var args = Array.prototype.slice.call(arguments, 0) - args.unshift('SEMVER') - console.log.apply(console, args) - } -} else { - debug = function () {} -} + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -exports.SEMVER_SPEC_VERSION = '2.0.0' + return [r * 255, g * 255, b * 255]; +}; -var MAX_LENGTH = 256 -var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 +convert.xyz.rgb = function (xyz) { + var x = xyz[0] / 100; + var y = xyz[1] / 100; + var z = xyz[2] / 100; + var r; + var g; + var b; -// Max safe segment length for coercion. -var MAX_SAFE_COMPONENT_LENGTH = 16 + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); -// The actual regexps go on exports.re -var re = exports.re = [] -var src = exports.src = [] -var R = 0 + // assume sRGB + r = r > 0.0031308 + ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r * 12.92; -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. + g = g > 0.0031308 + ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g * 12.92; -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. + b = b > 0.0031308 + ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b * 12.92; -var NUMERICIDENTIFIER = R++ -src[NUMERICIDENTIFIER] = '0|[1-9]\\d*' -var NUMERICIDENTIFIERLOOSE = R++ -src[NUMERICIDENTIFIERLOOSE] = '[0-9]+' + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. + return [r * 255, g * 255, b * 255]; +}; -var NONNUMERICIDENTIFIER = R++ -src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' +convert.xyz.lab = function (xyz) { + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; -// ## Main Version -// Three dot-separated numeric identifiers. + x /= 95.047; + y /= 100; + z /= 108.883; -var MAINVERSION = R++ -src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')' + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); -var MAINVERSIONLOOSE = R++ -src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')' + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. + return [l, a, b]; +}; -var PRERELEASEIDENTIFIER = R++ -src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + - '|' + src[NONNUMERICIDENTIFIER] + ')' +convert.lab.xyz = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var x; + var y; + var z; -var PRERELEASEIDENTIFIERLOOSE = R++ -src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + - '|' + src[NONNUMERICIDENTIFIER] + ')' + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. + var y2 = Math.pow(y, 3); + var x2 = Math.pow(x, 3); + var z2 = Math.pow(z, 3); + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; -var PRERELEASE = R++ -src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + - '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))' + x *= 95.047; + y *= 100; + z *= 108.883; -var PRERELEASELOOSE = R++ -src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + - '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))' + return [x, y, z]; +}; -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. +convert.lab.lch = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var hr; + var h; + var c; -var BUILDIDENTIFIER = R++ -src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+' + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. + if (h < 0) { + h += 360; + } -var BUILD = R++ -src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + - '(?:\\.' + src[BUILDIDENTIFIER] + ')*))' + c = Math.sqrt(a * a + b * b); -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. + return [l, c, h]; +}; -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. +convert.lch.lab = function (lch) { + var l = lch[0]; + var c = lch[1]; + var h = lch[2]; + var a; + var b; + var hr; -var FULL = R++ -var FULLPLAIN = 'v?' + src[MAINVERSION] + - src[PRERELEASE] + '?' + - src[BUILD] + '?' + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); -src[FULL] = '^' + FULLPLAIN + '$' + return [l, a, b]; +}; -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + - src[PRERELEASELOOSE] + '?' + - src[BUILD] + '?' +convert.rgb.ansi16 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization -var LOOSE = R++ -src[LOOSE] = '^' + LOOSEPLAIN + '$' + value = Math.round(value / 50); -var GTLT = R++ -src[GTLT] = '((?:<|>)?=?)' + if (value === 0) { + return 30; + } -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -var XRANGEIDENTIFIERLOOSE = R++ -src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' -var XRANGEIDENTIFIER = R++ -src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*' + var ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); -var XRANGEPLAIN = R++ -src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:' + src[PRERELEASE] + ')?' + - src[BUILD] + '?' + - ')?)?' + if (value === 2) { + ansi += 60; + } -var XRANGEPLAINLOOSE = R++ -src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:' + src[PRERELEASELOOSE] + ')?' + - src[BUILD] + '?' + - ')?)?' + return ansi; +}; -var XRANGE = R++ -src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' -var XRANGELOOSE = R++ -src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' +convert.hsv.ansi16 = function (args) { + // optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); +}; -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -var COERCE = R++ -src[COERCE] = '(?:^|[^\\d])' + - '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:$|[^\\d])' +convert.rgb.ansi256 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; -// Tilde ranges. -// Meaning is "reasonably at or greater than" -var LONETILDE = R++ -src[LONETILDE] = '(?:~>?)' + // we use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } -var TILDETRIM = R++ -src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+' -re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g') -var tildeTrimReplace = '$1~' + if (r > 248) { + return 231; + } -var TILDE = R++ -src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$' -var TILDELOOSE = R++ -src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$' + return Math.round(((r - 8) / 247) * 24) + 232; + } -// Caret ranges. -// Meaning is "at least and backwards compatible with" -var LONECARET = R++ -src[LONECARET] = '(?:\\^)' + var ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); -var CARETTRIM = R++ -src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+' -re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g') -var caretTrimReplace = '$1^' + return ansi; +}; -var CARET = R++ -src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$' -var CARETLOOSE = R++ -src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$' +convert.ansi16.rgb = function (args) { + var color = args % 10; -// A simple gt/lt/eq thing, or just "" to indicate "any version" -var COMPARATORLOOSE = R++ -src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$' -var COMPARATOR = R++ -src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$' + // handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -var COMPARATORTRIM = R++ -src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + - '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')' + color = color / 10.5 * 255; -// this one has to use the /g flag -re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g') -var comparatorTrimReplace = '$1$2$3' + return [color, color, color]; + } -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -var HYPHENRANGE = R++ -src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAIN] + ')' + - '\\s*$' + var mult = (~~(args > 50) + 1) * 0.5; + var r = ((color & 1) * mult) * 255; + var g = (((color >> 1) & 1) * mult) * 255; + var b = (((color >> 2) & 1) * mult) * 255; -var HYPHENRANGELOOSE = R++ -src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s*$' + return [r, g, b]; +}; -// Star ranges basically just allow anything at all. -var STAR = R++ -src[STAR] = '(<|>)?=?\\s*\\*' +convert.ansi256.rgb = function (args) { + // handle greyscale + if (args >= 232) { + var c = (args - 232) * 10 + 8; + return [c, c, c]; + } -// Compile to actual regexp objects. -// All are flag-free, unless they were created above with a flag. -for (var i = 0; i < R; i++) { - debug(i, src[i]) - if (!re[i]) { - re[i] = new RegExp(src[i]) - } -} + args -= 16; -exports.parse = parse -function parse (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } + var rem; + var r = Math.floor(args / 36) / 5 * 255; + var g = Math.floor((rem = args % 36) / 6) / 5 * 255; + var b = (rem % 6) / 5 * 255; - if (version instanceof SemVer) { - return version - } + return [r, g, b]; +}; - if (typeof version !== 'string') { - return null - } +convert.rgb.hex = function (args) { + var integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); - if (version.length > MAX_LENGTH) { - return null - } + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; - var r = options.loose ? re[LOOSE] : re[FULL] - if (!r.test(version)) { - return null - } +convert.hex.rgb = function (args) { + var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} + var colorString = match[0]; -exports.valid = valid -function valid (version, options) { - var v = parse(version, options) - return v ? v.version : null -} + if (match[0].length === 3) { + colorString = colorString.split('').map(function (char) { + return char + char; + }).join(''); + } -exports.clean = clean -function clean (version, options) { - var s = parse(version.trim().replace(/^[=v]+/, ''), options) - return s ? s.version : null -} - -exports.SemVer = SemVer - -function SemVer (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - if (version instanceof SemVer) { - if (version.loose === options.loose) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError('Invalid Version: ' + version) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') - } - - if (!(this instanceof SemVer)) { - return new SemVer(version, options) - } + var integer = parseInt(colorString, 16); + var r = (integer >> 16) & 0xFF; + var g = (integer >> 8) & 0xFF; + var b = integer & 0xFF; - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose + return [r, g, b]; +}; - var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]) +convert.rgb.hcg = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var max = Math.max(Math.max(r, g), b); + var min = Math.min(Math.min(r, g), b); + var chroma = (max - min); + var grayscale; + var hue; - if (!m) { - throw new TypeError('Invalid Version: ' + version) - } + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; + } - this.raw = version + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma + 4; + } - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] + hue /= 6; + hue %= 1; - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } + return [hue * 360, chroma * 100, grayscale * 100]; +}; - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } +convert.hsl.hcg = function (hsl) { + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var c = 1; + var f = 0; - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } + if (l < 0.5) { + c = 2.0 * s * l; + } else { + c = 2.0 * s * (1.0 - l); + } - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map(function (id) { - if (/^[0-9]+$/.test(id)) { - var num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); + } - this.build = m[5] ? m[5].split('.') : [] - this.format() -} + return [hsl[0], c * 100, f * 100]; +}; -SemVer.prototype.format = function () { - this.version = this.major + '.' + this.minor + '.' + this.patch - if (this.prerelease.length) { - this.version += '-' + this.prerelease.join('.') - } - return this.version -} +convert.hsv.hcg = function (hsv) { + var s = hsv[1] / 100; + var v = hsv[2] / 100; -SemVer.prototype.toString = function () { - return this.version -} + var c = s * v; + var f = 0; -SemVer.prototype.compare = function (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } + if (c < 1.0) { + f = (v - c) / (1 - c); + } - return this.compareMain(other) || this.comparePre(other) -} + return [hsv[0], c * 100, f * 100]; +}; -SemVer.prototype.compareMain = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } +convert.hcg.rgb = function (hcg) { + var h = hcg[0] / 360; + var c = hcg[1] / 100; + var g = hcg[2] / 100; - return compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) -} + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; + } -SemVer.prototype.comparePre = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } + var pure = [0, 0, 0]; + var hi = (h % 1) * 6; + var v = hi % 1; + var w = 1 - v; + var mg = 0; - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } - var i = 0 - do { - var a = this.prerelease[i] - var b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) -} + mg = (1.0 - c) * g; -// preminor will bump the version up to the next minor release, and immediately -// down to pre-release. premajor and prepatch work the same way. -SemVer.prototype.inc = function (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; +}; - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if (this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - var i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break +convert.hcg.hsv = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; - default: - throw new Error('invalid increment argument: ' + release) - } - this.format() - this.raw = this.version - return this -} + var v = c + g * (1.0 - c); + var f = 0; -exports.inc = inc -function inc (version, release, loose, identifier) { - if (typeof (loose) === 'string') { - identifier = loose - loose = undefined - } + if (v > 0.0) { + f = c / v; + } - try { - return new SemVer(version, loose).inc(release, identifier).version - } catch (er) { - return null - } -} + return [hcg[0], f * 100, v * 100]; +}; -exports.diff = diff -function diff (version1, version2) { - if (eq(version1, version2)) { - return null - } else { - var v1 = parse(version1) - var v2 = parse(version2) - var prefix = '' - if (v1.prerelease.length || v2.prerelease.length) { - prefix = 'pre' - var defaultResult = 'prerelease' - } - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return prefix + key - } - } - } - return defaultResult // may be undefined - } -} +convert.hcg.hsl = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; -exports.compareIdentifiers = compareIdentifiers + var l = g * (1.0 - c) + 0.5 * c; + var s = 0; -var numeric = /^[0-9]+$/ -function compareIdentifiers (a, b) { - var anum = numeric.test(a) - var bnum = numeric.test(b) + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } - if (anum && bnum) { - a = +a - b = +b - } + return [hcg[0], s * 100, l * 100]; +}; - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} +convert.hcg.hwb = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + var v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; +}; -exports.rcompareIdentifiers = rcompareIdentifiers -function rcompareIdentifiers (a, b) { - return compareIdentifiers(b, a) -} +convert.hwb.hcg = function (hwb) { + var w = hwb[1] / 100; + var b = hwb[2] / 100; + var v = 1 - b; + var c = v - w; + var g = 0; -exports.major = major -function major (a, loose) { - return new SemVer(a, loose).major -} + if (c < 1) { + g = (v - c) / (1 - c); + } -exports.minor = minor -function minor (a, loose) { - return new SemVer(a, loose).minor -} + return [hwb[0], c * 100, g * 100]; +}; -exports.patch = patch -function patch (a, loose) { - return new SemVer(a, loose).patch -} +convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; +}; -exports.compare = compare -function compare (a, b, loose) { - return new SemVer(a, loose).compare(new SemVer(b, loose)) -} +convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; +}; -exports.compareLoose = compareLoose -function compareLoose (a, b) { - return compare(a, b, true) -} +convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; +}; -exports.rcompare = rcompare -function rcompare (a, b, loose) { - return compare(b, a, loose) -} +convert.gray.hsl = convert.gray.hsv = function (args) { + return [0, 0, args[0]]; +}; -exports.sort = sort -function sort (list, loose) { - return list.sort(function (a, b) { - return exports.compare(a, b, loose) - }) -} +convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; +}; -exports.rsort = rsort -function rsort (list, loose) { - return list.sort(function (a, b) { - return exports.rcompare(a, b, loose) - }) -} +convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; +}; -exports.gt = gt -function gt (a, b, loose) { - return compare(a, b, loose) > 0 -} +convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; +}; -exports.lt = lt -function lt (a, b, loose) { - return compare(a, b, loose) < 0 -} +convert.gray.hex = function (gray) { + var val = Math.round(gray[0] / 100 * 255) & 0xFF; + var integer = (val << 16) + (val << 8) + val; -exports.eq = eq -function eq (a, b, loose) { - return compare(a, b, loose) === 0 -} + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; -exports.neq = neq -function neq (a, b, loose) { - return compare(a, b, loose) !== 0 -} +convert.rgb.gray = function (rgb) { + var val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; +}; -exports.gte = gte -function gte (a, b, loose) { - return compare(a, b, loose) >= 0 -} -exports.lte = lte -function lte (a, b, loose) { - return compare(a, b, loose) <= 0 -} +/***/ }), +/* 182 */ +/***/ (function(module, exports, __webpack_require__) { -exports.cmp = cmp -function cmp (a, op, b, loose) { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b +"use strict"; + + +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - case '': - case '=': - case '==': - return eq(a, b, loose) +/***/ }), +/* 183 */ +/***/ (function(module, exports, __webpack_require__) { - case '!=': - return neq(a, b, loose) +var conversions = __webpack_require__(181); - case '>': - return gt(a, b, loose) +/* + this function routes a model to all other models. - case '>=': - return gte(a, b, loose) + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). - case '<': - return lt(a, b, loose) + conversions that are not possible simply are not included. +*/ - case '<=': - return lte(a, b, loose) +function buildGraph() { + var graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + var models = Object.keys(conversions); - default: - throw new TypeError('Invalid operator: ' + op) - } + for (var len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } + + return graph; } -exports.Comparator = Comparator -function Comparator (comp, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } +// https://en.wikipedia.org/wiki/Breadth-first_search +function deriveBFS(fromModel) { + var graph = buildGraph(); + var queue = [fromModel]; // unshift -> queue -> pop - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } + graph[fromModel].distance = 0; - if (!(this instanceof Comparator)) { - return new Comparator(comp, options) - } + while (queue.length) { + var current = queue.pop(); + var adjacents = Object.keys(conversions[current]); - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) + for (var len = adjacents.length, i = 0; i < len; i++) { + var adjacent = adjacents[i]; + var node = graph[adjacent]; - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } + } - debug('comp', this) + return graph; } -var ANY = {} -Comparator.prototype.parse = function (comp) { - var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR] - var m = comp.match(r) +function link(from, to) { + return function (args) { + return to(from(args)); + }; +} - if (!m) { - throw new TypeError('Invalid comparator: ' + comp) - } +function wrapConversion(toModel, graph) { + var path = [graph[toModel].parent, toModel]; + var fn = conversions[graph[toModel].parent][toModel]; - this.operator = m[1] - if (this.operator === '=') { - this.operator = '' - } + var cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } + fn.conversion = path; + return fn; } -Comparator.prototype.toString = function () { - return this.value -} +module.exports = function (fromModel) { + var graph = deriveBFS(fromModel); + var conversion = {}; -Comparator.prototype.test = function (version) { - debug('Comparator.test', version, this.options.loose) + var models = Object.keys(graph); + for (var len = models.length, i = 0; i < len; i++) { + var toModel = models[i]; + var node = graph[toModel]; - if (this.semver === ANY) { - return true - } + if (node.parent === null) { + // no possible conversion, or this node is the source model. + continue; + } - if (typeof version === 'string') { - version = new SemVer(version, this.options) - } + conversion[toModel] = wrapConversion(toModel, graph); + } - return cmp(version, this.operator, this.semver, this.options) -} + return conversion; +}; -Comparator.prototype.intersects = function (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - var rangeTmp +/***/ }), +/* 184 */ +/***/ (function(module, exports, __webpack_require__) { - if (this.operator === '') { - rangeTmp = new Range(comp.value, options) - return satisfies(this.value, rangeTmp, options) - } else if (comp.operator === '') { - rangeTmp = new Range(this.value, options) - return satisfies(comp.semver, rangeTmp, options) - } +"use strict"; - var sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - var sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - var sameSemVer = this.semver.version === comp.semver.version - var differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - var oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - ((this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<')) - var oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - ((this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>')) +const os = __webpack_require__(120); +const hasFlag = __webpack_require__(185); - return sameDirectionIncreasing || sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || oppositeDirectionsGreaterThan +const env = process.env; + +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; } -exports.Range = Range -function Range (range, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } +function translateLevel(level) { + if (level === 0) { + return false; + } - if (range instanceof Range) { - if (range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease) { - return range - } else { - return new Range(range.raw, options) - } - } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} - if (range instanceof Comparator) { - return new Range(range.value, options) - } +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } - if (!(this instanceof Range)) { - return new Range(range, options) - } + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease + if (hasFlag('color=256')) { + return 2; + } - // First, split based on boolean or || - this.raw = range - this.set = range.split(/\s*\|\|\s*/).map(function (range) { - return this.parseRange(range.trim()) - }, this).filter(function (c) { - // throw out any that are not relevant for whatever reason - return c.length - }) + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } - if (!this.set.length) { - throw new TypeError('Invalid SemVer Range: ' + range) - } + const min = forceColor ? 1 : 0; - this.format() -} + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } -Range.prototype.format = function () { - this.range = this.set.map(function (comps) { - return comps.join(' ').trim() - }).join('||').trim() - return this.range -} + return 1; + } -Range.prototype.toString = function () { - return this.range -} + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } -Range.prototype.parseRange = function (range) { - var loose = this.options.loose - range = range.trim() - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE] - range = range.replace(hr, hyphenReplace) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[COMPARATORTRIM]) + return min; + } - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[TILDETRIM], tildeTrimReplace) + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[CARETTRIM], caretTrimReplace) + if (env.COLORTERM === 'truecolor') { + return 3; + } - // normalize spaces - range = range.split(/\s+/).join(' ') + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - // At this point, the range is completely trimmed and - // ready to be split into comparators. + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } - var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR] - var set = range.split(' ').map(function (comp) { - return parseComparator(comp, this.options) - }, this).join(' ').split(/\s+/) - if (this.options.loose) { - // in loose mode, throw out any that are not valid comparators - set = set.filter(function (comp) { - return !!comp.match(compRe) - }) - } - set = set.map(function (comp) { - return new Comparator(comp, this.options) - }, this) + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } - return set -} + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } -Range.prototype.intersects = function (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } + if ('COLORTERM' in env) { + return 1; + } - return this.set.some(function (thisComparators) { - return thisComparators.every(function (thisComparator) { - return range.set.some(function (rangeComparators) { - return rangeComparators.every(function (rangeComparator) { - return thisComparator.intersects(rangeComparator, options) - }) - }) - }) - }) -} + if (env.TERM === 'dumb') { + return min; + } -// Mostly just for testing and legacy API reasons -exports.toComparators = toComparators -function toComparators (range, options) { - return new Range(range, options).set.map(function (comp) { - return comp.map(function (c) { - return c.value - }).join(' ').trim().split(' ') - }) + return min; } -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -function parseComparator (comp, options) { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); } -function isX (id) { - return !id || id.toLowerCase() === 'x' || id === '*' -} +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 -function replaceTildes (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceTilde(comp, options) - }).join(' ') -} -function replaceTilde (comp, options) { - var r = options.loose ? re[TILDELOOSE] : re[TILDE] - return comp.replace(r, function (_, M, m, p, pr) { - debug('tilde', comp, _, M, m, p, pr) - var ret +/***/ }), +/* 185 */ +/***/ (function(module, exports, __webpack_require__) { - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0 - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else if (pr) { - debug('replaceTilde pr', pr) - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } else { - // ~1.2.3 == >=1.2.3 <1.3.0 - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0' - } +"use strict"; - debug('tilde return', ret) - return ret - }) -} +module.exports = (flag, argv) => { + argv = argv || process.argv; + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const pos = argv.indexOf(prefix + flag); + const terminatorPos = argv.indexOf('--'); + return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); +}; -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 -// ^1.2.3 --> >=1.2.3 <2.0.0 -// ^1.2.0 --> >=1.2.0 <2.0.0 -function replaceCarets (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceCaret(comp, options) - }).join(' ') -} -function replaceCaret (comp, options) { - debug('caret', comp, options) - var r = options.loose ? re[CARETLOOSE] : re[CARET] - return comp.replace(r, function (_, M, m, p, pr) { - debug('caret', comp, _, M, m, p, pr) - var ret +/***/ }), +/* 186 */ +/***/ (function(module, exports, __webpack_require__) { - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - if (M === '0') { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else { - ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + (+M + 1) + '.0.0' - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + (+M + 1) + '.0.0' - } - } +"use strict"; - debug('caret return', ret) - return ret - }) -} +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; -function replaceXRanges (comp, options) { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map(function (comp) { - return replaceXRange(comp, options) - }).join(' ') +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); + +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } + + return ESCAPES.get(c) || c; } -function replaceXRange (comp, options) { - comp = comp.trim() - var r = options.loose ? re[XRANGELOOSE] : re[XRANGE] - return comp.replace(r, function (ret, gtlt, M, m, p, pr) { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - var xM = isX(M) - var xm = xM || isX(m) - var xp = xm || isX(p) - var anyX = xp +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; - if (gtlt === '=' && anyX) { - gtlt = '' - } + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 + return results; +} - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - // >1.2.3 => >= 1.2.4 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; - ret = gtlt + M + '.' + m + '.' + p - } else if (xm) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (xp) { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } + const results = []; + let matches; - debug('xRange return', ret) + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; - return ret - }) -} + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -function replaceStars (comp, options) { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[STAR], '') + return results; } -// This function is passed to string.replace(re[HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0 -function hyphenReplace ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = '>=' + fM + '.0.0' - } else if (isX(fp)) { - from = '>=' + fM + '.' + fm + '.0' - } else { - from = '>=' + from - } +function buildStyle(chalk, styles) { + const enabled = {}; - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = '<' + (+tM + 1) + '.0.0' - } else if (isX(tp)) { - to = '<' + tM + '.' + (+tm + 1) + '.0' - } else if (tpr) { - to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr - } else { - to = '<=' + to - } + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } - return (from + ' ' + to).trim() + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } + + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; + } + } + } + + return current; } -// if ANY of the sets match ALL of its comparators, then pass -Range.prototype.test = function (version) { - if (!version) { - return false - } +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; - if (typeof version === 'string') { - version = new SemVer(version, this.options) - } + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } - for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false -} + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); + } + }); -function testSet (set, version, options) { - for (var i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } + chunks.push(chunk.join('')); - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === ANY) { - continue - } + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); + } - if (set[i].semver.prerelease.length > 0) { - var allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } + return chunks.join(''); +}; - // Version has a -pre, but it's not one of the ones we like. - return false - } - return true -} +/***/ }), +/* 187 */ +/***/ (function(module, exports, __webpack_require__) { -exports.satisfies = satisfies -function satisfies (version, range, options) { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} +module.exports = normalize -exports.maxSatisfying = maxSatisfying -function maxSatisfying (versions, range, options) { - var max = null - var maxSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null +var fixer = __webpack_require__(188) +normalize.fixer = fixer + +var makeWarning = __webpack_require__(211) + +var fieldsToFix = ['name','version','description','repository','modules','scripts' + ,'files','bin','man','bugs','keywords','readme','homepage','license'] +var otherThingsToFix = ['dependencies','people', 'typos'] + +var thingsToFix = fieldsToFix.map(function(fieldName) { + return ucFirst(fieldName) + "Field" +}) +// two ways to do this in CoffeeScript on only one line, sub-70 chars: +// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field" +// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix) +thingsToFix = thingsToFix.concat(otherThingsToFix) + +function normalize (data, warn, strict) { + if(warn === true) warn = null, strict = true + if(!strict) strict = false + if(!warn || data.private) warn = function(msg) { /* noop */ } + + if (data.scripts && + data.scripts.install === "node-gyp rebuild" && + !data.scripts.preinstall) { + data.gypfile = true } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!max || maxSV.compare(v) === -1) { - // compare(max, v, true) - max = v - maxSV = new SemVer(max, options) - } - } + fixer.warn = function() { warn(makeWarning.apply(null, arguments)) } + thingsToFix.forEach(function(thingName) { + fixer["fix" + ucFirst(thingName)](data, strict) }) - return max + data._id = data.name + "@" + data.version } -exports.minSatisfying = minSatisfying -function minSatisfying (versions, range, options) { - var min = null - var minSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!min || minSV.compare(v) === 1) { - // compare(min, v, true) - min = v - minSV = new SemVer(min, options) - } - } - }) - return min +function ucFirst (string) { + return string.charAt(0).toUpperCase() + string.slice(1); } -exports.minVersion = minVersion -function minVersion (range, loose) { - range = new Range(range, loose) - var minver = new SemVer('0.0.0') - if (range.test(minver)) { - return minver +/***/ }), +/* 188 */ +/***/ (function(module, exports, __webpack_require__) { + +var semver = __webpack_require__(189) +var validateLicense = __webpack_require__(190); +var hostedGitInfo = __webpack_require__(195) +var isBuiltinModule = __webpack_require__(199).isCore +var depTypes = ["dependencies","devDependencies","optionalDependencies"] +var extractDescription = __webpack_require__(209) +var url = __webpack_require__(196) +var typos = __webpack_require__(210) + +var fixer = module.exports = { + // default warning function + warn: function() {}, + + fixRepositoryField: function(data) { + if (data.repositories) { + this.warn("repositories"); + data.repository = data.repositories[0] + } + if (!data.repository) return this.warn("missingRepository") + if (typeof data.repository === "string") { + data.repository = { + type: "git", + url: data.repository + } + } + var r = data.repository.url || "" + if (r) { + var hosted = hostedGitInfo.fromUrl(r) + if (hosted) { + r = data.repository.url + = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString() + } + } + + if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) { + this.warn("brokenGitUrl", r) + } } - minver = new SemVer('0.0.0-0') - if (range.test(minver)) { - return minver +, fixTypos: function(data) { + Object.keys(typos.topLevel).forEach(function (d) { + if (data.hasOwnProperty(d)) { + this.warn("typo", d, typos.topLevel[d]) + } + }, this) } - minver = null - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] +, fixScriptsField: function(data) { + if (!data.scripts) return + if (typeof data.scripts !== "object") { + this.warn("nonObjectScripts") + delete data.scripts + return + } + Object.keys(data.scripts).forEach(function (k) { + if (typeof data.scripts[k] !== "string") { + this.warn("nonStringScript") + delete data.scripts[k] + } else if (typos.script[k] && !data.scripts[typos.script[k]]) { + this.warn("typo", k, typos.script[k], "scripts") + } + }, this) + } - comparators.forEach(function (comparator) { - // Clone to avoid manipulating the comparator's semver object. - var compver = new SemVer(comparator.semver.version) - switch (comparator.operator) { - case '>': - if (compver.prerelease.length === 0) { - compver.patch++ - } else { - compver.prerelease.push(0) - } - compver.raw = compver.format() - /* fallthrough */ - case '': - case '>=': - if (!minver || gt(minver, compver)) { - minver = compver - } - break - case '<': - case '<=': - /* Ignore maximum versions */ - break - /* istanbul ignore next */ - default: - throw new Error('Unexpected operation: ' + comparator.operator) +, fixFilesField: function(data) { + var files = data.files + if (files && !Array.isArray(files)) { + this.warn("nonArrayFiles") + delete data.files + } else if (data.files) { + data.files = data.files.filter(function(file) { + if (!file || typeof file !== "string") { + this.warn("invalidFilename", file) + return false + } else { + return true + } + }, this) + } + } + +, fixBinField: function(data) { + if (!data.bin) return; + if (typeof data.bin === "string") { + var b = {} + var match + if (match = data.name.match(/^@[^/]+[/](.*)$/)) { + b[match[1]] = data.bin + } else { + b[data.name] = data.bin } - }) + data.bin = b + } } - if (minver && range.test(minver)) { - return minver +, fixManField: function(data) { + if (!data.man) return; + if (typeof data.man === "string") { + data.man = [ data.man ] + } + } +, fixBundleDependenciesField: function(data) { + var bdd = "bundledDependencies" + var bd = "bundleDependencies" + if (data[bdd] && !data[bd]) { + data[bd] = data[bdd] + delete data[bdd] + } + if (data[bd] && !Array.isArray(data[bd])) { + this.warn("nonArrayBundleDependencies") + delete data[bd] + } else if (data[bd]) { + data[bd] = data[bd].filter(function(bd) { + if (!bd || typeof bd !== 'string') { + this.warn("nonStringBundleDependency", bd) + return false + } else { + if (!data.dependencies) { + data.dependencies = {} + } + if (!data.dependencies.hasOwnProperty(bd)) { + this.warn("nonDependencyBundleDependency", bd) + data.dependencies[bd] = "*" + } + return true + } + }, this) + } } - return null -} +, fixDependencies: function(data, strict) { + var loose = !strict + objectifyDeps(data, this.warn) + addOptionalDepsToDeps(data, this.warn) + this.fixBundleDependenciesField(data) -exports.validRange = validRange -function validRange (range, options) { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, options).range || '*' - } catch (er) { - return null + ;['dependencies','devDependencies'].forEach(function(deps) { + if (!(deps in data)) return + if (!data[deps] || typeof data[deps] !== "object") { + this.warn("nonObjectDependencies", deps) + delete data[deps] + return + } + Object.keys(data[deps]).forEach(function (d) { + var r = data[deps][d] + if (typeof r !== 'string') { + this.warn("nonStringDependency", d, JSON.stringify(r)) + delete data[deps][d] + } + var hosted = hostedGitInfo.fromUrl(data[deps][d]) + if (hosted) data[deps][d] = hosted.toString() + }, this) + }, this) } -} -// Determine if version is less than all the versions possible in the range -exports.ltr = ltr -function ltr (version, range, options) { - return outside(version, range, '<', options) -} +, fixModulesField: function (data) { + if (data.modules) { + this.warn("deprecatedModules") + delete data.modules + } + } -// Determine if version is greater than all the versions possible in the range. -exports.gtr = gtr -function gtr (version, range, options) { - return outside(version, range, '>', options) -} +, fixKeywordsField: function (data) { + if (typeof data.keywords === "string") { + data.keywords = data.keywords.split(/,\s+/) + } + if (data.keywords && !Array.isArray(data.keywords)) { + delete data.keywords + this.warn("nonArrayKeywords") + } else if (data.keywords) { + data.keywords = data.keywords.filter(function(kw) { + if (typeof kw !== "string" || !kw) { + this.warn("nonStringKeyword"); + return false + } else { + return true + } + }, this) + } + } -exports.outside = outside -function outside (version, range, hilo, options) { - version = new SemVer(version, options) - range = new Range(range, options) +, fixVersionField: function(data, strict) { + // allow "loose" semver 1.0 versions in non-strict mode + // enforce strict semver 2.0 compliance in strict mode + var loose = !strict + if (!data.version) { + data.version = "" + return true + } + if (!semver.valid(data.version, loose)) { + throw new Error('Invalid version: "'+ data.version + '"') + } + data.version = semver.clean(data.version, loose) + return true + } - var gtfn, ltefn, ltfn, comp, ecomp - switch (hilo) { - case '>': - gtfn = gt - ltefn = lte - ltfn = lt - comp = '>' - ecomp = '>=' - break - case '<': - gtfn = lt - ltefn = gte - ltfn = gt - comp = '<' - ecomp = '<=' - break - default: - throw new TypeError('Must provide a hilo val of "<" or ">"') +, fixPeople: function(data) { + modifyPeople(data, unParsePerson) + modifyPeople(data, parsePerson) } - // If it satisifes the range it is not outside - if (satisfies(version, range, options)) { - return false +, fixNameField: function(data, options) { + if (typeof options === "boolean") options = {strict: options} + else if (typeof options === "undefined") options = {} + var strict = options.strict + if (!data.name && !strict) { + data.name = "" + return + } + if (typeof data.name !== "string") { + throw new Error("name field must be a string.") + } + if (!strict) + data.name = data.name.trim() + ensureValidName(data.name, strict, options.allowLegacyCase) + if (isBuiltinModule(data.name)) + this.warn("conflictingName", data.name) } - // From now on, variable terms are as if we're in "gtr" mode. - // but note that everything is flipped for the "ltr" function. - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] +, fixDescriptionField: function (data) { + if (data.description && typeof data.description !== 'string') { + this.warn("nonStringDescription") + delete data.description + } + if (data.readme && !data.description) + data.description = extractDescription(data.readme) + if(data.description === undefined) delete data.description; + if (!data.description) this.warn("missingDescription") + } - var high = null - var low = null +, fixReadmeField: function (data) { + if (!data.readme) { + this.warn("missingReadme") + data.readme = "ERROR: No README data found!" + } + } - comparators.forEach(function (comparator) { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0') +, fixBugsField: function(data) { + if (!data.bugs && data.repository && data.repository.url) { + var hosted = hostedGitInfo.fromUrl(data.repository.url) + if(hosted && hosted.bugs()) { + data.bugs = {url: hosted.bugs()} } - high = high || comparator - low = low || comparator - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator - } else if (ltfn(comparator.semver, low.semver, options)) { - low = comparator + } + else if(data.bugs) { + var emailRe = /^.+@.*\..+$/ + if(typeof data.bugs == "string") { + if(emailRe.test(data.bugs)) + data.bugs = {email:data.bugs} + else if(url.parse(data.bugs).protocol) + data.bugs = {url: data.bugs} + else + this.warn("nonEmailUrlBugsString") } - }) + else { + bugsTypos(data.bugs, this.warn) + var oldBugs = data.bugs + data.bugs = {} + if(oldBugs.url) { + if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol) + data.bugs.url = oldBugs.url + else + this.warn("nonUrlBugsUrlField") + } + if(oldBugs.email) { + if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email)) + data.bugs.email = oldBugs.email + else + this.warn("nonEmailBugsEmailField") + } + } + if(!data.bugs.email && !data.bugs.url) { + delete data.bugs + this.warn("emptyNormalizedBugs") + } + } + } - // If the edge version comparator has a operator then our version - // isn't outside it - if (high.operator === comp || high.operator === ecomp) { - return false +, fixHomepageField: function(data) { + if (!data.homepage && data.repository && data.repository.url) { + var hosted = hostedGitInfo.fromUrl(data.repository.url) + if (hosted && hosted.docs()) data.homepage = hosted.docs() } + if (!data.homepage) return - // If the lowest version comparator has an operator and our version - // is less than it then it isn't higher than the range - if ((!low.operator || low.operator === comp) && - ltefn(version, low.semver)) { - return false - } else if (low.operator === ecomp && ltfn(version, low.semver)) { - return false + if(typeof data.homepage !== "string") { + this.warn("nonUrlHomepage") + return delete data.homepage + } + if(!url.parse(data.homepage).protocol) { + data.homepage = "http://" + data.homepage } } - return true -} -exports.prerelease = prerelease -function prerelease (version, options) { - var parsed = parse(version, options) - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null +, fixLicenseField: function(data) { + if (!data.license) { + return this.warn("missingLicense") + } else{ + if ( + typeof(data.license) !== 'string' || + data.license.length < 1 || + data.license.trim() === '' + ) { + this.warn("invalidLicense") + } else { + if (!validateLicense(data.license).validForNewPackages) + this.warn("invalidLicense") + } + } + } } -exports.intersects = intersects -function intersects (r1, r2, options) { - r1 = new Range(r1, options) - r2 = new Range(r2, options) - return r1.intersects(r2) -} +function isValidScopedPackageName(spec) { + if (spec.charAt(0) !== '@') return false -exports.coerce = coerce -function coerce (version) { - if (version instanceof SemVer) { - return version - } + var rest = spec.slice(1).split('/') + if (rest.length !== 2) return false - if (typeof version !== 'string') { - return null - } + return rest[0] && rest[1] && + rest[0] === encodeURIComponent(rest[0]) && + rest[1] === encodeURIComponent(rest[1]) +} - var match = version.match(re[COERCE]) +function isCorrectlyEncodedName(spec) { + return !spec.match(/[\/@\s\+%:]/) && + spec === encodeURIComponent(spec) +} - if (match == null) { - return null +function ensureValidName (name, strict, allowLegacyCase) { + if (name.charAt(0) === "." || + !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) || + (strict && (!allowLegacyCase) && name !== name.toLowerCase()) || + name.toLowerCase() === "node_modules" || + name.toLowerCase() === "favicon.ico") { + throw new Error("Invalid name: " + JSON.stringify(name)) } - - return parse(match[1] + - '.' + (match[2] || '0') + - '.' + (match[3] || '0')) } +function modifyPeople (data, fn) { + if (data.author) data.author = fn(data.author) + ;["maintainers", "contributors"].forEach(function (set) { + if (!Array.isArray(data[set])) return; + data[set] = data[set].map(fn) + }) + return data +} -/***/ }), -/* 183 */ -/***/ (function(module, exports, __webpack_require__) { - -var parse = __webpack_require__(184); -var correct = __webpack_require__(186); - -var genericWarning = ( - 'license should be ' + - 'a valid SPDX license expression (without "LicenseRef"), ' + - '"UNLICENSED", or ' + - '"SEE LICENSE IN "' -); +function unParsePerson (person) { + if (typeof person === "string") return person + var name = person.name || "" + var u = person.url || person.web + var url = u ? (" ("+u+")") : "" + var e = person.email || person.mail + var email = e ? (" <"+e+">") : "" + return name+email+url +} -var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/; +function parsePerson (person) { + if (typeof person !== "string") return person + var name = person.match(/^([^\(<]+)/) + var url = person.match(/\(([^\)]+)\)/) + var email = person.match(/<([^>]+)>/) + var obj = {} + if (name && name[0].trim()) obj.name = name[0].trim() + if (email) obj.email = email[1]; + if (url) obj.url = url[1]; + return obj +} -function startsWith(prefix, string) { - return string.slice(0, prefix.length) === prefix; +function addOptionalDepsToDeps (data, warn) { + var o = data.optionalDependencies + if (!o) return; + var d = data.dependencies || {} + Object.keys(o).forEach(function (k) { + d[k] = o[k] + }) + data.dependencies = d } -function usesLicenseRef(ast) { - if (ast.hasOwnProperty('license')) { - var license = ast.license; - return ( - startsWith('LicenseRef', license) || - startsWith('DocumentRef', license) - ); - } else { - return ( - usesLicenseRef(ast.left) || - usesLicenseRef(ast.right) - ); +function depObjectify (deps, type, warn) { + if (!deps) return {} + if (typeof deps === "string") { + deps = deps.trim().split(/[\n\r\s\t ,]+/) } + if (!Array.isArray(deps)) return deps + warn("deprecatedArrayDependencies", type) + var o = {} + deps.filter(function (d) { + return typeof d === "string" + }).forEach(function(d) { + d = d.trim().split(/(:?[@\s><=])/) + var dn = d.shift() + var dv = d.join("") + dv = dv.trim() + dv = dv.replace(/^@/, "") + o[dn] = dv + }) + return o } -module.exports = function(argument) { - var ast; +function objectifyDeps (data, warn) { + depTypes.forEach(function (type) { + if (!data[type]) return; + data[type] = depObjectify(data[type], type, warn) + }) +} - try { - ast = parse(argument); - } catch (e) { - var match - if ( - argument === 'UNLICENSED' || - argument === 'UNLICENCED' - ) { - return { - validForOldPackages: true, - validForNewPackages: true, - unlicensed: true - }; - } else if (match = fileReferenceRE.exec(argument)) { - return { - validForOldPackages: true, - validForNewPackages: true, - inFile: match[1] - }; - } else { - var result = { - validForOldPackages: false, - validForNewPackages: false, - warnings: [genericWarning] - }; - var corrected = correct(argument); - if (corrected) { - result.warnings.push( - 'license is similar to the valid expression "' + corrected + '"' - ); - } - return result; +function bugsTypos(bugs, warn) { + if (!bugs) return + Object.keys(bugs).forEach(function (k) { + if (typos.bugs[k]) { + warn("typo", k, typos.bugs[k], "bugs") + bugs[typos.bugs[k]] = bugs[k] + delete bugs[k] } - } - - if (usesLicenseRef(ast)) { - return { - validForNewPackages: false, - validForOldPackages: false, - spdx: true, - warnings: [genericWarning] - }; - } else { - return { - validForNewPackages: true, - validForOldPackages: true, - spdx: true - }; - } -}; + }) +} /***/ }), -/* 184 */ -/***/ (function(module, exports, __webpack_require__) { +/* 189 */ +/***/ (function(module, exports) { -var parser = __webpack_require__(185).parser +exports = module.exports = SemVer -module.exports = function (argument) { - return parser.parse(argument) +var debug +/* istanbul ignore next */ +if (typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG)) { + debug = function () { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift('SEMVER') + console.log.apply(console, args) + } +} else { + debug = function () {} } +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0' -/***/ }), -/* 185 */ -/***/ (function(module, exports, __webpack_require__) { +var MAX_LENGTH = 256 +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || + /* istanbul ignore next */ 9007199254740991 -/* WEBPACK VAR INJECTION */(function(module) {/* parser generated by jison 0.4.17 */ -/* - Returns a Parser object of the following structure: +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16 - Parser: { - yy: {} - } +// The actual regexps go on exports.re +var re = exports.re = [] +var src = exports.src = [] +var R = 0 - Parser.prototype: { - yy: {}, - trace: function(), - symbols_: {associative list: name ==> number}, - terminals_: {associative list: number ==> name}, - productions_: [...], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), - table: [...], - defaultActions: {...}, - parseError: function(str, hash), - parse: function(input), +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. - lexer: { - EOF: 1, - parseError: function(str, hash), - setInput: function(input), - input: function(), - unput: function(str), - more: function(), - less: function(n), - pastInput: function(), - upcomingInput: function(), - showPosition: function(), - test_match: function(regex_match_array, rule_index), - next: function(), - lex: function(), - begin: function(condition), - popState: function(), - _currentRules: function(), - topState: function(), - pushState: function(condition), +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. - options: { - ranges: boolean (optional: true ==> token location info will include a .range[] member) - flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) - backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) - }, +var NUMERICIDENTIFIER = R++ +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*' +var NUMERICIDENTIFIERLOOSE = R++ +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+' - performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), - rules: [...], - conditions: {associative list: name ==> set}, - } - } +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. +var NONNUMERICIDENTIFIER = R++ +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' - token location info (@$, _$, etc.): { - first_line: n, - last_line: n, - first_column: n, - last_column: n, - range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) - } +// ## Main Version +// Three dot-separated numeric identifiers. +var MAINVERSION = R++ +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')' - the parseError function receives a 'hash' object with these members for lexer and parser errors: { - text: (matched text) - token: (the produced terminal token, if any) - line: (yylineno) - } - while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { - loc: (yylloc) - expected: (string describing the set of expected tokens) - recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) - } -*/ -var spdxparse = (function(){ -var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,5],$V1=[1,6],$V2=[1,7],$V3=[1,4],$V4=[1,9],$V5=[1,10],$V6=[5,14,15,17],$V7=[5,12,14,15,17]; -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"start":3,"expression":4,"EOS":5,"simpleExpression":6,"LICENSE":7,"PLUS":8,"LICENSEREF":9,"DOCUMENTREF":10,"COLON":11,"WITH":12,"EXCEPTION":13,"AND":14,"OR":15,"OPEN":16,"CLOSE":17,"$accept":0,"$end":1}, -terminals_: {2:"error",5:"EOS",7:"LICENSE",8:"PLUS",9:"LICENSEREF",10:"DOCUMENTREF",11:"COLON",12:"WITH",13:"EXCEPTION",14:"AND",15:"OR",16:"OPEN",17:"CLOSE"}, -productions_: [0,[3,2],[6,1],[6,2],[6,1],[6,3],[4,1],[4,3],[4,3],[4,3],[4,3]], -performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { -/* this == yyval */ +var MAINVERSIONLOOSE = R++ +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')' -var $0 = $$.length - 1; -switch (yystate) { -case 1: -return this.$ = $$[$0-1] -break; -case 2: case 4: case 5: -this.$ = {license: yytext} -break; -case 3: -this.$ = {license: $$[$0-1], plus: true} -break; -case 6: -this.$ = $$[$0] -break; -case 7: -this.$ = {exception: $$[$0]} -this.$.license = $$[$0-2].license -if ($$[$0-2].hasOwnProperty('plus')) { - this.$.plus = $$[$0-2].plus -} -break; -case 8: -this.$ = {conjunction: 'and', left: $$[$0-2], right: $$[$0]} -break; -case 9: -this.$ = {conjunction: 'or', left: $$[$0-2], right: $$[$0]} -break; -case 10: -this.$ = $$[$0-1] -break; -} -}, -table: [{3:1,4:2,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{1:[3]},{5:[1,8],14:$V4,15:$V5},o($V6,[2,6],{12:[1,11]}),{4:12,6:3,7:$V0,9:$V1,10:$V2,16:$V3},o($V7,[2,2],{8:[1,13]}),o($V7,[2,4]),{11:[1,14]},{1:[2,1]},{4:15,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{4:16,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{13:[1,17]},{14:$V4,15:$V5,17:[1,18]},o($V7,[2,3]),{9:[1,19]},o($V6,[2,8]),o([5,15,17],[2,9],{14:$V4}),o($V6,[2,7]),o($V6,[2,10]),o($V7,[2,5])], -defaultActions: {8:[2,1]}, -parseError: function parseError(str, hash) { - if (hash.recoverable) { - this.trace(str); - } else { - function _parseError (msg, hash) { - this.message = msg; - this.hash = hash; - } - _parseError.prototype = Error; +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. - throw new _parseError(str, hash); - } -}, -parse: function parse(input) { - var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; - var args = lstack.slice.call(arguments, 1); - var lexer = Object.create(this.lexer); - var sharedState = { yy: {} }; - for (var k in this.yy) { - if (Object.prototype.hasOwnProperty.call(this.yy, k)) { - sharedState.yy[k] = this.yy[k]; - } - } - lexer.setInput(input, sharedState.yy); - sharedState.yy.lexer = lexer; - sharedState.yy.parser = this; - if (typeof lexer.yylloc == 'undefined') { - lexer.yylloc = {}; - } - var yyloc = lexer.yylloc; - lstack.push(yyloc); - var ranges = lexer.options && lexer.options.ranges; - if (typeof sharedState.yy.parseError === 'function') { - this.parseError = sharedState.yy.parseError; - } else { - this.parseError = Object.getPrototypeOf(this).parseError; - } - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - _token_stack: - var lex = function () { - var token; - token = lexer.lex() || EOF; - if (typeof token !== 'number') { - token = self.symbols_[token] || token; - } - return token; - }; - var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == 'undefined') { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === 'undefined' || !action.length || !action[0]) { - var errStr = ''; - expected = []; - for (p in table[state]) { - if (this.terminals_[p] && p > TERROR) { - expected.push('\'' + this.terminals_[p] + '\''); - } - } - if (lexer.showPosition) { - errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; - } else { - errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); - } - this.parseError(errStr, { - text: lexer.match, - token: this.terminals_[symbol] || symbol, - line: lexer.yylineno, - loc: yyloc, - expected: expected - }); - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(lexer.yytext); - lstack.push(lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = lexer.yyleng; - yytext = lexer.yytext; - yylineno = lexer.yylineno; - yyloc = lexer.yylloc; - if (recovering > 0) { - recovering--; - } - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { - first_line: lstack[lstack.length - (len || 1)].first_line, - last_line: lstack[lstack.length - 1].last_line, - first_column: lstack[lstack.length - (len || 1)].first_column, - last_column: lstack[lstack.length - 1].last_column - }; - if (ranges) { - yyval._$.range = [ - lstack[lstack.length - (len || 1)].range[0], - lstack[lstack.length - 1].range[1] - ]; - } - r = this.performAction.apply(yyval, [ - yytext, - yyleng, - yylineno, - sharedState.yy, - action[1], - vstack, - lstack - ].concat(args)); - if (typeof r !== 'undefined') { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; -}}; -/* generated by jison-lex 0.3.4 */ -var lexer = (function(){ -var lexer = ({ +var PRERELEASEIDENTIFIER = R++ +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')' -EOF:1, +var PRERELEASEIDENTIFIERLOOSE = R++ +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')' -parseError:function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. -// resets the lexer, sets new input -setInput:function (input, yy) { - this.yy = yy || this.yy || {}; - this._input = input; - this._more = this._backtrack = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = { - first_line: 1, - first_column: 0, - last_line: 1, - last_column: 0 - }; - if (this.options.ranges) { - this.yylloc.range = [0,0]; - } - this.offset = 0; - return this; - }, +var PRERELEASE = R++ +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))' -// consumes and returns one char from the input -input:function () { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) { - this.yylloc.range[1]++; - } +var PRERELEASELOOSE = R++ +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))' - this._input = this._input.slice(1); - return ch; - }, +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. -// unshifts one char (or a string) into the input -unput:function (ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); +var BUILDIDENTIFIER = R++ +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+' - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. - if (lines.length - 1) { - this.yylineno -= lines.length - 1; - } - var r = this.yylloc.range; +var BUILD = R++ +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))' - this.yylloc = { - first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? - (lines.length === oldLines.length ? this.yylloc.first_column : 0) - + oldLines[oldLines.length - lines.length].length - lines[0].length : - this.yylloc.first_column - len - }; +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - this.yyleng = this.yytext.length; - return this; - }, +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. -// When called from action, caches matched text and appends it on next action -more:function () { - this._more = true; - return this; - }, +var FULL = R++ +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?' -// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. -reject:function () { - if (this.options.backtrack_lexer) { - this._backtrack = true; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); +src[FULL] = '^' + FULLPLAIN + '$' - } - return this; - }, +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?' -// retain first n characters of the match -less:function (n) { - this.unput(this.match.slice(n)); - }, +var LOOSE = R++ +src[LOOSE] = '^' + LOOSEPLAIN + '$' -// displays already matched input, i.e. for error messages -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, +var GTLT = R++ +src[GTLT] = '((?:<|>)?=?)' -// displays upcoming input, i.e. for error messages -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); - }, +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++ +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' +var XRANGEIDENTIFIER = R++ +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*' -// displays the character position where the lexing error occurred, i.e. for error messages -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, +var XRANGEPLAIN = R++ +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?' -// test the lexed token: return FALSE when not a match, otherwise return token -test_match:function (match, indexed_rule) { - var token, - lines, - backup; +var XRANGEPLAINLOOSE = R++ +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?' - if (this.options.backtrack_lexer) { - // save context - backup = { - yylineno: this.yylineno, - yylloc: { - first_line: this.yylloc.first_line, - last_line: this.last_line, - first_column: this.yylloc.first_column, - last_column: this.yylloc.last_column - }, - yytext: this.yytext, - match: this.match, - matches: this.matches, - matched: this.matched, - yyleng: this.yyleng, - offset: this.offset, - _more: this._more, - _input: this._input, - yy: this.yy, - conditionStack: this.conditionStack.slice(0), - done: this.done - }; - if (this.options.ranges) { - backup.yylloc.range = this.yylloc.range.slice(0); - } - } +var XRANGE = R++ +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' +var XRANGELOOSE = R++ +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno += lines.length; - } - this.yylloc = { - first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? - lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : - this.yylloc.last_column + match[0].length - }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._backtrack = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) { - this.done = false; - } - if (token) { - return token; - } else if (this._backtrack) { - // recover context - for (var k in backup) { - this[k] = backup[k]; - } - return false; // rule action called reject() implying the next rule should be tested instead. - } - return false; - }, +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +var COERCE = R++ +src[COERCE] = '(?:^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])' -// return next match in input -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) { - this.done = true; - } +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++ +src[LONETILDE] = '(?:~>?)' - var token, - match, - tempMatch, - index; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (this.options.backtrack_lexer) { - token = this.test_match(tempMatch, rules[i]); - if (token !== false) { - return token; - } else if (this._backtrack) { - match = false; - continue; // rule action called reject() implying a rule MISmatch. - } else { - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - } else if (!this.options.flex) { - break; - } - } - } - if (match) { - token = this.test_match(match, rules[index]); - if (token !== false) { - return token; - } - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); - } - }, +var TILDETRIM = R++ +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+' +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g') +var tildeTrimReplace = '$1~' -// return next match that has a token -lex:function lex() { - var r = this.next(); - if (r) { - return r; - } else { - return this.lex(); - } - }, +var TILDE = R++ +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$' +var TILDELOOSE = R++ +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$' -// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) -begin:function begin(condition) { - this.conditionStack.push(condition); - }, +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++ +src[LONECARET] = '(?:\\^)' -// pop the previously active lexer condition state off the condition stack -popState:function popState() { - var n = this.conditionStack.length - 1; - if (n > 0) { - return this.conditionStack.pop(); - } else { - return this.conditionStack[0]; - } - }, +var CARETTRIM = R++ +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+' +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g') +var caretTrimReplace = '$1^' -// produce the lexer rule set which is active for the currently active lexer condition state -_currentRules:function _currentRules() { - if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - } else { - return this.conditions["INITIAL"].rules; - } - }, +var CARET = R++ +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$' +var CARETLOOSE = R++ +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$' -// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available -topState:function topState(n) { - n = this.conditionStack.length - 1 - Math.abs(n || 0); - if (n >= 0) { - return this.conditionStack[n]; - } else { - return "INITIAL"; +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++ +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$' +var COMPARATOR = R++ +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$' + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++ +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')' + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g') +var comparatorTrimReplace = '$1$2$3' + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++ +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$' + +var HYPHENRANGELOOSE = R++ +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$' + +// Star ranges basically just allow anything at all. +var STAR = R++ +src[STAR] = '(<|>)?=?\\s*\\*' + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]) + if (!re[i]) { + re[i] = new RegExp(src[i]) + } +} + +exports.parse = parse +function parse (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + if (version.length > MAX_LENGTH) { + return null + } + + var r = options.loose ? re[LOOSE] : re[FULL] + if (!r.test(version)) { + return null + } + + try { + return new SemVer(version, options) + } catch (er) { + return null + } +} + +exports.valid = valid +function valid (version, options) { + var v = parse(version, options) + return v ? v.version : null +} + +exports.clean = clean +function clean (version, options) { + var s = parse(version.trim().replace(/^[=v]+/, ''), options) + return s ? s.version : null +} + +exports.SemVer = SemVer + +function SemVer (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + if (version instanceof SemVer) { + if (version.loose === options.loose) { + return version + } else { + version = version.version + } + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version) + } + + if (version.length > MAX_LENGTH) { + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + } + + if (!(this instanceof SemVer)) { + return new SemVer(version, options) + } + + debug('SemVer', version, options) + this.options = options + this.loose = !!options.loose + + var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]) + + if (!m) { + throw new TypeError('Invalid Version: ' + version) + } + + this.raw = version + + // these are actually numbers + this.major = +m[1] + this.minor = +m[2] + this.patch = +m[3] + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) { + throw new TypeError('Invalid major version') + } + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { + throw new TypeError('Invalid minor version') + } + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { + throw new TypeError('Invalid patch version') + } + + // numberify any prerelease numeric ids + if (!m[4]) { + this.prerelease = [] + } else { + this.prerelease = m[4].split('.').map(function (id) { + if (/^[0-9]+$/.test(id)) { + var num = +id + if (num >= 0 && num < MAX_SAFE_INTEGER) { + return num } - }, + } + return id + }) + } -// alias for begin(condition) -pushState:function pushState(condition) { - this.begin(condition); - }, + this.build = m[5] ? m[5].split('.') : [] + this.format() +} -// return the number of states currently on the stack -stateStackSize:function stateStackSize() { - return this.conditionStack.length; - }, -options: {}, -performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { -var YYSTATE=YY_START; -switch($avoiding_name_collisions) { -case 0:return 5 -break; -case 1:/* skip whitespace */ -break; -case 2:return 8 -break; -case 3:return 16 -break; -case 4:return 17 -break; -case 5:return 11 -break; -case 6:return 10 -break; -case 7:return 9 -break; -case 8:return 14 -break; -case 9:return 15 -break; -case 10:return 12 -break; -case 11:return 7 -break; -case 12:return 7 -break; -case 13:return 7 -break; -case 14:return 7 -break; -case 15:return 7 -break; -case 16:return 7 -break; -case 17:return 7 -break; -case 18:return 7 -break; -case 19:return 7 -break; -case 20:return 7 -break; -case 21:return 7 -break; -case 22:return 7 -break; -case 23:return 7 -break; -case 24:return 13 -break; -case 25:return 13 -break; -case 26:return 13 -break; -case 27:return 13 -break; -case 28:return 13 -break; -case 29:return 13 -break; -case 30:return 13 -break; -case 31:return 13 -break; -case 32:return 7 -break; -case 33:return 13 -break; -case 34:return 7 -break; -case 35:return 13 -break; -case 36:return 7 -break; -case 37:return 13 -break; -case 38:return 13 -break; +SemVer.prototype.format = function () { + this.version = this.major + '.' + this.minor + '.' + this.patch + if (this.prerelease.length) { + this.version += '-' + this.prerelease.join('.') + } + return this.version +} + +SemVer.prototype.toString = function () { + return this.version +} + +SemVer.prototype.compare = function (other) { + debug('SemVer.compare', this.version, this.options, other) + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return this.compareMain(other) || this.comparePre(other) +} + +SemVer.prototype.compareMain = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch) +} + +SemVer.prototype.comparePre = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) { + return -1 + } else if (!this.prerelease.length && other.prerelease.length) { + return 1 + } else if (!this.prerelease.length && !other.prerelease.length) { + return 0 + } + + var i = 0 + do { + var a = this.prerelease[i] + var b = other.prerelease[i] + debug('prerelease compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) +} + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function (release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0 + this.patch = 0 + this.minor = 0 + this.major++ + this.inc('pre', identifier) + break + case 'preminor': + this.prerelease.length = 0 + this.patch = 0 + this.minor++ + this.inc('pre', identifier) + break + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0 + this.inc('patch', identifier) + this.inc('pre', identifier) + break + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) { + this.inc('patch', identifier) + } + this.inc('pre', identifier) + break + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || + this.patch !== 0 || + this.prerelease.length === 0) { + this.major++ + } + this.minor = 0 + this.patch = 0 + this.prerelease = [] + break + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) { + this.minor++ + } + this.patch = 0 + this.prerelease = [] + break + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) { + this.patch++ + } + this.prerelease = [] + break + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) { + this.prerelease = [0] + } else { + var i = this.prerelease.length + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++ + i = -2 + } + } + if (i === -1) { + // didn't increment anything + this.prerelease.push(0) + } + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) { + this.prerelease = [identifier, 0] + } + } else { + this.prerelease = [identifier, 0] + } + } + break + + default: + throw new Error('invalid increment argument: ' + release) + } + this.format() + this.raw = this.version + return this +} + +exports.inc = inc +function inc (version, release, loose, identifier) { + if (typeof (loose) === 'string') { + identifier = loose + loose = undefined + } + + try { + return new SemVer(version, loose).inc(release, identifier).version + } catch (er) { + return null + } +} + +exports.diff = diff +function diff (version1, version2) { + if (eq(version1, version2)) { + return null + } else { + var v1 = parse(version1) + var v2 = parse(version2) + var prefix = '' + if (v1.prerelease.length || v2.prerelease.length) { + prefix = 'pre' + var defaultResult = 'prerelease' + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return prefix + key + } + } + } + return defaultResult // may be undefined + } +} + +exports.compareIdentifiers = compareIdentifiers + +var numeric = /^[0-9]+$/ +function compareIdentifiers (a, b) { + var anum = numeric.test(a) + var bnum = numeric.test(b) + + if (anum && bnum) { + a = +a + b = +b + } + + return a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 +} + +exports.rcompareIdentifiers = rcompareIdentifiers +function rcompareIdentifiers (a, b) { + return compareIdentifiers(b, a) +} + +exports.major = major +function major (a, loose) { + return new SemVer(a, loose).major +} + +exports.minor = minor +function minor (a, loose) { + return new SemVer(a, loose).minor +} + +exports.patch = patch +function patch (a, loose) { + return new SemVer(a, loose).patch +} + +exports.compare = compare +function compare (a, b, loose) { + return new SemVer(a, loose).compare(new SemVer(b, loose)) +} + +exports.compareLoose = compareLoose +function compareLoose (a, b) { + return compare(a, b, true) +} + +exports.rcompare = rcompare +function rcompare (a, b, loose) { + return compare(b, a, loose) +} + +exports.sort = sort +function sort (list, loose) { + return list.sort(function (a, b) { + return exports.compare(a, b, loose) + }) +} + +exports.rsort = rsort +function rsort (list, loose) { + return list.sort(function (a, b) { + return exports.rcompare(a, b, loose) + }) +} + +exports.gt = gt +function gt (a, b, loose) { + return compare(a, b, loose) > 0 +} + +exports.lt = lt +function lt (a, b, loose) { + return compare(a, b, loose) < 0 +} + +exports.eq = eq +function eq (a, b, loose) { + return compare(a, b, loose) === 0 +} + +exports.neq = neq +function neq (a, b, loose) { + return compare(a, b, loose) !== 0 +} + +exports.gte = gte +function gte (a, b, loose) { + return compare(a, b, loose) >= 0 +} + +exports.lte = lte +function lte (a, b, loose) { + return compare(a, b, loose) <= 0 +} + +exports.cmp = cmp +function cmp (a, op, b, loose) { + switch (op) { + case '===': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a === b + + case '!==': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError('Invalid operator: ' + op) + } +} + +exports.Comparator = Comparator +function Comparator (comp, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value + } + } + + if (!(this instanceof Comparator)) { + return new Comparator(comp, options) + } + + debug('comparator', comp, options) + this.options = options + this.loose = !!options.loose + this.parse(comp) + + if (this.semver === ANY) { + this.value = '' + } else { + this.value = this.operator + this.semver.version + } + + debug('comp', this) +} + +var ANY = {} +Comparator.prototype.parse = function (comp) { + var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var m = comp.match(r) + + if (!m) { + throw new TypeError('Invalid comparator: ' + comp) + } + + this.operator = m[1] + if (this.operator === '=') { + this.operator = '' + } + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) { + this.semver = ANY + } else { + this.semver = new SemVer(m[2], this.options.loose) + } +} + +Comparator.prototype.toString = function () { + return this.value +} + +Comparator.prototype.test = function (version) { + debug('Comparator.test', version, this.options.loose) + + if (this.semver === ANY) { + return true + } + + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } + + return cmp(version, this.operator, this.semver, this.options) +} + +Comparator.prototype.intersects = function (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } + + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + var rangeTmp + + if (this.operator === '') { + rangeTmp = new Range(comp.value, options) + return satisfies(this.value, rangeTmp, options) + } else if (comp.operator === '') { + rangeTmp = new Range(this.value, options) + return satisfies(comp.semver, rangeTmp, options) + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>') + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<') + var sameSemVer = this.semver.version === comp.semver.version + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<=') + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, options) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')) + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, options) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')) + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan +} + +exports.Range = Range +function Range (range, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (range instanceof Range) { + if (range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease) { + return range + } else { + return new Range(range.raw, options) + } + } + + if (range instanceof Comparator) { + return new Range(range.value, options) + } + + if (!(this instanceof Range)) { + return new Range(range, options) + } + + this.options = options + this.loose = !!options.loose + this.includePrerelease = !!options.includePrerelease + + // First, split based on boolean or || + this.raw = range + this.set = range.split(/\s*\|\|\s*/).map(function (range) { + return this.parseRange(range.trim()) + }, this).filter(function (c) { + // throw out any that are not relevant for whatever reason + return c.length + }) + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range) + } + + this.format() +} + +Range.prototype.format = function () { + this.range = this.set.map(function (comps) { + return comps.join(' ').trim() + }).join('||').trim() + return this.range +} + +Range.prototype.toString = function () { + return this.range +} + +Range.prototype.parseRange = function (range) { + var loose = this.options.loose + range = range.trim() + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE] + range = range.replace(hr, hyphenReplace) + debug('hyphen replace', range) + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace) + debug('comparator trim', range, re[COMPARATORTRIM]) + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace) + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace) + + // normalize spaces + range = range.split(/\s+/).join(' ') + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var set = range.split(' ').map(function (comp) { + return parseComparator(comp, this.options) + }, this).join(' ').split(/\s+/) + if (this.options.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function (comp) { + return !!comp.match(compRe) + }) + } + set = set.map(function (comp) { + return new Comparator(comp, this.options) + }, this) + + return set +} + +Range.prototype.intersects = function (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') + } + + return this.set.some(function (thisComparators) { + return thisComparators.every(function (thisComparator) { + return range.set.some(function (rangeComparators) { + return rangeComparators.every(function (rangeComparator) { + return thisComparator.intersects(rangeComparator, options) + }) + }) + }) + }) +} + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators +function toComparators (range, options) { + return new Range(range, options).set.map(function (comp) { + return comp.map(function (c) { + return c.value + }).join(' ').trim().split(' ') + }) +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator (comp, options) { + debug('comp', comp, options) + comp = replaceCarets(comp, options) + debug('caret', comp) + comp = replaceTildes(comp, options) + debug('tildes', comp) + comp = replaceXRanges(comp, options) + debug('xrange', comp) + comp = replaceStars(comp, options) + debug('stars', comp) + return comp +} + +function isX (id) { + return !id || id.toLowerCase() === 'x' || id === '*' +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceTilde(comp, options) + }).join(' ') +} + +function replaceTilde (comp, options) { + var r = options.loose ? re[TILDELOOSE] : re[TILDE] + return comp.replace(r, function (_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else if (pr) { + debug('replaceTilde pr', pr) + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } else { + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' + } + + debug('tilde return', ret) + return ret + }) +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceCaret(comp, options) + }).join(' ') +} + +function replaceCaret (comp, options) { + debug('caret', comp, options) + var r = options.loose ? re[CARETLOOSE] : re[CARET] + return comp.replace(r, function (_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + if (M === '0') { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else { + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' + } + } else if (pr) { + debug('replaceCaret pr', pr) + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + (+M + 1) + '.0.0' + } + } else { + debug('no pr') + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0' + } + } + + debug('caret return', ret) + return ret + }) +} + +function replaceXRanges (comp, options) { + debug('replaceXRanges', comp, options) + return comp.split(/\s+/).map(function (comp) { + return replaceXRange(comp, options) + }).join(' ') +} + +function replaceXRange (comp, options) { + comp = comp.trim() + var r = options.loose ? re[XRANGELOOSE] : re[XRANGE] + return comp.replace(r, function (ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr) + var xM = isX(M) + var xm = xM || isX(m) + var xp = xm || isX(p) + var anyX = xp + + if (gtlt === '=' && anyX) { + gtlt = '' + } + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0' + } else { + // nothing is forbidden + ret = '*' + } + } else if (gtlt && anyX) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0 + } + p = 0 + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>=' + if (xm) { + M = +M + 1 + m = 0 + p = 0 + } else { + m = +m + 1 + p = 0 + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<' + if (xm) { + M = +M + 1 + } else { + m = +m + 1 + } + } + + ret = gtlt + M + '.' + m + '.' + p + } else if (xm) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (xp) { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } + + debug('xRange return', ret) + + return ret + }) +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars (comp, options) { + debug('replaceStars', comp, options) + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], '') +} + +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace ($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + if (isX(fM)) { + from = '' + } else if (isX(fm)) { + from = '>=' + fM + '.0.0' + } else if (isX(fp)) { + from = '>=' + fM + '.' + fm + '.0' + } else { + from = '>=' + from + } + + if (isX(tM)) { + to = '' + } else if (isX(tm)) { + to = '<' + (+tM + 1) + '.0.0' + } else if (isX(tp)) { + to = '<' + tM + '.' + (+tm + 1) + '.0' + } else if (tpr) { + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr + } else { + to = '<=' + to + } + + return (from + ' ' + to).trim() +} + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function (version) { + if (!version) { + return false + } + + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } + + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true + } + } + return false +} + +function testSet (set, version, options) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false + } + } + + if (version.prerelease.length && !options.includePrerelease) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (i = 0; i < set.length; i++) { + debug(set[i].semver) + if (set[i].semver === ANY) { + continue + } + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) { + return true + } + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false + } + + return true +} + +exports.satisfies = satisfies +function satisfies (version, range, options) { + try { + range = new Range(range, options) + } catch (er) { + return false + } + return range.test(version) +} + +exports.maxSatisfying = maxSatisfying +function maxSatisfying (versions, range, options) { + var max = null + var maxSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v + maxSV = new SemVer(max, options) + } + } + }) + return max +} + +exports.minSatisfying = minSatisfying +function minSatisfying (versions, range, options) { + var min = null + var minSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v + minSV = new SemVer(min, options) + } + } + }) + return min +} + +exports.minVersion = minVersion +function minVersion (range, loose) { + range = new Range(range, loose) + + var minver = new SemVer('0.0.0') + if (range.test(minver)) { + return minver + } + + minver = new SemVer('0.0.0-0') + if (range.test(minver)) { + return minver + } + + minver = null + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] + + comparators.forEach(function (comparator) { + // Clone to avoid manipulating the comparator's semver object. + var compver = new SemVer(comparator.semver.version) + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++ + } else { + compver.prerelease.push(0) + } + compver.raw = compver.format() + /* fallthrough */ + case '': + case '>=': + if (!minver || gt(minver, compver)) { + minver = compver + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error('Unexpected operation: ' + comparator.operator) + } + }) + } + + if (minver && range.test(minver)) { + return minver + } + + return null +} + +exports.validRange = validRange +function validRange (range, options) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null + } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr +function ltr (version, range, options) { + return outside(version, range, '<', options) +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr +function gtr (version, range, options) { + return outside(version, range, '>', options) +} + +exports.outside = outside +function outside (version, range, hilo, options) { + version = new SemVer(version, options) + range = new Range(range, options) + + var gtfn, ltefn, ltfn, comp, ecomp + switch (hilo) { + case '>': + gtfn = gt + ltefn = lte + ltfn = lt + comp = '>' + ecomp = '>=' + break + case '<': + gtfn = lt + ltefn = gte + ltfn = gt + comp = '<' + ecomp = '<=' + break + default: + throw new TypeError('Must provide a hilo val of "<" or ">"') + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, options)) { + return false + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] + + var high = null + var low = null + + comparators.forEach(function (comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator + low = low || comparator + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator + } else if (ltfn(comparator.semver, low.semver, options)) { + low = comparator + } + }) + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false + } + } + return true +} + +exports.prerelease = prerelease +function prerelease (version, options) { + var parsed = parse(version, options) + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null +} + +exports.intersects = intersects +function intersects (r1, r2, options) { + r1 = new Range(r1, options) + r2 = new Range(r2, options) + return r1.intersects(r2) +} + +exports.coerce = coerce +function coerce (version) { + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + var match = version.match(re[COERCE]) + + if (match == null) { + return null + } + + return parse(match[1] + + '.' + (match[2] || '0') + + '.' + (match[3] || '0')) +} + + +/***/ }), +/* 190 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(191); +var correct = __webpack_require__(193); + +var genericWarning = ( + 'license should be ' + + 'a valid SPDX license expression (without "LicenseRef"), ' + + '"UNLICENSED", or ' + + '"SEE LICENSE IN "' +); + +var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/; + +function startsWith(prefix, string) { + return string.slice(0, prefix.length) === prefix; +} + +function usesLicenseRef(ast) { + if (ast.hasOwnProperty('license')) { + var license = ast.license; + return ( + startsWith('LicenseRef', license) || + startsWith('DocumentRef', license) + ); + } else { + return ( + usesLicenseRef(ast.left) || + usesLicenseRef(ast.right) + ); + } +} + +module.exports = function(argument) { + var ast; + + try { + ast = parse(argument); + } catch (e) { + var match + if ( + argument === 'UNLICENSED' || + argument === 'UNLICENCED' + ) { + return { + validForOldPackages: true, + validForNewPackages: true, + unlicensed: true + }; + } else if (match = fileReferenceRE.exec(argument)) { + return { + validForOldPackages: true, + validForNewPackages: true, + inFile: match[1] + }; + } else { + var result = { + validForOldPackages: false, + validForNewPackages: false, + warnings: [genericWarning] + }; + var corrected = correct(argument); + if (corrected) { + result.warnings.push( + 'license is similar to the valid expression "' + corrected + '"' + ); + } + return result; + } + } + + if (usesLicenseRef(ast)) { + return { + validForNewPackages: false, + validForOldPackages: false, + spdx: true, + warnings: [genericWarning] + }; + } else { + return { + validForNewPackages: true, + validForOldPackages: true, + spdx: true + }; + } +}; + + +/***/ }), +/* 191 */ +/***/ (function(module, exports, __webpack_require__) { + +var parser = __webpack_require__(192).parser + +module.exports = function (argument) { + return parser.parse(argument) +} + + +/***/ }), +/* 192 */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(module) {/* parser generated by jison 0.4.17 */ +/* + Returns a Parser object of the following structure: + + Parser: { + yy: {} + } + + Parser.prototype: { + yy: {}, + trace: function(), + symbols_: {associative list: name ==> number}, + terminals_: {associative list: number ==> name}, + productions_: [...], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), + table: [...], + defaultActions: {...}, + parseError: function(str, hash), + parse: function(input), + + lexer: { + EOF: 1, + parseError: function(str, hash), + setInput: function(input), + input: function(), + unput: function(str), + more: function(), + less: function(n), + pastInput: function(), + upcomingInput: function(), + showPosition: function(), + test_match: function(regex_match_array, rule_index), + next: function(), + lex: function(), + begin: function(condition), + popState: function(), + _currentRules: function(), + topState: function(), + pushState: function(condition), + + options: { + ranges: boolean (optional: true ==> token location info will include a .range[] member) + flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) + backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) + }, + + performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), + rules: [...], + conditions: {associative list: name ==> set}, + } + } + + + token location info (@$, _$, etc.): { + first_line: n, + last_line: n, + first_column: n, + last_column: n, + range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) + } + + + the parseError function receives a 'hash' object with these members for lexer and parser errors: { + text: (matched text) + token: (the produced terminal token, if any) + line: (yylineno) + } + while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { + loc: (yylloc) + expected: (string describing the set of expected tokens) + recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) + } +*/ +var spdxparse = (function(){ +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,5],$V1=[1,6],$V2=[1,7],$V3=[1,4],$V4=[1,9],$V5=[1,10],$V6=[5,14,15,17],$V7=[5,12,14,15,17]; +var parser = {trace: function trace() { }, +yy: {}, +symbols_: {"error":2,"start":3,"expression":4,"EOS":5,"simpleExpression":6,"LICENSE":7,"PLUS":8,"LICENSEREF":9,"DOCUMENTREF":10,"COLON":11,"WITH":12,"EXCEPTION":13,"AND":14,"OR":15,"OPEN":16,"CLOSE":17,"$accept":0,"$end":1}, +terminals_: {2:"error",5:"EOS",7:"LICENSE",8:"PLUS",9:"LICENSEREF",10:"DOCUMENTREF",11:"COLON",12:"WITH",13:"EXCEPTION",14:"AND",15:"OR",16:"OPEN",17:"CLOSE"}, +productions_: [0,[3,2],[6,1],[6,2],[6,1],[6,3],[4,1],[4,3],[4,3],[4,3],[4,3]], +performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { +/* this == yyval */ + +var $0 = $$.length - 1; +switch (yystate) { +case 1: +return this.$ = $$[$0-1] +break; +case 2: case 4: case 5: +this.$ = {license: yytext} +break; +case 3: +this.$ = {license: $$[$0-1], plus: true} +break; +case 6: +this.$ = $$[$0] +break; +case 7: +this.$ = {exception: $$[$0]} +this.$.license = $$[$0-2].license +if ($$[$0-2].hasOwnProperty('plus')) { + this.$.plus = $$[$0-2].plus +} +break; +case 8: +this.$ = {conjunction: 'and', left: $$[$0-2], right: $$[$0]} +break; +case 9: +this.$ = {conjunction: 'or', left: $$[$0-2], right: $$[$0]} +break; +case 10: +this.$ = $$[$0-1] +break; +} +}, +table: [{3:1,4:2,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{1:[3]},{5:[1,8],14:$V4,15:$V5},o($V6,[2,6],{12:[1,11]}),{4:12,6:3,7:$V0,9:$V1,10:$V2,16:$V3},o($V7,[2,2],{8:[1,13]}),o($V7,[2,4]),{11:[1,14]},{1:[2,1]},{4:15,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{4:16,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{13:[1,17]},{14:$V4,15:$V5,17:[1,18]},o($V7,[2,3]),{9:[1,19]},o($V6,[2,8]),o([5,15,17],[2,9],{14:$V4}),o($V6,[2,7]),o($V6,[2,10]),o($V7,[2,5])], +defaultActions: {8:[2,1]}, +parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + function _parseError (msg, hash) { + this.message = msg; + this.hash = hash; + } + _parseError.prototype = Error; + + throw new _parseError(str, hash); + } +}, +parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer; + sharedState.yy.parser = this; + if (typeof lexer.yylloc == 'undefined') { + lexer.yylloc = {}; + } + var yyloc = lexer.yylloc; + lstack.push(yyloc); + var ranges = lexer.options && lexer.options.ranges; + if (typeof sharedState.yy.parseError === 'function') { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + _token_stack: + var lex = function () { + var token; + token = lexer.lex() || EOF; + if (typeof token !== 'number') { + token = self.symbols_[token] || token; + } + return token; + }; + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == 'undefined') { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === 'undefined' || !action.length || !action[0]) { + var errStr = ''; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push('\'' + this.terminals_[p] + '\''); + } + } + if (lexer.showPosition) { + errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; + } else { + errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); + } + this.parseError(errStr, { + text: lexer.match, + token: this.terminals_[symbol] || symbol, + line: lexer.yylineno, + loc: yyloc, + expected: expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer.yytext); + lstack.push(lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer.yyleng; + yytext = lexer.yytext; + yylineno = lexer.yylineno; + yyloc = lexer.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== 'undefined') { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; +}}; +/* generated by jison-lex 0.3.4 */ +var lexer = (function(){ +var lexer = ({ + +EOF:1, + +parseError:function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + +// resets the lexer, sets new input +setInput:function (input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0,0]; + } + this.offset = 0; + return this; + }, + +// consumes and returns one char from the input +input:function () { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + + this._input = this._input.slice(1); + return ch; + }, + +// unshifts one char (or a string) into the input +unput:function (ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? + (lines.length === oldLines.length ? this.yylloc.first_column : 0) + + oldLines[oldLines.length - lines.length].length - lines[0].length : + this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + +// When called from action, caches matched text and appends it on next action +more:function () { + this._more = true; + return this; + }, + +// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. +reject:function () { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + + } + return this; + }, + +// retain first n characters of the match +less:function (n) { + this.unput(this.match.slice(n)); + }, + +// displays already matched input, i.e. for error messages +pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, + +// displays upcoming input, i.e. for error messages +upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); + }, + +// displays the character position where the lexing error occurred, i.e. for error messages +showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + +// test the lexed token: return FALSE when not a match, otherwise return token +test_match:function (match, indexed_rule) { + var token, + lines, + backup; + + if (this.options.backtrack_lexer) { + // save context + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? + lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : + this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + // recover context + for (var k in backup) { + this[k] = backup[k]; + } + return false; // rule action called reject() implying the next rule should be tested instead. + } + return false; + }, + +// return next match in input +next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + + var token, + match, + tempMatch, + index; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; // rule action called reject() implying a rule MISmatch. + } else { + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + +// return next match that has a token +lex:function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + +// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) +begin:function begin(condition) { + this.conditionStack.push(condition); + }, + +// pop the previously active lexer condition state off the condition stack +popState:function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + +// produce the lexer rule set which is active for the currently active lexer condition state +_currentRules:function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + +// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available +topState:function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + +// alias for begin(condition) +pushState:function pushState(condition) { + this.begin(condition); + }, + +// return the number of states currently on the stack +stateStackSize:function stateStackSize() { + return this.conditionStack.length; + }, +options: {}, +performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { +var YYSTATE=YY_START; +switch($avoiding_name_collisions) { +case 0:return 5 +break; +case 1:/* skip whitespace */ +break; +case 2:return 8 +break; +case 3:return 16 +break; +case 4:return 17 +break; +case 5:return 11 +break; +case 6:return 10 +break; +case 7:return 9 +break; +case 8:return 14 +break; +case 9:return 15 +break; +case 10:return 12 +break; +case 11:return 7 +break; +case 12:return 7 +break; +case 13:return 7 +break; +case 14:return 7 +break; +case 15:return 7 +break; +case 16:return 7 +break; +case 17:return 7 +break; +case 18:return 7 +break; +case 19:return 7 +break; +case 20:return 7 +break; +case 21:return 7 +break; +case 22:return 7 +break; +case 23:return 7 +break; +case 24:return 13 +break; +case 25:return 13 +break; +case 26:return 13 +break; +case 27:return 13 +break; +case 28:return 13 +break; +case 29:return 13 +break; +case 30:return 13 +break; +case 31:return 13 +break; +case 32:return 7 +break; +case 33:return 13 +break; +case 34:return 7 +break; +case 35:return 13 +break; +case 36:return 7 +break; +case 37:return 13 +break; +case 38:return 13 +break; case 39:return 7 break; case 40:return 13 @@ -19627,4372 +20900,6162 @@ break; case 364:return 7 break; } -}, -rules: [/^(?:$)/,/^(?:\s+)/,/^(?:\+)/,/^(?:\()/,/^(?:\))/,/^(?::)/,/^(?:DocumentRef-([0-9A-Za-z-+.]+))/,/^(?:LicenseRef-([0-9A-Za-z-+.]+))/,/^(?:AND)/,/^(?:OR)/,/^(?:WITH)/,/^(?:BSD-3-Clause-No-Nuclear-License-2014)/,/^(?:BSD-3-Clause-No-Nuclear-Warranty)/,/^(?:GPL-2\.0-with-classpath-exception)/,/^(?:GPL-3\.0-with-autoconf-exception)/,/^(?:GPL-2\.0-with-autoconf-exception)/,/^(?:BSD-3-Clause-No-Nuclear-License)/,/^(?:MPL-2\.0-no-copyleft-exception)/,/^(?:GPL-2\.0-with-bison-exception)/,/^(?:GPL-2\.0-with-font-exception)/,/^(?:GPL-2\.0-with-GCC-exception)/,/^(?:CNRI-Python-GPL-Compatible)/,/^(?:GPL-3\.0-with-GCC-exception)/,/^(?:BSD-3-Clause-Attribution)/,/^(?:Classpath-exception-2\.0)/,/^(?:WxWindows-exception-3\.1)/,/^(?:freertos-exception-2\.0)/,/^(?:Autoconf-exception-3\.0)/,/^(?:i2p-gpl-java-exception)/,/^(?:gnu-javamail-exception)/,/^(?:Nokia-Qt-exception-1\.1)/,/^(?:Autoconf-exception-2\.0)/,/^(?:BSD-2-Clause-FreeBSD)/,/^(?:u-boot-exception-2\.0)/,/^(?:zlib-acknowledgement)/,/^(?:Bison-exception-2\.2)/,/^(?:BSD-2-Clause-NetBSD)/,/^(?:CLISP-exception-2\.0)/,/^(?:eCos-exception-2\.0)/,/^(?:BSD-3-Clause-Clear)/,/^(?:Font-exception-2\.0)/,/^(?:FLTK-exception-2\.0)/,/^(?:GCC-exception-2\.0)/,/^(?:Qwt-exception-1\.0)/,/^(?:Libtool-exception)/,/^(?:BSD-3-Clause-LBNL)/,/^(?:GCC-exception-3\.1)/,/^(?:Artistic-1\.0-Perl)/,/^(?:Artistic-1\.0-cl8)/,/^(?:CC-BY-NC-SA-2\.5)/,/^(?:MIT-advertising)/,/^(?:BSD-Source-Code)/,/^(?:CC-BY-NC-SA-4\.0)/,/^(?:LiLiQ-Rplus-1\.1)/,/^(?:CC-BY-NC-SA-3\.0)/,/^(?:BSD-4-Clause-UC)/,/^(?:CC-BY-NC-SA-2\.0)/,/^(?:CC-BY-NC-SA-1\.0)/,/^(?:CC-BY-NC-ND-4\.0)/,/^(?:CC-BY-NC-ND-3\.0)/,/^(?:CC-BY-NC-ND-2\.5)/,/^(?:CC-BY-NC-ND-2\.0)/,/^(?:CC-BY-NC-ND-1\.0)/,/^(?:LZMA-exception)/,/^(?:BitTorrent-1\.1)/,/^(?:CrystalStacker)/,/^(?:FLTK-exception)/,/^(?:SugarCRM-1\.1\.3)/,/^(?:BSD-Protection)/,/^(?:BitTorrent-1\.0)/,/^(?:HaskellReport)/,/^(?:Interbase-1\.0)/,/^(?:StandardML-NJ)/,/^(?:mif-exception)/,/^(?:Frameworx-1\.0)/,/^(?:389-exception)/,/^(?:CC-BY-NC-2\.0)/,/^(?:CC-BY-NC-2\.5)/,/^(?:CC-BY-NC-3\.0)/,/^(?:CC-BY-NC-4\.0)/,/^(?:W3C-19980720)/,/^(?:CC-BY-SA-1\.0)/,/^(?:CC-BY-SA-2\.0)/,/^(?:CC-BY-SA-2\.5)/,/^(?:CC-BY-ND-2\.0)/,/^(?:CC-BY-SA-4\.0)/,/^(?:CC-BY-SA-3\.0)/,/^(?:Artistic-1\.0)/,/^(?:Artistic-2\.0)/,/^(?:CC-BY-ND-2\.5)/,/^(?:CC-BY-ND-3\.0)/,/^(?:CC-BY-ND-4\.0)/,/^(?:CC-BY-ND-1\.0)/,/^(?:BSD-4-Clause)/,/^(?:BSD-3-Clause)/,/^(?:BSD-2-Clause)/,/^(?:CC-BY-NC-1\.0)/,/^(?:bzip2-1\.0\.6)/,/^(?:Unicode-TOU)/,/^(?:CNRI-Jython)/,/^(?:ImageMagick)/,/^(?:Adobe-Glyph)/,/^(?:CUA-OPL-1\.0)/,/^(?:OLDAP-2\.2\.2)/,/^(?:LiLiQ-R-1\.1)/,/^(?:bzip2-1\.0\.5)/,/^(?:LiLiQ-P-1\.1)/,/^(?:OLDAP-2\.0\.1)/,/^(?:OLDAP-2\.2\.1)/,/^(?:CNRI-Python)/,/^(?:XFree86-1\.1)/,/^(?:OSET-PL-2\.1)/,/^(?:Apache-2\.0)/,/^(?:Watcom-1\.0)/,/^(?:PostgreSQL)/,/^(?:Python-2\.0)/,/^(?:RHeCos-1\.1)/,/^(?:EUDatagrid)/,/^(?:Spencer-99)/,/^(?:Intel-ACPI)/,/^(?:CECILL-1\.0)/,/^(?:CECILL-1\.1)/,/^(?:JasPer-2\.0)/,/^(?:CECILL-2\.0)/,/^(?:CECILL-2\.1)/,/^(?:gSOAP-1\.3b)/,/^(?:Spencer-94)/,/^(?:Apache-1\.1)/,/^(?:Spencer-86)/,/^(?:Apache-1\.0)/,/^(?:ClArtistic)/,/^(?:TORQUE-1\.1)/,/^(?:CATOSL-1\.1)/,/^(?:Adobe-2006)/,/^(?:Zimbra-1\.4)/,/^(?:Zimbra-1\.3)/,/^(?:Condor-1\.1)/,/^(?:CC-BY-3\.0)/,/^(?:CC-BY-2\.5)/,/^(?:OLDAP-2\.4)/,/^(?:SGI-B-1\.1)/,/^(?:SISSL-1\.2)/,/^(?:SGI-B-1\.0)/,/^(?:OLDAP-2\.3)/,/^(?:CC-BY-4\.0)/,/^(?:Crossword)/,/^(?:SimPL-2\.0)/,/^(?:OLDAP-2\.2)/,/^(?:OLDAP-2\.1)/,/^(?:ErlPL-1\.1)/,/^(?:LPPL-1\.3a)/,/^(?:LPPL-1\.3c)/,/^(?:OLDAP-2\.0)/,/^(?:Leptonica)/,/^(?:CPOL-1\.02)/,/^(?:OLDAP-1\.4)/,/^(?:OLDAP-1\.3)/,/^(?:CC-BY-2\.0)/,/^(?:Unlicense)/,/^(?:OLDAP-2\.8)/,/^(?:OLDAP-1\.2)/,/^(?:MakeIndex)/,/^(?:OLDAP-2\.7)/,/^(?:OLDAP-1\.1)/,/^(?:Sleepycat)/,/^(?:D-FSL-1\.0)/,/^(?:CC-BY-1\.0)/,/^(?:OLDAP-2\.6)/,/^(?:WXwindows)/,/^(?:NPOSL-3\.0)/,/^(?:FreeImage)/,/^(?:SGI-B-2\.0)/,/^(?:OLDAP-2\.5)/,/^(?:Beerware)/,/^(?:Newsletr)/,/^(?:NBPL-1\.0)/,/^(?:NASA-1\.3)/,/^(?:NLOD-1\.0)/,/^(?:AGPL-1\.0)/,/^(?:OCLC-2\.0)/,/^(?:ODbL-1\.0)/,/^(?:PDDL-1\.0)/,/^(?:Motosoto)/,/^(?:Afmparse)/,/^(?:ANTLR-PD)/,/^(?:LPL-1\.02)/,/^(?:Abstyles)/,/^(?:eCos-2\.0)/,/^(?:APSL-1\.0)/,/^(?:LPPL-1\.2)/,/^(?:LPPL-1\.1)/,/^(?:LPPL-1\.0)/,/^(?:APSL-1\.1)/,/^(?:APSL-2\.0)/,/^(?:Info-ZIP)/,/^(?:Zend-2\.0)/,/^(?:IBM-pibs)/,/^(?:LGPL-2\.0)/,/^(?:LGPL-3\.0)/,/^(?:LGPL-2\.1)/,/^(?:GFDL-1\.3)/,/^(?:PHP-3\.01)/,/^(?:GFDL-1\.2)/,/^(?:GFDL-1\.1)/,/^(?:AGPL-3\.0)/,/^(?:Giftware)/,/^(?:EUPL-1\.1)/,/^(?:RPSL-1\.0)/,/^(?:EUPL-1\.0)/,/^(?:MIT-enna)/,/^(?:CECILL-B)/,/^(?:diffmark)/,/^(?:CECILL-C)/,/^(?:CDDL-1\.0)/,/^(?:Sendmail)/,/^(?:CDDL-1\.1)/,/^(?:CPAL-1\.0)/,/^(?:APSL-1\.2)/,/^(?:NPL-1\.1)/,/^(?:AFL-1\.2)/,/^(?:Caldera)/,/^(?:AFL-2\.0)/,/^(?:FSFULLR)/,/^(?:AFL-2\.1)/,/^(?:VSL-1\.0)/,/^(?:VOSTROM)/,/^(?:UPL-1\.0)/,/^(?:Dotseqn)/,/^(?:CPL-1\.0)/,/^(?:dvipdfm)/,/^(?:EPL-1\.0)/,/^(?:OCCT-PL)/,/^(?:ECL-1\.0)/,/^(?:Latex2e)/,/^(?:ECL-2\.0)/,/^(?:GPL-1\.0)/,/^(?:GPL-2\.0)/,/^(?:GPL-3\.0)/,/^(?:AFL-3\.0)/,/^(?:LAL-1\.2)/,/^(?:LAL-1\.3)/,/^(?:EFL-1\.0)/,/^(?:EFL-2\.0)/,/^(?:gnuplot)/,/^(?:Aladdin)/,/^(?:LPL-1\.0)/,/^(?:libtiff)/,/^(?:Entessa)/,/^(?:AMDPLPA)/,/^(?:IPL-1\.0)/,/^(?:OPL-1\.0)/,/^(?:OSL-1\.0)/,/^(?:OSL-1\.1)/,/^(?:OSL-2\.0)/,/^(?:OSL-2\.1)/,/^(?:OSL-3\.0)/,/^(?:OpenSSL)/,/^(?:ZPL-2\.1)/,/^(?:PHP-3\.0)/,/^(?:ZPL-2\.0)/,/^(?:ZPL-1\.1)/,/^(?:CC0-1\.0)/,/^(?:SPL-1\.0)/,/^(?:psutils)/,/^(?:MPL-1\.0)/,/^(?:QPL-1\.0)/,/^(?:MPL-1\.1)/,/^(?:MPL-2\.0)/,/^(?:APL-1\.0)/,/^(?:RPL-1\.1)/,/^(?:RPL-1\.5)/,/^(?:MIT-CMU)/,/^(?:Multics)/,/^(?:Eurosym)/,/^(?:BSL-1\.0)/,/^(?:MIT-feh)/,/^(?:Saxpath)/,/^(?:Borceux)/,/^(?:OFL-1\.1)/,/^(?:OFL-1\.0)/,/^(?:AFL-1\.1)/,/^(?:YPL-1\.1)/,/^(?:YPL-1\.0)/,/^(?:NPL-1\.0)/,/^(?:iMatix)/,/^(?:mpich2)/,/^(?:APAFML)/,/^(?:Bahyph)/,/^(?:RSA-MD)/,/^(?:psfrag)/,/^(?:Plexus)/,/^(?:eGenix)/,/^(?:Glulxe)/,/^(?:SAX-PD)/,/^(?:Imlib2)/,/^(?:Wsuipa)/,/^(?:LGPLLR)/,/^(?:Libpng)/,/^(?:xinetd)/,/^(?:MITNFA)/,/^(?:NetCDF)/,/^(?:Naumen)/,/^(?:SMPPL)/,/^(?:Nunit)/,/^(?:FSFUL)/,/^(?:GL2PS)/,/^(?:SMLNJ)/,/^(?:Rdisc)/,/^(?:Noweb)/,/^(?:Nokia)/,/^(?:SISSL)/,/^(?:Qhull)/,/^(?:Intel)/,/^(?:Glide)/,/^(?:Xerox)/,/^(?:AMPAS)/,/^(?:WTFPL)/,/^(?:MS-PL)/,/^(?:XSkat)/,/^(?:MS-RL)/,/^(?:MirOS)/,/^(?:RSCPL)/,/^(?:TMate)/,/^(?:OGTSL)/,/^(?:FSFAP)/,/^(?:NCSA)/,/^(?:Zlib)/,/^(?:SCEA)/,/^(?:SNIA)/,/^(?:NGPL)/,/^(?:NOSL)/,/^(?:ADSL)/,/^(?:MTLL)/,/^(?:NLPL)/,/^(?:Ruby)/,/^(?:JSON)/,/^(?:Barr)/,/^(?:0BSD)/,/^(?:Xnet)/,/^(?:Cube)/,/^(?:curl)/,/^(?:DSDP)/,/^(?:Fair)/,/^(?:HPND)/,/^(?:TOSL)/,/^(?:IJG)/,/^(?:SWL)/,/^(?:Vim)/,/^(?:FTL)/,/^(?:ICU)/,/^(?:OML)/,/^(?:NRL)/,/^(?:DOC)/,/^(?:TCL)/,/^(?:W3C)/,/^(?:NTP)/,/^(?:IPA)/,/^(?:ISC)/,/^(?:X11)/,/^(?:AAL)/,/^(?:AML)/,/^(?:xpp)/,/^(?:Zed)/,/^(?:MIT)/,/^(?:Mup)/], -conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364],"inclusive":true}} -}); -return lexer; -})(); -parser.lexer = lexer; -function Parser () { - this.yy = {}; +}, +rules: [/^(?:$)/,/^(?:\s+)/,/^(?:\+)/,/^(?:\()/,/^(?:\))/,/^(?::)/,/^(?:DocumentRef-([0-9A-Za-z-+.]+))/,/^(?:LicenseRef-([0-9A-Za-z-+.]+))/,/^(?:AND)/,/^(?:OR)/,/^(?:WITH)/,/^(?:BSD-3-Clause-No-Nuclear-License-2014)/,/^(?:BSD-3-Clause-No-Nuclear-Warranty)/,/^(?:GPL-2\.0-with-classpath-exception)/,/^(?:GPL-3\.0-with-autoconf-exception)/,/^(?:GPL-2\.0-with-autoconf-exception)/,/^(?:BSD-3-Clause-No-Nuclear-License)/,/^(?:MPL-2\.0-no-copyleft-exception)/,/^(?:GPL-2\.0-with-bison-exception)/,/^(?:GPL-2\.0-with-font-exception)/,/^(?:GPL-2\.0-with-GCC-exception)/,/^(?:CNRI-Python-GPL-Compatible)/,/^(?:GPL-3\.0-with-GCC-exception)/,/^(?:BSD-3-Clause-Attribution)/,/^(?:Classpath-exception-2\.0)/,/^(?:WxWindows-exception-3\.1)/,/^(?:freertos-exception-2\.0)/,/^(?:Autoconf-exception-3\.0)/,/^(?:i2p-gpl-java-exception)/,/^(?:gnu-javamail-exception)/,/^(?:Nokia-Qt-exception-1\.1)/,/^(?:Autoconf-exception-2\.0)/,/^(?:BSD-2-Clause-FreeBSD)/,/^(?:u-boot-exception-2\.0)/,/^(?:zlib-acknowledgement)/,/^(?:Bison-exception-2\.2)/,/^(?:BSD-2-Clause-NetBSD)/,/^(?:CLISP-exception-2\.0)/,/^(?:eCos-exception-2\.0)/,/^(?:BSD-3-Clause-Clear)/,/^(?:Font-exception-2\.0)/,/^(?:FLTK-exception-2\.0)/,/^(?:GCC-exception-2\.0)/,/^(?:Qwt-exception-1\.0)/,/^(?:Libtool-exception)/,/^(?:BSD-3-Clause-LBNL)/,/^(?:GCC-exception-3\.1)/,/^(?:Artistic-1\.0-Perl)/,/^(?:Artistic-1\.0-cl8)/,/^(?:CC-BY-NC-SA-2\.5)/,/^(?:MIT-advertising)/,/^(?:BSD-Source-Code)/,/^(?:CC-BY-NC-SA-4\.0)/,/^(?:LiLiQ-Rplus-1\.1)/,/^(?:CC-BY-NC-SA-3\.0)/,/^(?:BSD-4-Clause-UC)/,/^(?:CC-BY-NC-SA-2\.0)/,/^(?:CC-BY-NC-SA-1\.0)/,/^(?:CC-BY-NC-ND-4\.0)/,/^(?:CC-BY-NC-ND-3\.0)/,/^(?:CC-BY-NC-ND-2\.5)/,/^(?:CC-BY-NC-ND-2\.0)/,/^(?:CC-BY-NC-ND-1\.0)/,/^(?:LZMA-exception)/,/^(?:BitTorrent-1\.1)/,/^(?:CrystalStacker)/,/^(?:FLTK-exception)/,/^(?:SugarCRM-1\.1\.3)/,/^(?:BSD-Protection)/,/^(?:BitTorrent-1\.0)/,/^(?:HaskellReport)/,/^(?:Interbase-1\.0)/,/^(?:StandardML-NJ)/,/^(?:mif-exception)/,/^(?:Frameworx-1\.0)/,/^(?:389-exception)/,/^(?:CC-BY-NC-2\.0)/,/^(?:CC-BY-NC-2\.5)/,/^(?:CC-BY-NC-3\.0)/,/^(?:CC-BY-NC-4\.0)/,/^(?:W3C-19980720)/,/^(?:CC-BY-SA-1\.0)/,/^(?:CC-BY-SA-2\.0)/,/^(?:CC-BY-SA-2\.5)/,/^(?:CC-BY-ND-2\.0)/,/^(?:CC-BY-SA-4\.0)/,/^(?:CC-BY-SA-3\.0)/,/^(?:Artistic-1\.0)/,/^(?:Artistic-2\.0)/,/^(?:CC-BY-ND-2\.5)/,/^(?:CC-BY-ND-3\.0)/,/^(?:CC-BY-ND-4\.0)/,/^(?:CC-BY-ND-1\.0)/,/^(?:BSD-4-Clause)/,/^(?:BSD-3-Clause)/,/^(?:BSD-2-Clause)/,/^(?:CC-BY-NC-1\.0)/,/^(?:bzip2-1\.0\.6)/,/^(?:Unicode-TOU)/,/^(?:CNRI-Jython)/,/^(?:ImageMagick)/,/^(?:Adobe-Glyph)/,/^(?:CUA-OPL-1\.0)/,/^(?:OLDAP-2\.2\.2)/,/^(?:LiLiQ-R-1\.1)/,/^(?:bzip2-1\.0\.5)/,/^(?:LiLiQ-P-1\.1)/,/^(?:OLDAP-2\.0\.1)/,/^(?:OLDAP-2\.2\.1)/,/^(?:CNRI-Python)/,/^(?:XFree86-1\.1)/,/^(?:OSET-PL-2\.1)/,/^(?:Apache-2\.0)/,/^(?:Watcom-1\.0)/,/^(?:PostgreSQL)/,/^(?:Python-2\.0)/,/^(?:RHeCos-1\.1)/,/^(?:EUDatagrid)/,/^(?:Spencer-99)/,/^(?:Intel-ACPI)/,/^(?:CECILL-1\.0)/,/^(?:CECILL-1\.1)/,/^(?:JasPer-2\.0)/,/^(?:CECILL-2\.0)/,/^(?:CECILL-2\.1)/,/^(?:gSOAP-1\.3b)/,/^(?:Spencer-94)/,/^(?:Apache-1\.1)/,/^(?:Spencer-86)/,/^(?:Apache-1\.0)/,/^(?:ClArtistic)/,/^(?:TORQUE-1\.1)/,/^(?:CATOSL-1\.1)/,/^(?:Adobe-2006)/,/^(?:Zimbra-1\.4)/,/^(?:Zimbra-1\.3)/,/^(?:Condor-1\.1)/,/^(?:CC-BY-3\.0)/,/^(?:CC-BY-2\.5)/,/^(?:OLDAP-2\.4)/,/^(?:SGI-B-1\.1)/,/^(?:SISSL-1\.2)/,/^(?:SGI-B-1\.0)/,/^(?:OLDAP-2\.3)/,/^(?:CC-BY-4\.0)/,/^(?:Crossword)/,/^(?:SimPL-2\.0)/,/^(?:OLDAP-2\.2)/,/^(?:OLDAP-2\.1)/,/^(?:ErlPL-1\.1)/,/^(?:LPPL-1\.3a)/,/^(?:LPPL-1\.3c)/,/^(?:OLDAP-2\.0)/,/^(?:Leptonica)/,/^(?:CPOL-1\.02)/,/^(?:OLDAP-1\.4)/,/^(?:OLDAP-1\.3)/,/^(?:CC-BY-2\.0)/,/^(?:Unlicense)/,/^(?:OLDAP-2\.8)/,/^(?:OLDAP-1\.2)/,/^(?:MakeIndex)/,/^(?:OLDAP-2\.7)/,/^(?:OLDAP-1\.1)/,/^(?:Sleepycat)/,/^(?:D-FSL-1\.0)/,/^(?:CC-BY-1\.0)/,/^(?:OLDAP-2\.6)/,/^(?:WXwindows)/,/^(?:NPOSL-3\.0)/,/^(?:FreeImage)/,/^(?:SGI-B-2\.0)/,/^(?:OLDAP-2\.5)/,/^(?:Beerware)/,/^(?:Newsletr)/,/^(?:NBPL-1\.0)/,/^(?:NASA-1\.3)/,/^(?:NLOD-1\.0)/,/^(?:AGPL-1\.0)/,/^(?:OCLC-2\.0)/,/^(?:ODbL-1\.0)/,/^(?:PDDL-1\.0)/,/^(?:Motosoto)/,/^(?:Afmparse)/,/^(?:ANTLR-PD)/,/^(?:LPL-1\.02)/,/^(?:Abstyles)/,/^(?:eCos-2\.0)/,/^(?:APSL-1\.0)/,/^(?:LPPL-1\.2)/,/^(?:LPPL-1\.1)/,/^(?:LPPL-1\.0)/,/^(?:APSL-1\.1)/,/^(?:APSL-2\.0)/,/^(?:Info-ZIP)/,/^(?:Zend-2\.0)/,/^(?:IBM-pibs)/,/^(?:LGPL-2\.0)/,/^(?:LGPL-3\.0)/,/^(?:LGPL-2\.1)/,/^(?:GFDL-1\.3)/,/^(?:PHP-3\.01)/,/^(?:GFDL-1\.2)/,/^(?:GFDL-1\.1)/,/^(?:AGPL-3\.0)/,/^(?:Giftware)/,/^(?:EUPL-1\.1)/,/^(?:RPSL-1\.0)/,/^(?:EUPL-1\.0)/,/^(?:MIT-enna)/,/^(?:CECILL-B)/,/^(?:diffmark)/,/^(?:CECILL-C)/,/^(?:CDDL-1\.0)/,/^(?:Sendmail)/,/^(?:CDDL-1\.1)/,/^(?:CPAL-1\.0)/,/^(?:APSL-1\.2)/,/^(?:NPL-1\.1)/,/^(?:AFL-1\.2)/,/^(?:Caldera)/,/^(?:AFL-2\.0)/,/^(?:FSFULLR)/,/^(?:AFL-2\.1)/,/^(?:VSL-1\.0)/,/^(?:VOSTROM)/,/^(?:UPL-1\.0)/,/^(?:Dotseqn)/,/^(?:CPL-1\.0)/,/^(?:dvipdfm)/,/^(?:EPL-1\.0)/,/^(?:OCCT-PL)/,/^(?:ECL-1\.0)/,/^(?:Latex2e)/,/^(?:ECL-2\.0)/,/^(?:GPL-1\.0)/,/^(?:GPL-2\.0)/,/^(?:GPL-3\.0)/,/^(?:AFL-3\.0)/,/^(?:LAL-1\.2)/,/^(?:LAL-1\.3)/,/^(?:EFL-1\.0)/,/^(?:EFL-2\.0)/,/^(?:gnuplot)/,/^(?:Aladdin)/,/^(?:LPL-1\.0)/,/^(?:libtiff)/,/^(?:Entessa)/,/^(?:AMDPLPA)/,/^(?:IPL-1\.0)/,/^(?:OPL-1\.0)/,/^(?:OSL-1\.0)/,/^(?:OSL-1\.1)/,/^(?:OSL-2\.0)/,/^(?:OSL-2\.1)/,/^(?:OSL-3\.0)/,/^(?:OpenSSL)/,/^(?:ZPL-2\.1)/,/^(?:PHP-3\.0)/,/^(?:ZPL-2\.0)/,/^(?:ZPL-1\.1)/,/^(?:CC0-1\.0)/,/^(?:SPL-1\.0)/,/^(?:psutils)/,/^(?:MPL-1\.0)/,/^(?:QPL-1\.0)/,/^(?:MPL-1\.1)/,/^(?:MPL-2\.0)/,/^(?:APL-1\.0)/,/^(?:RPL-1\.1)/,/^(?:RPL-1\.5)/,/^(?:MIT-CMU)/,/^(?:Multics)/,/^(?:Eurosym)/,/^(?:BSL-1\.0)/,/^(?:MIT-feh)/,/^(?:Saxpath)/,/^(?:Borceux)/,/^(?:OFL-1\.1)/,/^(?:OFL-1\.0)/,/^(?:AFL-1\.1)/,/^(?:YPL-1\.1)/,/^(?:YPL-1\.0)/,/^(?:NPL-1\.0)/,/^(?:iMatix)/,/^(?:mpich2)/,/^(?:APAFML)/,/^(?:Bahyph)/,/^(?:RSA-MD)/,/^(?:psfrag)/,/^(?:Plexus)/,/^(?:eGenix)/,/^(?:Glulxe)/,/^(?:SAX-PD)/,/^(?:Imlib2)/,/^(?:Wsuipa)/,/^(?:LGPLLR)/,/^(?:Libpng)/,/^(?:xinetd)/,/^(?:MITNFA)/,/^(?:NetCDF)/,/^(?:Naumen)/,/^(?:SMPPL)/,/^(?:Nunit)/,/^(?:FSFUL)/,/^(?:GL2PS)/,/^(?:SMLNJ)/,/^(?:Rdisc)/,/^(?:Noweb)/,/^(?:Nokia)/,/^(?:SISSL)/,/^(?:Qhull)/,/^(?:Intel)/,/^(?:Glide)/,/^(?:Xerox)/,/^(?:AMPAS)/,/^(?:WTFPL)/,/^(?:MS-PL)/,/^(?:XSkat)/,/^(?:MS-RL)/,/^(?:MirOS)/,/^(?:RSCPL)/,/^(?:TMate)/,/^(?:OGTSL)/,/^(?:FSFAP)/,/^(?:NCSA)/,/^(?:Zlib)/,/^(?:SCEA)/,/^(?:SNIA)/,/^(?:NGPL)/,/^(?:NOSL)/,/^(?:ADSL)/,/^(?:MTLL)/,/^(?:NLPL)/,/^(?:Ruby)/,/^(?:JSON)/,/^(?:Barr)/,/^(?:0BSD)/,/^(?:Xnet)/,/^(?:Cube)/,/^(?:curl)/,/^(?:DSDP)/,/^(?:Fair)/,/^(?:HPND)/,/^(?:TOSL)/,/^(?:IJG)/,/^(?:SWL)/,/^(?:Vim)/,/^(?:FTL)/,/^(?:ICU)/,/^(?:OML)/,/^(?:NRL)/,/^(?:DOC)/,/^(?:TCL)/,/^(?:W3C)/,/^(?:NTP)/,/^(?:IPA)/,/^(?:ISC)/,/^(?:X11)/,/^(?:AAL)/,/^(?:AML)/,/^(?:xpp)/,/^(?:Zed)/,/^(?:MIT)/,/^(?:Mup)/], +conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364],"inclusive":true}} +}); +return lexer; +})(); +parser.lexer = lexer; +function Parser () { + this.yy = {}; +} +Parser.prototype = parser;parser.Parser = Parser; +return new Parser; +})(); + + +if (true) { +exports.parser = spdxparse; +exports.Parser = spdxparse.Parser; +exports.parse = function () { return spdxparse.parse.apply(spdxparse, arguments); }; +exports.main = function commonjsMain(args) { + if (!args[1]) { + console.log('Usage: '+args[0]+' FILE'); + process.exit(1); + } + var source = __webpack_require__(133).readFileSync(__webpack_require__(4).normalize(args[1]), "utf8"); + return exports.parser.parse(source); +}; +if ( true && __webpack_require__.c[__webpack_require__.s] === module) { + exports.main(process.argv.slice(1)); +} +} + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) + +/***/ }), +/* 193 */ +/***/ (function(module, exports, __webpack_require__) { + +var licenseIDs = __webpack_require__(194); + +function valid(string) { + return licenseIDs.indexOf(string) > -1; +} + +// Common transpositions of license identifier acronyms +var transpositions = [ + ['APGL', 'AGPL'], + ['Gpl', 'GPL'], + ['GLP', 'GPL'], + ['APL', 'Apache'], + ['ISD', 'ISC'], + ['GLP', 'GPL'], + ['IST', 'ISC'], + ['Claude', 'Clause'], + [' or later', '+'], + [' International', ''], + ['GNU', 'GPL'], + ['GUN', 'GPL'], + ['+', ''], + ['GNU GPL', 'GPL'], + ['GNU/GPL', 'GPL'], + ['GNU GLP', 'GPL'], + ['GNU General Public License', 'GPL'], + ['Gnu public license', 'GPL'], + ['GNU Public License', 'GPL'], + ['GNU GENERAL PUBLIC LICENSE', 'GPL'], + ['MTI', 'MIT'], + ['Mozilla Public License', 'MPL'], + ['WTH', 'WTF'], + ['-License', ''] +]; + +var TRANSPOSED = 0; +var CORRECT = 1; + +// Simple corrections to nearly valid identifiers. +var transforms = [ + // e.g. 'mit' + function(argument) { + return argument.toUpperCase(); + }, + // e.g. 'MIT ' + function(argument) { + return argument.trim(); + }, + // e.g. 'M.I.T.' + function(argument) { + return argument.replace(/\./g, ''); + }, + // e.g. 'Apache- 2.0' + function(argument) { + return argument.replace(/\s+/g, ''); + }, + // e.g. 'CC BY 4.0'' + function(argument) { + return argument.replace(/\s+/g, '-'); + }, + // e.g. 'LGPLv2.1' + function(argument) { + return argument.replace('v', '-'); + }, + // e.g. 'Apache 2.0' + function(argument) { + return argument.replace(/,?\s*(\d)/, '-$1'); + }, + // e.g. 'GPL 2' + function(argument) { + return argument.replace(/,?\s*(\d)/, '-$1.0'); + }, + // e.g. 'Apache Version 2.0' + function(argument) { + return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2'); + }, + // e.g. 'Apache Version 2' + function(argument) { + return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0'); + }, + // e.g. 'ZLIB' + function(argument) { + return argument[0].toUpperCase() + argument.slice(1); + }, + // e.g. 'MPL/2.0' + function(argument) { + return argument.replace('/', '-'); + }, + // e.g. 'Apache 2' + function(argument) { + return argument + .replace(/\s*V\s*(\d)/, '-$1') + .replace(/(\d)$/, '$1.0'); + }, + // e.g. 'GPL-2.0-' + function(argument) { + return argument.slice(0, argument.length - 1); + }, + // e.g. 'GPL2' + function(argument) { + return argument.replace(/(\d)$/, '-$1.0'); + }, + // e.g. 'BSD 3' + function(argument) { + return argument.replace(/(-| )?(\d)$/, '-$2-Clause'); + }, + // e.g. 'BSD clause 3' + function(argument) { + return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause'); + }, + // e.g. 'BY-NC-4.0' + function(argument) { + return 'CC-' + argument; + }, + // e.g. 'BY-NC' + function(argument) { + return 'CC-' + argument + '-4.0'; + }, + // e.g. 'Attribution-NonCommercial' + function(argument) { + return argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, ''); + }, + // e.g. 'Attribution-NonCommercial' + function(argument) { + return 'CC-' + + argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, '') + + '-4.0'; + } +]; + +// If all else fails, guess that strings containing certain substrings +// meant to identify certain licenses. +var lastResorts = [ + ['UNLI', 'Unlicense'], + ['WTF', 'WTFPL'], + ['2 CLAUSE', 'BSD-2-Clause'], + ['2-CLAUSE', 'BSD-2-Clause'], + ['3 CLAUSE', 'BSD-3-Clause'], + ['3-CLAUSE', 'BSD-3-Clause'], + ['AFFERO', 'AGPL-3.0'], + ['AGPL', 'AGPL-3.0'], + ['APACHE', 'Apache-2.0'], + ['ARTISTIC', 'Artistic-2.0'], + ['Affero', 'AGPL-3.0'], + ['BEER', 'Beerware'], + ['BOOST', 'BSL-1.0'], + ['BSD', 'BSD-2-Clause'], + ['ECLIPSE', 'EPL-1.0'], + ['FUCK', 'WTFPL'], + ['GNU', 'GPL-3.0'], + ['LGPL', 'LGPL-3.0'], + ['GPL', 'GPL-3.0'], + ['MIT', 'MIT'], + ['MPL', 'MPL-2.0'], + ['X11', 'X11'], + ['ZLIB', 'Zlib'] +]; + +var SUBSTRING = 0; +var IDENTIFIER = 1; + +var validTransformation = function(identifier) { + for (var i = 0; i < transforms.length; i++) { + var transformed = transforms[i](identifier); + if (transformed !== identifier && valid(transformed)) { + return transformed; + } + } + return null; +}; + +var validLastResort = function(identifier) { + var upperCased = identifier.toUpperCase(); + for (var i = 0; i < lastResorts.length; i++) { + var lastResort = lastResorts[i]; + if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) { + return lastResort[IDENTIFIER]; + } + } + return null; +}; + +var anyCorrection = function(identifier, check) { + for (var i = 0; i < transpositions.length; i++) { + var transposition = transpositions[i]; + var transposed = transposition[TRANSPOSED]; + if (identifier.indexOf(transposed) > -1) { + var corrected = identifier.replace( + transposed, + transposition[CORRECT] + ); + var checked = check(corrected); + if (checked !== null) { + return checked; + } + } + } + return null; +}; + +module.exports = function(identifier) { + identifier = identifier.replace(/\+$/, ''); + if (valid(identifier)) { + return identifier; + } + var transformed = validTransformation(identifier); + if (transformed !== null) { + return transformed; + } + transformed = anyCorrection(identifier, function(argument) { + if (valid(argument)) { + return argument; + } + return validTransformation(argument); + }); + if (transformed !== null) { + return transformed; + } + transformed = validLastResort(identifier); + if (transformed !== null) { + return transformed; + } + transformed = anyCorrection(identifier, validLastResort); + if (transformed !== null) { + return transformed; + } + return null; +}; + + +/***/ }), +/* 194 */ +/***/ (function(module) { + +module.exports = JSON.parse("[\"Glide\",\"Abstyles\",\"AFL-1.1\",\"AFL-1.2\",\"AFL-2.0\",\"AFL-2.1\",\"AFL-3.0\",\"AMPAS\",\"APL-1.0\",\"Adobe-Glyph\",\"APAFML\",\"Adobe-2006\",\"AGPL-1.0\",\"Afmparse\",\"Aladdin\",\"ADSL\",\"AMDPLPA\",\"ANTLR-PD\",\"Apache-1.0\",\"Apache-1.1\",\"Apache-2.0\",\"AML\",\"APSL-1.0\",\"APSL-1.1\",\"APSL-1.2\",\"APSL-2.0\",\"Artistic-1.0\",\"Artistic-1.0-Perl\",\"Artistic-1.0-cl8\",\"Artistic-2.0\",\"AAL\",\"Bahyph\",\"Barr\",\"Beerware\",\"BitTorrent-1.0\",\"BitTorrent-1.1\",\"BSL-1.0\",\"Borceux\",\"BSD-2-Clause\",\"BSD-2-Clause-FreeBSD\",\"BSD-2-Clause-NetBSD\",\"BSD-3-Clause\",\"BSD-3-Clause-Clear\",\"BSD-4-Clause\",\"BSD-Protection\",\"BSD-Source-Code\",\"BSD-3-Clause-Attribution\",\"0BSD\",\"BSD-4-Clause-UC\",\"bzip2-1.0.5\",\"bzip2-1.0.6\",\"Caldera\",\"CECILL-1.0\",\"CECILL-1.1\",\"CECILL-2.0\",\"CECILL-2.1\",\"CECILL-B\",\"CECILL-C\",\"ClArtistic\",\"MIT-CMU\",\"CNRI-Jython\",\"CNRI-Python\",\"CNRI-Python-GPL-Compatible\",\"CPOL-1.02\",\"CDDL-1.0\",\"CDDL-1.1\",\"CPAL-1.0\",\"CPL-1.0\",\"CATOSL-1.1\",\"Condor-1.1\",\"CC-BY-1.0\",\"CC-BY-2.0\",\"CC-BY-2.5\",\"CC-BY-3.0\",\"CC-BY-4.0\",\"CC-BY-ND-1.0\",\"CC-BY-ND-2.0\",\"CC-BY-ND-2.5\",\"CC-BY-ND-3.0\",\"CC-BY-ND-4.0\",\"CC-BY-NC-1.0\",\"CC-BY-NC-2.0\",\"CC-BY-NC-2.5\",\"CC-BY-NC-3.0\",\"CC-BY-NC-4.0\",\"CC-BY-NC-ND-1.0\",\"CC-BY-NC-ND-2.0\",\"CC-BY-NC-ND-2.5\",\"CC-BY-NC-ND-3.0\",\"CC-BY-NC-ND-4.0\",\"CC-BY-NC-SA-1.0\",\"CC-BY-NC-SA-2.0\",\"CC-BY-NC-SA-2.5\",\"CC-BY-NC-SA-3.0\",\"CC-BY-NC-SA-4.0\",\"CC-BY-SA-1.0\",\"CC-BY-SA-2.0\",\"CC-BY-SA-2.5\",\"CC-BY-SA-3.0\",\"CC-BY-SA-4.0\",\"CC0-1.0\",\"Crossword\",\"CrystalStacker\",\"CUA-OPL-1.0\",\"Cube\",\"curl\",\"D-FSL-1.0\",\"diffmark\",\"WTFPL\",\"DOC\",\"Dotseqn\",\"DSDP\",\"dvipdfm\",\"EPL-1.0\",\"ECL-1.0\",\"ECL-2.0\",\"eGenix\",\"EFL-1.0\",\"EFL-2.0\",\"MIT-advertising\",\"MIT-enna\",\"Entessa\",\"ErlPL-1.1\",\"EUDatagrid\",\"EUPL-1.0\",\"EUPL-1.1\",\"Eurosym\",\"Fair\",\"MIT-feh\",\"Frameworx-1.0\",\"FreeImage\",\"FTL\",\"FSFAP\",\"FSFUL\",\"FSFULLR\",\"Giftware\",\"GL2PS\",\"Glulxe\",\"AGPL-3.0\",\"GFDL-1.1\",\"GFDL-1.2\",\"GFDL-1.3\",\"GPL-1.0\",\"GPL-2.0\",\"GPL-3.0\",\"LGPL-2.1\",\"LGPL-3.0\",\"LGPL-2.0\",\"gnuplot\",\"gSOAP-1.3b\",\"HaskellReport\",\"HPND\",\"IBM-pibs\",\"IPL-1.0\",\"ICU\",\"ImageMagick\",\"iMatix\",\"Imlib2\",\"IJG\",\"Info-ZIP\",\"Intel-ACPI\",\"Intel\",\"Interbase-1.0\",\"IPA\",\"ISC\",\"JasPer-2.0\",\"JSON\",\"LPPL-1.0\",\"LPPL-1.1\",\"LPPL-1.2\",\"LPPL-1.3a\",\"LPPL-1.3c\",\"Latex2e\",\"BSD-3-Clause-LBNL\",\"Leptonica\",\"LGPLLR\",\"Libpng\",\"libtiff\",\"LAL-1.2\",\"LAL-1.3\",\"LiLiQ-P-1.1\",\"LiLiQ-Rplus-1.1\",\"LiLiQ-R-1.1\",\"LPL-1.02\",\"LPL-1.0\",\"MakeIndex\",\"MTLL\",\"MS-PL\",\"MS-RL\",\"MirOS\",\"MITNFA\",\"MIT\",\"Motosoto\",\"MPL-1.0\",\"MPL-1.1\",\"MPL-2.0\",\"MPL-2.0-no-copyleft-exception\",\"mpich2\",\"Multics\",\"Mup\",\"NASA-1.3\",\"Naumen\",\"NBPL-1.0\",\"NetCDF\",\"NGPL\",\"NOSL\",\"NPL-1.0\",\"NPL-1.1\",\"Newsletr\",\"NLPL\",\"Nokia\",\"NPOSL-3.0\",\"NLOD-1.0\",\"Noweb\",\"NRL\",\"NTP\",\"Nunit\",\"OCLC-2.0\",\"ODbL-1.0\",\"PDDL-1.0\",\"OCCT-PL\",\"OGTSL\",\"OLDAP-2.2.2\",\"OLDAP-1.1\",\"OLDAP-1.2\",\"OLDAP-1.3\",\"OLDAP-1.4\",\"OLDAP-2.0\",\"OLDAP-2.0.1\",\"OLDAP-2.1\",\"OLDAP-2.2\",\"OLDAP-2.2.1\",\"OLDAP-2.3\",\"OLDAP-2.4\",\"OLDAP-2.5\",\"OLDAP-2.6\",\"OLDAP-2.7\",\"OLDAP-2.8\",\"OML\",\"OPL-1.0\",\"OSL-1.0\",\"OSL-1.1\",\"OSL-2.0\",\"OSL-2.1\",\"OSL-3.0\",\"OpenSSL\",\"OSET-PL-2.1\",\"PHP-3.0\",\"PHP-3.01\",\"Plexus\",\"PostgreSQL\",\"psfrag\",\"psutils\",\"Python-2.0\",\"QPL-1.0\",\"Qhull\",\"Rdisc\",\"RPSL-1.0\",\"RPL-1.1\",\"RPL-1.5\",\"RHeCos-1.1\",\"RSCPL\",\"RSA-MD\",\"Ruby\",\"SAX-PD\",\"Saxpath\",\"SCEA\",\"SWL\",\"SMPPL\",\"Sendmail\",\"SGI-B-1.0\",\"SGI-B-1.1\",\"SGI-B-2.0\",\"OFL-1.0\",\"OFL-1.1\",\"SimPL-2.0\",\"Sleepycat\",\"SNIA\",\"Spencer-86\",\"Spencer-94\",\"Spencer-99\",\"SMLNJ\",\"SugarCRM-1.1.3\",\"SISSL\",\"SISSL-1.2\",\"SPL-1.0\",\"Watcom-1.0\",\"TCL\",\"Unlicense\",\"TMate\",\"TORQUE-1.1\",\"TOSL\",\"Unicode-TOU\",\"UPL-1.0\",\"NCSA\",\"Vim\",\"VOSTROM\",\"VSL-1.0\",\"W3C-19980720\",\"W3C\",\"Wsuipa\",\"Xnet\",\"X11\",\"Xerox\",\"XFree86-1.1\",\"xinetd\",\"xpp\",\"XSkat\",\"YPL-1.0\",\"YPL-1.1\",\"Zed\",\"Zend-2.0\",\"Zimbra-1.3\",\"Zimbra-1.4\",\"Zlib\",\"zlib-acknowledgement\",\"ZPL-1.1\",\"ZPL-2.0\",\"ZPL-2.1\",\"BSD-3-Clause-No-Nuclear-License\",\"BSD-3-Clause-No-Nuclear-Warranty\",\"BSD-3-Clause-No-Nuclear-License-2014\",\"eCos-2.0\",\"GPL-2.0-with-autoconf-exception\",\"GPL-2.0-with-bison-exception\",\"GPL-2.0-with-classpath-exception\",\"GPL-2.0-with-font-exception\",\"GPL-2.0-with-GCC-exception\",\"GPL-3.0-with-autoconf-exception\",\"GPL-3.0-with-GCC-exception\",\"StandardML-NJ\",\"WXwindows\"]"); + +/***/ }), +/* 195 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var url = __webpack_require__(196) +var gitHosts = __webpack_require__(197) +var GitHost = module.exports = __webpack_require__(198) + +var protocolToRepresentationMap = { + 'git+ssh': 'sshurl', + 'git+https': 'https', + 'ssh': 'sshurl', + 'git': 'git' +} + +function protocolToRepresentation (protocol) { + if (protocol.substr(-1) === ':') protocol = protocol.slice(0, -1) + return protocolToRepresentationMap[protocol] || protocol +} + +var authProtocols = { + 'git:': true, + 'https:': true, + 'git+https:': true, + 'http:': true, + 'git+http:': true +} + +var cache = {} + +module.exports.fromUrl = function (giturl, opts) { + var key = giturl + JSON.stringify(opts || {}) + + if (!(key in cache)) { + cache[key] = fromUrl(giturl, opts) + } + + return cache[key] +} + +function fromUrl (giturl, opts) { + if (giturl == null || giturl === '') return + var url = fixupUnqualifiedGist( + isGitHubShorthand(giturl) ? 'github:' + giturl : giturl + ) + var parsed = parseGitUrl(url) + var shortcutMatch = url.match(new RegExp('^([^:]+):(?:(?:[^@:]+(?:[^@]+)?@)?([^/]*))[/](.+?)(?:[.]git)?($|#)')) + var matches = Object.keys(gitHosts).map(function (gitHostName) { + try { + var gitHostInfo = gitHosts[gitHostName] + var auth = null + if (parsed.auth && authProtocols[parsed.protocol]) { + auth = decodeURIComponent(parsed.auth) + } + var committish = parsed.hash ? decodeURIComponent(parsed.hash.substr(1)) : null + var user = null + var project = null + var defaultRepresentation = null + if (shortcutMatch && shortcutMatch[1] === gitHostName) { + user = shortcutMatch[2] && decodeURIComponent(shortcutMatch[2]) + project = decodeURIComponent(shortcutMatch[3]) + defaultRepresentation = 'shortcut' + } else { + if (parsed.host !== gitHostInfo.domain) return + if (!gitHostInfo.protocols_re.test(parsed.protocol)) return + if (!parsed.path) return + var pathmatch = gitHostInfo.pathmatch + var matched = parsed.path.match(pathmatch) + if (!matched) return + if (matched[1] != null) user = decodeURIComponent(matched[1].replace(/^:/, '')) + if (matched[2] != null) project = decodeURIComponent(matched[2]) + defaultRepresentation = protocolToRepresentation(parsed.protocol) + } + return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts) + } catch (ex) { + if (!(ex instanceof URIError)) throw ex + } + }).filter(function (gitHostInfo) { return gitHostInfo }) + if (matches.length !== 1) return + return matches[0] +} + +function isGitHubShorthand (arg) { + // Note: This does not fully test the git ref format. + // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html + // + // The only way to do this properly would be to shell out to + // git-check-ref-format, and as this is a fast sync function, + // we don't want to do that. Just let git fail if it turns + // out that the commit-ish is invalid. + // GH usernames cannot start with . or - + return /^[^:@%/\s.-][^:@%/\s]*[/][^:@\s/%]+(?:#.*)?$/.test(arg) +} + +function fixupUnqualifiedGist (giturl) { + // necessary for round-tripping gists + var parsed = url.parse(giturl) + if (parsed.protocol === 'gist:' && parsed.host && !parsed.path) { + return parsed.protocol + '/' + parsed.host + } else { + return giturl + } +} + +function parseGitUrl (giturl) { + if (typeof giturl !== 'string') giturl = '' + giturl + var matched = giturl.match(/^([^@]+)@([^:/]+):[/]?((?:[^/]+[/])?[^/]+?)(?:[.]git)?(#.*)?$/) + if (!matched) return url.parse(giturl) + return { + protocol: 'git+ssh:', + slashes: true, + auth: matched[1], + host: matched[2], + port: null, + hostname: matched[2], + hash: matched[4], + search: null, + query: null, + pathname: '/' + matched[3], + path: '/' + matched[3], + href: 'git+ssh://' + matched[1] + '@' + matched[2] + + '/' + matched[3] + (matched[4] || '') + } +} + + +/***/ }), +/* 196 */ +/***/ (function(module, exports) { + +module.exports = require("url"); + +/***/ }), +/* 197 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var gitHosts = module.exports = { + github: { + // First two are insecure and generally shouldn't be used any more, but + // they are still supported. + 'protocols': [ 'git', 'http', 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'github.com', + 'treepath': 'tree', + 'filetemplate': 'https://{auth@}raw.githubusercontent.com/{user}/{project}/{committish}/{path}', + 'bugstemplate': 'https://{domain}/{user}/{project}/issues', + 'gittemplate': 'git://{auth@}{domain}/{user}/{project}.git{#committish}', + 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' + }, + bitbucket: { + 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'bitbucket.org', + 'treepath': 'src', + 'tarballtemplate': 'https://{domain}/{user}/{project}/get/{committish}.tar.gz' + }, + gitlab: { + 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'gitlab.com', + 'treepath': 'tree', + 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#README', + 'bugstemplate': 'https://{domain}/{user}/{project}/issues', + 'tarballtemplate': 'https://{domain}/{user}/{project}/repository/archive.tar.gz?ref={committish}' + }, + gist: { + 'protocols': [ 'git', 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'gist.github.com', + 'pathmatch': /^[/](?:([^/]+)[/])?([a-z0-9]+)(?:[.]git)?$/, + 'filetemplate': 'https://gist.githubusercontent.com/{user}/{project}/raw{/committish}/{path}', + 'bugstemplate': 'https://{domain}/{project}', + 'gittemplate': 'git://{domain}/{project}.git{#committish}', + 'sshtemplate': 'git@{domain}:/{project}.git{#committish}', + 'sshurltemplate': 'git+ssh://git@{domain}/{project}.git{#committish}', + 'browsetemplate': 'https://{domain}/{project}{/committish}', + 'docstemplate': 'https://{domain}/{project}{/committish}', + 'httpstemplate': 'git+https://{domain}/{project}.git{#committish}', + 'shortcuttemplate': '{type}:{project}{#committish}', + 'pathtemplate': '{project}{#committish}', + 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' + } +} + +var gitHostDefaults = { + 'sshtemplate': 'git@{domain}:{user}/{project}.git{#committish}', + 'sshurltemplate': 'git+ssh://git@{domain}/{user}/{project}.git{#committish}', + 'browsetemplate': 'https://{domain}/{user}/{project}{/tree/committish}', + 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#readme', + 'httpstemplate': 'git+https://{auth@}{domain}/{user}/{project}.git{#committish}', + 'filetemplate': 'https://{domain}/{user}/{project}/raw/{committish}/{path}', + 'shortcuttemplate': '{type}:{user}/{project}{#committish}', + 'pathtemplate': '{user}/{project}{#committish}', + 'pathmatch': /^[/]([^/]+)[/]([^/]+?)(?:[.]git|[/])?$/ +} + +Object.keys(gitHosts).forEach(function (name) { + Object.keys(gitHostDefaults).forEach(function (key) { + if (gitHosts[name][key]) return + gitHosts[name][key] = gitHostDefaults[key] + }) + gitHosts[name].protocols_re = RegExp('^(' + + gitHosts[name].protocols.map(function (protocol) { + return protocol.replace(/([\\+*{}()[\]$^|])/g, '\\$1') + }).join('|') + '):$') +}) + + +/***/ }), +/* 198 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var gitHosts = __webpack_require__(197) +var extend = Object.assign || __webpack_require__(111)._extend + +var GitHost = module.exports = function (type, user, auth, project, committish, defaultRepresentation, opts) { + var gitHostInfo = this + gitHostInfo.type = type + Object.keys(gitHosts[type]).forEach(function (key) { + gitHostInfo[key] = gitHosts[type][key] + }) + gitHostInfo.user = user + gitHostInfo.auth = auth + gitHostInfo.project = project + gitHostInfo.committish = committish + gitHostInfo.default = defaultRepresentation + gitHostInfo.opts = opts || {} +} +GitHost.prototype = {} + +GitHost.prototype.hash = function () { + return this.committish ? '#' + this.committish : '' +} + +GitHost.prototype._fill = function (template, opts) { + if (!template) return + var vars = extend({}, opts) + opts = extend(extend({}, this.opts), opts) + var self = this + Object.keys(this).forEach(function (key) { + if (self[key] != null && vars[key] == null) vars[key] = self[key] + }) + var rawAuth = vars.auth + var rawComittish = vars.committish + Object.keys(vars).forEach(function (key) { + vars[key] = encodeURIComponent(vars[key]) + }) + vars['auth@'] = rawAuth ? rawAuth + '@' : '' + if (opts.noCommittish) { + vars['#committish'] = '' + vars['/tree/committish'] = '' + vars['/comittish'] = '' + vars.comittish = '' + } else { + vars['#committish'] = rawComittish ? '#' + rawComittish : '' + vars['/tree/committish'] = vars.committish + ? '/' + vars.treepath + '/' + vars.committish + : '' + vars['/committish'] = vars.committish ? '/' + vars.committish : '' + vars.committish = vars.committish || 'master' + } + var res = template + Object.keys(vars).forEach(function (key) { + res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key]) + }) + if (opts.noGitPlus) { + return res.replace(/^git[+]/, '') + } else { + return res + } +} + +GitHost.prototype.ssh = function (opts) { + return this._fill(this.sshtemplate, opts) +} + +GitHost.prototype.sshurl = function (opts) { + return this._fill(this.sshurltemplate, opts) +} + +GitHost.prototype.browse = function (opts) { + return this._fill(this.browsetemplate, opts) +} + +GitHost.prototype.docs = function (opts) { + return this._fill(this.docstemplate, opts) +} + +GitHost.prototype.bugs = function (opts) { + return this._fill(this.bugstemplate, opts) +} + +GitHost.prototype.https = function (opts) { + return this._fill(this.httpstemplate, opts) +} + +GitHost.prototype.git = function (opts) { + return this._fill(this.gittemplate, opts) +} + +GitHost.prototype.shortcut = function (opts) { + return this._fill(this.shortcuttemplate, opts) +} + +GitHost.prototype.path = function (opts) { + return this._fill(this.pathtemplate, opts) +} + +GitHost.prototype.tarball = function (opts) { + return this._fill(this.tarballtemplate, opts) +} + +GitHost.prototype.file = function (P, opts) { + return this._fill(this.filetemplate, extend({ + path: P.replace(/^[/]+/g, '') + }, opts)) +} + +GitHost.prototype.getDefaultRepresentation = function () { + return this.default +} + +GitHost.prototype.toString = function (opts) { + return (this[this.default] || this.sshurl).call(this, opts) +} + + +/***/ }), +/* 199 */ +/***/ (function(module, exports, __webpack_require__) { + +var async = __webpack_require__(200); +async.core = __webpack_require__(206); +async.isCore = __webpack_require__(205); +async.sync = __webpack_require__(208); + +module.exports = async; + + +/***/ }), +/* 200 */ +/***/ (function(module, exports, __webpack_require__) { + +var fs = __webpack_require__(133); +var path = __webpack_require__(4); +var caller = __webpack_require__(201); +var nodeModulesPaths = __webpack_require__(202); +var normalizeOptions = __webpack_require__(204); +var isCore = __webpack_require__(205); + +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() + ); + } +}; + + +/***/ }), +/* 201 */ +/***/ (function(module, exports) { + +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(); +}; + + +/***/ }), +/* 202 */ +/***/ (function(module, exports, __webpack_require__) { + +var path = __webpack_require__(4); +var parse = path.parse || __webpack_require__(203); + +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; +}; + + +/***/ }), +/* 203 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isWindows = process.platform === 'win32'; + +// Regex to split a windows path into three parts: [*, device, slash, +// tail] windows-only +var splitDeviceRe = + /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + +// Regex to split the tail part of the above into [*, dir, basename, ext] +var splitTailRe = + /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/; + +var win32 = {}; + +// Function to split a filename into [root, dir, basename, ext] +function win32SplitPath(filename) { + // Separate device+slash from tail + var result = splitDeviceRe.exec(filename), + device = (result[1] || '') + (result[2] || ''), + tail = result[3] || ''; + // Split the tail into dir, basename and extension + var result2 = splitTailRe.exec(tail), + dir = result2[1], + basename = result2[2], + ext = result2[3]; + return [device, dir, basename, ext]; +} + +win32.parse = function(pathString) { + if (typeof pathString !== 'string') { + throw new TypeError( + "Parameter 'pathString' must be a string, not " + typeof pathString + ); + } + var allParts = win32SplitPath(pathString); + if (!allParts || allParts.length !== 4) { + throw new TypeError("Invalid path '" + pathString + "'"); + } + return { + root: allParts[0], + dir: allParts[0] + allParts[1].slice(0, -1), + base: allParts[2], + ext: allParts[3], + name: allParts[2].slice(0, allParts[2].length - allParts[3].length) + }; +}; + + + +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var posix = {}; + + +function posixSplitPath(filename) { + return splitPathRe.exec(filename).slice(1); +} + + +posix.parse = function(pathString) { + if (typeof pathString !== 'string') { + throw new TypeError( + "Parameter 'pathString' must be a string, not " + typeof pathString + ); + } + var allParts = posixSplitPath(pathString); + if (!allParts || allParts.length !== 4) { + throw new TypeError("Invalid path '" + pathString + "'"); + } + allParts[1] = allParts[1] || ''; + allParts[2] = allParts[2] || ''; + allParts[3] = allParts[3] || ''; + + return { + root: allParts[0], + dir: allParts[0] + allParts[1].slice(0, -1), + base: allParts[2], + ext: allParts[3], + name: allParts[2].slice(0, allParts[2].length - allParts[3].length) + }; +}; + + +if (isWindows) + module.exports = win32.parse; +else /* posix */ + module.exports = posix.parse; + +module.exports.posix = posix.parse; +module.exports.win32 = win32.parse; + + +/***/ }), +/* 204 */ +/***/ (function(module, exports) { + +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 || {}; +}; + + +/***/ }), +/* 205 */ +/***/ (function(module, exports, __webpack_require__) { + +var core = __webpack_require__(206); + +module.exports = function isCore(x) { + return Object.prototype.hasOwnProperty.call(core, x); +}; + + +/***/ }), +/* 206 */ +/***/ (function(module, exports, __webpack_require__) { + +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 = __webpack_require__(207); + +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; + + +/***/ }), +/* 207 */ +/***/ (function(module) { + +module.exports = JSON.parse("{\"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}"); + +/***/ }), +/* 208 */ +/***/ (function(module, exports, __webpack_require__) { + +var isCore = __webpack_require__(205); +var fs = __webpack_require__(133); +var path = __webpack_require__(4); +var caller = __webpack_require__(201); +var nodeModulesPaths = __webpack_require__(202); +var normalizeOptions = __webpack_require__(204); + +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; + } + } + } +}; + + +/***/ }), +/* 209 */ +/***/ (function(module, exports) { + +module.exports = extractDescription + +// Extracts description from contents of a readme file in markdown format +function extractDescription (d) { + if (!d) return; + if (d === "ERROR: No README data found!") return; + // the first block of text before the first heading + // that isn't the first line heading + d = d.trim().split('\n') + for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++); + var l = d.length + for (var e = s + 1; e < l && d[e].trim(); e ++); + return d.slice(s, e).join(' ').trim() +} + + +/***/ }), +/* 210 */ +/***/ (function(module) { + +module.exports = JSON.parse("{\"topLevel\":{\"dependancies\":\"dependencies\",\"dependecies\":\"dependencies\",\"depdenencies\":\"dependencies\",\"devEependencies\":\"devDependencies\",\"depends\":\"dependencies\",\"dev-dependencies\":\"devDependencies\",\"devDependences\":\"devDependencies\",\"devDepenencies\":\"devDependencies\",\"devdependencies\":\"devDependencies\",\"repostitory\":\"repository\",\"repo\":\"repository\",\"prefereGlobal\":\"preferGlobal\",\"hompage\":\"homepage\",\"hampage\":\"homepage\",\"autohr\":\"author\",\"autor\":\"author\",\"contributers\":\"contributors\",\"publicationConfig\":\"publishConfig\",\"script\":\"scripts\"},\"bugs\":{\"web\":\"url\",\"name\":\"url\"},\"script\":{\"server\":\"start\",\"tests\":\"test\"}}"); + +/***/ }), +/* 211 */ +/***/ (function(module, exports, __webpack_require__) { + +var util = __webpack_require__(111) +var messages = __webpack_require__(212) + +module.exports = function() { + var args = Array.prototype.slice.call(arguments, 0) + var warningName = args.shift() + if (warningName == "typo") { + return makeTypoWarning.apply(null,args) + } + else { + var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'" + args.unshift(msgTemplate) + return util.format.apply(null, args) + } } -Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})(); +function makeTypoWarning (providedName, probableName, field) { + if (field) { + providedName = field + "['" + providedName + "']" + probableName = field + "['" + probableName + "']" + } + return util.format(messages.typo, providedName, probableName) +} + + +/***/ }), +/* 212 */ +/***/ (function(module) { + +module.exports = JSON.parse("{\"repositories\":\"'repositories' (plural) Not supported. Please pick one as the 'repository' field\",\"missingRepository\":\"No repository field.\",\"brokenGitUrl\":\"Probably broken git url: %s\",\"nonObjectScripts\":\"scripts must be an object\",\"nonStringScript\":\"script values must be string commands\",\"nonArrayFiles\":\"Invalid 'files' member\",\"invalidFilename\":\"Invalid filename in 'files' list: %s\",\"nonArrayBundleDependencies\":\"Invalid 'bundleDependencies' list. Must be array of package names\",\"nonStringBundleDependency\":\"Invalid bundleDependencies member: %s\",\"nonDependencyBundleDependency\":\"Non-dependency in bundleDependencies: %s\",\"nonObjectDependencies\":\"%s field must be an object\",\"nonStringDependency\":\"Invalid dependency: %s %s\",\"deprecatedArrayDependencies\":\"specifying %s as array is deprecated\",\"deprecatedModules\":\"modules field is deprecated\",\"nonArrayKeywords\":\"keywords should be an array of strings\",\"nonStringKeyword\":\"keywords should be an array of strings\",\"conflictingName\":\"%s is also the name of a node core module.\",\"nonStringDescription\":\"'description' field should be a string\",\"missingDescription\":\"No description\",\"missingReadme\":\"No README data\",\"missingLicense\":\"No license field.\",\"nonEmailUrlBugsString\":\"Bug string field must be url, email, or {email,url}\",\"nonUrlBugsUrlField\":\"bugs.url field must be a string url. Deleted.\",\"nonEmailBugsEmailField\":\"bugs.email field must be a string email. Deleted.\",\"emptyNormalizedBugs\":\"Normalized value of bugs field is an empty object. Deleted.\",\"nonUrlHomepage\":\"homepage field must be a string url. Deleted.\",\"invalidLicense\":\"license should be a valid SPDX license expression\",\"typo\":\"%s should probably be %s.\"}"); + +/***/ }), +/* 213 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const path = __webpack_require__(4); +const writeJsonFile = __webpack_require__(214); +const sortKeys = __webpack_require__(228); + +const dependencyKeys = new Set([ + 'dependencies', + 'devDependencies', + 'optionalDependencies', + 'peerDependencies' +]); + +function normalize(packageJson) { + const result = {}; + + for (const key of Object.keys(packageJson)) { + if (!dependencyKeys.has(key)) { + result[key] = packageJson[key]; + } else if (Object.keys(packageJson[key]).length !== 0) { + result[key] = sortKeys(packageJson[key]); + } + } + + return result; +} + +module.exports = async (filePath, data, options) => { + if (typeof filePath !== 'string') { + options = data; + data = filePath; + filePath = '.'; + } + + options = { + normalize: true, + ...options, + detectIndent: true + }; + + filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); + + data = options.normalize ? normalize(data) : data; + + return writeJsonFile(filePath, data, options); +}; + +module.exports.sync = (filePath, data, options) => { + if (typeof filePath !== 'string') { + options = data; + data = filePath; + filePath = '.'; + } + + options = { + normalize: true, + ...options, + detectIndent: true + }; + + filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); + + data = options.normalize ? normalize(data) : data; + + writeJsonFile.sync(filePath, data, options); +}; + + +/***/ }), +/* 214 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const path = __webpack_require__(4); +const fs = __webpack_require__(215); +const writeFileAtomic = __webpack_require__(219); +const sortKeys = __webpack_require__(228); +const makeDir = __webpack_require__(230); +const pify = __webpack_require__(231); +const detectIndent = __webpack_require__(232); + +const init = (fn, filePath, data, options) => { + if (!filePath) { + throw new TypeError('Expected a filepath'); + } + + if (data === undefined) { + throw new TypeError('Expected data to stringify'); + } + + options = Object.assign({ + indent: '\t', + sortKeys: false + }, options); + + if (options.sortKeys) { + data = sortKeys(data, { + deep: true, + compare: typeof options.sortKeys === 'function' ? options.sortKeys : undefined + }); + } + + return fn(filePath, data, options); +}; + +const readFile = filePath => pify(fs.readFile)(filePath, 'utf8').catch(() => {}); + +const main = (filePath, data, options) => { + return (options.detectIndent ? readFile(filePath) : Promise.resolve()) + .then(string => { + const indent = string ? detectIndent(string).indent : options.indent; + const json = JSON.stringify(data, options.replacer, indent); + + return pify(writeFileAtomic)(filePath, `${json}\n`, {mode: options.mode}); + }); +}; + +const mainSync = (filePath, data, options) => { + let {indent} = options; + + if (options.detectIndent) { + try { + const file = fs.readFileSync(filePath, 'utf8'); + indent = detectIndent(file).indent; + } catch (error) { + if (error.code !== 'ENOENT') { + throw error; + } + } + } + + const json = JSON.stringify(data, options.replacer, indent); + + return writeFileAtomic.sync(filePath, `${json}\n`, {mode: options.mode}); +}; + +const writeJsonFile = (filePath, data, options) => { + return makeDir(path.dirname(filePath), {fs}) + .then(() => init(main, filePath, data, options)); +}; + +module.exports = writeJsonFile; +// TODO: Remove this for the next major release +module.exports.default = writeJsonFile; +module.exports.sync = (filePath, data, options) => { + makeDir.sync(path.dirname(filePath), {fs}); + init(mainSync, filePath, data, options); +}; + + +/***/ }), +/* 215 */ +/***/ (function(module, exports, __webpack_require__) { + +var fs = __webpack_require__(133) +var polyfills = __webpack_require__(216) +var legacy = __webpack_require__(217) +var clone = __webpack_require__(218) + +var queue = [] + +var util = __webpack_require__(111) + +function noop () {} + +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) + } + +if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(queue) + __webpack_require__(139).equal(queue.length, 0) + }) +} + +module.exports = patch(clone(fs)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { + module.exports = patch(fs) + fs.__patched = true; +} + +// Always patch fs.close/closeSync, because we want to +// retry() whenever a close happens *anywhere* in the program. +// This is essential when multiple graceful-fs instances are +// in play at the same time. +module.exports.close = (function (fs$close) { return function (fd, cb) { + return fs$close.call(fs, fd, function (err) { + if (!err) + retry() + + if (typeof cb === 'function') + cb.apply(this, arguments) + }) +}})(fs.close) + +module.exports.closeSync = (function (fs$closeSync) { return function (fd) { + // Note that graceful-fs also retries when fs.closeSync() fails. + // Looks like a bug to me, although it's probably a harmless one. + var rval = fs$closeSync.apply(fs, arguments) + retry() + return rval +}})(fs.closeSync) + +// Only patch fs once, otherwise we'll run into a memory leak if +// graceful-fs is loaded multiple times, such as in test environments that +// reset the loaded modules between tests. +// We look for the string `graceful-fs` from the comment above. This +// way we are not adding any extra properties and it will detect if older +// versions of graceful-fs are installed. +if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { + fs.closeSync = module.exports.closeSync; + fs.close = module.exports.close; +} + +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch + fs.FileReadStream = ReadStream; // Legacy name. + fs.FileWriteStream = WriteStream; // Legacy name. + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$readFile(path, options, cb) + + function go$readFile (path, options, cb) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$writeFile(path, data, options, cb) + + function go$writeFile (path, data, options, cb) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$appendFile(path, data, options, cb) + + function go$appendFile (path, data, options, cb) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$readdir = fs.readdir + fs.readdir = readdir + function readdir (path, options, cb) { + var args = [path] + if (typeof options !== 'function') { + args.push(options) + } else { + cb = options + } + args.push(go$readdir$cb) + + return go$readdir(args) + + function go$readdir$cb (err, files) { + if (files && files.sort) + files.sort() + + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readdir, [args]]) + + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + } + } + + function go$readdir (args) { + return fs$readdir.apply(fs, args) + } + + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } + + var fs$ReadStream = fs.ReadStream + if (fs$ReadStream) { + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + } + + var fs$WriteStream = fs.WriteStream + if (fs$WriteStream) { + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + } + + fs.ReadStream = ReadStream + fs.WriteStream = WriteStream + + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) + } + + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() + + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) + } + + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) + } + + function WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + } + }) + } + + function createReadStream (path, options) { + return new ReadStream(path, options) + } -if (true) { -exports.parser = spdxparse; -exports.Parser = spdxparse.Parser; -exports.parse = function () { return spdxparse.parse.apply(spdxparse, arguments); }; -exports.main = function commonjsMain(args) { - if (!args[1]) { - console.log('Usage: '+args[0]+' FILE'); - process.exit(1); + function createWriteStream (path, options) { + return new WriteStream(path, options) + } + + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null + + return go$open(path, flags, mode, cb) + + function go$open (path, flags, mode, cb) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) } - var source = __webpack_require__(132).readFileSync(__webpack_require__(4).normalize(args[1]), "utf8"); - return exports.parser.parse(source); -}; -if ( true && __webpack_require__.c[__webpack_require__.s] === module) { - exports.main(process.argv.slice(1)); + } + + return fs +} + +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + queue.push(elem) } + +function retry () { + var elem = queue.shift() + if (elem) { + debug('RETRY', elem[0].name, elem[1]) + elem[0].apply(null, elem[1]) + } } -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(115)(module))) /***/ }), -/* 186 */ +/* 216 */ /***/ (function(module, exports, __webpack_require__) { -var licenseIDs = __webpack_require__(187); +var constants = __webpack_require__(135) -function valid(string) { - return licenseIDs.indexOf(string) > -1; +var origCwd = process.cwd +var cwd = null + +var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform + +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd } +try { + process.cwd() +} catch (er) {} -// Common transpositions of license identifier acronyms -var transpositions = [ - ['APGL', 'AGPL'], - ['Gpl', 'GPL'], - ['GLP', 'GPL'], - ['APL', 'Apache'], - ['ISD', 'ISC'], - ['GLP', 'GPL'], - ['IST', 'ISC'], - ['Claude', 'Clause'], - [' or later', '+'], - [' International', ''], - ['GNU', 'GPL'], - ['GUN', 'GPL'], - ['+', ''], - ['GNU GPL', 'GPL'], - ['GNU/GPL', 'GPL'], - ['GNU GLP', 'GPL'], - ['GNU General Public License', 'GPL'], - ['Gnu public license', 'GPL'], - ['GNU Public License', 'GPL'], - ['GNU GENERAL PUBLIC LICENSE', 'GPL'], - ['MTI', 'MIT'], - ['Mozilla Public License', 'MPL'], - ['WTH', 'WTF'], - ['-License', ''] -]; +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} -var TRANSPOSED = 0; -var CORRECT = 1; +module.exports = patch -// Simple corrections to nearly valid identifiers. -var transforms = [ - // e.g. 'mit' - function(argument) { - return argument.toUpperCase(); - }, - // e.g. 'MIT ' - function(argument) { - return argument.trim(); - }, - // e.g. 'M.I.T.' - function(argument) { - return argument.replace(/\./g, ''); - }, - // e.g. 'Apache- 2.0' - function(argument) { - return argument.replace(/\s+/g, ''); - }, - // e.g. 'CC BY 4.0'' - function(argument) { - return argument.replace(/\s+/g, '-'); - }, - // e.g. 'LGPLv2.1' - function(argument) { - return argument.replace('v', '-'); - }, - // e.g. 'Apache 2.0' - function(argument) { - return argument.replace(/,?\s*(\d)/, '-$1'); - }, - // e.g. 'GPL 2' - function(argument) { - return argument.replace(/,?\s*(\d)/, '-$1.0'); - }, - // e.g. 'Apache Version 2.0' - function(argument) { - return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2'); - }, - // e.g. 'Apache Version 2' - function(argument) { - return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0'); - }, - // e.g. 'ZLIB' - function(argument) { - return argument[0].toUpperCase() + argument.slice(1); - }, - // e.g. 'MPL/2.0' - function(argument) { - return argument.replace('/', '-'); - }, - // e.g. 'Apache 2' - function(argument) { - return argument - .replace(/\s*V\s*(\d)/, '-$1') - .replace(/(\d)$/, '$1.0'); - }, - // e.g. 'GPL-2.0-' - function(argument) { - return argument.slice(0, argument.length - 1); - }, - // e.g. 'GPL2' - function(argument) { - return argument.replace(/(\d)$/, '-$1.0'); - }, - // e.g. 'BSD 3' - function(argument) { - return argument.replace(/(-| )?(\d)$/, '-$2-Clause'); - }, - // e.g. 'BSD clause 3' - function(argument) { - return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause'); - }, - // e.g. 'BY-NC-4.0' - function(argument) { - return 'CC-' + argument; - }, - // e.g. 'BY-NC' - function(argument) { - return 'CC-' + argument + '-4.0'; - }, - // e.g. 'Attribution-NonCommercial' - function(argument) { - return argument - .replace('Attribution', 'BY') - .replace('NonCommercial', 'NC') - .replace('NoDerivatives', 'ND') - .replace(/ (\d)/, '-$1') - .replace(/ ?International/, ''); - }, - // e.g. 'Attribution-NonCommercial' - function(argument) { - return 'CC-' + - argument - .replace('Attribution', 'BY') - .replace('NonCommercial', 'NC') - .replace('NoDerivatives', 'ND') - .replace(/ (\d)/, '-$1') - .replace(/ ?International/, '') + - '-4.0'; +function patch (fs) { + // (re-)implement some things that are known busted or missing. + + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) } -]; -// If all else fails, guess that strings containing certain substrings -// meant to identify certain licenses. -var lastResorts = [ - ['UNLI', 'Unlicense'], - ['WTF', 'WTFPL'], - ['2 CLAUSE', 'BSD-2-Clause'], - ['2-CLAUSE', 'BSD-2-Clause'], - ['3 CLAUSE', 'BSD-3-Clause'], - ['3-CLAUSE', 'BSD-3-Clause'], - ['AFFERO', 'AGPL-3.0'], - ['AGPL', 'AGPL-3.0'], - ['APACHE', 'Apache-2.0'], - ['ARTISTIC', 'Artistic-2.0'], - ['Affero', 'AGPL-3.0'], - ['BEER', 'Beerware'], - ['BOOST', 'BSL-1.0'], - ['BSD', 'BSD-2-Clause'], - ['ECLIPSE', 'EPL-1.0'], - ['FUCK', 'WTFPL'], - ['GNU', 'GPL-3.0'], - ['LGPL', 'LGPL-3.0'], - ['GPL', 'GPL-3.0'], - ['MIT', 'MIT'], - ['MPL', 'MPL-2.0'], - ['X11', 'X11'], - ['ZLIB', 'Zlib'] -]; + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) + } -var SUBSTRING = 0; -var IDENTIFIER = 1; + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. -var validTransformation = function(identifier) { - for (var i = 0; i < transforms.length; i++) { - var transformed = transforms[i](identifier); - if (transformed !== identifier && valid(transformed)) { - return transformed; + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) + + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) + + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) + + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) + + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) + + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) + + // if lchmod/lchown do not exist, then make them no-ops + if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) } + fs.lchmodSync = function () {} + } + if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) + } + fs.lchownSync = function () {} } - return null; -}; -var validLastResort = function(identifier) { - var upperCased = identifier.toUpperCase(); - for (var i = 0; i < lastResorts.length; i++) { - var lastResort = lastResorts[i]; - if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) { - return lastResort[IDENTIFIER]; + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 60 seconds. + + // Set the timeout this long because some Windows Anti-Virus, such as Parity + // bit9, may lock files for up to a minute, causing npm package install + // failures. Also, take care to yield the scheduler. Windows scheduling gives + // CPU to a busy looping process, which can cause the program causing the lock + // contention to be starved of CPU by node, so the contention doesn't resolve. + if (platform === "win32") { + fs.rename = (function (fs$rename) { return function (from, to, cb) { + var start = Date.now() + var backoff = 0; + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function (stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er) + }) + }, backoff) + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er) + }) + }})(fs.rename) + } + + // if read() returns EAGAIN, then just try it again. + fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + }})(fs.read) + + fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } + }})(fs.readSync) + + function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } + + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret } } - return null; -}; -var anyCorrection = function(identifier, check) { - for (var i = 0; i < transpositions.length; i++) { - var transposition = transpositions[i]; - var transposed = transposition[TRANSPOSED]; - if (identifier.indexOf(transposed) > -1) { - var corrected = identifier.replace( - transposed, - transposition[CORRECT] - ); - var checked = check(corrected); - if (checked !== null) { - return checked; + function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } + + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } + + } else { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} + } + } + + function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } + } + + function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } + } + } + + + function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } + } + + function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er } } } - return null; -}; -module.exports = function(identifier) { - identifier = identifier.replace(/\+$/, ''); - if (valid(identifier)) { - return identifier; - } - var transformed = validTransformation(identifier); - if (transformed !== null) { - return transformed; - } - transformed = anyCorrection(identifier, function(argument) { - if (valid(argument)) { - return argument; + + function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, cb) { + return orig.call(fs, target, function (er, stats) { + if (!stats) return cb.apply(this, arguments) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + if (cb) cb.apply(this, arguments) + }) + } + } + + function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target) { + var stats = orig.call(fs, target) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + return stats; } - return validTransformation(argument); - }); - if (transformed !== null) { - return transformed; - } - transformed = validLastResort(identifier); - if (transformed !== null) { - return transformed; - } - transformed = anyCorrection(identifier, validLastResort); - if (transformed !== null) { - return transformed; } - return null; -}; + // ENOSYS means that the fs doesn't support the op. Just ignore + // that, because it doesn't matter. + // + // if there's no getuid, or if getuid() is something other + // than 0, and the error is EINVAL or EPERM, then just ignore + // it. + // + // This specific case is a silent failure in cp, install, tar, + // and most other unix tools that manage permissions. + // + // When running as root, or if other types of errors are + // encountered, then it's strict. + function chownErOk (er) { + if (!er) + return true -/***/ }), -/* 187 */ -/***/ (function(module) { + if (er.code === "ENOSYS") + return true + + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } + + return false + } +} -module.exports = JSON.parse("[\"Glide\",\"Abstyles\",\"AFL-1.1\",\"AFL-1.2\",\"AFL-2.0\",\"AFL-2.1\",\"AFL-3.0\",\"AMPAS\",\"APL-1.0\",\"Adobe-Glyph\",\"APAFML\",\"Adobe-2006\",\"AGPL-1.0\",\"Afmparse\",\"Aladdin\",\"ADSL\",\"AMDPLPA\",\"ANTLR-PD\",\"Apache-1.0\",\"Apache-1.1\",\"Apache-2.0\",\"AML\",\"APSL-1.0\",\"APSL-1.1\",\"APSL-1.2\",\"APSL-2.0\",\"Artistic-1.0\",\"Artistic-1.0-Perl\",\"Artistic-1.0-cl8\",\"Artistic-2.0\",\"AAL\",\"Bahyph\",\"Barr\",\"Beerware\",\"BitTorrent-1.0\",\"BitTorrent-1.1\",\"BSL-1.0\",\"Borceux\",\"BSD-2-Clause\",\"BSD-2-Clause-FreeBSD\",\"BSD-2-Clause-NetBSD\",\"BSD-3-Clause\",\"BSD-3-Clause-Clear\",\"BSD-4-Clause\",\"BSD-Protection\",\"BSD-Source-Code\",\"BSD-3-Clause-Attribution\",\"0BSD\",\"BSD-4-Clause-UC\",\"bzip2-1.0.5\",\"bzip2-1.0.6\",\"Caldera\",\"CECILL-1.0\",\"CECILL-1.1\",\"CECILL-2.0\",\"CECILL-2.1\",\"CECILL-B\",\"CECILL-C\",\"ClArtistic\",\"MIT-CMU\",\"CNRI-Jython\",\"CNRI-Python\",\"CNRI-Python-GPL-Compatible\",\"CPOL-1.02\",\"CDDL-1.0\",\"CDDL-1.1\",\"CPAL-1.0\",\"CPL-1.0\",\"CATOSL-1.1\",\"Condor-1.1\",\"CC-BY-1.0\",\"CC-BY-2.0\",\"CC-BY-2.5\",\"CC-BY-3.0\",\"CC-BY-4.0\",\"CC-BY-ND-1.0\",\"CC-BY-ND-2.0\",\"CC-BY-ND-2.5\",\"CC-BY-ND-3.0\",\"CC-BY-ND-4.0\",\"CC-BY-NC-1.0\",\"CC-BY-NC-2.0\",\"CC-BY-NC-2.5\",\"CC-BY-NC-3.0\",\"CC-BY-NC-4.0\",\"CC-BY-NC-ND-1.0\",\"CC-BY-NC-ND-2.0\",\"CC-BY-NC-ND-2.5\",\"CC-BY-NC-ND-3.0\",\"CC-BY-NC-ND-4.0\",\"CC-BY-NC-SA-1.0\",\"CC-BY-NC-SA-2.0\",\"CC-BY-NC-SA-2.5\",\"CC-BY-NC-SA-3.0\",\"CC-BY-NC-SA-4.0\",\"CC-BY-SA-1.0\",\"CC-BY-SA-2.0\",\"CC-BY-SA-2.5\",\"CC-BY-SA-3.0\",\"CC-BY-SA-4.0\",\"CC0-1.0\",\"Crossword\",\"CrystalStacker\",\"CUA-OPL-1.0\",\"Cube\",\"curl\",\"D-FSL-1.0\",\"diffmark\",\"WTFPL\",\"DOC\",\"Dotseqn\",\"DSDP\",\"dvipdfm\",\"EPL-1.0\",\"ECL-1.0\",\"ECL-2.0\",\"eGenix\",\"EFL-1.0\",\"EFL-2.0\",\"MIT-advertising\",\"MIT-enna\",\"Entessa\",\"ErlPL-1.1\",\"EUDatagrid\",\"EUPL-1.0\",\"EUPL-1.1\",\"Eurosym\",\"Fair\",\"MIT-feh\",\"Frameworx-1.0\",\"FreeImage\",\"FTL\",\"FSFAP\",\"FSFUL\",\"FSFULLR\",\"Giftware\",\"GL2PS\",\"Glulxe\",\"AGPL-3.0\",\"GFDL-1.1\",\"GFDL-1.2\",\"GFDL-1.3\",\"GPL-1.0\",\"GPL-2.0\",\"GPL-3.0\",\"LGPL-2.1\",\"LGPL-3.0\",\"LGPL-2.0\",\"gnuplot\",\"gSOAP-1.3b\",\"HaskellReport\",\"HPND\",\"IBM-pibs\",\"IPL-1.0\",\"ICU\",\"ImageMagick\",\"iMatix\",\"Imlib2\",\"IJG\",\"Info-ZIP\",\"Intel-ACPI\",\"Intel\",\"Interbase-1.0\",\"IPA\",\"ISC\",\"JasPer-2.0\",\"JSON\",\"LPPL-1.0\",\"LPPL-1.1\",\"LPPL-1.2\",\"LPPL-1.3a\",\"LPPL-1.3c\",\"Latex2e\",\"BSD-3-Clause-LBNL\",\"Leptonica\",\"LGPLLR\",\"Libpng\",\"libtiff\",\"LAL-1.2\",\"LAL-1.3\",\"LiLiQ-P-1.1\",\"LiLiQ-Rplus-1.1\",\"LiLiQ-R-1.1\",\"LPL-1.02\",\"LPL-1.0\",\"MakeIndex\",\"MTLL\",\"MS-PL\",\"MS-RL\",\"MirOS\",\"MITNFA\",\"MIT\",\"Motosoto\",\"MPL-1.0\",\"MPL-1.1\",\"MPL-2.0\",\"MPL-2.0-no-copyleft-exception\",\"mpich2\",\"Multics\",\"Mup\",\"NASA-1.3\",\"Naumen\",\"NBPL-1.0\",\"NetCDF\",\"NGPL\",\"NOSL\",\"NPL-1.0\",\"NPL-1.1\",\"Newsletr\",\"NLPL\",\"Nokia\",\"NPOSL-3.0\",\"NLOD-1.0\",\"Noweb\",\"NRL\",\"NTP\",\"Nunit\",\"OCLC-2.0\",\"ODbL-1.0\",\"PDDL-1.0\",\"OCCT-PL\",\"OGTSL\",\"OLDAP-2.2.2\",\"OLDAP-1.1\",\"OLDAP-1.2\",\"OLDAP-1.3\",\"OLDAP-1.4\",\"OLDAP-2.0\",\"OLDAP-2.0.1\",\"OLDAP-2.1\",\"OLDAP-2.2\",\"OLDAP-2.2.1\",\"OLDAP-2.3\",\"OLDAP-2.4\",\"OLDAP-2.5\",\"OLDAP-2.6\",\"OLDAP-2.7\",\"OLDAP-2.8\",\"OML\",\"OPL-1.0\",\"OSL-1.0\",\"OSL-1.1\",\"OSL-2.0\",\"OSL-2.1\",\"OSL-3.0\",\"OpenSSL\",\"OSET-PL-2.1\",\"PHP-3.0\",\"PHP-3.01\",\"Plexus\",\"PostgreSQL\",\"psfrag\",\"psutils\",\"Python-2.0\",\"QPL-1.0\",\"Qhull\",\"Rdisc\",\"RPSL-1.0\",\"RPL-1.1\",\"RPL-1.5\",\"RHeCos-1.1\",\"RSCPL\",\"RSA-MD\",\"Ruby\",\"SAX-PD\",\"Saxpath\",\"SCEA\",\"SWL\",\"SMPPL\",\"Sendmail\",\"SGI-B-1.0\",\"SGI-B-1.1\",\"SGI-B-2.0\",\"OFL-1.0\",\"OFL-1.1\",\"SimPL-2.0\",\"Sleepycat\",\"SNIA\",\"Spencer-86\",\"Spencer-94\",\"Spencer-99\",\"SMLNJ\",\"SugarCRM-1.1.3\",\"SISSL\",\"SISSL-1.2\",\"SPL-1.0\",\"Watcom-1.0\",\"TCL\",\"Unlicense\",\"TMate\",\"TORQUE-1.1\",\"TOSL\",\"Unicode-TOU\",\"UPL-1.0\",\"NCSA\",\"Vim\",\"VOSTROM\",\"VSL-1.0\",\"W3C-19980720\",\"W3C\",\"Wsuipa\",\"Xnet\",\"X11\",\"Xerox\",\"XFree86-1.1\",\"xinetd\",\"xpp\",\"XSkat\",\"YPL-1.0\",\"YPL-1.1\",\"Zed\",\"Zend-2.0\",\"Zimbra-1.3\",\"Zimbra-1.4\",\"Zlib\",\"zlib-acknowledgement\",\"ZPL-1.1\",\"ZPL-2.0\",\"ZPL-2.1\",\"BSD-3-Clause-No-Nuclear-License\",\"BSD-3-Clause-No-Nuclear-Warranty\",\"BSD-3-Clause-No-Nuclear-License-2014\",\"eCos-2.0\",\"GPL-2.0-with-autoconf-exception\",\"GPL-2.0-with-bison-exception\",\"GPL-2.0-with-classpath-exception\",\"GPL-2.0-with-font-exception\",\"GPL-2.0-with-GCC-exception\",\"GPL-3.0-with-autoconf-exception\",\"GPL-3.0-with-GCC-exception\",\"StandardML-NJ\",\"WXwindows\"]"); /***/ }), -/* 188 */ +/* 217 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var Stream = __webpack_require__(137).Stream -var url = __webpack_require__(189) -var gitHosts = __webpack_require__(190) -var GitHost = module.exports = __webpack_require__(191) +module.exports = legacy -var protocolToRepresentationMap = { - 'git+ssh': 'sshurl', - 'git+https': 'https', - 'ssh': 'sshurl', - 'git': 'git' -} +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream + } -function protocolToRepresentation (protocol) { - if (protocol.substr(-1) === ':') protocol = protocol.slice(0, -1) - return protocolToRepresentationMap[protocol] || protocol -} + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); -var authProtocols = { - 'git:': true, - 'https:': true, - 'git+https:': true, - 'http:': true, - 'git+http:': true -} + Stream.call(this); -var cache = {} + var self = this; -module.exports.fromUrl = function (giturl, opts) { - var key = giturl + JSON.stringify(opts || {}) + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; - if (!(key in cache)) { - cache[key] = fromUrl(giturl, opts) - } + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; - return cache[key] -} + options = options || {}; -function fromUrl (giturl, opts) { - if (giturl == null || giturl === '') return - var url = fixupUnqualifiedGist( - isGitHubShorthand(giturl) ? 'github:' + giturl : giturl - ) - var parsed = parseGitUrl(url) - var shortcutMatch = url.match(new RegExp('^([^:]+):(?:(?:[^@:]+(?:[^@]+)?@)?([^/]*))[/](.+?)(?:[.]git)?($|#)')) - var matches = Object.keys(gitHosts).map(function (gitHostName) { - try { - var gitHostInfo = gitHosts[gitHostName] - var auth = null - if (parsed.auth && authProtocols[parsed.protocol]) { - auth = decodeURIComponent(parsed.auth) + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + + if (this.encoding) this.setEncoding(this.encoding); + + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); } - var committish = parsed.hash ? decodeURIComponent(parsed.hash.substr(1)) : null - var user = null - var project = null - var defaultRepresentation = null - if (shortcutMatch && shortcutMatch[1] === gitHostName) { - user = shortcutMatch[2] && decodeURIComponent(shortcutMatch[2]) - project = decodeURIComponent(shortcutMatch[3]) - defaultRepresentation = 'shortcut' - } else { - if (parsed.host !== gitHostInfo.domain) return - if (!gitHostInfo.protocols_re.test(parsed.protocol)) return - if (!parsed.path) return - var pathmatch = gitHostInfo.pathmatch - var matched = parsed.path.match(pathmatch) - if (!matched) return - if (matched[1] != null) user = decodeURIComponent(matched[1].replace(/^:/, '')) - if (matched[2] != null) project = decodeURIComponent(matched[2]) - defaultRepresentation = protocolToRepresentation(parsed.protocol) + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); } - return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts) - } catch (ex) { - if (!(ex instanceof URIError)) throw ex + + if (this.start > this.end) { + throw new Error('start must be <= end'); + } + + this.pos = this.start; } - }).filter(function (gitHostInfo) { return gitHostInfo }) - if (matches.length !== 1) return - return matches[0] -} -function isGitHubShorthand (arg) { - // Note: This does not fully test the git ref format. - // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html - // - // The only way to do this properly would be to shell out to - // git-check-ref-format, and as this is a fast sync function, - // we don't want to do that. Just let git fail if it turns - // out that the commit-ish is invalid. - // GH usernames cannot start with . or - - return /^[^:@%/\s.-][^:@%/\s]*[/][^:@\s/%]+(?:#.*)?$/.test(arg) -} + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } -function fixupUnqualifiedGist (giturl) { - // necessary for round-tripping gists - var parsed = url.parse(giturl) - if (parsed.protocol === 'gist:' && parsed.host && !parsed.path) { - return parsed.protocol + '/' + parsed.host - } else { - return giturl + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } + + self.fd = fd; + self.emit('open', fd); + self._read(); + }) } -} -function parseGitUrl (giturl) { - if (typeof giturl !== 'string') giturl = '' + giturl - var matched = giturl.match(/^([^@]+)@([^:/]+):[/]?((?:[^/]+[/])?[^/]+?)(?:[.]git)?(#.*)?$/) - if (!matched) return url.parse(giturl) - return { - protocol: 'git+ssh:', - slashes: true, - auth: matched[1], - host: matched[2], - port: null, - hostname: matched[2], - hash: matched[4], - search: null, - query: null, - pathname: '/' + matched[3], - path: '/' + matched[3], - href: 'git+ssh://' + matched[1] + '@' + matched[2] + - '/' + matched[3] + (matched[4] || '') + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); + + Stream.call(this); + + this.path = path; + this.fd = null; + this.writable = true; + + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; + + options = options || {}; + + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); + } + + this.pos = this.start; + } + + this.busy = false; + this._queue = []; + + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); + } } } /***/ }), -/* 189 */ -/***/ (function(module, exports) { +/* 218 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = clone + +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj + + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) + + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) + + return copy +} -module.exports = require("url"); /***/ }), -/* 190 */ +/* 219 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +module.exports = writeFile +module.exports.sync = writeFileSync +module.exports._getTmpname = getTmpname // for testing +module.exports._cleanupOnExit = cleanupOnExit -var gitHosts = module.exports = { - github: { - // First two are insecure and generally shouldn't be used any more, but - // they are still supported. - 'protocols': [ 'git', 'http', 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'github.com', - 'treepath': 'tree', - 'filetemplate': 'https://{auth@}raw.githubusercontent.com/{user}/{project}/{committish}/{path}', - 'bugstemplate': 'https://{domain}/{user}/{project}/issues', - 'gittemplate': 'git://{auth@}{domain}/{user}/{project}.git{#committish}', - 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' - }, - bitbucket: { - 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'bitbucket.org', - 'treepath': 'src', - 'tarballtemplate': 'https://{domain}/{user}/{project}/get/{committish}.tar.gz' - }, - gitlab: { - 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'gitlab.com', - 'treepath': 'tree', - 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#README', - 'bugstemplate': 'https://{domain}/{user}/{project}/issues', - 'tarballtemplate': 'https://{domain}/{user}/{project}/repository/archive.tar.gz?ref={committish}' - }, - gist: { - 'protocols': [ 'git', 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'gist.github.com', - 'pathmatch': /^[/](?:([^/]+)[/])?([a-z0-9]+)(?:[.]git)?$/, - 'filetemplate': 'https://gist.githubusercontent.com/{user}/{project}/raw{/committish}/{path}', - 'bugstemplate': 'https://{domain}/{project}', - 'gittemplate': 'git://{domain}/{project}.git{#committish}', - 'sshtemplate': 'git@{domain}:/{project}.git{#committish}', - 'sshurltemplate': 'git+ssh://git@{domain}/{project}.git{#committish}', - 'browsetemplate': 'https://{domain}/{project}{/committish}', - 'docstemplate': 'https://{domain}/{project}{/committish}', - 'httpstemplate': 'git+https://{domain}/{project}.git{#committish}', - 'shortcuttemplate': '{type}:{project}{#committish}', - 'pathtemplate': '{project}{#committish}', - 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' +var fs = __webpack_require__(220) +var MurmurHash3 = __webpack_require__(224) +var onExit = __webpack_require__(225) +var path = __webpack_require__(4) +var activeFiles = {} + +// if we run inside of a worker_thread, `process.pid` is not unique +/* istanbul ignore next */ +var threadId = (function getId () { + try { + var workerThreads = __webpack_require__(227) + + /// if we are in main thread, this is set to `0` + return workerThreads.threadId + } catch (e) { + // worker_threads are not available, fallback to 0 + return 0 } -} +})() -var gitHostDefaults = { - 'sshtemplate': 'git@{domain}:{user}/{project}.git{#committish}', - 'sshurltemplate': 'git+ssh://git@{domain}/{user}/{project}.git{#committish}', - 'browsetemplate': 'https://{domain}/{user}/{project}{/tree/committish}', - 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#readme', - 'httpstemplate': 'git+https://{auth@}{domain}/{user}/{project}.git{#committish}', - 'filetemplate': 'https://{domain}/{user}/{project}/raw/{committish}/{path}', - 'shortcuttemplate': '{type}:{user}/{project}{#committish}', - 'pathtemplate': '{user}/{project}{#committish}', - 'pathmatch': /^[/]([^/]+)[/]([^/]+?)(?:[.]git|[/])?$/ +var invocations = 0 +function getTmpname (filename) { + return filename + '.' + + MurmurHash3(__filename) + .hash(String(process.pid)) + .hash(String(threadId)) + .hash(String(++invocations)) + .result() } -Object.keys(gitHosts).forEach(function (name) { - Object.keys(gitHostDefaults).forEach(function (key) { - if (gitHosts[name][key]) return - gitHosts[name][key] = gitHostDefaults[key] - }) - gitHosts[name].protocols_re = RegExp('^(' + - gitHosts[name].protocols.map(function (protocol) { - return protocol.replace(/([\\+*{}()[\]$^|])/g, '\\$1') - }).join('|') + '):$') -}) +function cleanupOnExit (tmpfile) { + return function () { + try { + fs.unlinkSync(typeof tmpfile === 'function' ? tmpfile() : tmpfile) + } catch (_) {} + } +} +function writeFile (filename, data, options, callback) { + if (options) { + if (options instanceof Function) { + callback = options + options = {} + } else if (typeof options === 'string') { + options = { encoding: options } + } + } else { + options = {} + } -/***/ }), -/* 191 */ -/***/ (function(module, exports, __webpack_require__) { + var Promise = options.Promise || global.Promise + var truename + var fd + var tmpfile + /* istanbul ignore next -- The closure only gets called when onExit triggers */ + var removeOnExitHandler = onExit(cleanupOnExit(() => tmpfile)) + var absoluteName = path.resolve(filename) -"use strict"; + new Promise(function serializeSameFile (resolve) { + // make a queue if it doesn't already exist + if (!activeFiles[absoluteName]) activeFiles[absoluteName] = [] -var gitHosts = __webpack_require__(190) -var extend = Object.assign || __webpack_require__(111)._extend + activeFiles[absoluteName].push(resolve) // add this job to the queue + if (activeFiles[absoluteName].length === 1) resolve() // kick off the first one + }).then(function getRealPath () { + return new Promise(function (resolve) { + fs.realpath(filename, function (_, realname) { + truename = realname || filename + tmpfile = getTmpname(truename) + resolve() + }) + }) + }).then(function stat () { + return new Promise(function stat (resolve) { + if (options.mode && options.chown) resolve() + else { + // Either mode or chown is not explicitly set + // Default behavior is to copy it from original file + fs.stat(truename, function (err, stats) { + if (err || !stats) resolve() + else { + options = Object.assign({}, options) -var GitHost = module.exports = function (type, user, auth, project, committish, defaultRepresentation, opts) { - var gitHostInfo = this - gitHostInfo.type = type - Object.keys(gitHosts[type]).forEach(function (key) { - gitHostInfo[key] = gitHosts[type][key] + if (options.mode == null) { + options.mode = stats.mode + } + if (options.chown == null && process.getuid) { + options.chown = { uid: stats.uid, gid: stats.gid } + } + resolve() + } + }) + } + }) + }).then(function thenWriteFile () { + return new Promise(function (resolve, reject) { + fs.open(tmpfile, 'w', options.mode, function (err, _fd) { + fd = _fd + if (err) reject(err) + else resolve() + }) + }) + }).then(function write () { + return new Promise(function (resolve, reject) { + if (Buffer.isBuffer(data)) { + fs.write(fd, data, 0, data.length, 0, function (err) { + if (err) reject(err) + else resolve() + }) + } else if (data != null) { + fs.write(fd, String(data), 0, String(options.encoding || 'utf8'), function (err) { + if (err) reject(err) + else resolve() + }) + } else resolve() + }) + }).then(function syncAndClose () { + return new Promise(function (resolve, reject) { + if (options.fsync !== false) { + fs.fsync(fd, function (err) { + if (err) fs.close(fd, () => reject(err)) + else fs.close(fd, resolve) + }) + } else { + fs.close(fd, resolve) + } + }) + }).then(function chown () { + fd = null + if (options.chown) { + return new Promise(function (resolve, reject) { + fs.chown(tmpfile, options.chown.uid, options.chown.gid, function (err) { + if (err) reject(err) + else resolve() + }) + }) + } + }).then(function chmod () { + if (options.mode) { + return new Promise(function (resolve, reject) { + fs.chmod(tmpfile, options.mode, function (err) { + if (err) reject(err) + else resolve() + }) + }) + } + }).then(function rename () { + return new Promise(function (resolve, reject) { + fs.rename(tmpfile, truename, function (err) { + if (err) reject(err) + else resolve() + }) + }) + }).then(function success () { + removeOnExitHandler() + callback() + }, function fail (err) { + return new Promise(resolve => { + return fd ? fs.close(fd, resolve) : resolve() + }).then(() => { + removeOnExitHandler() + fs.unlink(tmpfile, function () { + callback(err) + }) + }) + }).then(function checkQueue () { + activeFiles[absoluteName].shift() // remove the element added by serializeSameFile + if (activeFiles[absoluteName].length > 0) { + activeFiles[absoluteName][0]() // start next job if one is pending + } else delete activeFiles[absoluteName] }) - gitHostInfo.user = user - gitHostInfo.auth = auth - gitHostInfo.project = project - gitHostInfo.committish = committish - gitHostInfo.default = defaultRepresentation - gitHostInfo.opts = opts || {} -} -GitHost.prototype = {} - -GitHost.prototype.hash = function () { - return this.committish ? '#' + this.committish : '' } -GitHost.prototype._fill = function (template, opts) { - if (!template) return - var vars = extend({}, opts) - opts = extend(extend({}, this.opts), opts) - var self = this - Object.keys(this).forEach(function (key) { - if (self[key] != null && vars[key] == null) vars[key] = self[key] - }) - var rawAuth = vars.auth - var rawComittish = vars.committish - Object.keys(vars).forEach(function (key) { - vars[key] = encodeURIComponent(vars[key]) - }) - vars['auth@'] = rawAuth ? rawAuth + '@' : '' - if (opts.noCommittish) { - vars['#committish'] = '' - vars['/tree/committish'] = '' - vars['/comittish'] = '' - vars.comittish = '' - } else { - vars['#committish'] = rawComittish ? '#' + rawComittish : '' - vars['/tree/committish'] = vars.committish - ? '/' + vars.treepath + '/' + vars.committish - : '' - vars['/committish'] = vars.committish ? '/' + vars.committish : '' - vars.committish = vars.committish || 'master' - } - var res = template - Object.keys(vars).forEach(function (key) { - res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key]) - }) - if (opts.noGitPlus) { - return res.replace(/^git[+]/, '') - } else { - return res +function writeFileSync (filename, data, options) { + if (typeof options === 'string') options = { encoding: options } + else if (!options) options = {} + try { + filename = fs.realpathSync(filename) + } catch (ex) { + // it's ok, it'll happen on a not yet existing file } -} - -GitHost.prototype.ssh = function (opts) { - return this._fill(this.sshtemplate, opts) -} - -GitHost.prototype.sshurl = function (opts) { - return this._fill(this.sshurltemplate, opts) -} + var tmpfile = getTmpname(filename) -GitHost.prototype.browse = function (opts) { - return this._fill(this.browsetemplate, opts) -} + if (!options.mode || !options.chown) { + // Either mode or chown is not explicitly set + // Default behavior is to copy it from original file + try { + var stats = fs.statSync(filename) + options = Object.assign({}, options) + if (!options.mode) { + options.mode = stats.mode + } + if (!options.chown && process.getuid) { + options.chown = { uid: stats.uid, gid: stats.gid } + } + } catch (ex) { + // ignore stat errors + } + } -GitHost.prototype.docs = function (opts) { - return this._fill(this.docstemplate, opts) -} + var fd + var cleanup = cleanupOnExit(tmpfile) + var removeOnExitHandler = onExit(cleanup) -GitHost.prototype.bugs = function (opts) { - return this._fill(this.bugstemplate, opts) + try { + fd = fs.openSync(tmpfile, 'w', options.mode) + if (Buffer.isBuffer(data)) { + fs.writeSync(fd, data, 0, data.length, 0) + } else if (data != null) { + fs.writeSync(fd, String(data), 0, String(options.encoding || 'utf8')) + } + if (options.fsync !== false) { + fs.fsyncSync(fd) + } + fs.closeSync(fd) + if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid) + if (options.mode) fs.chmodSync(tmpfile, options.mode) + fs.renameSync(tmpfile, filename) + removeOnExitHandler() + } catch (err) { + if (fd) { + try { + fs.closeSync(fd) + } catch (ex) { + // ignore close errors at this stage, error may have closed fd already. + } + } + removeOnExitHandler() + cleanup() + throw err + } } -GitHost.prototype.https = function (opts) { - return this._fill(this.httpstemplate, opts) -} -GitHost.prototype.git = function (opts) { - return this._fill(this.gittemplate, opts) -} +/***/ }), +/* 220 */ +/***/ (function(module, exports, __webpack_require__) { -GitHost.prototype.shortcut = function (opts) { - return this._fill(this.shortcuttemplate, opts) -} +var fs = __webpack_require__(133) +var polyfills = __webpack_require__(221) +var legacy = __webpack_require__(223) +var queue = [] -GitHost.prototype.path = function (opts) { - return this._fill(this.pathtemplate, opts) -} +var util = __webpack_require__(111) -GitHost.prototype.tarball = function (opts) { - return this._fill(this.tarballtemplate, opts) -} +function noop () {} -GitHost.prototype.file = function (P, opts) { - return this._fill(this.filetemplate, extend({ - path: P.replace(/^[/]+/g, '') - }, opts)) -} +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) + } -GitHost.prototype.getDefaultRepresentation = function () { - return this.default +if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(queue) + __webpack_require__(139).equal(queue.length, 0) + }) } -GitHost.prototype.toString = function (opts) { - return (this[this.default] || this.sshurl).call(this, opts) +module.exports = patch(__webpack_require__(222)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) { + module.exports = patch(fs) } +// Always patch fs.close/closeSync, because we want to +// retry() whenever a close happens *anywhere* in the program. +// This is essential when multiple graceful-fs instances are +// in play at the same time. +module.exports.close = +fs.close = (function (fs$close) { return function (fd, cb) { + return fs$close.call(fs, fd, function (err) { + if (!err) + retry() -/***/ }), -/* 192 */ -/***/ (function(module, exports, __webpack_require__) { - -var async = __webpack_require__(193); -async.core = __webpack_require__(199); -async.isCore = __webpack_require__(198); -async.sync = __webpack_require__(201); + if (typeof cb === 'function') + cb.apply(this, arguments) + }) +}})(fs.close) -module.exports = async; +module.exports.closeSync = +fs.closeSync = (function (fs$closeSync) { return function (fd) { + // Note that graceful-fs also retries when fs.closeSync() fails. + // Looks like a bug to me, although it's probably a harmless one. + var rval = fs$closeSync.apply(fs, arguments) + retry() + return rval +}})(fs.closeSync) +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch + fs.FileReadStream = ReadStream; // Legacy name. + fs.FileWriteStream = WriteStream; // Legacy name. + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null -/***/ }), -/* 193 */ -/***/ (function(module, exports, __webpack_require__) { + return go$readFile(path, options, cb) -var fs = __webpack_require__(132); -var path = __webpack_require__(4); -var caller = __webpack_require__(194); -var nodeModulesPaths = __webpack_require__(195); -var normalizeOptions = __webpack_require__(197); -var isCore = __webpack_require__(198); + function go$readFile (path, options, cb) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } -var realpathFS = fs.realpath && typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath; + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null -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); - }); -}; + return go$writeFile(path, data, options, cb) -var defaultIsDir = function isDirectory(dir, cb) { - fs.stat(dir, function (err, stat) { - if (!err) { - return cb(null, stat.isDirectory()); + function go$writeFile (path, data, options, cb) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() } - 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 fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null -var maybeRealpath = function maybeRealpath(realpath, x, opts, cb) { - if (opts && opts.preserveSymlinks === false) { - realpath(x, cb); - } else { - cb(null, x); - } -}; + return go$appendFile(path, data, options, cb) -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); + function go$appendFile (path, data, options, cb) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) } - 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); - }); + var fs$readdir = fs.readdir + fs.readdir = readdir + function readdir (path, options, cb) { + var args = [path] + if (typeof options !== 'function') { + args.push(options) + } else { + cb = options } + args.push(go$readdir$cb) - opts = normalizeOptions(x, opts); + return go$readdir(args) - 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; + function go$readdir$cb (err, files) { + if (files && files.sort) + files.sort() - var extensions = opts.extensions || ['.js']; - var basedir = opts.basedir || path.dirname(caller()); - var parent = opts.filename || basedir; + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readdir, [args]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + } + } - opts.paths = opts.paths || []; + function go$readdir (args) { + return fs$readdir.apply(fs, args) + } - // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory - var absoluteStart = path.resolve(basedir); + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } - maybeRealpath( - realpath, - absoluteStart, - opts, - function (err, realStart) { - if (err) cb(err); - else init(realStart); - } - ); + var fs$ReadStream = fs.ReadStream + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open - 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); - } - }); - } + var fs$WriteStream = fs.WriteStream + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open - 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); - } - }); - } + fs.ReadStream = ReadStream + fs.WriteStream = WriteStream - function loadAsFile(x, thePackage, callback) { - var loadAsFilePackage = thePackage; - var cb = callback; - if (typeof loadAsFilePackage === 'function') { - cb = loadAsFilePackage; - loadAsFilePackage = undefined; - } + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) + } - var exts = [''].concat(extensions); - load(exts, x, loadAsFilePackage); + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() - function load(exts, x, loadPackage) { - if (exts.length === 0) return cb(null, undefined, loadPackage); - var file = x + exts[0]; + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) + } - var pkg = loadPackage; - if (pkg) onpkg(null, pkg); - else loadpkg(path.dirname(file), onpkg); + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) + } - 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 WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + } + }) + } - 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); + function createReadStream (path, options) { + return new ReadStream(path, options) + } - 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); + function createWriteStream (path, options) { + return new WriteStream(path, options) + } - readFile(pkgfile, function (err, body) { - if (err) cb(err); - try { var pkg = JSON.parse(body); } catch (jsonErr) {} + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null - if (pkg && opts.packageFilter) { - pkg = opts.packageFilter(pkg, pkgfile); - } - cb(null, pkg, dir); - }); - }); - }); - } + return go$open(path, flags, mode, cb) - function loadAsDirectory(x, loadAsDirectoryPackage, callback) { - var cb = callback; - var fpkg = loadAsDirectoryPackage; - if (typeof fpkg === 'function') { - cb = fpkg; - fpkg = opts.package; + function go$open (path, flags, mode, cb) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() } + }) + } + } - 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); + return fs +} - readFile(pkgfile, function (err, body) { - if (err) return cb(err); - try { - var pkg = JSON.parse(body); - } catch (jsonErr) {} +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + queue.push(elem) +} - if (pkg && opts.packageFilter) { - pkg = opts.packageFilter(pkg, pkgfile); - } +function retry () { + var elem = queue.shift() + if (elem) { + debug('RETRY', elem[0].name, elem[1]) + elem[0].apply(null, elem[1]) + } +} - 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; - } +/***/ }), +/* 221 */ +/***/ (function(module, exports, __webpack_require__) { - loadAsFile(path.join(x, '/index'), pkg, cb); - }); - }); - }); - } +var fs = __webpack_require__(222) +var constants = __webpack_require__(135) - function processDirs(cb, dirs) { - if (dirs.length === 0) return cb(null, undefined); - var dir = dirs[0]; +var origCwd = process.cwd +var cwd = null - isDirectory(path.dirname(dir), isdir); +var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform - function isdir(err, isdir) { - if (err) return cb(err); - if (!isdir) return processDirs(cb, dirs.slice(1)); - loadAsFile(dir, opts.package, onfile); - } +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd +} +try { + process.cwd() +} catch (er) {} - function onfile(err, m, pkg) { - if (err) return cb(err); - if (m) return cb(null, m, pkg); - loadAsDirectory(dir, opts.package, ondir); - } +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} - 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() - ); - } -}; +module.exports = patch +function patch (fs) { + // (re-)implement some things that are known busted or missing. -/***/ }), -/* 194 */ -/***/ (function(module, exports) { + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) + } -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(); -}; + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) + } + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. -/***/ }), -/* 195 */ -/***/ (function(module, exports, __webpack_require__) { + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) -var path = __webpack_require__(4); -var parse = path.parse || __webpack_require__(196); + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) -var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { - var prefix = '/'; - if ((/^([A-Za-z]:)/).test(absoluteStart)) { - prefix = ''; - } else if ((/^\\\\/).test(absoluteStart)) { - prefix = '\\\\'; - } + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) - var paths = [absoluteStart]; - var parsed = parse(absoluteStart); - while (parsed.dir !== paths[paths.length - 1]) { - paths.push(parsed.dir); - parsed = parse(parsed.dir); - } + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) - return paths.reduce(function (dirs, aPath) { - return dirs.concat(modules.map(function (moduleDir) { - return path.resolve(prefix, aPath, moduleDir); - })); - }, []); -}; + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) -module.exports = function nodeModulesPaths(start, opts, request) { - var modules = opts && opts.moduleDirectory - ? [].concat(opts.moduleDirectory) - : ['node_modules']; + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) - if (opts && typeof opts.paths === 'function') { - return opts.paths( - request, - start, - function () { return getNodeModulesDirs(start, modules); }, - opts - ); + // if lchmod/lchown do not exist, then make them no-ops + if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) + } + fs.lchmodSync = function () {} + } + if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) } + fs.lchownSync = function () {} + } - var dirs = getNodeModulesDirs(start, modules); - return opts && opts.paths ? dirs.concat(opts.paths) : dirs; -}; + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 60 seconds. + + // Set the timeout this long because some Windows Anti-Virus, such as Parity + // bit9, may lock files for up to a minute, causing npm package install + // failures. Also, take care to yield the scheduler. Windows scheduling gives + // CPU to a busy looping process, which can cause the program causing the lock + // contention to be starved of CPU by node, so the contention doesn't resolve. + if (platform === "win32") { + fs.rename = (function (fs$rename) { return function (from, to, cb) { + var start = Date.now() + var backoff = 0; + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function (stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er) + }) + }, backoff) + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er) + }) + }})(fs.rename) + } + // if read() returns EAGAIN, then just try it again. + fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + }})(fs.read) -/***/ }), -/* 196 */ -/***/ (function(module, exports, __webpack_require__) { + fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } + }})(fs.readSync) +} -"use strict"; +function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) -var isWindows = process.platform === 'win32'; + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } +} -// Regex to split a windows path into three parts: [*, device, slash, -// tail] windows-only -var splitDeviceRe = - /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; +function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } -// Regex to split the tail part of the above into [*, dir, basename, ext] -var splitTailRe = - /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/; + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } -var win32 = {}; + } else { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} + } +} -// Function to split a filename into [root, dir, basename, ext] -function win32SplitPath(filename) { - // Separate device+slash from tail - var result = splitDeviceRe.exec(filename), - device = (result[1] || '') + (result[2] || ''), - tail = result[3] || ''; - // Split the tail into dir, basename and extension - var result2 = splitTailRe.exec(tail), - dir = result2[1], - basename = result2[2], - ext = result2[3]; - return [device, dir, basename, ext]; +function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } } -win32.parse = function(pathString) { - if (typeof pathString !== 'string') { - throw new TypeError( - "Parameter 'pathString' must be a string, not " + typeof pathString - ); +function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } } - var allParts = win32SplitPath(pathString); - if (!allParts || allParts.length !== 4) { - throw new TypeError("Invalid path '" + pathString + "'"); +} + + +function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) } - return { - root: allParts[0], - dir: allParts[0] + allParts[1].slice(0, -1), - base: allParts[2], - ext: allParts[3], - name: allParts[2].slice(0, allParts[2].length - allParts[3].length) - }; -}; +} +function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} -// Split a filename into [root, dir, basename, ext], unix version -// 'root' is just a slash, or nothing. -var splitPathRe = - /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; -var posix = {}; +function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, cb) { + return orig.call(fs, target, function (er, stats) { + if (!stats) return cb.apply(this, arguments) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + if (cb) cb.apply(this, arguments) + }) + } +} + +function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target) { + var stats = orig.call(fs, target) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + return stats; + } +} + +// ENOSYS means that the fs doesn't support the op. Just ignore +// that, because it doesn't matter. +// +// if there's no getuid, or if getuid() is something other +// than 0, and the error is EINVAL or EPERM, then just ignore +// it. +// +// This specific case is a silent failure in cp, install, tar, +// and most other unix tools that manage permissions. +// +// When running as root, or if other types of errors are +// encountered, then it's strict. +function chownErOk (er) { + if (!er) + return true + if (er.code === "ENOSYS") + return true -function posixSplitPath(filename) { - return splitPathRe.exec(filename).slice(1); + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } + + return false } -posix.parse = function(pathString) { - if (typeof pathString !== 'string') { - throw new TypeError( - "Parameter 'pathString' must be a string, not " + typeof pathString - ); - } - var allParts = posixSplitPath(pathString); - if (!allParts || allParts.length !== 4) { - throw new TypeError("Invalid path '" + pathString + "'"); - } - allParts[1] = allParts[1] || ''; - allParts[2] = allParts[2] || ''; - allParts[3] = allParts[3] || ''; +/***/ }), +/* 222 */ +/***/ (function(module, exports, __webpack_require__) { - return { - root: allParts[0], - dir: allParts[0] + allParts[1].slice(0, -1), - base: allParts[2], - ext: allParts[3], - name: allParts[2].slice(0, allParts[2].length - allParts[3].length) - }; -}; +"use strict"; -if (isWindows) - module.exports = win32.parse; -else /* posix */ - module.exports = posix.parse; +var fs = __webpack_require__(133) -module.exports.posix = posix.parse; -module.exports.win32 = win32.parse; +module.exports = clone(fs) +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj -/***/ }), -/* 197 */ -/***/ (function(module, exports) { + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) -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. - */ + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) - return opts || {}; -}; + return copy +} /***/ }), -/* 198 */ +/* 223 */ /***/ (function(module, exports, __webpack_require__) { -var core = __webpack_require__(199); +var Stream = __webpack_require__(137).Stream -module.exports = function isCore(x) { - return Object.prototype.hasOwnProperty.call(core, x); -}; +module.exports = legacy +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream + } -/***/ }), -/* 199 */ -/***/ (function(module, exports, __webpack_require__) { + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); -var current = (process.versions && process.versions.node && process.versions.node.split('.')) || []; + Stream.call(this); -function specifierIncluded(specifier) { - var parts = specifier.split(' '); - var op = parts.length > 1 ? parts[0] : '='; - var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); + var self = this; - 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 === '>='; -} + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; -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; -} + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; -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; + options = options || {}; + + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; } - return matchesRange(specifierValue); -} -var data = __webpack_require__(200); + if (this.encoding) this.setEncoding(this.encoding); -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]); + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); + } + + if (this.start > this.end) { + throw new Error('start must be <= end'); + } + + this.pos = this.start; } -} -module.exports = core; + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } -/***/ }), -/* 200 */ -/***/ (function(module) { + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } -module.exports = JSON.parse("{\"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}"); + self.fd = fd; + self.emit('open', fd); + self._read(); + }) + } -/***/ }), -/* 201 */ -/***/ (function(module, exports, __webpack_require__) { + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); -var isCore = __webpack_require__(198); -var fs = __webpack_require__(132); -var path = __webpack_require__(4); -var caller = __webpack_require__(194); -var nodeModulesPaths = __webpack_require__(195); -var normalizeOptions = __webpack_require__(197); + Stream.call(this); -var realpathFS = fs.realpathSync && typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync; + this.path = path; + this.fd = null; + this.writable = true; -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(); -}; + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; -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(); -}; + options = options || {}; -var defaultRealpathSync = function realpathSync(x) { - try { - return realpathFS(x); - } catch (realpathErr) { - if (realpathErr.code !== 'ENOENT') { - throw realpathErr; - } + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; } - return x; -}; -var maybeRealpathSync = function maybeRealpathSync(realpathSync, x, opts) { - if (opts && opts.preserveSymlinks === false) { - return realpathSync(x); - } - return x; -}; + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); + } -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); + this.pos = this.start; } - return dirs; -}; -module.exports = function resolveSync(x, options) { - if (typeof x !== 'string') { - throw new TypeError('Path must be a string.'); + this.busy = false; + this._queue = []; + + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); } - 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; +/***/ }), +/* 224 */ +/***/ (function(module, exports, __webpack_require__) { - opts.paths = opts.paths || []; +/** + * @preserve + * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) + * + * @author Jens Taylor + * @see http://github.com/homebrewing/brauhaus-diff + * @author Gary Court + * @see http://github.com/garycourt/murmurhash-js + * @author Austin Appleby + * @see http://sites.google.com/site/murmurhash/ + */ +(function(){ + var cache; - // 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); + // Call this function without `new` to use the cached object (good for + // single-threaded environments), or with `new` to create a new object. + // + // @param {string} key A UTF-16 or ASCII string + // @param {number} seed An optional positive integer + // @return {object} A MurmurHash3 object for incremental hashing + function MurmurHash3(key, seed) { + var m = this instanceof MurmurHash3 ? this : cache; + m.reset(seed) + if (typeof key === 'string' && key.length > 0) { + m.hash(key); + } - 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); - } + if (m !== this) { + return m; + } + }; - var err = new Error("Cannot find module '" + x + "' from '" + parent + "'"); - err.code = 'MODULE_NOT_FOUND'; - throw err; + // Incrementally add a string to this hash + // + // @param {string} key A UTF-16 or ASCII string + // @return {object} this + MurmurHash3.prototype.hash = function(key) { + var h1, k1, i, top, len; - function loadAsFileSync(x) { - var pkg = loadpkg(path.dirname(x)); + len = key.length; + this.len += len; - 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 - } + k1 = this.k1; + i = 0; + switch (this.rem) { + case 0: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) : 0; + case 1: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 8 : 0; + case 2: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 16 : 0; + case 3: + k1 ^= len > i ? (key.charCodeAt(i) & 0xff) << 24 : 0; + k1 ^= len > i ? (key.charCodeAt(i++) & 0xff00) >> 8 : 0; } - if (isFile(x)) { - return x; - } + this.rem = (len + this.rem) & 3; // & 3 is same as % 4 + len -= this.rem; + if (len > 0) { + h1 = this.h1; + while (1) { + k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - for (var i = 0; i < extensions.length; i++) { - var file = x + extensions[i]; - if (isFile(file)) { - return file; - } - } - } + h1 ^= k1; + h1 = (h1 << 13) | (h1 >>> 19); + h1 = (h1 * 5 + 0xe6546b64) & 0xffffffff; - function loadpkg(dir) { - if (dir === '' || dir === '/') return; - if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { - return; - } - if ((/[/\\]node_modules[/\\]*$/).test(dir)) return; + if (i >= len) { + break; + } - var pkgfile = path.join(maybeRealpathSync(realpathSync, dir, opts), 'package.json'); + k1 = ((key.charCodeAt(i++) & 0xffff)) ^ + ((key.charCodeAt(i++) & 0xffff) << 8) ^ + ((key.charCodeAt(i++) & 0xffff) << 16); + top = key.charCodeAt(i++); + k1 ^= ((top & 0xff) << 24) ^ + ((top & 0xff00) >> 8); + } - if (!isFile(pkgfile)) { - return loadpkg(path.dirname(dir)); + k1 = 0; + switch (this.rem) { + case 3: k1 ^= (key.charCodeAt(i + 2) & 0xffff) << 16; + case 2: k1 ^= (key.charCodeAt(i + 1) & 0xffff) << 8; + case 1: k1 ^= (key.charCodeAt(i) & 0xffff); + } + + this.h1 = h1; } - var body = readFileSync(pkgfile); + this.k1 = k1; + return this; + }; - try { - var pkg = JSON.parse(body); - } catch (jsonErr) {} + // Get the result of this hash + // + // @return {number} The 32-bit hash + MurmurHash3.prototype.result = function() { + var k1, h1; + + k1 = this.k1; + h1 = this.h1; - if (pkg && opts.packageFilter) { - // v2 will pass pkgfile - pkg = opts.packageFilter(pkg, /*pkgfile,*/ dir); // eslint-disable-line spaced-comment + if (k1 > 0) { + k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; + h1 ^= k1; } - 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) {} + h1 ^= this.len; - if (pkg && opts.packageFilter) { - // v2 will pass pkgfile - pkg = opts.packageFilter(pkg, /*pkgfile,*/ x); // eslint-disable-line spaced-comment - } + h1 ^= h1 >>> 16; + h1 = (h1 * 0xca6b + (h1 & 0xffff) * 0x85eb0000) & 0xffffffff; + h1 ^= h1 >>> 13; + h1 = (h1 * 0xae35 + (h1 & 0xffff) * 0xc2b20000) & 0xffffffff; + h1 ^= h1 >>> 16; - 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 h1 >>> 0; + }; - return loadAsFileSync(path.join(x, '/index')); - } + // Reset the hash object for reuse + // + // @param {number} seed An optional positive integer + MurmurHash3.prototype.reset = function(seed) { + this.h1 = typeof seed === 'number' ? seed : 0; + this.rem = this.k1 = this.len = 0; + return this; + }; - function loadNodeModulesSync(x, start) { - var thunk = function () { return getPackageCandidates(x, start, opts); }; - var dirs = packageIterator ? packageIterator(x, start, thunk, opts) : thunk(); + // A cached object to use. This can be safely used if you're in a single- + // threaded environment, otherwise you need to create new hashes to use. + cache = new MurmurHash3(); - 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; - } - } - } -}; + if (true) { + module.exports = MurmurHash3; + } else {} +}()); /***/ }), -/* 202 */ -/***/ (function(module, exports) { +/* 225 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports = extractDescription +// Note: since nyc uses this module to output coverage, any lines +// that are in the direct sync flow of nyc's outputCoverage are +// ignored, since we can never get coverage for them. +var assert = __webpack_require__(139) +var signals = __webpack_require__(226) -// Extracts description from contents of a readme file in markdown format -function extractDescription (d) { - if (!d) return; - if (d === "ERROR: No README data found!") return; - // the first block of text before the first heading - // that isn't the first line heading - d = d.trim().split('\n') - for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++); - var l = d.length - for (var e = s + 1; e < l && d[e].trim(); e ++); - return d.slice(s, e).join(' ').trim() +var EE = __webpack_require__(155) +/* istanbul ignore if */ +if (typeof EE !== 'function') { + EE = EE.EventEmitter +} + +var emitter +if (process.__signal_exit_emitter__) { + emitter = process.__signal_exit_emitter__ +} else { + emitter = process.__signal_exit_emitter__ = new EE() + emitter.count = 0 + emitter.emitted = {} } +// Because this emitter is a global, we have to check to see if a +// previous version of this library failed to enable infinite listeners. +// I know what you're about to say. But literally everything about +// signal-exit is a compromise with evil. Get used to it. +if (!emitter.infinite) { + emitter.setMaxListeners(Infinity) + emitter.infinite = true +} -/***/ }), -/* 203 */ -/***/ (function(module) { - -module.exports = JSON.parse("{\"topLevel\":{\"dependancies\":\"dependencies\",\"dependecies\":\"dependencies\",\"depdenencies\":\"dependencies\",\"devEependencies\":\"devDependencies\",\"depends\":\"dependencies\",\"dev-dependencies\":\"devDependencies\",\"devDependences\":\"devDependencies\",\"devDepenencies\":\"devDependencies\",\"devdependencies\":\"devDependencies\",\"repostitory\":\"repository\",\"repo\":\"repository\",\"prefereGlobal\":\"preferGlobal\",\"hompage\":\"homepage\",\"hampage\":\"homepage\",\"autohr\":\"author\",\"autor\":\"author\",\"contributers\":\"contributors\",\"publicationConfig\":\"publishConfig\",\"script\":\"scripts\"},\"bugs\":{\"web\":\"url\",\"name\":\"url\"},\"script\":{\"server\":\"start\",\"tests\":\"test\"}}"); - -/***/ }), -/* 204 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports = function (cb, opts) { + assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') -var util = __webpack_require__(111) -var messages = __webpack_require__(205) + if (loaded === false) { + load() + } -module.exports = function() { - var args = Array.prototype.slice.call(arguments, 0) - var warningName = args.shift() - if (warningName == "typo") { - return makeTypoWarning.apply(null,args) + var ev = 'exit' + if (opts && opts.alwaysLast) { + ev = 'afterexit' } - else { - var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'" - args.unshift(msgTemplate) - return util.format.apply(null, args) + + var remove = function () { + emitter.removeListener(ev, cb) + if (emitter.listeners('exit').length === 0 && + emitter.listeners('afterexit').length === 0) { + unload() + } } + emitter.on(ev, cb) + + return remove } -function makeTypoWarning (providedName, probableName, field) { - if (field) { - providedName = field + "['" + providedName + "']" - probableName = field + "['" + probableName + "']" +module.exports.unload = unload +function unload () { + if (!loaded) { + return } - return util.format(messages.typo, providedName, probableName) -} + loaded = false + signals.forEach(function (sig) { + try { + process.removeListener(sig, sigListeners[sig]) + } catch (er) {} + }) + process.emit = originalProcessEmit + process.reallyExit = originalProcessReallyExit + emitter.count -= 1 +} -/***/ }), -/* 205 */ -/***/ (function(module) { +function emit (event, code, signal) { + if (emitter.emitted[event]) { + return + } + emitter.emitted[event] = true + emitter.emit(event, code, signal) +} -module.exports = JSON.parse("{\"repositories\":\"'repositories' (plural) Not supported. Please pick one as the 'repository' field\",\"missingRepository\":\"No repository field.\",\"brokenGitUrl\":\"Probably broken git url: %s\",\"nonObjectScripts\":\"scripts must be an object\",\"nonStringScript\":\"script values must be string commands\",\"nonArrayFiles\":\"Invalid 'files' member\",\"invalidFilename\":\"Invalid filename in 'files' list: %s\",\"nonArrayBundleDependencies\":\"Invalid 'bundleDependencies' list. Must be array of package names\",\"nonStringBundleDependency\":\"Invalid bundleDependencies member: %s\",\"nonDependencyBundleDependency\":\"Non-dependency in bundleDependencies: %s\",\"nonObjectDependencies\":\"%s field must be an object\",\"nonStringDependency\":\"Invalid dependency: %s %s\",\"deprecatedArrayDependencies\":\"specifying %s as array is deprecated\",\"deprecatedModules\":\"modules field is deprecated\",\"nonArrayKeywords\":\"keywords should be an array of strings\",\"nonStringKeyword\":\"keywords should be an array of strings\",\"conflictingName\":\"%s is also the name of a node core module.\",\"nonStringDescription\":\"'description' field should be a string\",\"missingDescription\":\"No description\",\"missingReadme\":\"No README data\",\"missingLicense\":\"No license field.\",\"nonEmailUrlBugsString\":\"Bug string field must be url, email, or {email,url}\",\"nonUrlBugsUrlField\":\"bugs.url field must be a string url. Deleted.\",\"nonEmailBugsEmailField\":\"bugs.email field must be a string email. Deleted.\",\"emptyNormalizedBugs\":\"Normalized value of bugs field is an empty object. Deleted.\",\"nonUrlHomepage\":\"homepage field must be a string url. Deleted.\",\"invalidLicense\":\"license should be a valid SPDX license expression\",\"typo\":\"%s should probably be %s.\"}"); +// { : , ... } +var sigListeners = {} +signals.forEach(function (sig) { + sigListeners[sig] = function listener () { + // If there are no other listeners, an exit is coming! + // Simplest way: remove us and then re-send the signal. + // We know that this will kill the process, so we can + // safely emit now. + var listeners = process.listeners(sig) + if (listeners.length === emitter.count) { + unload() + emit('exit', null, sig) + /* istanbul ignore next */ + emit('afterexit', null, sig) + /* istanbul ignore next */ + process.kill(process.pid, sig) + } + } +}) -/***/ }), -/* 206 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports.signals = function () { + return signals +} -"use strict"; +module.exports.load = load -const path = __webpack_require__(4); -const writeJsonFile = __webpack_require__(207); -const sortKeys = __webpack_require__(221); +var loaded = false -const dependencyKeys = new Set([ - 'dependencies', - 'devDependencies', - 'optionalDependencies', - 'peerDependencies' -]); +function load () { + if (loaded) { + return + } + loaded = true -function normalize(packageJson) { - const result = {}; + // This is the number of onSignalExit's that are in play. + // It's important so that we can count the correct number of + // listeners on signals, and don't wait for the other one to + // handle it instead of us. + emitter.count += 1 - for (const key of Object.keys(packageJson)) { - if (!dependencyKeys.has(key)) { - result[key] = packageJson[key]; - } else if (Object.keys(packageJson[key]).length !== 0) { - result[key] = sortKeys(packageJson[key]); - } - } + signals = signals.filter(function (sig) { + try { + process.on(sig, sigListeners[sig]) + return true + } catch (er) { + return false + } + }) - return result; + process.emit = processEmit + process.reallyExit = processReallyExit } -module.exports = async (filePath, data, options) => { - if (typeof filePath !== 'string') { - options = data; - data = filePath; - filePath = '.'; - } - - options = { - normalize: true, - ...options, - detectIndent: true - }; +var originalProcessReallyExit = process.reallyExit +function processReallyExit (code) { + process.exitCode = code || 0 + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + /* istanbul ignore next */ + originalProcessReallyExit.call(process, process.exitCode) +} - filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); +var originalProcessEmit = process.emit +function processEmit (ev, arg) { + if (ev === 'exit') { + if (arg !== undefined) { + process.exitCode = arg + } + var ret = originalProcessEmit.apply(this, arguments) + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + return ret + } else { + return originalProcessEmit.apply(this, arguments) + } +} - data = options.normalize ? normalize(data) : data; - return writeJsonFile(filePath, data, options); -}; +/***/ }), +/* 226 */ +/***/ (function(module, exports) { -module.exports.sync = (filePath, data, options) => { - if (typeof filePath !== 'string') { - options = data; - data = filePath; - filePath = '.'; - } +// This is not the set of all possible signals. +// +// It IS, however, the set of all signals that trigger +// an exit on either Linux or BSD systems. Linux is a +// superset of the signal names supported on BSD, and +// the unknown signals just fail to register, so we can +// catch that easily enough. +// +// Don't bother with SIGKILL. It's uncatchable, which +// means that we can't fire any callbacks anyway. +// +// If a user does happen to register a handler on a non- +// fatal signal like SIGWINCH or something, and then +// exit, it'll end up firing `process.emit('exit')`, so +// the handler will be fired anyway. +// +// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised +// artificially, inherently leave the process in a +// state from which it is not safe to try and enter JS +// listeners. +module.exports = [ + 'SIGABRT', + 'SIGALRM', + 'SIGHUP', + 'SIGINT', + 'SIGTERM' +] - options = { - normalize: true, - ...options, - detectIndent: true - }; +if (process.platform !== 'win32') { + module.exports.push( + 'SIGVTALRM', + 'SIGXCPU', + 'SIGXFSZ', + 'SIGUSR2', + 'SIGTRAP', + 'SIGSYS', + 'SIGQUIT', + 'SIGIOT' + // should detect profiler and enable/disable accordingly. + // see #21 + // 'SIGPROF' + ) +} - filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); +if (process.platform === 'linux') { + module.exports.push( + 'SIGIO', + 'SIGPOLL', + 'SIGPWR', + 'SIGSTKFLT', + 'SIGUNUSED' + ) +} - data = options.normalize ? normalize(data) : data; - writeJsonFile.sync(filePath, data, options); -}; +/***/ }), +/* 227 */ +/***/ (function(module, exports) { +module.exports = require(undefined); /***/ }), -/* 207 */ +/* 228 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(4); -const fs = __webpack_require__(208); -const writeFileAtomic = __webpack_require__(212); -const sortKeys = __webpack_require__(221); -const makeDir = __webpack_require__(223); -const pify = __webpack_require__(224); -const detectIndent = __webpack_require__(225); +const isPlainObj = __webpack_require__(229); -const init = (fn, filePath, data, options) => { - if (!filePath) { - throw new TypeError('Expected a filepath'); +module.exports = (obj, opts) => { + if (!isPlainObj(obj)) { + throw new TypeError('Expected a plain object'); } - if (data === undefined) { - throw new TypeError('Expected data to stringify'); + opts = opts || {}; + + // DEPRECATED + if (typeof opts === 'function') { + throw new TypeError('Specify the compare function as an option instead'); } - options = Object.assign({ - indent: '\t', - sortKeys: false - }, options); + const deep = opts.deep; + const seenInput = []; + const seenOutput = []; - if (options.sortKeys) { - data = sortKeys(data, { - deep: true, - compare: typeof options.sortKeys === 'function' ? options.sortKeys : undefined - }); - } + const sortKeys = x => { + const seenIndex = seenInput.indexOf(x); - return fn(filePath, data, options); -}; + if (seenIndex !== -1) { + return seenOutput[seenIndex]; + } -const readFile = filePath => pify(fs.readFile)(filePath, 'utf8').catch(() => {}); + const ret = {}; + const keys = Object.keys(x).sort(opts.compare); -const main = (filePath, data, options) => { - return (options.detectIndent ? readFile(filePath) : Promise.resolve()) - .then(string => { - const indent = string ? detectIndent(string).indent : options.indent; - const json = JSON.stringify(data, options.replacer, indent); + seenInput.push(x); + seenOutput.push(ret); - return pify(writeFileAtomic)(filePath, `${json}\n`, {mode: options.mode}); - }); -}; + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const val = x[key]; -const mainSync = (filePath, data, options) => { - let {indent} = options; + if (deep && Array.isArray(val)) { + const retArr = []; - if (options.detectIndent) { - try { - const file = fs.readFileSync(filePath, 'utf8'); - indent = detectIndent(file).indent; - } catch (error) { - if (error.code !== 'ENOENT') { - throw error; - } - } - } + for (let j = 0; j < val.length; j++) { + retArr[j] = isPlainObj(val[j]) ? sortKeys(val[j]) : val[j]; + } - const json = JSON.stringify(data, options.replacer, indent); + ret[key] = retArr; + continue; + } - return writeFileAtomic.sync(filePath, `${json}\n`, {mode: options.mode}); -}; + ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val; + } -const writeJsonFile = (filePath, data, options) => { - return makeDir(path.dirname(filePath), {fs}) - .then(() => init(main, filePath, data, options)); -}; + return ret; + }; -module.exports = writeJsonFile; -// TODO: Remove this for the next major release -module.exports.default = writeJsonFile; -module.exports.sync = (filePath, data, options) => { - makeDir.sync(path.dirname(filePath), {fs}); - init(mainSync, filePath, data, options); + return sortKeys(obj); }; /***/ }), -/* 208 */ +/* 229 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(132) -var polyfills = __webpack_require__(209) -var legacy = __webpack_require__(210) -var clone = __webpack_require__(211) - -var queue = [] - -var util = __webpack_require__(111) - -function noop () {} - -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } - -if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(queue) - __webpack_require__(138).equal(queue.length, 0) - }) -} - -module.exports = patch(clone(fs)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { - module.exports = patch(fs) - fs.__patched = true; -} - -// Always patch fs.close/closeSync, because we want to -// retry() whenever a close happens *anywhere* in the program. -// This is essential when multiple graceful-fs instances are -// in play at the same time. -module.exports.close = (function (fs$close) { return function (fd, cb) { - return fs$close.call(fs, fd, function (err) { - if (!err) - retry() - - if (typeof cb === 'function') - cb.apply(this, arguments) - }) -}})(fs.close) - -module.exports.closeSync = (function (fs$closeSync) { return function (fd) { - // Note that graceful-fs also retries when fs.closeSync() fails. - // Looks like a bug to me, although it's probably a harmless one. - var rval = fs$closeSync.apply(fs, arguments) - retry() - return rval -}})(fs.closeSync) +"use strict"; -// Only patch fs once, otherwise we'll run into a memory leak if -// graceful-fs is loaded multiple times, such as in test environments that -// reset the loaded modules between tests. -// We look for the string `graceful-fs` from the comment above. This -// way we are not adding any extra properties and it will detect if older -// versions of graceful-fs are installed. -if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { - fs.closeSync = module.exports.closeSync; - fs.close = module.exports.close; -} +var toString = Object.prototype.toString; -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch - fs.FileReadStream = ReadStream; // Legacy name. - fs.FileWriteStream = WriteStream; // Legacy name. - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null +module.exports = function (x) { + var prototype; + return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); +}; - return go$readFile(path, options, cb) - function go$readFile (path, options, cb) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } +/***/ }), +/* 230 */ +/***/ (function(module, exports, __webpack_require__) { - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null +"use strict"; - return go$writeFile(path, data, options, cb) +const fs = __webpack_require__(133); +const path = __webpack_require__(4); +const pify = __webpack_require__(231); +const semver = __webpack_require__(189); - function go$writeFile (path, data, options, cb) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } +const defaults = { + mode: 0o777 & (~process.umask()), + fs +}; - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null +const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); - return go$appendFile(path, data, options, cb) +// https://github.com/nodejs/node/issues/8987 +// https://github.com/libuv/libuv/pull/1088 +const checkPath = pth => { + if (process.platform === 'win32') { + const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, '')); - function go$appendFile (path, data, options, cb) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + if (pathHasInvalidWinCharacters) { + const error = new Error(`Path contains invalid characters: ${pth}`); + error.code = 'EINVAL'; + throw error; + } + } +}; - var fs$readdir = fs.readdir - fs.readdir = readdir - function readdir (path, options, cb) { - var args = [path] - if (typeof options !== 'function') { - args.push(options) - } else { - cb = options - } - args.push(go$readdir$cb) +const permissionError = pth => { + // This replicates the exception of `fs.mkdir` with native the + // `recusive` option when run on an invalid drive under Windows. + const error = new Error(`operation not permitted, mkdir '${pth}'`); + error.code = 'EPERM'; + error.errno = -4048; + error.path = pth; + error.syscall = 'mkdir'; + return error; +}; - return go$readdir(args) +const makeDir = (input, options) => Promise.resolve().then(() => { + checkPath(input); + options = Object.assign({}, defaults, options); - function go$readdir$cb (err, files) { - if (files && files.sort) - files.sort() + // TODO: Use util.promisify when targeting Node.js 8 + const mkdir = pify(options.fs.mkdir); + const stat = pify(options.fs.stat); - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [args]]) + if (useNativeRecursiveOption && options.fs.mkdir === fs.mkdir) { + const pth = path.resolve(input); - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - } - } + return mkdir(pth, { + mode: options.mode, + recursive: true + }).then(() => pth); + } - function go$readdir (args) { - return fs$readdir.apply(fs, args) - } + const make = pth => { + return mkdir(pth, options.mode) + .then(() => pth) + .catch(error => { + if (error.code === 'EPERM') { + throw error; + } - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } + if (error.code === 'ENOENT') { + if (path.dirname(pth) === pth) { + throw permissionError(pth); + } - var fs$ReadStream = fs.ReadStream - if (fs$ReadStream) { - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open - } + if (error.message.includes('null bytes')) { + throw error; + } - var fs$WriteStream = fs.WriteStream - if (fs$WriteStream) { - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open - } + return make(path.dirname(pth)).then(() => make(pth)); + } - fs.ReadStream = ReadStream - fs.WriteStream = WriteStream + return stat(pth) + .then(stats => stats.isDirectory() ? pth : Promise.reject()) + .catch(() => { + throw error; + }); + }); + }; - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } + return make(path.resolve(input)); +}); - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() +module.exports = makeDir; +module.exports.default = makeDir; - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } +module.exports.sync = (input, options) => { + checkPath(input); + options = Object.assign({}, defaults, options); - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } + if (useNativeRecursiveOption && options.fs.mkdirSync === fs.mkdirSync) { + const pth = path.resolve(input); - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } + fs.mkdirSync(pth, { + mode: options.mode, + recursive: true + }); - function createReadStream (path, options) { - return new ReadStream(path, options) - } + return pth; + } - function createWriteStream (path, options) { - return new WriteStream(path, options) - } + const make = pth => { + try { + options.fs.mkdirSync(pth, options.mode); + } catch (error) { + if (error.code === 'EPERM') { + throw error; + } - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null + if (error.code === 'ENOENT') { + if (path.dirname(pth) === pth) { + throw permissionError(pth); + } - return go$open(path, flags, mode, cb) + if (error.message.includes('null bytes')) { + throw error; + } - function go$open (path, flags, mode, cb) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + make(path.dirname(pth)); + return make(pth); + } - return fs -} + try { + if (!options.fs.statSync(pth).isDirectory()) { + throw new Error('The path is not a directory'); + } + } catch (_) { + throw error; + } + } -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - queue.push(elem) -} + return pth; + }; -function retry () { - var elem = queue.shift() - if (elem) { - debug('RETRY', elem[0].name, elem[1]) - elem[0].apply(null, elem[1]) - } -} + return make(path.resolve(input)); +}; /***/ }), -/* 209 */ +/* 231 */ /***/ (function(module, exports, __webpack_require__) { -var constants = __webpack_require__(134) - -var origCwd = process.cwd -var cwd = null - -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform - -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} +"use strict"; -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) -} -module.exports = patch +const processFn = (fn, options) => function (...args) { + const P = options.promiseModule; -function patch (fs) { - // (re-)implement some things that are known busted or missing. + return new P((resolve, reject) => { + if (options.multiArgs) { + args.push((...result) => { + if (options.errorFirst) { + if (result[0]) { + reject(result); + } else { + result.shift(); + resolve(result); + } + } else { + resolve(result); + } + }); + } else if (options.errorFirst) { + args.push((error, result) => { + if (error) { + reject(error); + } else { + resolve(result); + } + }); + } else { + args.push(resolve); + } - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) - } + fn.apply(this, args); + }); +}; - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) - } +module.exports = (input, options) => { + options = Object.assign({ + exclude: [/.+(Sync|Stream)$/], + errorFirst: true, + promiseModule: Promise + }, options); - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. + const objType = typeof input; + if (!(input !== null && (objType === 'object' || objType === 'function'))) { + throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${input === null ? 'null' : objType}\``); + } - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) + const filter = key => { + const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key); + return options.include ? options.include.some(match) : !options.exclude.some(match); + }; - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) + let ret; + if (objType === 'function') { + ret = function (...args) { + return options.excludeMain ? input(...args) : processFn(input, options).apply(this, args); + }; + } else { + ret = Object.create(Object.getPrototypeOf(input)); + } - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) + for (const key in input) { // eslint-disable-line guard-for-in + const property = input[key]; + ret[key] = typeof property === 'function' && filter(key) ? processFn(property, options) : property; + } - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) + return ret; +}; - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) +/***/ }), +/* 232 */ +/***/ (function(module, exports, __webpack_require__) { - // if lchmod/lchown do not exist, then make them no-ops - if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) - } - fs.lchmodSync = function () {} - } - if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) - } - fs.lchownSync = function () {} - } +"use strict"; - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = (function (fs$rename) { return function (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - }})(fs.rename) - } +// detect either spaces or tabs but not both to properly handle tabs +// for indentation and spaces for alignment +const INDENT_RE = /^(?:( )+|\t+)/; - // if read() returns EAGAIN, then just try it again. - fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } - } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - }})(fs.read) +function getMostUsed(indents) { + let result = 0; + let maxUsed = 0; + let maxWeight = 0; - fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } - } - }})(fs.readSync) + for (const entry of indents) { + // TODO: use destructuring when targeting Node.js 6 + const key = entry[0]; + const val = entry[1]; - function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) - } + const u = val[0]; + const w = val[1]; - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + if (u > maxUsed || (u === maxUsed && w > maxWeight)) { + maxUsed = u; + maxWeight = w; + result = Number(key); + } + } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } - } + return result; +} - function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } +module.exports = str => { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } + // used to see if tabs or spaces are the most used + let tabs = 0; + let spaces = 0; - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} - } - } + // remember the size of previous line's indentation + let prev = 0; - function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } - } + // remember how many indents/unindents as occurred for a given size + // and how much lines follow a given indentation + // + // indents = { + // 3: [1, 0], + // 4: [1, 5], + // 5: [1, 0], + // 12: [1, 0], + // } + const indents = new Map(); - function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } - } - } + // pointer to the array of last used indent + let current; + // whether the last action was an indent (opposed to an unindent) + let isIndent; - function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } - } + for (const line of str.split(/\n/g)) { + if (!line) { + // ignore empty lines + continue; + } - function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } - } - } + let indent; + const matches = line.match(INDENT_RE); + if (matches) { + indent = matches[0].length; - function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, cb) { - return orig.call(fs, target, function (er, stats) { - if (!stats) return cb.apply(this, arguments) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - if (cb) cb.apply(this, arguments) - }) - } - } + if (matches[1]) { + spaces++; + } else { + tabs++; + } + } else { + indent = 0; + } - function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target) { - var stats = orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; - } - } + const diff = indent - prev; + prev = indent; - // ENOSYS means that the fs doesn't support the op. Just ignore - // that, because it doesn't matter. - // - // if there's no getuid, or if getuid() is something other - // than 0, and the error is EINVAL or EPERM, then just ignore - // it. - // - // This specific case is a silent failure in cp, install, tar, - // and most other unix tools that manage permissions. - // - // When running as root, or if other types of errors are - // encountered, then it's strict. - function chownErOk (er) { - if (!er) - return true + if (diff) { + // an indent or unindent has been detected - if (er.code === "ENOSYS") - return true + isIndent = diff > 0; - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } + current = indents.get(isIndent ? diff : -diff); - return false - } -} + if (current) { + current[0]++; + } else { + current = [1, 0]; + indents.set(diff, current); + } + } else if (current) { + // if the last action was an indent, increment the weight + current[1] += Number(isIndent); + } + } + const amount = getMostUsed(indents); -/***/ }), -/* 210 */ -/***/ (function(module, exports, __webpack_require__) { + let type; + let indent; + if (!amount) { + type = null; + indent = ''; + } else if (spaces >= tabs) { + type = 'space'; + indent = ' '.repeat(amount); + } else { + type = 'tab'; + indent = '\t'.repeat(amount); + } -var Stream = __webpack_require__(136).Stream + return { + amount, + type, + indent + }; +}; -module.exports = legacy -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } +/***/ }), +/* 233 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installInDir", function() { return installInDir; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackage", function() { return runScriptInPackage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackageStreaming", function() { return runScriptInPackageStreaming; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "yarnWorkspacesInfo", function() { return yarnWorkspacesInfo; }); +/* harmony import */ var _child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(234); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ - Stream.call(this); +const YARN_EXEC = process.env.npm_execpath || 'yarn'; - var self = this; +/** + * Install all dependencies in the given directory + */ +async function installInDir(directory, extraArgs = []) { + const options = ['install', '--non-interactive', ...extraArgs]; // We pass the mutex flag to ensure only one instance of yarn runs at any + // given time (e.g. to avoid conflicts). - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, options, { + cwd: directory + }); +} +/** + * Run script in the given directory + */ - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; +async function runScriptInPackage(script, args, pkg) { + const execOpts = { + cwd: pkg.path + }; + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['run', script, ...args], execOpts); +} +/** + * Run script in the given directory + */ - options = options || {}; +function runScriptInPackageStreaming({ + script, + args, + pkg, + debug +}) { + const execOpts = { + cwd: pkg.path + }; + return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])(YARN_EXEC, ['run', script, ...args], execOpts, { + prefix: pkg.name, + debug + }); +} +async function yarnWorkspacesInfo(directory) { + const { + stdout + } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['--json', 'workspaces', 'info'], { + cwd: directory, + stdio: 'pipe' + }); - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } + try { + return JSON.parse(JSON.parse(stdout).data); + } catch (error) { + throw new Error(`'yarn workspaces info --json' produced unexpected output: \n${stdout}`); + } +} - if (this.encoding) this.setEncoding(this.encoding); +/***/ }), +/* 234 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawn", function() { return spawn; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawnStreaming", function() { return spawnStreaming; }); +/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(137); +/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stream__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(235); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(244); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(279); +/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(143); +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; } - if (this.start > this.end) { - throw new Error('start must be <= end'); - } +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; } - this.pos = this.start; - } +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; } - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; - } +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } - self.fd = fd; - self.emit('open', fd); - self._read(); - }) - } - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); - Stream.call(this); - this.path = path; - this.fd = null; - this.writable = true; +const colorWheel = [chalk__WEBPACK_IMPORTED_MODULE_1___default.a.cyan, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.magenta, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.blue, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.yellow, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.green]; - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; +const getColor = () => { + const color = colorWheel.shift(); + colorWheel.push(color); + return color; +}; - options = options || {}; +function spawn(command, args, opts) { + return execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ + stdio: 'inherit', + preferLocal: true + }, opts)); +} - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } +function streamToLog(debug = true) { + return new stream__WEBPACK_IMPORTED_MODULE_0__["Writable"]({ + objectMode: true, - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); + write(line, _, cb) { + if (line.endsWith('\n')) { + _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line.slice(0, -1)); + } else { + _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line); } - this.pos = this.start; + cb(); } - this.busy = false; - this._queue = []; - - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); - } - } + }); } +function spawnStreaming(command, args, opts, { + prefix, + debug +}) { + const spawned = execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ + stdio: ['ignore', 'pipe', 'pipe'], + preferLocal: true + }, opts)); + const color = getColor(); + const prefixedStdout = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ + tag: color.bold(prefix) + }); + const prefixedStderr = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ + mergeMultiline: true, + tag: color.bold(prefix) + }); + spawned.stdout.pipe(prefixedStdout).pipe(streamToLog(debug)); + spawned.stderr.pipe(prefixedStderr).pipe(streamToLog(debug)); + return spawned; +} /***/ }), -/* 211 */ +/* 235 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const ansiStyles = __webpack_require__(236); +const {stdout: stdoutColor, stderr: stderrColor} = __webpack_require__(240); +const { + stringReplaceAll, + stringEncaseCRLFWithFirstIndex +} = __webpack_require__(242); -module.exports = clone +const {isArray} = Array; -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = [ + 'ansi', + 'ansi', + 'ansi256', + 'ansi16m' +]; - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) +const styles = Object.create(null); - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) +const applyOptions = (object, options = {}) => { + if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) { + throw new Error('The `level` option should be an integer from 0 to 3'); + } - return copy + // Detect level if not set manually + const colorLevel = stdoutColor ? stdoutColor.level : 0; + object.level = options.level === undefined ? colorLevel : options.level; +}; + +class ChalkClass { + constructor(options) { + // eslint-disable-next-line no-constructor-return + return chalkFactory(options); + } } +const chalkFactory = options => { + const chalk = {}; + applyOptions(chalk, options); -/***/ }), -/* 212 */ -/***/ (function(module, exports, __webpack_require__) { + chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_); -"use strict"; + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); -module.exports = writeFile -module.exports.sync = writeFileSync -module.exports._getTmpname = getTmpname // for testing -module.exports._cleanupOnExit = cleanupOnExit + chalk.template.constructor = () => { + throw new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.'); + }; -var fs = __webpack_require__(213) -var MurmurHash3 = __webpack_require__(217) -var onExit = __webpack_require__(218) -var path = __webpack_require__(4) -var activeFiles = {} + chalk.template.Instance = ChalkClass; -// if we run inside of a worker_thread, `process.pid` is not unique -/* istanbul ignore next */ -var threadId = (function getId () { - try { - var workerThreads = __webpack_require__(220) + return chalk.template; +}; - /// if we are in main thread, this is set to `0` - return workerThreads.threadId - } catch (e) { - // worker_threads are not available, fallback to 0 - return 0 - } -})() +function Chalk(options) { + return chalkFactory(options); +} -var invocations = 0 -function getTmpname (filename) { - return filename + '.' + - MurmurHash3(__filename) - .hash(String(process.pid)) - .hash(String(threadId)) - .hash(String(++invocations)) - .result() +for (const [styleName, style] of Object.entries(ansiStyles)) { + styles[styleName] = { + get() { + const builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty); + Object.defineProperty(this, styleName, {value: builder}); + return builder; + } + }; } -function cleanupOnExit (tmpfile) { - return function () { - try { - fs.unlinkSync(typeof tmpfile === 'function' ? tmpfile() : tmpfile) - } catch (_) {} - } +styles.visible = { + get() { + const builder = createBuilder(this, this._styler, true); + Object.defineProperty(this, 'visible', {value: builder}); + return builder; + } +}; + +const usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256']; + +for (const model of usedModels) { + styles[model] = { + get() { + const {level} = this; + return function (...arguments_) { + const styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler); + return createBuilder(this, styler, this._isEmpty); + }; + } + }; } -function writeFile (filename, data, options, callback) { - if (options) { - if (options instanceof Function) { - callback = options - options = {} - } else if (typeof options === 'string') { - options = { encoding: options } - } - } else { - options = {} - } +for (const model of usedModels) { + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const {level} = this; + return function (...arguments_) { + const styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler); + return createBuilder(this, styler, this._isEmpty); + }; + } + }; +} + +const proto = Object.defineProperties(() => {}, { + ...styles, + level: { + enumerable: true, + get() { + return this._generator.level; + }, + set(level) { + this._generator.level = level; + } + } +}); + +const createStyler = (open, close, parent) => { + let openAll; + let closeAll; + if (parent === undefined) { + openAll = open; + closeAll = close; + } else { + openAll = parent.openAll + open; + closeAll = close + parent.closeAll; + } + + return { + open, + close, + openAll, + closeAll, + parent + }; +}; + +const createBuilder = (self, _styler, _isEmpty) => { + const builder = (...arguments_) => { + if (isArray(arguments_[0]) && isArray(arguments_[0].raw)) { + // Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}` + return applyStyle(builder, chalkTag(builder, ...arguments_)); + } + + // Single argument is hot path, implicit coercion is faster than anything + // eslint-disable-next-line no-implicit-coercion + return applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' ')); + }; + + // We alter the prototype because we must return a function, but there is + // no way to create a function with a different prototype + Object.setPrototypeOf(builder, proto); + + builder._generator = self; + builder._styler = _styler; + builder._isEmpty = _isEmpty; + + return builder; +}; + +const applyStyle = (self, string) => { + if (self.level <= 0 || !string) { + return self._isEmpty ? '' : string; + } + + let styler = self._styler; + + if (styler === undefined) { + return string; + } + + const {openAll, closeAll} = styler; + if (string.indexOf('\u001B') !== -1) { + while (styler !== undefined) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + string = stringReplaceAll(string, styler.close, styler.open); + + styler = styler.parent; + } + } - var Promise = options.Promise || global.Promise - var truename - var fd - var tmpfile - /* istanbul ignore next -- The closure only gets called when onExit triggers */ - var removeOnExitHandler = onExit(cleanupOnExit(() => tmpfile)) - var absoluteName = path.resolve(filename) + // We can move both next actions out of loop, because remaining actions in loop won't have + // any/visible effect on parts we add here. Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92 + const lfIndex = string.indexOf('\n'); + if (lfIndex !== -1) { + string = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex); + } - new Promise(function serializeSameFile (resolve) { - // make a queue if it doesn't already exist - if (!activeFiles[absoluteName]) activeFiles[absoluteName] = [] + return openAll + string + closeAll; +}; - activeFiles[absoluteName].push(resolve) // add this job to the queue - if (activeFiles[absoluteName].length === 1) resolve() // kick off the first one - }).then(function getRealPath () { - return new Promise(function (resolve) { - fs.realpath(filename, function (_, realname) { - truename = realname || filename - tmpfile = getTmpname(truename) - resolve() - }) - }) - }).then(function stat () { - return new Promise(function stat (resolve) { - if (options.mode && options.chown) resolve() - else { - // Either mode or chown is not explicitly set - // Default behavior is to copy it from original file - fs.stat(truename, function (err, stats) { - if (err || !stats) resolve() - else { - options = Object.assign({}, options) +let template; +const chalkTag = (chalk, ...strings) => { + const [firstString] = strings; - if (options.mode == null) { - options.mode = stats.mode - } - if (options.chown == null && process.getuid) { - options.chown = { uid: stats.uid, gid: stats.gid } - } - resolve() - } - }) - } - }) - }).then(function thenWriteFile () { - return new Promise(function (resolve, reject) { - fs.open(tmpfile, 'w', options.mode, function (err, _fd) { - fd = _fd - if (err) reject(err) - else resolve() - }) - }) - }).then(function write () { - return new Promise(function (resolve, reject) { - if (Buffer.isBuffer(data)) { - fs.write(fd, data, 0, data.length, 0, function (err) { - if (err) reject(err) - else resolve() - }) - } else if (data != null) { - fs.write(fd, String(data), 0, String(options.encoding || 'utf8'), function (err) { - if (err) reject(err) - else resolve() - }) - } else resolve() - }) - }).then(function syncAndClose () { - return new Promise(function (resolve, reject) { - if (options.fsync !== false) { - fs.fsync(fd, function (err) { - if (err) fs.close(fd, () => reject(err)) - else fs.close(fd, resolve) - }) - } else { - fs.close(fd, resolve) - } - }) - }).then(function chown () { - fd = null - if (options.chown) { - return new Promise(function (resolve, reject) { - fs.chown(tmpfile, options.chown.uid, options.chown.gid, function (err) { - if (err) reject(err) - else resolve() - }) - }) - } - }).then(function chmod () { - if (options.mode) { - return new Promise(function (resolve, reject) { - fs.chmod(tmpfile, options.mode, function (err) { - if (err) reject(err) - else resolve() - }) - }) - } - }).then(function rename () { - return new Promise(function (resolve, reject) { - fs.rename(tmpfile, truename, function (err) { - if (err) reject(err) - else resolve() - }) - }) - }).then(function success () { - removeOnExitHandler() - callback() - }, function fail (err) { - return new Promise(resolve => { - return fd ? fs.close(fd, resolve) : resolve() - }).then(() => { - removeOnExitHandler() - fs.unlink(tmpfile, function () { - callback(err) - }) - }) - }).then(function checkQueue () { - activeFiles[absoluteName].shift() // remove the element added by serializeSameFile - if (activeFiles[absoluteName].length > 0) { - activeFiles[absoluteName][0]() // start next job if one is pending - } else delete activeFiles[absoluteName] - }) -} + if (!isArray(firstString) || !isArray(firstString.raw)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return strings.join(' '); + } -function writeFileSync (filename, data, options) { - if (typeof options === 'string') options = { encoding: options } - else if (!options) options = {} - try { - filename = fs.realpathSync(filename) - } catch (ex) { - // it's ok, it'll happen on a not yet existing file - } - var tmpfile = getTmpname(filename) + const arguments_ = strings.slice(1); + const parts = [firstString.raw[0]]; - if (!options.mode || !options.chown) { - // Either mode or chown is not explicitly set - // Default behavior is to copy it from original file - try { - var stats = fs.statSync(filename) - options = Object.assign({}, options) - if (!options.mode) { - options.mode = stats.mode - } - if (!options.chown && process.getuid) { - options.chown = { uid: stats.uid, gid: stats.gid } - } - } catch (ex) { - // ignore stat errors - } - } + for (let i = 1; i < firstString.length; i++) { + parts.push( + String(arguments_[i - 1]).replace(/[{}\\]/g, '\\$&'), + String(firstString.raw[i]) + ); + } - var fd - var cleanup = cleanupOnExit(tmpfile) - var removeOnExitHandler = onExit(cleanup) + if (template === undefined) { + template = __webpack_require__(243); + } - try { - fd = fs.openSync(tmpfile, 'w', options.mode) - if (Buffer.isBuffer(data)) { - fs.writeSync(fd, data, 0, data.length, 0) - } else if (data != null) { - fs.writeSync(fd, String(data), 0, String(options.encoding || 'utf8')) - } - if (options.fsync !== false) { - fs.fsyncSync(fd) - } - fs.closeSync(fd) - if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid) - if (options.mode) fs.chmodSync(tmpfile, options.mode) - fs.renameSync(tmpfile, filename) - removeOnExitHandler() - } catch (err) { - if (fd) { - try { - fs.closeSync(fd) - } catch (ex) { - // ignore close errors at this stage, error may have closed fd already. - } - } - removeOnExitHandler() - cleanup() - throw err - } -} + return template(chalk, parts.join('')); +}; + +Object.defineProperties(Chalk.prototype, styles); + +const chalk = Chalk(); // eslint-disable-line new-cap +chalk.supportsColor = stdoutColor; +chalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap +chalk.stderr.supportsColor = stderrColor; + +module.exports = chalk; /***/ }), -/* 213 */ +/* 236 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(132) -var polyfills = __webpack_require__(214) -var legacy = __webpack_require__(216) -var queue = [] +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { -var util = __webpack_require__(111) +const wrapAnsi16 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${code + offset}m`; +}; -function noop () {} +const wrapAnsi256 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${38 + offset};5;${code}m`; +}; -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } +const wrapAnsi16m = (fn, offset) => (...args) => { + const rgb = fn(...args); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; -if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(queue) - __webpack_require__(138).equal(queue.length, 0) - }) -} +const ansi2ansi = n => n; +const rgb2rgb = (r, g, b) => [r, g, b]; -module.exports = patch(__webpack_require__(215)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) { - module.exports = patch(fs) -} +const setLazyProperty = (object, property, get) => { + Object.defineProperty(object, property, { + get: () => { + const value = get(); -// Always patch fs.close/closeSync, because we want to -// retry() whenever a close happens *anywhere* in the program. -// This is essential when multiple graceful-fs instances are -// in play at the same time. -module.exports.close = -fs.close = (function (fs$close) { return function (fd, cb) { - return fs$close.call(fs, fd, function (err) { - if (!err) - retry() + Object.defineProperty(object, property, { + value, + enumerable: true, + configurable: true + }); - if (typeof cb === 'function') - cb.apply(this, arguments) - }) -}})(fs.close) + return value; + }, + enumerable: true, + configurable: true + }); +}; -module.exports.closeSync = -fs.closeSync = (function (fs$closeSync) { return function (fd) { - // Note that graceful-fs also retries when fs.closeSync() fails. - // Looks like a bug to me, although it's probably a harmless one. - var rval = fs$closeSync.apply(fs, arguments) - retry() - return rval -}})(fs.closeSync) +/** @type {typeof import('color-convert')} */ +let colorConvert; +const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => { + if (colorConvert === undefined) { + colorConvert = __webpack_require__(237); + } -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch - fs.FileReadStream = ReadStream; // Legacy name. - fs.FileWriteStream = WriteStream; // Legacy name. - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null + const offset = isBackground ? 10 : 0; + const styles = {}; - return go$readFile(path, options, cb) + for (const [sourceSpace, suite] of Object.entries(colorConvert)) { + const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace; + if (sourceSpace === targetSpace) { + styles[name] = wrap(identity, offset); + } else if (typeof suite === 'object') { + styles[name] = wrap(suite[targetSpace], offset); + } + } - function go$readFile (path, options, cb) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + return styles; +}; - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], - return go$writeFile(path, data, options, cb) + // Bright color + blackBright: [90, 39], + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], - function go$writeFile (path, data, options, cb) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + // Alias bright black as gray (and grey) + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; - return go$appendFile(path, data, options, cb) + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; - function go$appendFile (path, data, options, cb) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + group[styleName] = styles[styleName]; - var fs$readdir = fs.readdir - fs.readdir = readdir - function readdir (path, options, cb) { - var args = [path] - if (typeof options !== 'function') { - args.push(options) - } else { - cb = options - } - args.push(go$readdir$cb) + codes.set(style[0], style[1]); + } - return go$readdir(args) + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + } - function go$readdir$cb (err, files) { - if (files && files.sort) - files.sort() + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [args]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - } - } + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; - function go$readdir (args) { - return fs$readdir.apply(fs, args) - } + setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false)); + setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true)); - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } + return styles; +} - var fs$ReadStream = fs.ReadStream - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); - var fs$WriteStream = fs.WriteStream - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) - fs.ReadStream = ReadStream - fs.WriteStream = WriteStream +/***/ }), +/* 237 */ +/***/ (function(module, exports, __webpack_require__) { - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } +const conversions = __webpack_require__(238); +const route = __webpack_require__(239); - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() +const convert = {}; - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } +const models = Object.keys(conversions); - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } +function wrapRaw(fn) { + const wrappedFn = function (...args) { + const arg0 = args[0]; + if (arg0 === undefined || arg0 === null) { + return arg0; + } - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } + if (arg0.length > 1) { + args = arg0; + } - function createReadStream (path, options) { - return new ReadStream(path, options) - } + return fn(args); + }; - function createWriteStream (path, options) { - return new WriteStream(path, options) - } + // Preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null + return wrappedFn; +} + +function wrapRounded(fn) { + const wrappedFn = function (...args) { + const arg0 = args[0]; + + if (arg0 === undefined || arg0 === null) { + return arg0; + } + + if (arg0.length > 1) { + args = arg0; + } + + const result = fn(args); + + // We're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (let len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } + } + + return result; + }; + + // Preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } - return go$open(path, flags, mode, cb) + return wrappedFn; +} - function go$open (path, flags, mode, cb) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } +models.forEach(fromModel => { + convert[fromModel] = {}; - return fs -} + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - queue.push(elem) -} + const routes = route(fromModel); + const routeModels = Object.keys(routes); -function retry () { - var elem = queue.shift() - if (elem) { - debug('RETRY', elem[0].name, elem[1]) - elem[0].apply(null, elem[1]) - } -} + routeModels.forEach(toModel => { + const fn = routes[toModel]; + + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); +}); + +module.exports = convert; /***/ }), -/* 214 */ +/* 238 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(215) -var constants = __webpack_require__(134) - -var origCwd = process.cwd -var cwd = null - -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform +/* MIT license */ +/* eslint-disable no-mixed-operators */ +const cssKeywords = __webpack_require__(117); -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} +// NOTE: conversions should only return primitive values (i.e. arrays, or +// values that give correct `typeof` results). +// do not use box values types (i.e. Number(), String(), etc.) -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) +const reverseKeywords = {}; +for (const key of Object.keys(cssKeywords)) { + reverseKeywords[cssKeywords[key]] = key; } -module.exports = patch +const convert = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} +}; -function patch (fs) { - // (re-)implement some things that are known busted or missing. +module.exports = convert; - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) - } +// Hide .channels and .labels properties +for (const model of Object.keys(convert)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) - } + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); + } - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) + const {channels, labels} = convert[model]; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); +} - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) +convert.rgb.hsl = function (rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const min = Math.min(r, g, b); + const max = Math.max(r, g, b); + const delta = max - min; + let h; + let s; - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; + } - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) + h = Math.min(h * 60, 360); - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) + if (h < 0) { + h += 360; + } - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) + const l = (min + max) / 2; - // if lchmod/lchown do not exist, then make them no-ops - if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) - } - fs.lchmodSync = function () {} - } - if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) - } - fs.lchownSync = function () {} - } + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. + return [h, s * 100, l * 100]; +}; - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = (function (fs$rename) { return function (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - }})(fs.rename) - } +convert.rgb.hsv = function (rgb) { + let rdif; + let gdif; + let bdif; + let h; + let s; + + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const v = Math.max(r, g, b); + const diff = v - Math.min(r, g, b); + const diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; - // if read() returns EAGAIN, then just try it again. - fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } - } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - }})(fs.read) + if (diff === 0) { + h = 0; + s = 0; + } else { + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } - fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } - } - }})(fs.readSync) -} + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + } -function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) - } + return [ + h * 360, + s * 100, + v * 100 + ]; +}; - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) +convert.rgb.hwb = function (rgb) { + const r = rgb[0]; + const g = rgb[1]; + let b = rgb[2]; + const h = convert.rgb.hsl(rgb)[0]; + const w = 1 / 255 * Math.min(r, Math.min(g, b)); - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } -} + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); -function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } + return [h, w * 100, b * 100]; +}; - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } +convert.rgb.cmyk = function (rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} - } -} + const k = Math.min(1 - r, 1 - g, 1 - b); + const c = (1 - r - k) / (1 - k) || 0; + const m = (1 - g - k) / (1 - k) || 0; + const y = (1 - b - k) / (1 - k) || 0; -function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } -} + return [c * 100, m * 100, y * 100, k * 100]; +}; -function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } - } +function comparativeDistance(x, y) { + /* + See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + */ + return ( + ((x[0] - y[0]) ** 2) + + ((x[1] - y[1]) ** 2) + + ((x[2] - y[2]) ** 2) + ); } +convert.rgb.keyword = function (rgb) { + const reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; + } -function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } -} + let currentClosestDistance = Infinity; + let currentClosestKeyword; -function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } - } -} + for (const keyword of Object.keys(cssKeywords)) { + const value = cssKeywords[keyword]; + // Compute comparative distance + const distance = comparativeDistance(rgb, value); -function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, cb) { - return orig.call(fs, target, function (er, stats) { - if (!stats) return cb.apply(this, arguments) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - if (cb) cb.apply(this, arguments) - }) - } -} + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } -function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target) { - var stats = orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; - } -} + return currentClosestKeyword; +}; -// ENOSYS means that the fs doesn't support the op. Just ignore -// that, because it doesn't matter. -// -// if there's no getuid, or if getuid() is something other -// than 0, and the error is EINVAL or EPERM, then just ignore -// it. -// -// This specific case is a silent failure in cp, install, tar, -// and most other unix tools that manage permissions. -// -// When running as root, or if other types of errors are -// encountered, then it's strict. -function chownErOk (er) { - if (!er) - return true +convert.keyword.rgb = function (keyword) { + return cssKeywords[keyword]; +}; - if (er.code === "ENOSYS") - return true +convert.rgb.xyz = function (rgb) { + let r = rgb[0] / 255; + let g = rgb[1] / 255; + let b = rgb[2] / 255; - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } + // Assume sRGB + r = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92); + g = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92); + b = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92); - return false -} + const x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + const y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + const z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + return [x * 100, y * 100, z * 100]; +}; -/***/ }), -/* 215 */ -/***/ (function(module, exports, __webpack_require__) { +convert.rgb.lab = function (rgb) { + const xyz = convert.rgb.xyz(rgb); + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; -"use strict"; + x /= 95.047; + y /= 100; + z /= 108.883; + x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); -var fs = __webpack_require__(132) + const l = (116 * y) - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); -module.exports = clone(fs) + return [l, a, b]; +}; -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj +convert.hsl.rgb = function (hsl) { + const h = hsl[0] / 360; + const s = hsl[1] / 100; + const l = hsl[2] / 100; + let t2; + let t3; + let val; - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) + if (s === 0) { + val = l * 255; + return [val, val, val]; + } - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } - return copy -} + const t1 = 2 * l - t2; + const rgb = [0, 0, 0]; + for (let i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } -/***/ }), -/* 216 */ -/***/ (function(module, exports, __webpack_require__) { + if (t3 > 1) { + t3--; + } -var Stream = __webpack_require__(136).Stream + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } -module.exports = legacy + rgb[i] = val * 255; + } -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } + return rgb; +}; - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); +convert.hsl.hsv = function (hsl) { + const h = hsl[0]; + let s = hsl[1] / 100; + let l = hsl[2] / 100; + let smin = s; + const lmin = Math.max(l, 0.01); - Stream.call(this); + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + const v = (l + s) / 2; + const sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); - var self = this; + return [h, sv * 100, v * 100]; +}; - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; +convert.hsv.rgb = function (hsv) { + const h = hsv[0] / 60; + const s = hsv[1] / 100; + let v = hsv[2] / 100; + const hi = Math.floor(h) % 6; + + const f = h - Math.floor(h); + const p = 255 * v * (1 - s); + const q = 255 * v * (1 - (s * f)); + const t = 255 * v * (1 - (s * (1 - f))); + v *= 255; - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +}; - options = options || {}; +convert.hsv.hsl = function (hsv) { + const h = hsv[0]; + const s = hsv[1] / 100; + const v = hsv[2] / 100; + const vmin = Math.max(v, 0.01); + let sl; + let l; - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } + l = (2 - s) * v; + const lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; - if (this.encoding) this.setEncoding(this.encoding); + return [h, sl * 100, l * 100]; +}; - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +convert.hwb.rgb = function (hwb) { + const h = hwb[0] / 360; + let wh = hwb[1] / 100; + let bl = hwb[2] / 100; + const ratio = wh + bl; + let f; - if (this.start > this.end) { - throw new Error('start must be <= end'); - } + // Wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } - this.pos = this.start; - } + const i = Math.floor(6 * h); + const v = 1 - bl; + f = 6 * h - i; - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; - } + if ((i & 0x01) !== 0) { + f = 1 - f; + } - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } + const n = wh + f * (v - wh); // Linear interpolation - self.fd = fd; - self.emit('open', fd); - self._read(); - }) - } + let r; + let g; + let b; + /* eslint-disable max-statements-per-line,no-multi-spaces */ + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + /* eslint-enable max-statements-per-line,no-multi-spaces */ - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); + return [r * 255, g * 255, b * 255]; +}; - Stream.call(this); +convert.cmyk.rgb = function (cmyk) { + const c = cmyk[0] / 100; + const m = cmyk[1] / 100; + const y = cmyk[2] / 100; + const k = cmyk[3] / 100; - this.path = path; - this.fd = null; - this.writable = true; + const r = 1 - Math.min(1, c * (1 - k) + k); + const g = 1 - Math.min(1, m * (1 - k) + k); + const b = 1 - Math.min(1, y * (1 - k) + k); - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; + return [r * 255, g * 255, b * 255]; +}; - options = options || {}; +convert.xyz.rgb = function (xyz) { + const x = xyz[0] / 100; + const y = xyz[1] / 100; + const z = xyz[2] / 100; + let r; + let g; + let b; - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); - } + // Assume sRGB + r = r > 0.0031308 + ? ((1.055 * (r ** (1.0 / 2.4))) - 0.055) + : r * 12.92; - this.pos = this.start; - } + g = g > 0.0031308 + ? ((1.055 * (g ** (1.0 / 2.4))) - 0.055) + : g * 12.92; - this.busy = false; - this._queue = []; + b = b > 0.0031308 + ? ((1.055 * (b ** (1.0 / 2.4))) - 0.055) + : b * 12.92; - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); - } - } -} + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + return [r * 255, g * 255, b * 255]; +}; -/***/ }), -/* 217 */ -/***/ (function(module, exports, __webpack_require__) { +convert.xyz.lab = function (xyz) { + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; -/** - * @preserve - * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) - * - * @author Jens Taylor - * @see http://github.com/homebrewing/brauhaus-diff - * @author Gary Court - * @see http://github.com/garycourt/murmurhash-js - * @author Austin Appleby - * @see http://sites.google.com/site/murmurhash/ - */ -(function(){ - var cache; + x /= 95.047; + y /= 100; + z /= 108.883; - // Call this function without `new` to use the cached object (good for - // single-threaded environments), or with `new` to create a new object. - // - // @param {string} key A UTF-16 or ASCII string - // @param {number} seed An optional positive integer - // @return {object} A MurmurHash3 object for incremental hashing - function MurmurHash3(key, seed) { - var m = this instanceof MurmurHash3 ? this : cache; - m.reset(seed) - if (typeof key === 'string' && key.length > 0) { - m.hash(key); - } + x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); - if (m !== this) { - return m; - } - }; + const l = (116 * y) - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); - // Incrementally add a string to this hash - // - // @param {string} key A UTF-16 or ASCII string - // @return {object} this - MurmurHash3.prototype.hash = function(key) { - var h1, k1, i, top, len; + return [l, a, b]; +}; - len = key.length; - this.len += len; +convert.lab.xyz = function (lab) { + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let x; + let y; + let z; - k1 = this.k1; - i = 0; - switch (this.rem) { - case 0: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) : 0; - case 1: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 8 : 0; - case 2: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 16 : 0; - case 3: - k1 ^= len > i ? (key.charCodeAt(i) & 0xff) << 24 : 0; - k1 ^= len > i ? (key.charCodeAt(i++) & 0xff00) >> 8 : 0; - } + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; - this.rem = (len + this.rem) & 3; // & 3 is same as % 4 - len -= this.rem; - if (len > 0) { - h1 = this.h1; - while (1) { - k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; + const y2 = y ** 3; + const x2 = x ** 3; + const z2 = z ** 3; + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; - h1 ^= k1; - h1 = (h1 << 13) | (h1 >>> 19); - h1 = (h1 * 5 + 0xe6546b64) & 0xffffffff; + x *= 95.047; + y *= 100; + z *= 108.883; - if (i >= len) { - break; - } + return [x, y, z]; +}; - k1 = ((key.charCodeAt(i++) & 0xffff)) ^ - ((key.charCodeAt(i++) & 0xffff) << 8) ^ - ((key.charCodeAt(i++) & 0xffff) << 16); - top = key.charCodeAt(i++); - k1 ^= ((top & 0xff) << 24) ^ - ((top & 0xff00) >> 8); - } +convert.lab.lch = function (lab) { + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let h; - k1 = 0; - switch (this.rem) { - case 3: k1 ^= (key.charCodeAt(i + 2) & 0xffff) << 16; - case 2: k1 ^= (key.charCodeAt(i + 1) & 0xffff) << 8; - case 1: k1 ^= (key.charCodeAt(i) & 0xffff); - } + const hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; - this.h1 = h1; - } + if (h < 0) { + h += 360; + } - this.k1 = k1; - return this; - }; + const c = Math.sqrt(a * a + b * b); - // Get the result of this hash - // - // @return {number} The 32-bit hash - MurmurHash3.prototype.result = function() { - var k1, h1; - - k1 = this.k1; - h1 = this.h1; + return [l, c, h]; +}; - if (k1 > 0) { - k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - h1 ^= k1; - } +convert.lch.lab = function (lch) { + const l = lch[0]; + const c = lch[1]; + const h = lch[2]; - h1 ^= this.len; + const hr = h / 360 * 2 * Math.PI; + const a = c * Math.cos(hr); + const b = c * Math.sin(hr); - h1 ^= h1 >>> 16; - h1 = (h1 * 0xca6b + (h1 & 0xffff) * 0x85eb0000) & 0xffffffff; - h1 ^= h1 >>> 13; - h1 = (h1 * 0xae35 + (h1 & 0xffff) * 0xc2b20000) & 0xffffffff; - h1 ^= h1 >>> 16; + return [l, a, b]; +}; - return h1 >>> 0; - }; +convert.rgb.ansi16 = function (args, saturation = null) { + const [r, g, b] = args; + let value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization - // Reset the hash object for reuse - // - // @param {number} seed An optional positive integer - MurmurHash3.prototype.reset = function(seed) { - this.h1 = typeof seed === 'number' ? seed : 0; - this.rem = this.k1 = this.len = 0; - return this; - }; + value = Math.round(value / 50); - // A cached object to use. This can be safely used if you're in a single- - // threaded environment, otherwise you need to create new hashes to use. - cache = new MurmurHash3(); + if (value === 0) { + return 30; + } - if (true) { - module.exports = MurmurHash3; - } else {} -}()); + let ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); + if (value === 2) { + ansi += 60; + } -/***/ }), -/* 218 */ -/***/ (function(module, exports, __webpack_require__) { + return ansi; +}; -// Note: since nyc uses this module to output coverage, any lines -// that are in the direct sync flow of nyc's outputCoverage are -// ignored, since we can never get coverage for them. -var assert = __webpack_require__(138) -var signals = __webpack_require__(219) +convert.hsv.ansi16 = function (args) { + // Optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); +}; -var EE = __webpack_require__(154) -/* istanbul ignore if */ -if (typeof EE !== 'function') { - EE = EE.EventEmitter -} +convert.rgb.ansi256 = function (args) { + const r = args[0]; + const g = args[1]; + const b = args[2]; -var emitter -if (process.__signal_exit_emitter__) { - emitter = process.__signal_exit_emitter__ -} else { - emitter = process.__signal_exit_emitter__ = new EE() - emitter.count = 0 - emitter.emitted = {} -} + // We use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } -// Because this emitter is a global, we have to check to see if a -// previous version of this library failed to enable infinite listeners. -// I know what you're about to say. But literally everything about -// signal-exit is a compromise with evil. Get used to it. -if (!emitter.infinite) { - emitter.setMaxListeners(Infinity) - emitter.infinite = true -} + if (r > 248) { + return 231; + } -module.exports = function (cb, opts) { - assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') + return Math.round(((r - 8) / 247) * 24) + 232; + } - if (loaded === false) { - load() - } + const ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); - var ev = 'exit' - if (opts && opts.alwaysLast) { - ev = 'afterexit' - } + return ansi; +}; - var remove = function () { - emitter.removeListener(ev, cb) - if (emitter.listeners('exit').length === 0 && - emitter.listeners('afterexit').length === 0) { - unload() - } - } - emitter.on(ev, cb) +convert.ansi16.rgb = function (args) { + let color = args % 10; - return remove -} + // Handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } -module.exports.unload = unload -function unload () { - if (!loaded) { - return - } - loaded = false + color = color / 10.5 * 255; - signals.forEach(function (sig) { - try { - process.removeListener(sig, sigListeners[sig]) - } catch (er) {} - }) - process.emit = originalProcessEmit - process.reallyExit = originalProcessReallyExit - emitter.count -= 1 -} + return [color, color, color]; + } -function emit (event, code, signal) { - if (emitter.emitted[event]) { - return - } - emitter.emitted[event] = true - emitter.emit(event, code, signal) -} + const mult = (~~(args > 50) + 1) * 0.5; + const r = ((color & 1) * mult) * 255; + const g = (((color >> 1) & 1) * mult) * 255; + const b = (((color >> 2) & 1) * mult) * 255; -// { : , ... } -var sigListeners = {} -signals.forEach(function (sig) { - sigListeners[sig] = function listener () { - // If there are no other listeners, an exit is coming! - // Simplest way: remove us and then re-send the signal. - // We know that this will kill the process, so we can - // safely emit now. - var listeners = process.listeners(sig) - if (listeners.length === emitter.count) { - unload() - emit('exit', null, sig) - /* istanbul ignore next */ - emit('afterexit', null, sig) - /* istanbul ignore next */ - process.kill(process.pid, sig) - } - } -}) + return [r, g, b]; +}; -module.exports.signals = function () { - return signals -} +convert.ansi256.rgb = function (args) { + // Handle greyscale + if (args >= 232) { + const c = (args - 232) * 10 + 8; + return [c, c, c]; + } -module.exports.load = load + args -= 16; -var loaded = false + let rem; + const r = Math.floor(args / 36) / 5 * 255; + const g = Math.floor((rem = args % 36) / 6) / 5 * 255; + const b = (rem % 6) / 5 * 255; -function load () { - if (loaded) { - return - } - loaded = true + return [r, g, b]; +}; - // This is the number of onSignalExit's that are in play. - // It's important so that we can count the correct number of - // listeners on signals, and don't wait for the other one to - // handle it instead of us. - emitter.count += 1 +convert.rgb.hex = function (args) { + const integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); - signals = signals.filter(function (sig) { - try { - process.on(sig, sigListeners[sig]) - return true - } catch (er) { - return false - } - }) + const string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; - process.emit = processEmit - process.reallyExit = processReallyExit -} +convert.hex.rgb = function (args) { + const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } -var originalProcessReallyExit = process.reallyExit -function processReallyExit (code) { - process.exitCode = code || 0 - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - /* istanbul ignore next */ - originalProcessReallyExit.call(process, process.exitCode) -} + let colorString = match[0]; -var originalProcessEmit = process.emit -function processEmit (ev, arg) { - if (ev === 'exit') { - if (arg !== undefined) { - process.exitCode = arg - } - var ret = originalProcessEmit.apply(this, arguments) - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - return ret - } else { - return originalProcessEmit.apply(this, arguments) - } -} + if (match[0].length === 3) { + colorString = colorString.split('').map(char => { + return char + char; + }).join(''); + } + const integer = parseInt(colorString, 16); + const r = (integer >> 16) & 0xFF; + const g = (integer >> 8) & 0xFF; + const b = integer & 0xFF; -/***/ }), -/* 219 */ -/***/ (function(module, exports) { + return [r, g, b]; +}; -// This is not the set of all possible signals. -// -// It IS, however, the set of all signals that trigger -// an exit on either Linux or BSD systems. Linux is a -// superset of the signal names supported on BSD, and -// the unknown signals just fail to register, so we can -// catch that easily enough. -// -// Don't bother with SIGKILL. It's uncatchable, which -// means that we can't fire any callbacks anyway. -// -// If a user does happen to register a handler on a non- -// fatal signal like SIGWINCH or something, and then -// exit, it'll end up firing `process.emit('exit')`, so -// the handler will be fired anyway. -// -// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised -// artificially, inherently leave the process in a -// state from which it is not safe to try and enter JS -// listeners. -module.exports = [ - 'SIGABRT', - 'SIGALRM', - 'SIGHUP', - 'SIGINT', - 'SIGTERM' -] +convert.rgb.hcg = function (rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const max = Math.max(Math.max(r, g), b); + const min = Math.min(Math.min(r, g), b); + const chroma = (max - min); + let grayscale; + let hue; -if (process.platform !== 'win32') { - module.exports.push( - 'SIGVTALRM', - 'SIGXCPU', - 'SIGXFSZ', - 'SIGUSR2', - 'SIGTRAP', - 'SIGSYS', - 'SIGQUIT', - 'SIGIOT' - // should detect profiler and enable/disable accordingly. - // see #21 - // 'SIGPROF' - ) -} + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; + } -if (process.platform === 'linux') { - module.exports.push( - 'SIGIO', - 'SIGPOLL', - 'SIGPWR', - 'SIGSTKFLT', - 'SIGUNUSED' - ) -} + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma; + } + hue /= 6; + hue %= 1; -/***/ }), -/* 220 */ -/***/ (function(module, exports) { + return [hue * 360, chroma * 100, grayscale * 100]; +}; -module.exports = require(undefined); +convert.hsl.hcg = function (hsl) { + const s = hsl[1] / 100; + const l = hsl[2] / 100; -/***/ }), -/* 221 */ -/***/ (function(module, exports, __webpack_require__) { + const c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l)); -"use strict"; + let f = 0; + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); + } -const isPlainObj = __webpack_require__(222); + return [hsl[0], c * 100, f * 100]; +}; -module.exports = (obj, opts) => { - if (!isPlainObj(obj)) { - throw new TypeError('Expected a plain object'); +convert.hsv.hcg = function (hsv) { + const s = hsv[1] / 100; + const v = hsv[2] / 100; + + const c = s * v; + let f = 0; + + if (c < 1.0) { + f = (v - c) / (1 - c); } - opts = opts || {}; + return [hsv[0], c * 100, f * 100]; +}; - // DEPRECATED - if (typeof opts === 'function') { - throw new TypeError('Specify the compare function as an option instead'); +convert.hcg.rgb = function (hcg) { + const h = hcg[0] / 360; + const c = hcg[1] / 100; + const g = hcg[2] / 100; + + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; } - const deep = opts.deep; - const seenInput = []; - const seenOutput = []; + const pure = [0, 0, 0]; + const hi = (h % 1) * 6; + const v = hi % 1; + const w = 1 - v; + let mg = 0; - const sortKeys = x => { - const seenIndex = seenInput.indexOf(x); + /* eslint-disable max-statements-per-line */ + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } + /* eslint-enable max-statements-per-line */ - if (seenIndex !== -1) { - return seenOutput[seenIndex]; - } + mg = (1.0 - c) * g; - const ret = {}; - const keys = Object.keys(x).sort(opts.compare); + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; +}; - seenInput.push(x); - seenOutput.push(ret); +convert.hcg.hsv = function (hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - const val = x[key]; + const v = c + g * (1.0 - c); + let f = 0; - if (deep && Array.isArray(val)) { - const retArr = []; + if (v > 0.0) { + f = c / v; + } - for (let j = 0; j < val.length; j++) { - retArr[j] = isPlainObj(val[j]) ? sortKeys(val[j]) : val[j]; - } + return [hcg[0], f * 100, v * 100]; +}; - ret[key] = retArr; - continue; - } +convert.hcg.hsl = function (hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; - ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val; - } + const l = g * (1.0 - c) + 0.5 * c; + let s = 0; - return ret; - }; + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } - return sortKeys(obj); + return [hcg[0], s * 100, l * 100]; }; +convert.hcg.hwb = function (hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; + const v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; +}; -/***/ }), -/* 222 */ -/***/ (function(module, exports, __webpack_require__) { +convert.hwb.hcg = function (hwb) { + const w = hwb[1] / 100; + const b = hwb[2] / 100; + const v = 1 - b; + const c = v - w; + let g = 0; -"use strict"; + if (c < 1) { + g = (v - c) / (1 - c); + } -var toString = Object.prototype.toString; + return [hwb[0], c * 100, g * 100]; +}; -module.exports = function (x) { - var prototype; - return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); +convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; }; +convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; +}; -/***/ }), -/* 223 */ -/***/ (function(module, exports, __webpack_require__) { +convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; +}; -"use strict"; +convert.gray.hsl = function (args) { + return [0, 0, args[0]]; +}; -const fs = __webpack_require__(132); -const path = __webpack_require__(4); -const pify = __webpack_require__(224); -const semver = __webpack_require__(182); +convert.gray.hsv = convert.gray.hsl; -const defaults = { - mode: 0o777 & (~process.umask()), - fs +convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; }; -const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); - -// https://github.com/nodejs/node/issues/8987 -// https://github.com/libuv/libuv/pull/1088 -const checkPath = pth => { - if (process.platform === 'win32') { - const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, '')); +convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; +}; - if (pathHasInvalidWinCharacters) { - const error = new Error(`Path contains invalid characters: ${pth}`); - error.code = 'EINVAL'; - throw error; - } - } +convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; }; -const permissionError = pth => { - // This replicates the exception of `fs.mkdir` with native the - // `recusive` option when run on an invalid drive under Windows. - const error = new Error(`operation not permitted, mkdir '${pth}'`); - error.code = 'EPERM'; - error.errno = -4048; - error.path = pth; - error.syscall = 'mkdir'; - return error; +convert.gray.hex = function (gray) { + const val = Math.round(gray[0] / 100 * 255) & 0xFF; + const integer = (val << 16) + (val << 8) + val; + + const string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; }; -const makeDir = (input, options) => Promise.resolve().then(() => { - checkPath(input); - options = Object.assign({}, defaults, options); +convert.rgb.gray = function (rgb) { + const val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; +}; - // TODO: Use util.promisify when targeting Node.js 8 - const mkdir = pify(options.fs.mkdir); - const stat = pify(options.fs.stat); - if (useNativeRecursiveOption && options.fs.mkdir === fs.mkdir) { - const pth = path.resolve(input); +/***/ }), +/* 239 */ +/***/ (function(module, exports, __webpack_require__) { - return mkdir(pth, { - mode: options.mode, - recursive: true - }).then(() => pth); - } +const conversions = __webpack_require__(238); - const make = pth => { - return mkdir(pth, options.mode) - .then(() => pth) - .catch(error => { - if (error.code === 'EPERM') { - throw error; - } +/* + This function routes a model to all other models. - if (error.code === 'ENOENT') { - if (path.dirname(pth) === pth) { - throw permissionError(pth); - } + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). - if (error.message.includes('null bytes')) { - throw error; - } + conversions that are not possible simply are not included. +*/ - return make(path.dirname(pth)).then(() => make(pth)); - } +function buildGraph() { + const graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + const models = Object.keys(conversions); - return stat(pth) - .then(stats => stats.isDirectory() ? pth : Promise.reject()) - .catch(() => { - throw error; - }); - }); - }; + for (let len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } - return make(path.resolve(input)); -}); + return graph; +} -module.exports = makeDir; -module.exports.default = makeDir; +// https://en.wikipedia.org/wiki/Breadth-first_search +function deriveBFS(fromModel) { + const graph = buildGraph(); + const queue = [fromModel]; // Unshift -> queue -> pop -module.exports.sync = (input, options) => { - checkPath(input); - options = Object.assign({}, defaults, options); + graph[fromModel].distance = 0; - if (useNativeRecursiveOption && options.fs.mkdirSync === fs.mkdirSync) { - const pth = path.resolve(input); + while (queue.length) { + const current = queue.pop(); + const adjacents = Object.keys(conversions[current]); - fs.mkdirSync(pth, { - mode: options.mode, - recursive: true - }); + for (let len = adjacents.length, i = 0; i < len; i++) { + const adjacent = adjacents[i]; + const node = graph[adjacent]; - return pth; + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } } - const make = pth => { - try { - options.fs.mkdirSync(pth, options.mode); - } catch (error) { - if (error.code === 'EPERM') { - throw error; - } + return graph; +} - if (error.code === 'ENOENT') { - if (path.dirname(pth) === pth) { - throw permissionError(pth); - } +function link(from, to) { + return function (args) { + return to(from(args)); + }; +} - if (error.message.includes('null bytes')) { - throw error; - } +function wrapConversion(toModel, graph) { + const path = [graph[toModel].parent, toModel]; + let fn = conversions[graph[toModel].parent][toModel]; - make(path.dirname(pth)); - return make(pth); - } + let cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } - try { - if (!options.fs.statSync(pth).isDirectory()) { - throw new Error('The path is not a directory'); - } - } catch (_) { - throw error; - } + fn.conversion = path; + return fn; +} + +module.exports = function (fromModel) { + const graph = deriveBFS(fromModel); + const conversion = {}; + + const models = Object.keys(graph); + for (let len = models.length, i = 0; i < len; i++) { + const toModel = models[i]; + const node = graph[toModel]; + + if (node.parent === null) { + // No possible conversion, or this node is the source model. + continue; } - return pth; - }; + conversion[toModel] = wrapConversion(toModel, graph); + } - return make(path.resolve(input)); + return conversion; }; + /***/ }), -/* 224 */ +/* 240 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const os = __webpack_require__(120); +const tty = __webpack_require__(121); +const hasFlag = __webpack_require__(241); -const processFn = (fn, options) => function (...args) { - const P = options.promiseModule; - - return new P((resolve, reject) => { - if (options.multiArgs) { - args.push((...result) => { - if (options.errorFirst) { - if (result[0]) { - reject(result); - } else { - result.shift(); - resolve(result); - } - } else { - resolve(result); - } - }); - } else if (options.errorFirst) { - args.push((error, result) => { - if (error) { - reject(error); - } else { - resolve(result); - } - }); - } else { - args.push(resolve); - } +const {env} = process; - fn.apply(this, args); - }); -}; +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false') || + hasFlag('color=never')) { + forceColor = 0; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = 1; +} -module.exports = (input, options) => { - options = Object.assign({ - exclude: [/.+(Sync|Stream)$/], - errorFirst: true, - promiseModule: Promise - }, options); +if ('FORCE_COLOR' in env) { + if (env.FORCE_COLOR === 'true') { + forceColor = 1; + } else if (env.FORCE_COLOR === 'false') { + forceColor = 0; + } else { + forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); + } +} - const objType = typeof input; - if (!(input !== null && (objType === 'object' || objType === 'function'))) { - throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${input === null ? 'null' : objType}\``); +function translateLevel(level) { + if (level === 0) { + return false; } - const filter = key => { - const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key); - return options.include ? options.include.some(match) : !options.exclude.some(match); + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 }; +} - let ret; - if (objType === 'function') { - ret = function (...args) { - return options.excludeMain ? input(...args) : processFn(input, options).apply(this, args); - }; - } else { - ret = Object.create(Object.getPrototypeOf(input)); +function supportsColor(haveStream, streamIsTTY) { + if (forceColor === 0) { + return 0; } - for (const key in input) { // eslint-disable-line guard-for-in - const property = input[key]; - ret[key] = typeof property === 'function' && filter(key) ? processFn(property, options) : property; + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; } - return ret; -}; + if (hasFlag('color=256')) { + return 2; + } + if (haveStream && !streamIsTTY && forceColor === undefined) { + return 0; + } -/***/ }), -/* 225 */ -/***/ (function(module, exports, __webpack_require__) { + const min = forceColor || 0; -"use strict"; + if (env.TERM === 'dumb') { + return min; + } + if (process.platform === 'win32') { + // Windows 10 build 10586 is the first Windows release that supports 256 colors. + // Windows 10 build 14931 is the first release that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } -// detect either spaces or tabs but not both to properly handle tabs -// for indentation and spaces for alignment -const INDENT_RE = /^(?:( )+|\t+)/; + return 1; + } -function getMostUsed(indents) { - let result = 0; - let maxUsed = 0; - let maxWeight = 0; + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } - for (const entry of indents) { - // TODO: use destructuring when targeting Node.js 6 - const key = entry[0]; - const val = entry[1]; + return min; + } - const u = val[0]; - const w = val[1]; + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } - if (u > maxUsed || (u === maxUsed && w > maxWeight)) { - maxUsed = u; - maxWeight = w; - result = Number(key); + if ('GITHUB_ACTIONS' in env) { + return 1; + } + + if (env.COLORTERM === 'truecolor') { + return 3; + } + + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default } } - return result; -} + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } -module.exports = str => { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; } - // used to see if tabs or spaces are the most used - let tabs = 0; - let spaces = 0; + if ('COLORTERM' in env) { + return 1; + } - // remember the size of previous line's indentation - let prev = 0; + return min; +} - // remember how many indents/unindents as occurred for a given size - // and how much lines follow a given indentation - // - // indents = { - // 3: [1, 0], - // 4: [1, 5], - // 5: [1, 0], - // 12: [1, 0], - // } - const indents = new Map(); +function getSupportLevel(stream) { + const level = supportsColor(stream, stream && stream.isTTY); + return translateLevel(level); +} - // pointer to the array of last used indent - let current; +module.exports = { + supportsColor: getSupportLevel, + stdout: translateLevel(supportsColor(true, tty.isatty(1))), + stderr: translateLevel(supportsColor(true, tty.isatty(2))) +}; + + +/***/ }), +/* 241 */ +/***/ (function(module, exports, __webpack_require__) { - // whether the last action was an indent (opposed to an unindent) - let isIndent; +"use strict"; - for (const line of str.split(/\n/g)) { - if (!line) { - // ignore empty lines - continue; - } - let indent; - const matches = line.match(INDENT_RE); +module.exports = (flag, argv = process.argv) => { + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf('--'); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); +}; - if (matches) { - indent = matches[0].length; - if (matches[1]) { - spaces++; - } else { - tabs++; - } - } else { - indent = 0; - } +/***/ }), +/* 242 */ +/***/ (function(module, exports, __webpack_require__) { - const diff = indent - prev; - prev = indent; +"use strict"; - if (diff) { - // an indent or unindent has been detected - isIndent = diff > 0; +const stringReplaceAll = (string, substring, replacer) => { + let index = string.indexOf(substring); + if (index === -1) { + return string; + } - current = indents.get(isIndent ? diff : -diff); + const substringLength = substring.length; + let endIndex = 0; + let returnValue = ''; + do { + returnValue += string.substr(endIndex, index - endIndex) + substring + replacer; + endIndex = index + substringLength; + index = string.indexOf(substring, endIndex); + } while (index !== -1); - if (current) { - current[0]++; - } else { - current = [1, 0]; - indents.set(diff, current); - } - } else if (current) { - // if the last action was an indent, increment the weight - current[1] += Number(isIndent); - } - } + returnValue += string.substr(endIndex); + return returnValue; +}; - const amount = getMostUsed(indents); +const stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => { + let endIndex = 0; + let returnValue = ''; + do { + const gotCR = string[index - 1] === '\r'; + returnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\r\n' : '\n') + postfix; + endIndex = index + 1; + index = string.indexOf('\n', endIndex); + } while (index !== -1); - let type; - let indent; - if (!amount) { - type = null; - indent = ''; - } else if (spaces >= tabs) { - type = 'space'; - indent = ' '.repeat(amount); - } else { - type = 'tab'; - indent = '\t'.repeat(amount); - } + returnValue += string.substr(endIndex); + return returnValue; +}; - return { - amount, - type, - indent - }; +module.exports = { + stringReplaceAll, + stringEncaseCRLFWithFirstIndex }; /***/ }), -/* 226 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 243 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installInDir", function() { return installInDir; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackage", function() { return runScriptInPackage; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackageStreaming", function() { return runScriptInPackageStreaming; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "yarnWorkspacesInfo", function() { return yarnWorkspacesInfo; }); -/* harmony import */ var _child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(227); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -const YARN_EXEC = process.env.npm_execpath || 'yarn'; +const TEMPLATE_REGEX = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi; -/** - * Install all dependencies in the given directory - */ -async function installInDir(directory, extraArgs = []) { - const options = ['install', '--non-interactive', ...extraArgs]; // We pass the mutex flag to ensure only one instance of yarn runs at any - // given time (e.g. to avoid conflicts). +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, options, { - cwd: directory - }); -} -/** - * Run script in the given directory - */ +function unescape(c) { + const u = c[0] === 'u'; + const bracket = c[1] === '{'; -async function runScriptInPackage(script, args, pkg) { - const execOpts = { - cwd: pkg.path - }; - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['run', script, ...args], execOpts); -} -/** - * Run script in the given directory - */ + if ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } -function runScriptInPackageStreaming({ - script, - args, - pkg, - debug -}) { - const execOpts = { - cwd: pkg.path - }; - return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])(YARN_EXEC, ['run', script, ...args], execOpts, { - prefix: pkg.name, - debug - }); -} -async function yarnWorkspacesInfo(directory) { - const { - stdout - } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['--json', 'workspaces', 'info'], { - cwd: directory, - stdio: 'pipe' - }); + if (u && bracket) { + return String.fromCodePoint(parseInt(c.slice(2, -1), 16)); + } - try { - return JSON.parse(JSON.parse(stdout).data); - } catch (error) { - throw new Error(`'yarn workspaces info --json' produced unexpected output: \n${stdout}`); - } + return ESCAPES.get(c) || c; } -/***/ }), -/* 227 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +function parseArguments(name, arguments_) { + const results = []; + const chunks = arguments_.trim().split(/\s*,\s*/g); + let matches; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawn", function() { return spawn; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawnStreaming", function() { return spawnStreaming; }); -/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(136); -/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stream__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(112); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(228); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(263); -/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(142); -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; } + for (const chunk of chunks) { + const number = Number(chunk); + if (!Number.isNaN(number)) { + results.push(number); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } -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; } + return results; +} -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 parseStyle(style) { + STYLE_REGEX.lastIndex = 0; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ + const results = []; + let matches; + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } + return results; +} +function buildStyle(chalk, styles) { + const enabled = {}; -const colorWheel = [chalk__WEBPACK_IMPORTED_MODULE_1___default.a.cyan, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.magenta, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.blue, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.yellow, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.green]; + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } -const getColor = () => { - const color = colorWheel.shift(); - colorWheel.push(color); - return color; -}; + let current = chalk; + for (const [styleName, styles] of Object.entries(enabled)) { + if (!Array.isArray(styles)) { + continue; + } -function spawn(command, args, opts) { - return execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ - stdio: 'inherit', - preferLocal: true - }, opts)); + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } + + current = styles.length > 0 ? current[styleName](...styles) : current[styleName]; + } + + return current; } -function streamToLog(debug = true) { - return new stream__WEBPACK_IMPORTED_MODULE_0__["Writable"]({ - objectMode: true, +module.exports = (chalk, temporary) => { + const styles = []; + const chunks = []; + let chunk = []; - write(line, _, cb) { - if (line.endsWith('\n')) { - _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line.slice(0, -1)); - } else { - _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line); - } + // eslint-disable-next-line max-params + temporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => { + if (escapeCharacter) { + chunk.push(unescape(escapeCharacter)); + } else if (style) { + const string = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } - cb(); - } + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(character); + } + }); - }); -} + chunks.push(chunk.join('')); + + if (styles.length > 0) { + const errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMessage); + } + + return chunks.join(''); +}; -function spawnStreaming(command, args, opts, { - prefix, - debug -}) { - const spawned = execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ - stdio: ['ignore', 'pipe', 'pipe'], - preferLocal: true - }, opts)); - const color = getColor(); - const prefixedStdout = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ - tag: color.bold(prefix) - }); - const prefixedStderr = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ - mergeMultiline: true, - tag: color.bold(prefix) - }); - spawned.stdout.pipe(prefixedStdout).pipe(streamToLog(debug)); - spawned.stderr.pipe(prefixedStderr).pipe(streamToLog(debug)); - return spawned; -} /***/ }), -/* 228 */ +/* 244 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const childProcess = __webpack_require__(229); -const crossSpawn = __webpack_require__(230); -const stripFinalNewline = __webpack_require__(243); -const npmRunPath = __webpack_require__(244); -const onetime = __webpack_require__(245); -const makeError = __webpack_require__(247); -const normalizeStdio = __webpack_require__(252); -const {spawnedKill, spawnedCancel, setupTimeout, setExitHandler} = __webpack_require__(253); -const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = __webpack_require__(254); -const {mergePromise, getSpawnedPromise} = __webpack_require__(261); -const {joinCommand, parseCommand} = __webpack_require__(262); +const childProcess = __webpack_require__(245); +const crossSpawn = __webpack_require__(246); +const stripFinalNewline = __webpack_require__(259); +const npmRunPath = __webpack_require__(260); +const onetime = __webpack_require__(261); +const makeError = __webpack_require__(263); +const normalizeStdio = __webpack_require__(268); +const {spawnedKill, spawnedCancel, setupTimeout, setExitHandler} = __webpack_require__(269); +const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = __webpack_require__(270); +const {mergePromise, getSpawnedPromise} = __webpack_require__(277); +const {joinCommand, parseCommand} = __webpack_require__(278); const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100; @@ -24239,21 +27302,21 @@ module.exports.node = (scriptPath, args, options = {}) => { /***/ }), -/* 229 */ +/* 245 */ /***/ (function(module, exports) { module.exports = require("child_process"); /***/ }), -/* 230 */ +/* 246 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const cp = __webpack_require__(229); -const parse = __webpack_require__(231); -const enoent = __webpack_require__(242); +const cp = __webpack_require__(245); +const parse = __webpack_require__(247); +const enoent = __webpack_require__(258); function spawn(command, args, options) { // Parse the arguments @@ -24291,16 +27354,16 @@ module.exports._enoent = enoent; /***/ }), -/* 231 */ +/* 247 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const resolveCommand = __webpack_require__(232); -const escape = __webpack_require__(238); -const readShebang = __webpack_require__(239); +const resolveCommand = __webpack_require__(248); +const escape = __webpack_require__(254); +const readShebang = __webpack_require__(255); const isWin = process.platform === 'win32'; const isExecutableRegExp = /\.(?:com|exe)$/i; @@ -24389,15 +27452,15 @@ module.exports = parse; /***/ }), -/* 232 */ +/* 248 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const which = __webpack_require__(233); -const pathKey = __webpack_require__(237)(); +const which = __webpack_require__(249); +const pathKey = __webpack_require__(253)(); function resolveCommandAttempt(parsed, withoutPathExt) { const cwd = process.cwd(); @@ -24447,7 +27510,7 @@ module.exports = resolveCommand; /***/ }), -/* 233 */ +/* 249 */ /***/ (function(module, exports, __webpack_require__) { const isWindows = process.platform === 'win32' || @@ -24456,7 +27519,7 @@ const isWindows = process.platform === 'win32' || const path = __webpack_require__(4) const COLON = isWindows ? ';' : ':' -const isexe = __webpack_require__(234) +const isexe = __webpack_require__(250) const getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }) @@ -24578,15 +27641,15 @@ which.sync = whichSync /***/ }), -/* 234 */ +/* 250 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(132) +var fs = __webpack_require__(133) var core if (process.platform === 'win32' || global.TESTING_WINDOWS) { - core = __webpack_require__(235) + core = __webpack_require__(251) } else { - core = __webpack_require__(236) + core = __webpack_require__(252) } module.exports = isexe @@ -24641,13 +27704,13 @@ function sync (path, options) { /***/ }), -/* 235 */ +/* 251 */ /***/ (function(module, exports, __webpack_require__) { module.exports = isexe isexe.sync = sync -var fs = __webpack_require__(132) +var fs = __webpack_require__(133) function checkPathExt (path, options) { var pathext = options.pathExt !== undefined ? @@ -24689,13 +27752,13 @@ function sync (path, options) { /***/ }), -/* 236 */ +/* 252 */ /***/ (function(module, exports, __webpack_require__) { module.exports = isexe isexe.sync = sync -var fs = __webpack_require__(132) +var fs = __webpack_require__(133) function isexe (path, options, cb) { fs.stat(path, function (er, stat) { @@ -24736,7 +27799,7 @@ function checkMode (stat, options) { /***/ }), -/* 237 */ +/* 253 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24759,7 +27822,7 @@ module.exports.default = pathKey; /***/ }), -/* 238 */ +/* 254 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24811,14 +27874,14 @@ module.exports.argument = escapeArgument; /***/ }), -/* 239 */ +/* 255 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); -const shebangCommand = __webpack_require__(240); +const fs = __webpack_require__(133); +const shebangCommand = __webpack_require__(256); function readShebang(command) { // Read the first 150 bytes from the file @@ -24841,12 +27904,12 @@ module.exports = readShebang; /***/ }), -/* 240 */ +/* 256 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const shebangRegex = __webpack_require__(241); +const shebangRegex = __webpack_require__(257); module.exports = (string = '') => { const match = string.match(shebangRegex); @@ -24867,7 +27930,7 @@ module.exports = (string = '') => { /***/ }), -/* 241 */ +/* 257 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24876,7 +27939,7 @@ module.exports = /^#!(.*)/; /***/ }), -/* 242 */ +/* 258 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24942,7 +28005,7 @@ module.exports = { /***/ }), -/* 243 */ +/* 259 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24965,13 +28028,13 @@ module.exports = input => { /***/ }), -/* 244 */ +/* 260 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const pathKey = __webpack_require__(237); +const pathKey = __webpack_require__(253); const npmRunPath = options => { options = { @@ -25019,12 +28082,12 @@ module.exports.env = options => { /***/ }), -/* 245 */ +/* 261 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const mimicFn = __webpack_require__(246); +const mimicFn = __webpack_require__(262); const calledFunctions = new WeakMap(); @@ -25076,7 +28139,7 @@ module.exports.callCount = fn => { /***/ }), -/* 246 */ +/* 262 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25096,12 +28159,12 @@ module.exports.default = mimicFn; /***/ }), -/* 247 */ +/* 263 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {signalsByName} = __webpack_require__(248); +const {signalsByName} = __webpack_require__(264); const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => { if (timedOut) { @@ -25189,14 +28252,14 @@ module.exports = makeError; /***/ }), -/* 248 */ +/* 264 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.signalsByNumber=exports.signalsByName=void 0;var _os=__webpack_require__(121); +Object.defineProperty(exports,"__esModule",{value:true});exports.signalsByNumber=exports.signalsByName=void 0;var _os=__webpack_require__(120); -var _signals=__webpack_require__(249); -var _realtime=__webpack_require__(251); +var _signals=__webpack_require__(265); +var _realtime=__webpack_require__(267); @@ -25266,14 +28329,14 @@ const signalsByNumber=getSignalsByNumber();exports.signalsByNumber=signalsByNumb //# sourceMappingURL=main.js.map /***/ }), -/* 249 */ +/* 265 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.getSignals=void 0;var _os=__webpack_require__(121); +Object.defineProperty(exports,"__esModule",{value:true});exports.getSignals=void 0;var _os=__webpack_require__(120); -var _core=__webpack_require__(250); -var _realtime=__webpack_require__(251); +var _core=__webpack_require__(266); +var _realtime=__webpack_require__(267); @@ -25307,7 +28370,7 @@ return{name,number,description,supported,action,forced,standard}; //# sourceMappingURL=signals.js.map /***/ }), -/* 250 */ +/* 266 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25586,7 +28649,7 @@ standard:"other"}];exports.SIGNALS=SIGNALS; //# sourceMappingURL=core.js.map /***/ }), -/* 251 */ +/* 267 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25611,7 +28674,7 @@ const SIGRTMAX=64;exports.SIGRTMAX=SIGRTMAX; //# sourceMappingURL=realtime.js.map /***/ }), -/* 252 */ +/* 268 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25670,13 +28733,13 @@ module.exports.node = opts => { /***/ }), -/* 253 */ +/* 269 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(121); -const onExit = __webpack_require__(218); +const os = __webpack_require__(120); +const onExit = __webpack_require__(225); const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5; @@ -25789,14 +28852,14 @@ module.exports = { /***/ }), -/* 254 */ +/* 270 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const isStream = __webpack_require__(255); -const getStream = __webpack_require__(256); -const mergeStream = __webpack_require__(260); +const isStream = __webpack_require__(271); +const getStream = __webpack_require__(272); +const mergeStream = __webpack_require__(276); // `input` option const handleInput = (spawned, input) => { @@ -25893,7 +28956,7 @@ module.exports = { /***/ }), -/* 255 */ +/* 271 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25929,13 +28992,13 @@ module.exports = isStream; /***/ }), -/* 256 */ +/* 272 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pump = __webpack_require__(257); -const bufferStream = __webpack_require__(259); +const pump = __webpack_require__(273); +const bufferStream = __webpack_require__(275); class MaxBufferError extends Error { constructor() { @@ -25994,12 +29057,12 @@ module.exports.MaxBufferError = MaxBufferError; /***/ }), -/* 257 */ +/* 273 */ /***/ (function(module, exports, __webpack_require__) { -var once = __webpack_require__(160) -var eos = __webpack_require__(258) -var fs = __webpack_require__(132) // we only need fs to get the ReadStream and WriteStream prototypes +var once = __webpack_require__(161) +var eos = __webpack_require__(274) +var fs = __webpack_require__(133) // we only need fs to get the ReadStream and WriteStream prototypes var noop = function () {} var ancient = /^v?\.0/.test(process.version) @@ -26082,10 +29145,10 @@ module.exports = pump /***/ }), -/* 258 */ +/* 274 */ /***/ (function(module, exports, __webpack_require__) { -var once = __webpack_require__(160); +var once = __webpack_require__(161); var noop = function() {}; @@ -26175,12 +29238,12 @@ module.exports = eos; /***/ }), -/* 259 */ +/* 275 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {PassThrough: PassThroughStream} = __webpack_require__(136); +const {PassThrough: PassThroughStream} = __webpack_require__(137); module.exports = options => { options = {...options}; @@ -26234,13 +29297,13 @@ module.exports = options => { /***/ }), -/* 260 */ +/* 276 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const { PassThrough } = __webpack_require__(136); +const { PassThrough } = __webpack_require__(137); module.exports = function (/*streams...*/) { var sources = [] @@ -26282,7 +29345,7 @@ module.exports = function (/*streams...*/) { /***/ }), -/* 261 */ +/* 277 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26335,7 +29398,7 @@ module.exports = { /***/ }), -/* 262 */ +/* 278 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26380,7 +29443,7 @@ module.exports = { /***/ }), -/* 263 */ +/* 279 */ /***/ (function(module, exports, __webpack_require__) { // Copyright IBM Corp. 2014,2018. All Rights Reserved. @@ -26388,12 +29451,12 @@ module.exports = { // This file is licensed under the Apache License 2.0. // License text available at https://opensource.org/licenses/Apache-2.0 -module.exports = __webpack_require__(264); -module.exports.cli = __webpack_require__(268); +module.exports = __webpack_require__(280); +module.exports.cli = __webpack_require__(284); /***/ }), -/* 264 */ +/* 280 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26404,13 +29467,13 @@ module.exports.cli = __webpack_require__(268); -var stream = __webpack_require__(136); +var stream = __webpack_require__(137); var util = __webpack_require__(111); -var fs = __webpack_require__(132); +var fs = __webpack_require__(133); -var through = __webpack_require__(265); -var duplexer = __webpack_require__(266); -var StringDecoder = __webpack_require__(267).StringDecoder; +var through = __webpack_require__(281); +var duplexer = __webpack_require__(282); +var StringDecoder = __webpack_require__(283).StringDecoder; module.exports = Logger; @@ -26599,10 +29662,10 @@ function lineMerger(host) { /***/ }), -/* 265 */ +/* 281 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(136) +var Stream = __webpack_require__(137) // through // @@ -26713,10 +29776,10 @@ function through (write, end, opts) { /***/ }), -/* 266 */ +/* 282 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(136) +var Stream = __webpack_require__(137) var writeMethods = ["write", "end", "destroy"] var readMethods = ["resume", "pause"] var readEvents = ["data", "close"] @@ -26806,13 +29869,13 @@ function duplex(writer, reader) { /***/ }), -/* 267 */ +/* 283 */ /***/ (function(module, exports) { module.exports = require("string_decoder"); /***/ }), -/* 268 */ +/* 284 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26823,11 +29886,11 @@ module.exports = require("string_decoder"); -var minimist = __webpack_require__(269); +var minimist = __webpack_require__(285); var path = __webpack_require__(4); -var Logger = __webpack_require__(264); -var pkg = __webpack_require__(270); +var Logger = __webpack_require__(280); +var pkg = __webpack_require__(286); module.exports = cli; @@ -26881,7 +29944,7 @@ function usage($0, p) { /***/ }), -/* 269 */ +/* 285 */ /***/ (function(module, exports) { module.exports = function (args, opts) { @@ -27123,29 +30186,29 @@ function isNumber (x) { /***/ }), -/* 270 */ +/* 286 */ /***/ (function(module) { module.exports = JSON.parse("{\"name\":\"strong-log-transformer\",\"version\":\"2.1.0\",\"description\":\"Stream transformer that prefixes lines with timestamps and other things.\",\"author\":\"Ryan Graham \",\"license\":\"Apache-2.0\",\"repository\":{\"type\":\"git\",\"url\":\"git://github.com/strongloop/strong-log-transformer\"},\"keywords\":[\"logging\",\"streams\"],\"bugs\":{\"url\":\"https://github.com/strongloop/strong-log-transformer/issues\"},\"homepage\":\"https://github.com/strongloop/strong-log-transformer\",\"directories\":{\"test\":\"test\"},\"bin\":{\"sl-log-transformer\":\"bin/sl-log-transformer.js\"},\"main\":\"index.js\",\"scripts\":{\"test\":\"tap --100 test/test-*\"},\"dependencies\":{\"duplexer\":\"^0.1.1\",\"minimist\":\"^1.2.0\",\"through\":\"^2.3.4\"},\"devDependencies\":{\"tap\":\"^12.0.1\"},\"engines\":{\"node\":\">=4\"}}"); /***/ }), -/* 271 */ +/* 287 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "workspacePackagePaths", function() { return workspacePackagePaths; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyWorkspacePackages", function() { return copyWorkspacePackages; }); -/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145); +/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(146); /* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(glob__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(111); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(272); -/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(129); -/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(163); -/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(144); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(288); +/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(130); +/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(164); +/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(145); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -27237,7 +30300,7 @@ function packagesFromGlobPattern({ } /***/ }), -/* 272 */ +/* 288 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -27307,21 +30370,21 @@ function getProjectPaths({ } /***/ }), -/* 273 */ +/* 289 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAllChecksums", function() { return getAllChecksums; }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(132); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(133); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(274); +/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(290); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(111); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(228); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(244); /* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _yarn_lock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(275); +/* harmony import */ var _yarn_lock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(291); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -27550,21 +30613,21 @@ async function getAllChecksums(kbn, log) { } /***/ }), -/* 274 */ +/* 290 */ /***/ (function(module, exports) { module.exports = require("crypto"); /***/ }), -/* 275 */ +/* 291 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readYarnLock", function() { return readYarnLock; }); -/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(276); +/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); /* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(129); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(130); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -27606,7 +30669,7 @@ async function readYarnLock(kbn) { } /***/ }), -/* 276 */ +/* 292 */ /***/ (function(module, exports, __webpack_require__) { module.exports = @@ -27738,7 +30801,7 @@ module.exports = __webpack_require__(111); /* 3 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(132); +module.exports = __webpack_require__(133); /***/ }), /* 4 */ @@ -29165,7 +32228,7 @@ module.exports = invariant; /* 9 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(274); +module.exports = __webpack_require__(290); /***/ }), /* 10 */, @@ -29591,7 +32654,7 @@ exports.default = Lockfile; /* 17 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(136); +module.exports = __webpack_require__(137); /***/ }), /* 18 */, @@ -29643,7 +32706,7 @@ function nullify(obj = {}) { /* 22 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(138); +module.exports = __webpack_require__(139); /***/ }), /* 23 */ @@ -29830,7 +32893,7 @@ module.exports = {}; /* 36 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(121); +module.exports = __webpack_require__(120); /***/ }), /* 37 */, @@ -30115,7 +33178,7 @@ exports.f = __webpack_require__(33) ? Object.defineProperty : function definePro /* 54 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(154); +module.exports = __webpack_require__(155); /***/ }), /* 55 */ @@ -31489,7 +34552,7 @@ function onceStrict (fn) { /* 63 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(277); +module.exports = __webpack_require__(293); /***/ }), /* 64 */, @@ -32427,7 +35490,7 @@ module.exports.win32 = win32; /* 79 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(278); +module.exports = __webpack_require__(121); /***/ }), /* 80 */, @@ -37884,25 +40947,19 @@ module.exports = process && support(supportLevel); /******/ ]); /***/ }), -/* 277 */ +/* 293 */ /***/ (function(module, exports) { module.exports = require("buffer"); /***/ }), -/* 278 */ -/***/ (function(module, exports) { - -module.exports = require("tty"); - -/***/ }), -/* 279 */ +/* 294 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BootstrapCacheFile", function() { return BootstrapCacheFile; }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(132); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(133); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); @@ -37993,20 +41050,20 @@ class BootstrapCacheFile { } /***/ }), -/* 280 */ +/* 295 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CleanCommand", function() { return CleanCommand; }); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(281); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(296); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(373); +/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(388); /* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ora__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(129); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(142); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(130); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(143); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -38101,21 +41158,21 @@ const CleanCommand = { }; /***/ }), -/* 281 */ +/* 296 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(111); const path = __webpack_require__(4); -const globby = __webpack_require__(282); -const isGlob = __webpack_require__(365); -const slash = __webpack_require__(363); -const gracefulFs = __webpack_require__(131); -const isPathCwd = __webpack_require__(366); -const isPathInside = __webpack_require__(367); -const rimraf = __webpack_require__(368); -const pMap = __webpack_require__(369); +const globby = __webpack_require__(297); +const isGlob = __webpack_require__(380); +const slash = __webpack_require__(378); +const gracefulFs = __webpack_require__(132); +const isPathCwd = __webpack_require__(381); +const isPathInside = __webpack_require__(382); +const rimraf = __webpack_require__(383); +const pMap = __webpack_require__(384); const rimrafP = promisify(rimraf); @@ -38229,19 +41286,19 @@ module.exports.sync = (patterns, {force, dryRun, cwd = process.cwd(), ...options /***/ }), -/* 282 */ +/* 297 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); -const arrayUnion = __webpack_require__(283); -const merge2 = __webpack_require__(284); -const glob = __webpack_require__(285); -const fastGlob = __webpack_require__(290); -const dirGlob = __webpack_require__(359); -const gitignore = __webpack_require__(361); -const {FilterStream, UniqueStream} = __webpack_require__(364); +const fs = __webpack_require__(133); +const arrayUnion = __webpack_require__(298); +const merge2 = __webpack_require__(299); +const glob = __webpack_require__(300); +const fastGlob = __webpack_require__(305); +const dirGlob = __webpack_require__(374); +const gitignore = __webpack_require__(376); +const {FilterStream, UniqueStream} = __webpack_require__(379); const DEFAULT_FILTER = () => false; @@ -38414,7 +41471,7 @@ module.exports.gitignore = gitignore; /***/ }), -/* 283 */ +/* 298 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -38426,7 +41483,7 @@ module.exports = (...arguments_) => { /***/ }), -/* 284 */ +/* 299 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -38438,7 +41495,7 @@ module.exports = (...arguments_) => { * Copyright (c) 2014-2020 Teambition * Licensed under the MIT license. */ -const Stream = __webpack_require__(136) +const Stream = __webpack_require__(137) const PassThrough = Stream.PassThrough const slice = Array.prototype.slice @@ -38577,7 +41634,7 @@ function pauseStreams (streams, options) { /***/ }), -/* 285 */ +/* 300 */ /***/ (function(module, exports, __webpack_require__) { // Approach: @@ -38622,27 +41679,27 @@ function pauseStreams (streams, options) { module.exports = glob -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(286) -var EE = __webpack_require__(154).EventEmitter +var inherits = __webpack_require__(301) +var EE = __webpack_require__(155).EventEmitter var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var globSync = __webpack_require__(288) -var common = __webpack_require__(289) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var globSync = __webpack_require__(303) +var common = __webpack_require__(304) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp -var inflight = __webpack_require__(158) +var inflight = __webpack_require__(159) var util = __webpack_require__(111) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(160) +var once = __webpack_require__(161) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -39373,7 +42430,7 @@ Glob.prototype._stat2 = function (f, abs, er, stat, cb) { /***/ }), -/* 286 */ +/* 301 */ /***/ (function(module, exports, __webpack_require__) { try { @@ -39383,12 +42440,12 @@ try { module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ - module.exports = __webpack_require__(287); + module.exports = __webpack_require__(302); } /***/ }), -/* 287 */ +/* 302 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -39421,22 +42478,22 @@ if (typeof Object.create === 'function') { /***/ }), -/* 288 */ +/* 303 */ /***/ (function(module, exports, __webpack_require__) { module.exports = globSync globSync.GlobSync = GlobSync -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(285).Glob +var Glob = __webpack_require__(300).Glob var util = __webpack_require__(111) var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var common = __webpack_require__(289) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var common = __webpack_require__(304) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts @@ -39913,7 +42970,7 @@ GlobSync.prototype._makeAbs = function (f) { /***/ }), -/* 289 */ +/* 304 */ /***/ (function(module, exports, __webpack_require__) { exports.alphasort = alphasort @@ -39931,8 +42988,8 @@ function ownProp (obj, field) { } var path = __webpack_require__(4) -var minimatch = __webpack_require__(148) -var isAbsolute = __webpack_require__(155) +var minimatch = __webpack_require__(149) +var isAbsolute = __webpack_require__(156) var Minimatch = minimatch.Minimatch function alphasorti (a, b) { @@ -40159,17 +43216,17 @@ function childrenIgnored (self, path) { /***/ }), -/* 290 */ +/* 305 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const taskManager = __webpack_require__(291); -const async_1 = __webpack_require__(320); -const stream_1 = __webpack_require__(355); -const sync_1 = __webpack_require__(356); -const settings_1 = __webpack_require__(358); -const utils = __webpack_require__(292); +const taskManager = __webpack_require__(306); +const async_1 = __webpack_require__(335); +const stream_1 = __webpack_require__(370); +const sync_1 = __webpack_require__(371); +const settings_1 = __webpack_require__(373); +const utils = __webpack_require__(307); async function FastGlob(source, options) { assertPatternsInput(source); const works = getWorks(source, async_1.default, options); @@ -40233,13 +43290,13 @@ module.exports = FastGlob; /***/ }), -/* 291 */ +/* 306 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); +const utils = __webpack_require__(307); function generate(patterns, settings) { const positivePatterns = getPositivePatterns(patterns); const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); @@ -40304,30 +43361,30 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 292 */ +/* 307 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const array = __webpack_require__(293); +const array = __webpack_require__(308); exports.array = array; -const errno = __webpack_require__(294); +const errno = __webpack_require__(309); exports.errno = errno; -const fs = __webpack_require__(295); +const fs = __webpack_require__(310); exports.fs = fs; -const path = __webpack_require__(296); +const path = __webpack_require__(311); exports.path = path; -const pattern = __webpack_require__(297); +const pattern = __webpack_require__(312); exports.pattern = pattern; -const stream = __webpack_require__(318); +const stream = __webpack_require__(333); exports.stream = stream; -const string = __webpack_require__(319); +const string = __webpack_require__(334); exports.string = string; /***/ }), -/* 293 */ +/* 308 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -40355,7 +43412,7 @@ exports.splitWhen = splitWhen; /***/ }), -/* 294 */ +/* 309 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -40368,7 +43425,7 @@ exports.isEnoentCodeError = isEnoentCodeError; /***/ }), -/* 295 */ +/* 310 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -40393,7 +43450,7 @@ exports.createDirentFromStats = createDirentFromStats; /***/ }), -/* 296 */ +/* 311 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -40432,16 +43489,16 @@ exports.removeLeadingDotSegment = removeLeadingDotSegment; /***/ }), -/* 297 */ +/* 312 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const globParent = __webpack_require__(298); -const micromatch = __webpack_require__(301); -const picomatch = __webpack_require__(312); +const globParent = __webpack_require__(313); +const micromatch = __webpack_require__(316); +const picomatch = __webpack_require__(327); const GLOBSTAR = '**'; const ESCAPE_SYMBOL = '\\'; const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; @@ -40551,15 +43608,15 @@ exports.matchAny = matchAny; /***/ }), -/* 298 */ +/* 313 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isGlob = __webpack_require__(299); +var isGlob = __webpack_require__(314); var pathPosixDirname = __webpack_require__(4).posix.dirname; -var isWin32 = __webpack_require__(121).platform() === 'win32'; +var isWin32 = __webpack_require__(120).platform() === 'win32'; var slash = '/'; var backslash = /\\/g; @@ -40599,7 +43656,7 @@ module.exports = function globParent(str, opts) { /***/ }), -/* 299 */ +/* 314 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -40609,7 +43666,7 @@ module.exports = function globParent(str, opts) { * Released under the MIT License. */ -var isExtglob = __webpack_require__(300); +var isExtglob = __webpack_require__(315); var chars = { '{': '}', '(': ')', '[': ']'}; var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; @@ -40653,7 +43710,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 300 */ +/* 315 */ /***/ (function(module, exports) { /*! @@ -40679,16 +43736,16 @@ module.exports = function isExtglob(str) { /***/ }), -/* 301 */ +/* 316 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const util = __webpack_require__(111); -const braces = __webpack_require__(302); -const picomatch = __webpack_require__(312); -const utils = __webpack_require__(315); +const braces = __webpack_require__(317); +const picomatch = __webpack_require__(327); +const utils = __webpack_require__(330); const isEmptyString = val => typeof val === 'string' && (val === '' || val === './'); /** @@ -41153,16 +44210,16 @@ module.exports = micromatch; /***/ }), -/* 302 */ +/* 317 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const stringify = __webpack_require__(303); -const compile = __webpack_require__(305); -const expand = __webpack_require__(309); -const parse = __webpack_require__(310); +const stringify = __webpack_require__(318); +const compile = __webpack_require__(320); +const expand = __webpack_require__(324); +const parse = __webpack_require__(325); /** * Expand the given pattern or create a regex-compatible string. @@ -41330,13 +44387,13 @@ module.exports = braces; /***/ }), -/* 303 */ +/* 318 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const utils = __webpack_require__(304); +const utils = __webpack_require__(319); module.exports = (ast, options = {}) => { let stringify = (node, parent = {}) => { @@ -41369,7 +44426,7 @@ module.exports = (ast, options = {}) => { /***/ }), -/* 304 */ +/* 319 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -41488,14 +44545,14 @@ exports.flatten = (...args) => { /***/ }), -/* 305 */ +/* 320 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fill = __webpack_require__(306); -const utils = __webpack_require__(304); +const fill = __webpack_require__(321); +const utils = __webpack_require__(319); const compile = (ast, options = {}) => { let walk = (node, parent = {}) => { @@ -41552,7 +44609,7 @@ module.exports = compile; /***/ }), -/* 306 */ +/* 321 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -41566,7 +44623,7 @@ module.exports = compile; const util = __webpack_require__(111); -const toRegexRange = __webpack_require__(307); +const toRegexRange = __webpack_require__(322); const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); @@ -41808,7 +44865,7 @@ module.exports = fill; /***/ }), -/* 307 */ +/* 322 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -41821,7 +44878,7 @@ module.exports = fill; -const isNumber = __webpack_require__(308); +const isNumber = __webpack_require__(323); const toRegexRange = (min, max, options) => { if (isNumber(min) === false) { @@ -42103,7 +45160,7 @@ module.exports = toRegexRange; /***/ }), -/* 308 */ +/* 323 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -42128,15 +45185,15 @@ module.exports = function(num) { /***/ }), -/* 309 */ +/* 324 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fill = __webpack_require__(306); -const stringify = __webpack_require__(303); -const utils = __webpack_require__(304); +const fill = __webpack_require__(321); +const stringify = __webpack_require__(318); +const utils = __webpack_require__(319); const append = (queue = '', stash = '', enclose = false) => { let result = []; @@ -42248,13 +45305,13 @@ module.exports = expand; /***/ }), -/* 310 */ +/* 325 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const stringify = __webpack_require__(303); +const stringify = __webpack_require__(318); /** * Constants @@ -42276,7 +45333,7 @@ const { CHAR_SINGLE_QUOTE, /* ' */ CHAR_NO_BREAK_SPACE, CHAR_ZERO_WIDTH_NOBREAK_SPACE -} = __webpack_require__(311); +} = __webpack_require__(326); /** * parse @@ -42588,7 +45645,7 @@ module.exports = parse; /***/ }), -/* 311 */ +/* 326 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -42652,27 +45709,27 @@ module.exports = { /***/ }), -/* 312 */ +/* 327 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(313); +module.exports = __webpack_require__(328); /***/ }), -/* 313 */ +/* 328 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const scan = __webpack_require__(314); -const parse = __webpack_require__(317); -const utils = __webpack_require__(315); -const constants = __webpack_require__(316); +const scan = __webpack_require__(329); +const parse = __webpack_require__(332); +const utils = __webpack_require__(330); +const constants = __webpack_require__(331); const isObject = val => val && typeof val === 'object' && !Array.isArray(val); /** @@ -43008,13 +46065,13 @@ module.exports = picomatch; /***/ }), -/* 314 */ +/* 329 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const utils = __webpack_require__(315); +const utils = __webpack_require__(330); const { CHAR_ASTERISK, /* * */ CHAR_AT, /* @ */ @@ -43031,7 +46088,7 @@ const { CHAR_RIGHT_CURLY_BRACE, /* } */ CHAR_RIGHT_PARENTHESES, /* ) */ CHAR_RIGHT_SQUARE_BRACKET /* ] */ -} = __webpack_require__(316); +} = __webpack_require__(331); const isPathSeparator = code => { return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; @@ -43398,7 +46455,7 @@ module.exports = scan; /***/ }), -/* 315 */ +/* 330 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -43411,7 +46468,7 @@ const { REGEX_REMOVE_BACKSLASH, REGEX_SPECIAL_CHARS, REGEX_SPECIAL_CHARS_GLOBAL -} = __webpack_require__(316); +} = __webpack_require__(331); exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); @@ -43469,7 +46526,7 @@ exports.wrapOutput = (input, state = {}, options = {}) => { /***/ }), -/* 316 */ +/* 331 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -43655,14 +46712,14 @@ module.exports = { /***/ }), -/* 317 */ +/* 332 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const constants = __webpack_require__(316); -const utils = __webpack_require__(315); +const constants = __webpack_require__(331); +const utils = __webpack_require__(330); /** * Constants @@ -44740,13 +47797,13 @@ module.exports = parse; /***/ }), -/* 318 */ +/* 333 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const merge2 = __webpack_require__(284); +const merge2 = __webpack_require__(299); function merge(streams) { const mergedStream = merge2(streams); streams.forEach((stream) => { @@ -44763,7 +47820,7 @@ function propagateCloseEventToSources(streams) { /***/ }), -/* 319 */ +/* 334 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -44780,14 +47837,14 @@ exports.isEmpty = isEmpty; /***/ }), -/* 320 */ +/* 335 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(321); -const provider_1 = __webpack_require__(348); +const stream_1 = __webpack_require__(336); +const provider_1 = __webpack_require__(363); class ProviderAsync extends provider_1.default { constructor() { super(...arguments); @@ -44815,16 +47872,16 @@ exports.default = ProviderAsync; /***/ }), -/* 321 */ +/* 336 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(136); -const fsStat = __webpack_require__(322); -const fsWalk = __webpack_require__(327); -const reader_1 = __webpack_require__(347); +const stream_1 = __webpack_require__(137); +const fsStat = __webpack_require__(337); +const fsWalk = __webpack_require__(342); +const reader_1 = __webpack_require__(362); class ReaderStream extends reader_1.default { constructor() { super(...arguments); @@ -44877,15 +47934,15 @@ exports.default = ReaderStream; /***/ }), -/* 322 */ +/* 337 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(323); -const sync = __webpack_require__(324); -const settings_1 = __webpack_require__(325); +const async = __webpack_require__(338); +const sync = __webpack_require__(339); +const settings_1 = __webpack_require__(340); exports.Settings = settings_1.default; function stat(path, optionsOrSettingsOrCallback, callback) { if (typeof optionsOrSettingsOrCallback === 'function') { @@ -44908,7 +47965,7 @@ function getSettings(settingsOrOptions = {}) { /***/ }), -/* 323 */ +/* 338 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -44946,7 +48003,7 @@ function callSuccessCallback(callback, result) { /***/ }), -/* 324 */ +/* 339 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -44975,13 +48032,13 @@ exports.read = read; /***/ }), -/* 325 */ +/* 340 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(326); +const fs = __webpack_require__(341); class Settings { constructor(_options = {}) { this._options = _options; @@ -44998,13 +48055,13 @@ exports.default = Settings; /***/ }), -/* 326 */ +/* 341 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); exports.FILE_SYSTEM_ADAPTER = { lstat: fs.lstat, stat: fs.stat, @@ -45021,16 +48078,16 @@ exports.createFileSystemAdapter = createFileSystemAdapter; /***/ }), -/* 327 */ +/* 342 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(328); -const stream_1 = __webpack_require__(343); -const sync_1 = __webpack_require__(344); -const settings_1 = __webpack_require__(346); +const async_1 = __webpack_require__(343); +const stream_1 = __webpack_require__(358); +const sync_1 = __webpack_require__(359); +const settings_1 = __webpack_require__(361); exports.Settings = settings_1.default; function walk(directory, optionsOrSettingsOrCallback, callback) { if (typeof optionsOrSettingsOrCallback === 'function') { @@ -45060,13 +48117,13 @@ function getSettings(settingsOrOptions = {}) { /***/ }), -/* 328 */ +/* 343 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(329); +const async_1 = __webpack_require__(344); class AsyncProvider { constructor(_root, _settings) { this._root = _root; @@ -45097,17 +48154,17 @@ function callSuccessCallback(callback, entries) { /***/ }), -/* 329 */ +/* 344 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const events_1 = __webpack_require__(154); -const fsScandir = __webpack_require__(330); -const fastq = __webpack_require__(339); -const common = __webpack_require__(341); -const reader_1 = __webpack_require__(342); +const events_1 = __webpack_require__(155); +const fsScandir = __webpack_require__(345); +const fastq = __webpack_require__(354); +const common = __webpack_require__(356); +const reader_1 = __webpack_require__(357); class AsyncReader extends reader_1.default { constructor(_root, _settings) { super(_root, _settings); @@ -45197,15 +48254,15 @@ exports.default = AsyncReader; /***/ }), -/* 330 */ +/* 345 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(331); -const sync = __webpack_require__(336); -const settings_1 = __webpack_require__(337); +const async = __webpack_require__(346); +const sync = __webpack_require__(351); +const settings_1 = __webpack_require__(352); exports.Settings = settings_1.default; function scandir(path, optionsOrSettingsOrCallback, callback) { if (typeof optionsOrSettingsOrCallback === 'function') { @@ -45228,16 +48285,16 @@ function getSettings(settingsOrOptions = {}) { /***/ }), -/* 331 */ +/* 346 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(322); -const rpl = __webpack_require__(332); -const constants_1 = __webpack_require__(333); -const utils = __webpack_require__(334); +const fsStat = __webpack_require__(337); +const rpl = __webpack_require__(347); +const constants_1 = __webpack_require__(348); +const utils = __webpack_require__(349); function read(directory, settings, callback) { if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { return readdirWithFileTypes(directory, settings, callback); @@ -45325,7 +48382,7 @@ function callSuccessCallback(callback, result) { /***/ }), -/* 332 */ +/* 347 */ /***/ (function(module, exports) { module.exports = runParallel @@ -45379,7 +48436,7 @@ function runParallel (tasks, cb) { /***/ }), -/* 333 */ +/* 348 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -45399,18 +48456,18 @@ exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_B /***/ }), -/* 334 */ +/* 349 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(335); +const fs = __webpack_require__(350); exports.fs = fs; /***/ }), -/* 335 */ +/* 350 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -45435,15 +48492,15 @@ exports.createDirentFromStats = createDirentFromStats; /***/ }), -/* 336 */ +/* 351 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(322); -const constants_1 = __webpack_require__(333); -const utils = __webpack_require__(334); +const fsStat = __webpack_require__(337); +const constants_1 = __webpack_require__(348); +const utils = __webpack_require__(349); function read(directory, settings) { if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { return readdirWithFileTypes(directory, settings); @@ -45494,15 +48551,15 @@ exports.readdir = readdir; /***/ }), -/* 337 */ +/* 352 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const fsStat = __webpack_require__(322); -const fs = __webpack_require__(338); +const fsStat = __webpack_require__(337); +const fs = __webpack_require__(353); class Settings { constructor(_options = {}) { this._options = _options; @@ -45525,13 +48582,13 @@ exports.default = Settings; /***/ }), -/* 338 */ +/* 353 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); exports.FILE_SYSTEM_ADAPTER = { lstat: fs.lstat, stat: fs.stat, @@ -45550,13 +48607,13 @@ exports.createFileSystemAdapter = createFileSystemAdapter; /***/ }), -/* 339 */ +/* 354 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var reusify = __webpack_require__(340) +var reusify = __webpack_require__(355) function fastqueue (context, worker, concurrency) { if (typeof context === 'function') { @@ -45730,7 +48787,7 @@ module.exports = fastqueue /***/ }), -/* 340 */ +/* 355 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -45770,7 +48827,7 @@ module.exports = reusify /***/ }), -/* 341 */ +/* 356 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -45801,13 +48858,13 @@ exports.joinPathSegments = joinPathSegments; /***/ }), -/* 342 */ +/* 357 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const common = __webpack_require__(341); +const common = __webpack_require__(356); class Reader { constructor(_root, _settings) { this._root = _root; @@ -45819,14 +48876,14 @@ exports.default = Reader; /***/ }), -/* 343 */ +/* 358 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(136); -const async_1 = __webpack_require__(329); +const stream_1 = __webpack_require__(137); +const async_1 = __webpack_require__(344); class StreamProvider { constructor(_root, _settings) { this._root = _root; @@ -45856,13 +48913,13 @@ exports.default = StreamProvider; /***/ }), -/* 344 */ +/* 359 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(345); +const sync_1 = __webpack_require__(360); class SyncProvider { constructor(_root, _settings) { this._root = _root; @@ -45877,15 +48934,15 @@ exports.default = SyncProvider; /***/ }), -/* 345 */ +/* 360 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsScandir = __webpack_require__(330); -const common = __webpack_require__(341); -const reader_1 = __webpack_require__(342); +const fsScandir = __webpack_require__(345); +const common = __webpack_require__(356); +const reader_1 = __webpack_require__(357); class SyncReader extends reader_1.default { constructor() { super(...arguments); @@ -45943,14 +49000,14 @@ exports.default = SyncReader; /***/ }), -/* 346 */ +/* 361 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const fsScandir = __webpack_require__(330); +const fsScandir = __webpack_require__(345); class Settings { constructor(_options = {}) { this._options = _options; @@ -45976,15 +49033,15 @@ exports.default = Settings; /***/ }), -/* 347 */ +/* 362 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const fsStat = __webpack_require__(322); -const utils = __webpack_require__(292); +const fsStat = __webpack_require__(337); +const utils = __webpack_require__(307); class Reader { constructor(_settings) { this._settings = _settings; @@ -46016,17 +49073,17 @@ exports.default = Reader; /***/ }), -/* 348 */ +/* 363 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const deep_1 = __webpack_require__(349); -const entry_1 = __webpack_require__(352); -const error_1 = __webpack_require__(353); -const entry_2 = __webpack_require__(354); +const deep_1 = __webpack_require__(364); +const entry_1 = __webpack_require__(367); +const error_1 = __webpack_require__(368); +const entry_2 = __webpack_require__(369); class Provider { constructor(_settings) { this._settings = _settings; @@ -46071,14 +49128,14 @@ exports.default = Provider; /***/ }), -/* 349 */ +/* 364 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); -const partial_1 = __webpack_require__(350); +const utils = __webpack_require__(307); +const partial_1 = __webpack_require__(365); class DeepFilter { constructor(_settings, _micromatchOptions) { this._settings = _settings; @@ -46132,13 +49189,13 @@ exports.default = DeepFilter; /***/ }), -/* 350 */ +/* 365 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const matcher_1 = __webpack_require__(351); +const matcher_1 = __webpack_require__(366); class PartialMatcher extends matcher_1.default { match(filepath) { const parts = filepath.split('/'); @@ -46177,13 +49234,13 @@ exports.default = PartialMatcher; /***/ }), -/* 351 */ +/* 366 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); +const utils = __webpack_require__(307); class Matcher { constructor(_patterns, _settings, _micromatchOptions) { this._patterns = _patterns; @@ -46234,13 +49291,13 @@ exports.default = Matcher; /***/ }), -/* 352 */ +/* 367 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); +const utils = __webpack_require__(307); class EntryFilter { constructor(_settings, _micromatchOptions) { this._settings = _settings; @@ -46296,13 +49353,13 @@ exports.default = EntryFilter; /***/ }), -/* 353 */ +/* 368 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); +const utils = __webpack_require__(307); class ErrorFilter { constructor(_settings) { this._settings = _settings; @@ -46318,13 +49375,13 @@ exports.default = ErrorFilter; /***/ }), -/* 354 */ +/* 369 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); +const utils = __webpack_require__(307); class EntryTransformer { constructor(_settings) { this._settings = _settings; @@ -46351,15 +49408,15 @@ exports.default = EntryTransformer; /***/ }), -/* 355 */ +/* 370 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(136); -const stream_2 = __webpack_require__(321); -const provider_1 = __webpack_require__(348); +const stream_1 = __webpack_require__(137); +const stream_2 = __webpack_require__(336); +const provider_1 = __webpack_require__(363); class ProviderStream extends provider_1.default { constructor() { super(...arguments); @@ -46389,14 +49446,14 @@ exports.default = ProviderStream; /***/ }), -/* 356 */ +/* 371 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(357); -const provider_1 = __webpack_require__(348); +const sync_1 = __webpack_require__(372); +const provider_1 = __webpack_require__(363); class ProviderSync extends provider_1.default { constructor() { super(...arguments); @@ -46419,15 +49476,15 @@ exports.default = ProviderSync; /***/ }), -/* 357 */ +/* 372 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(322); -const fsWalk = __webpack_require__(327); -const reader_1 = __webpack_require__(347); +const fsStat = __webpack_require__(337); +const fsWalk = __webpack_require__(342); +const reader_1 = __webpack_require__(362); class ReaderSync extends reader_1.default { constructor() { super(...arguments); @@ -46469,14 +49526,14 @@ exports.default = ReaderSync; /***/ }), -/* 358 */ +/* 373 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(132); -const os = __webpack_require__(121); +const fs = __webpack_require__(133); +const os = __webpack_require__(120); const CPU_COUNT = os.cpus().length; exports.DEFAULT_FILE_SYSTEM_ADAPTER = { lstat: fs.lstat, @@ -46528,13 +49585,13 @@ exports.default = Settings; /***/ }), -/* 359 */ +/* 374 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const pathType = __webpack_require__(360); +const pathType = __webpack_require__(375); const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; @@ -46610,13 +49667,13 @@ module.exports.sync = (input, options) => { /***/ }), -/* 360 */ +/* 375 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(111); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); async function isType(fsStatType, statsMethodName, filePath) { if (typeof filePath !== 'string') { @@ -46660,17 +49717,17 @@ exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 361 */ +/* 376 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(111); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); const path = __webpack_require__(4); -const fastGlob = __webpack_require__(290); -const gitIgnore = __webpack_require__(362); -const slash = __webpack_require__(363); +const fastGlob = __webpack_require__(305); +const gitIgnore = __webpack_require__(377); +const slash = __webpack_require__(378); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -46784,7 +49841,7 @@ module.exports.sync = options => { /***/ }), -/* 362 */ +/* 377 */ /***/ (function(module, exports) { // A simple implementation of make-array @@ -47387,7 +50444,7 @@ if ( /***/ }), -/* 363 */ +/* 378 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -47405,12 +50462,12 @@ module.exports = path => { /***/ }), -/* 364 */ +/* 379 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {Transform} = __webpack_require__(136); +const {Transform} = __webpack_require__(137); class ObjectTransform extends Transform { constructor() { @@ -47458,7 +50515,7 @@ module.exports = { /***/ }), -/* 365 */ +/* 380 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -47468,7 +50525,7 @@ module.exports = { * Released under the MIT License. */ -var isExtglob = __webpack_require__(300); +var isExtglob = __webpack_require__(315); var chars = { '{': '}', '(': ')', '[': ']'}; var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; @@ -47512,7 +50569,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 366 */ +/* 381 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -47534,7 +50591,7 @@ module.exports = path_ => { /***/ }), -/* 367 */ +/* 382 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -47562,15 +50619,15 @@ module.exports = (childPath, parentPath) => { /***/ }), -/* 368 */ +/* 383 */ /***/ (function(module, exports, __webpack_require__) { -const assert = __webpack_require__(138) +const assert = __webpack_require__(139) const path = __webpack_require__(4) -const fs = __webpack_require__(132) +const fs = __webpack_require__(133) let glob = undefined try { - glob = __webpack_require__(285) + glob = __webpack_require__(300) } catch (_err) { // treat glob as optional. } @@ -47936,12 +50993,12 @@ rimraf.sync = rimrafSync /***/ }), -/* 369 */ +/* 384 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const AggregateError = __webpack_require__(370); +const AggregateError = __webpack_require__(385); module.exports = async ( iterable, @@ -48024,13 +51081,13 @@ module.exports = async ( /***/ }), -/* 370 */ +/* 385 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const indentString = __webpack_require__(371); -const cleanStack = __webpack_require__(372); +const indentString = __webpack_require__(386); +const cleanStack = __webpack_require__(387); const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); @@ -48078,7 +51135,7 @@ module.exports = AggregateError; /***/ }), -/* 371 */ +/* 386 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -48120,12 +51177,12 @@ module.exports = (string, count = 1, options) => { /***/ }), -/* 372 */ +/* 387 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(121); +const os = __webpack_require__(120); const extractPathRegex = /\s+at.*(?:\(|\s)(.*)\)?/; const pathRegex = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/; @@ -48167,15 +51224,15 @@ module.exports = (stack, options) => { /***/ }), -/* 373 */ +/* 388 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const chalk = __webpack_require__(374); -const cliCursor = __webpack_require__(378); -const cliSpinners = __webpack_require__(382); -const logSymbols = __webpack_require__(384); +const chalk = __webpack_require__(389); +const cliCursor = __webpack_require__(392); +const cliSpinners = __webpack_require__(396); +const logSymbols = __webpack_require__(398); class Ora { constructor(options) { @@ -48322,16 +51379,16 @@ module.exports.promise = (action, options) => { /***/ }), -/* 374 */ +/* 389 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(113); -const ansiStyles = __webpack_require__(375); -const stdoutColor = __webpack_require__(376).stdout; +const escapeStringRegexp = __webpack_require__(178); +const ansiStyles = __webpack_require__(390); +const stdoutColor = __webpack_require__(184).stdout; -const template = __webpack_require__(377); +const template = __webpack_require__(391); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); @@ -48557,12 +51614,12 @@ module.exports.default = module.exports; // For TypeScript /***/ }), -/* 375 */ +/* 390 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(116); +const colorConvert = __webpack_require__(180); const wrapAnsi16 = (fn, offset) => function () { const code = fn.apply(colorConvert, arguments); @@ -48727,152 +51784,10 @@ Object.defineProperty(module, 'exports', { get: assembleStyles }); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(115)(module))) - -/***/ }), -/* 376 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const os = __webpack_require__(121); -const hasFlag = __webpack_require__(122); - -const env = process.env; - -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} - -function translateLevel(level) { - if (level === 0) { - return false; - } - - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} - -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } - - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } - - if (hasFlag('color=256')) { - return 2; - } - - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } - return 0; - } - - const min = forceColor ? 1 : 0; - - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } - - return 1; - } - - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } - - return min; - } - - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } - - if (env.COLORTERM === 'truecolor') { - return 3; - } - - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } - - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } - - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } - - if ('COLORTERM' in env) { - return 1; - } - - if (env.TERM === 'dumb') { - return min; - } - - return min; -} - -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} - -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; - +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) /***/ }), -/* 377 */ +/* 391 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -49007,12 +51922,12 @@ module.exports = (chalk, tmp) => { /***/ }), -/* 378 */ +/* 392 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const restoreCursor = __webpack_require__(379); +const restoreCursor = __webpack_require__(393); let hidden = false; @@ -49053,13 +51968,13 @@ exports.toggle = (force, stream) => { /***/ }), -/* 379 */ +/* 393 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const onetime = __webpack_require__(380); -const signalExit = __webpack_require__(218); +const onetime = __webpack_require__(394); +const signalExit = __webpack_require__(225); module.exports = onetime(() => { signalExit(() => { @@ -49069,12 +51984,12 @@ module.exports = onetime(() => { /***/ }), -/* 380 */ +/* 394 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const mimicFn = __webpack_require__(381); +const mimicFn = __webpack_require__(395); module.exports = (fn, opts) => { // TODO: Remove this in v3 @@ -49115,7 +52030,7 @@ module.exports = (fn, opts) => { /***/ }), -/* 381 */ +/* 395 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -49131,27 +52046,27 @@ module.exports = (to, from) => { /***/ }), -/* 382 */ +/* 396 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(383); +module.exports = __webpack_require__(397); /***/ }), -/* 383 */ +/* 397 */ /***/ (function(module) { module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠹\",\"⠸\",\"⠼\",\"⠴\",\"⠦\",\"⠧\",\"⠇\",\"⠏\"]},\"dots2\":{\"interval\":80,\"frames\":[\"⣾\",\"⣽\",\"⣻\",\"⢿\",\"⡿\",\"⣟\",\"⣯\",\"⣷\"]},\"dots3\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠞\",\"⠖\",\"⠦\",\"⠴\",\"⠲\",\"⠳\",\"⠓\"]},\"dots4\":{\"interval\":80,\"frames\":[\"⠄\",\"⠆\",\"⠇\",\"⠋\",\"⠙\",\"⠸\",\"⠰\",\"⠠\",\"⠰\",\"⠸\",\"⠙\",\"⠋\",\"⠇\",\"⠆\"]},\"dots5\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\"]},\"dots6\":{\"interval\":80,\"frames\":[\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠴\",\"⠲\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠚\",\"⠙\",\"⠉\",\"⠁\"]},\"dots7\":{\"interval\":80,\"frames\":[\"⠈\",\"⠉\",\"⠋\",\"⠓\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠖\",\"⠦\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\"]},\"dots8\":{\"interval\":80,\"frames\":[\"⠁\",\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\",\"⠈\"]},\"dots9\":{\"interval\":80,\"frames\":[\"⢹\",\"⢺\",\"⢼\",\"⣸\",\"⣇\",\"⡧\",\"⡗\",\"⡏\"]},\"dots10\":{\"interval\":80,\"frames\":[\"⢄\",\"⢂\",\"⢁\",\"⡁\",\"⡈\",\"⡐\",\"⡠\"]},\"dots11\":{\"interval\":100,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⡀\",\"⢀\",\"⠠\",\"⠐\",\"⠈\"]},\"dots12\":{\"interval\":80,\"frames\":[\"⢀⠀\",\"⡀⠀\",\"⠄⠀\",\"⢂⠀\",\"⡂⠀\",\"⠅⠀\",\"⢃⠀\",\"⡃⠀\",\"⠍⠀\",\"⢋⠀\",\"⡋⠀\",\"⠍⠁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⢈⠩\",\"⡀⢙\",\"⠄⡙\",\"⢂⠩\",\"⡂⢘\",\"⠅⡘\",\"⢃⠨\",\"⡃⢐\",\"⠍⡐\",\"⢋⠠\",\"⡋⢀\",\"⠍⡁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⠈⠩\",\"⠀⢙\",\"⠀⡙\",\"⠀⠩\",\"⠀⢘\",\"⠀⡘\",\"⠀⠨\",\"⠀⢐\",\"⠀⡐\",\"⠀⠠\",\"⠀⢀\",\"⠀⡀\"]},\"line\":{\"interval\":130,\"frames\":[\"-\",\"\\\\\",\"|\",\"/\"]},\"line2\":{\"interval\":100,\"frames\":[\"⠂\",\"-\",\"–\",\"—\",\"–\",\"-\"]},\"pipe\":{\"interval\":100,\"frames\":[\"┤\",\"┘\",\"┴\",\"└\",\"├\",\"┌\",\"┬\",\"┐\"]},\"simpleDots\":{\"interval\":400,\"frames\":[\". \",\".. \",\"...\",\" \"]},\"simpleDotsScrolling\":{\"interval\":200,\"frames\":[\". \",\".. \",\"...\",\" ..\",\" .\",\" \"]},\"star\":{\"interval\":70,\"frames\":[\"✶\",\"✸\",\"✹\",\"✺\",\"✹\",\"✷\"]},\"star2\":{\"interval\":80,\"frames\":[\"+\",\"x\",\"*\"]},\"flip\":{\"interval\":70,\"frames\":[\"_\",\"_\",\"_\",\"-\",\"`\",\"`\",\"'\",\"´\",\"-\",\"_\",\"_\",\"_\"]},\"hamburger\":{\"interval\":100,\"frames\":[\"☱\",\"☲\",\"☴\"]},\"growVertical\":{\"interval\":120,\"frames\":[\"▁\",\"▃\",\"▄\",\"▅\",\"▆\",\"▇\",\"▆\",\"▅\",\"▄\",\"▃\"]},\"growHorizontal\":{\"interval\":120,\"frames\":[\"▏\",\"▎\",\"▍\",\"▌\",\"▋\",\"▊\",\"▉\",\"▊\",\"▋\",\"▌\",\"▍\",\"▎\"]},\"balloon\":{\"interval\":140,\"frames\":[\" \",\".\",\"o\",\"O\",\"@\",\"*\",\" \"]},\"balloon2\":{\"interval\":120,\"frames\":[\".\",\"o\",\"O\",\"°\",\"O\",\"o\",\".\"]},\"noise\":{\"interval\":100,\"frames\":[\"▓\",\"▒\",\"░\"]},\"bounce\":{\"interval\":120,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⠂\"]},\"boxBounce\":{\"interval\":120,\"frames\":[\"▖\",\"▘\",\"▝\",\"▗\"]},\"boxBounce2\":{\"interval\":100,\"frames\":[\"▌\",\"▀\",\"▐\",\"▄\"]},\"triangle\":{\"interval\":50,\"frames\":[\"◢\",\"◣\",\"◤\",\"◥\"]},\"arc\":{\"interval\":100,\"frames\":[\"◜\",\"◠\",\"◝\",\"◞\",\"◡\",\"◟\"]},\"circle\":{\"interval\":120,\"frames\":[\"◡\",\"⊙\",\"◠\"]},\"squareCorners\":{\"interval\":180,\"frames\":[\"◰\",\"◳\",\"◲\",\"◱\"]},\"circleQuarters\":{\"interval\":120,\"frames\":[\"◴\",\"◷\",\"◶\",\"◵\"]},\"circleHalves\":{\"interval\":50,\"frames\":[\"◐\",\"◓\",\"◑\",\"◒\"]},\"squish\":{\"interval\":100,\"frames\":[\"╫\",\"╪\"]},\"toggle\":{\"interval\":250,\"frames\":[\"⊶\",\"⊷\"]},\"toggle2\":{\"interval\":80,\"frames\":[\"▫\",\"▪\"]},\"toggle3\":{\"interval\":120,\"frames\":[\"□\",\"■\"]},\"toggle4\":{\"interval\":100,\"frames\":[\"■\",\"□\",\"▪\",\"▫\"]},\"toggle5\":{\"interval\":100,\"frames\":[\"▮\",\"▯\"]},\"toggle6\":{\"interval\":300,\"frames\":[\"ဝ\",\"၀\"]},\"toggle7\":{\"interval\":80,\"frames\":[\"⦾\",\"⦿\"]},\"toggle8\":{\"interval\":100,\"frames\":[\"◍\",\"◌\"]},\"toggle9\":{\"interval\":100,\"frames\":[\"◉\",\"◎\"]},\"toggle10\":{\"interval\":100,\"frames\":[\"㊂\",\"㊀\",\"㊁\"]},\"toggle11\":{\"interval\":50,\"frames\":[\"⧇\",\"⧆\"]},\"toggle12\":{\"interval\":120,\"frames\":[\"☗\",\"☖\"]},\"toggle13\":{\"interval\":80,\"frames\":[\"=\",\"*\",\"-\"]},\"arrow\":{\"interval\":100,\"frames\":[\"←\",\"↖\",\"↑\",\"↗\",\"→\",\"↘\",\"↓\",\"↙\"]},\"arrow2\":{\"interval\":80,\"frames\":[\"⬆️ \",\"↗️ \",\"➡️ \",\"↘️ \",\"⬇️ \",\"↙️ \",\"⬅️ \",\"↖️ \"]},\"arrow3\":{\"interval\":120,\"frames\":[\"▹▹▹▹▹\",\"▸▹▹▹▹\",\"▹▸▹▹▹\",\"▹▹▸▹▹\",\"▹▹▹▸▹\",\"▹▹▹▹▸\"]},\"bouncingBar\":{\"interval\":80,\"frames\":[\"[ ]\",\"[= ]\",\"[== ]\",\"[=== ]\",\"[ ===]\",\"[ ==]\",\"[ =]\",\"[ ]\",\"[ =]\",\"[ ==]\",\"[ ===]\",\"[====]\",\"[=== ]\",\"[== ]\",\"[= ]\"]},\"bouncingBall\":{\"interval\":80,\"frames\":[\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ●)\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"(● )\"]},\"smiley\":{\"interval\":200,\"frames\":[\"😄 \",\"😝 \"]},\"monkey\":{\"interval\":300,\"frames\":[\"🙈 \",\"🙈 \",\"🙉 \",\"🙊 \"]},\"hearts\":{\"interval\":100,\"frames\":[\"💛 \",\"💙 \",\"💜 \",\"💚 \",\"❤️ \"]},\"clock\":{\"interval\":100,\"frames\":[\"🕐 \",\"🕑 \",\"🕒 \",\"🕓 \",\"🕔 \",\"🕕 \",\"🕖 \",\"🕗 \",\"🕘 \",\"🕙 \",\"🕚 \"]},\"earth\":{\"interval\":180,\"frames\":[\"🌍 \",\"🌎 \",\"🌏 \"]},\"moon\":{\"interval\":80,\"frames\":[\"🌑 \",\"🌒 \",\"🌓 \",\"🌔 \",\"🌕 \",\"🌖 \",\"🌗 \",\"🌘 \"]},\"runner\":{\"interval\":140,\"frames\":[\"🚶 \",\"🏃 \"]},\"pong\":{\"interval\":80,\"frames\":[\"▐⠂ ▌\",\"▐⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂▌\",\"▐ ⠠▌\",\"▐ ⡀▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐⠠ ▌\"]},\"shark\":{\"interval\":120,\"frames\":[\"▐|\\\\____________▌\",\"▐_|\\\\___________▌\",\"▐__|\\\\__________▌\",\"▐___|\\\\_________▌\",\"▐____|\\\\________▌\",\"▐_____|\\\\_______▌\",\"▐______|\\\\______▌\",\"▐_______|\\\\_____▌\",\"▐________|\\\\____▌\",\"▐_________|\\\\___▌\",\"▐__________|\\\\__▌\",\"▐___________|\\\\_▌\",\"▐____________|\\\\▌\",\"▐____________/|▌\",\"▐___________/|_▌\",\"▐__________/|__▌\",\"▐_________/|___▌\",\"▐________/|____▌\",\"▐_______/|_____▌\",\"▐______/|______▌\",\"▐_____/|_______▌\",\"▐____/|________▌\",\"▐___/|_________▌\",\"▐__/|__________▌\",\"▐_/|___________▌\",\"▐/|____________▌\"]},\"dqpb\":{\"interval\":100,\"frames\":[\"d\",\"q\",\"p\",\"b\"]},\"weather\":{\"interval\":100,\"frames\":[\"☀️ \",\"☀️ \",\"☀️ \",\"🌤 \",\"⛅️ \",\"🌥 \",\"☁️ \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"⛈ \",\"🌨 \",\"🌧 \",\"🌨 \",\"☁️ \",\"🌥 \",\"⛅️ \",\"🌤 \",\"☀️ \",\"☀️ \"]},\"christmas\":{\"interval\":400,\"frames\":[\"🌲\",\"🎄\"]}}"); /***/ }), -/* 384 */ +/* 398 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const chalk = __webpack_require__(385); +const chalk = __webpack_require__(399); const isSupported = process.platform !== 'win32' || process.env.CI || process.env.TERM === 'xterm-256color'; @@ -49173,16 +52088,16 @@ module.exports = isSupported ? main : fallbacks; /***/ }), -/* 385 */ +/* 399 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(113); -const ansiStyles = __webpack_require__(386); -const stdoutColor = __webpack_require__(387).stdout; +const escapeStringRegexp = __webpack_require__(178); +const ansiStyles = __webpack_require__(400); +const stdoutColor = __webpack_require__(184).stdout; -const template = __webpack_require__(388); +const template = __webpack_require__(401); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); @@ -49408,12 +52323,12 @@ module.exports.default = module.exports; // For TypeScript /***/ }), -/* 386 */ +/* 400 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(116); +const colorConvert = __webpack_require__(180); const wrapAnsi16 = (fn, offset) => function () { const code = fn.apply(colorConvert, arguments); @@ -49578,152 +52493,10 @@ Object.defineProperty(module, 'exports', { get: assembleStyles }); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(115)(module))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) /***/ }), -/* 387 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const os = __webpack_require__(121); -const hasFlag = __webpack_require__(122); - -const env = process.env; - -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} - -function translateLevel(level) { - if (level === 0) { - return false; - } - - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} - -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } - - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } - - if (hasFlag('color=256')) { - return 2; - } - - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } - return 0; - } - - const min = forceColor ? 1 : 0; - - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } - - return 1; - } - - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } - - return min; - } - - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } - - if (env.COLORTERM === 'truecolor') { - return 3; - } - - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } - - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } - - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } - - if ('COLORTERM' in env) { - return 1; - } - - if (env.TERM === 'dumb') { - return min; - } - - return min; -} - -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} - -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; - - -/***/ }), -/* 388 */ +/* 401 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -49858,16 +52631,16 @@ module.exports = (chalk, tmp) => { /***/ }), -/* 389 */ +/* 402 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RunCommand", function() { return RunCommand; }); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(161); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(142); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(144); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -49919,17 +52692,17 @@ const RunCommand = { }; /***/ }), -/* 390 */ +/* 403 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WatchCommand", function() { return WatchCommand; }); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(161); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(142); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(144); -/* harmony import */ var _utils_watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(391); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); +/* harmony import */ var _utils_watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(404); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -50014,14 +52787,14 @@ const WatchCommand = { }; /***/ }), -/* 391 */ +/* 404 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitUntilWatchIsReady", function() { return waitUntilWatchIsReady; }); /* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8); -/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(392); +/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(405); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -50088,141 +52861,141 @@ function waitUntilWatchIsReady(stream, opts = {}) { } /***/ }), -/* 392 */ +/* 405 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(393); +/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(406); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__["audit"]; }); -/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(394); +/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(407); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__["auditTime"]; }); -/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(395); +/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(408); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__["buffer"]; }); -/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(396); +/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(409); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__["bufferCount"]; }); -/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(397); +/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(410); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__["bufferTime"]; }); -/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(398); +/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(411); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__["bufferToggle"]; }); -/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(399); +/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(412); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__["bufferWhen"]; }); -/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(400); +/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(413); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__["catchError"]; }); -/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(401); +/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(414); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__["combineAll"]; }); -/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(402); +/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(415); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__["combineLatest"]; }); -/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(403); +/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(416); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__["concat"]; }); /* harmony import */ var _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(80); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__["concatAll"]; }); -/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(404); +/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(417); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__["concatMap"]; }); -/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(405); +/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(418); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__["concatMapTo"]; }); -/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(406); +/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(419); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "count", function() { return _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__["count"]; }); -/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(407); +/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(420); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__["debounce"]; }); -/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(408); +/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(421); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__["debounceTime"]; }); -/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(409); +/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(422); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__["defaultIfEmpty"]; }); -/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(410); +/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(423); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__["delay"]; }); -/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(412); +/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(425); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__["delayWhen"]; }); -/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(413); +/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(426); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__["dematerialize"]; }); -/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(414); +/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(427); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__["distinct"]; }); -/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(415); +/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(428); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__["distinctUntilChanged"]; }); -/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(416); +/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(429); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__["distinctUntilKeyChanged"]; }); -/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(417); +/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(430); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__["elementAt"]; }); -/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(420); +/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(433); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__["endWith"]; }); -/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(421); +/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(434); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "every", function() { return _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__["every"]; }); -/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(422); +/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(435); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__["exhaust"]; }); -/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(423); +/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(436); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__["exhaustMap"]; }); -/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(424); +/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(437); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__["expand"]; }); /* harmony import */ var _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(104); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__["filter"]; }); -/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(425); +/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(438); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__["finalize"]; }); -/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(426); +/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(439); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "find", function() { return _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__["find"]; }); -/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(427); +/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(440); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__["findIndex"]; }); -/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(428); +/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(441); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "first", function() { return _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__["first"]; }); /* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(31); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__["groupBy"]; }); -/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(429); +/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(442); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__["ignoreElements"]; }); -/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(430); +/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(443); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__["isEmpty"]; }); -/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(431); +/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(444); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "last", function() { return _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__["last"]; }); /* harmony import */ var _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(66); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__["map"]; }); -/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(433); +/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(446); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__["mapTo"]; }); -/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(434); +/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(447); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__["materialize"]; }); -/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(435); +/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(448); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__["max"]; }); -/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(438); +/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(451); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__["merge"]; }); /* harmony import */ var _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(81); @@ -50233,175 +53006,175 @@ __webpack_require__.r(__webpack_exports__); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); -/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(439); +/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(452); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__["mergeMapTo"]; }); -/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(440); +/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(453); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__["mergeScan"]; }); -/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(441); +/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(454); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__["min"]; }); -/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(442); +/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(455); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__["multicast"]; }); /* harmony import */ var _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(41); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__["observeOn"]; }); -/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(443); +/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(456); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__["onErrorResumeNext"]; }); -/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(444); +/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(457); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__["pairwise"]; }); -/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(445); +/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(458); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__["partition"]; }); -/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(446); +/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(459); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__["pluck"]; }); -/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(447); +/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(460); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__["publish"]; }); -/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(448); +/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(461); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__["publishBehavior"]; }); -/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(449); +/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(462); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__["publishLast"]; }); -/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(450); +/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(463); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__["publishReplay"]; }); -/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(451); +/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(464); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__["race"]; }); -/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(436); +/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(449); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__["reduce"]; }); -/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(452); +/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(465); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__["repeat"]; }); -/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(453); +/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(466); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__["repeatWhen"]; }); -/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(454); +/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(467); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__["retry"]; }); -/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(455); +/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(468); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__["retryWhen"]; }); /* harmony import */ var _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(30); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__["refCount"]; }); -/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(456); +/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(469); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__["sample"]; }); -/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(457); +/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(470); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__["sampleTime"]; }); -/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(437); +/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(450); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__["scan"]; }); -/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(458); +/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(471); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__["sequenceEqual"]; }); -/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(459); +/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(472); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "share", function() { return _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__["share"]; }); -/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(460); +/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(473); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__["shareReplay"]; }); -/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(461); +/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(474); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "single", function() { return _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__["single"]; }); -/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(462); +/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(475); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__["skip"]; }); -/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(463); +/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(476); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__["skipLast"]; }); -/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(464); +/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(477); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__["skipUntil"]; }); -/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(465); +/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(478); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__["skipWhile"]; }); -/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(466); +/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(479); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__["startWith"]; }); -/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(467); +/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(480); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__["subscribeOn"]; }); -/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(469); +/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(482); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__["switchAll"]; }); -/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(470); +/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(483); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__["switchMap"]; }); -/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(471); +/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(484); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__["switchMapTo"]; }); -/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(419); +/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(432); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "take", function() { return _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__["take"]; }); -/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(432); +/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(445); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__["takeLast"]; }); -/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(472); +/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(485); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__["takeUntil"]; }); -/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(473); +/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(486); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__["takeWhile"]; }); -/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(474); +/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(487); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__["tap"]; }); -/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(475); +/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(488); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__["throttle"]; }); -/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(476); +/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(489); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__["throttleTime"]; }); -/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(418); +/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(431); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__["throwIfEmpty"]; }); -/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(477); +/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(490); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__["timeInterval"]; }); -/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(478); +/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(491); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__["timeout"]; }); -/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(479); +/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(492); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__["timeoutWith"]; }); -/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(480); +/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(493); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__["timestamp"]; }); -/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(481); +/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(494); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__["toArray"]; }); -/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(482); +/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(495); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__["window"]; }); -/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(483); +/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(496); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__["windowCount"]; }); -/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(484); +/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(497); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__["windowTime"]; }); -/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(485); +/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(498); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__["windowToggle"]; }); -/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(486); +/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(499); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__["windowWhen"]; }); -/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(487); +/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(500); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__["withLatestFrom"]; }); -/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(488); +/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(501); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__["zip"]; }); -/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(489); +/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(502); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__["zipAll"]; }); /** PURE_IMPORTS_START PURE_IMPORTS_END */ @@ -50513,7 +53286,7 @@ __webpack_require__.r(__webpack_exports__); /***/ }), -/* 393 */ +/* 406 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -50594,14 +53367,14 @@ var AuditSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 394 */ +/* 407 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return auditTime; }); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); -/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(393); +/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(406); /* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(107); /** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */ @@ -50617,7 +53390,7 @@ function auditTime(duration, scheduler) { /***/ }), -/* 395 */ +/* 408 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -50666,7 +53439,7 @@ var BufferSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 396 */ +/* 409 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -50767,7 +53540,7 @@ var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 397 */ +/* 410 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -50928,7 +53701,7 @@ function dispatchBufferClose(arg) { /***/ }), -/* 398 */ +/* 411 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51048,7 +53821,7 @@ var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 399 */ +/* 412 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51143,7 +53916,7 @@ var BufferWhenSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 400 */ +/* 413 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51207,7 +53980,7 @@ var CatchSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 401 */ +/* 414 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51223,7 +53996,7 @@ function combineAll(project) { /***/ }), -/* 402 */ +/* 415 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51255,7 +54028,7 @@ function combineLatest() { /***/ }), -/* 403 */ +/* 416 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51275,7 +54048,7 @@ function concat() { /***/ }), -/* 404 */ +/* 417 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51291,13 +54064,13 @@ function concatMap(project, resultSelector) { /***/ }), -/* 405 */ +/* 418 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return concatMapTo; }); -/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(404); +/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(417); /** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */ function concatMapTo(innerObservable, resultSelector) { @@ -51307,7 +54080,7 @@ function concatMapTo(innerObservable, resultSelector) { /***/ }), -/* 406 */ +/* 419 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51372,7 +54145,7 @@ var CountSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 407 */ +/* 420 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51460,7 +54233,7 @@ var DebounceSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 408 */ +/* 421 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51536,7 +54309,7 @@ function dispatchNext(subscriber) { /***/ }), -/* 409 */ +/* 422 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51586,7 +54359,7 @@ var DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 410 */ +/* 423 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51594,7 +54367,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return delay; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(411); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(424); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11); /* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(42); /** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ @@ -51693,7 +54466,7 @@ var DelayMessage = /*@__PURE__*/ (function () { /***/ }), -/* 411 */ +/* 424 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51707,7 +54480,7 @@ function isDate(value) { /***/ }), -/* 412 */ +/* 425 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51853,7 +54626,7 @@ var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 413 */ +/* 426 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51891,7 +54664,7 @@ var DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 414 */ +/* 427 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51969,7 +54742,7 @@ var DistinctSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 415 */ +/* 428 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52040,13 +54813,13 @@ var DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 416 */ +/* 429 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return distinctUntilKeyChanged; }); -/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(415); +/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(428); /** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */ function distinctUntilKeyChanged(key, compare) { @@ -52056,7 +54829,7 @@ function distinctUntilKeyChanged(key, compare) { /***/ }), -/* 417 */ +/* 430 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52064,9 +54837,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return elementAt; }); /* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); /* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(418); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(409); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(419); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(431); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(422); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(432); /** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ @@ -52088,7 +54861,7 @@ function elementAt(index, defaultValue) { /***/ }), -/* 418 */ +/* 431 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52154,7 +54927,7 @@ function defaultErrorFactory() { /***/ }), -/* 419 */ +/* 432 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52216,7 +54989,7 @@ var TakeSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 420 */ +/* 433 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52238,7 +55011,7 @@ function endWith() { /***/ }), -/* 421 */ +/* 434 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52300,7 +55073,7 @@ var EverySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 422 */ +/* 435 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52357,7 +55130,7 @@ var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 423 */ +/* 436 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52457,7 +55230,7 @@ var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 424 */ +/* 437 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52576,7 +55349,7 @@ var ExpandSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 425 */ +/* 438 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52614,7 +55387,7 @@ var FinallySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 426 */ +/* 439 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52686,13 +55459,13 @@ var FindValueSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 427 */ +/* 440 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return findIndex; }); -/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(426); +/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(439); /** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */ function findIndex(predicate, thisArg) { @@ -52702,7 +55475,7 @@ function findIndex(predicate, thisArg) { /***/ }), -/* 428 */ +/* 441 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52710,9 +55483,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "first", function() { return first; }); /* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(63); /* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(419); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(409); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(418); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(432); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(422); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(431); /* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25); /** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ @@ -52729,7 +55502,7 @@ function first(predicate, defaultValue) { /***/ }), -/* 429 */ +/* 442 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52766,7 +55539,7 @@ var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 430 */ +/* 443 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52810,7 +55583,7 @@ var IsEmptySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 431 */ +/* 444 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52818,9 +55591,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "last", function() { return last; }); /* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(63); /* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(432); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(418); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(409); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(445); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(431); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(422); /* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25); /** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ @@ -52837,7 +55610,7 @@ function last(predicate, defaultValue) { /***/ }), -/* 432 */ +/* 445 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52914,7 +55687,7 @@ var TakeLastSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 433 */ +/* 446 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52953,7 +55726,7 @@ var MapToSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 434 */ +/* 447 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53003,13 +55776,13 @@ var MaterializeSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 435 */ +/* 448 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(436); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(449); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function max(comparer) { @@ -53022,15 +55795,15 @@ function max(comparer) { /***/ }), -/* 436 */ +/* 449 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(437); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(432); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(409); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(450); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(445); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(422); /* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24); /** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */ @@ -53051,7 +55824,7 @@ function reduce(accumulator, seed) { /***/ }), -/* 437 */ +/* 450 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53133,7 +55906,7 @@ var ScanSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 438 */ +/* 451 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53153,7 +55926,7 @@ function merge() { /***/ }), -/* 439 */ +/* 452 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53178,7 +55951,7 @@ function mergeMapTo(innerObservable, resultSelector, concurrent) { /***/ }), -/* 440 */ +/* 453 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53293,13 +56066,13 @@ var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 441 */ +/* 454 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(436); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(449); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function min(comparer) { @@ -53312,7 +56085,7 @@ function min(comparer) { /***/ }), -/* 442 */ +/* 455 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53361,7 +56134,7 @@ var MulticastOperator = /*@__PURE__*/ (function () { /***/ }), -/* 443 */ +/* 456 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53455,7 +56228,7 @@ var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 444 */ +/* 457 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53503,7 +56276,7 @@ var PairwiseSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 445 */ +/* 458 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53526,7 +56299,7 @@ function partition(predicate, thisArg) { /***/ }), -/* 446 */ +/* 459 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53566,14 +56339,14 @@ function plucker(props, length) { /***/ }), -/* 447 */ +/* 460 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return publish; }); /* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(27); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(442); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); /** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ @@ -53586,14 +56359,14 @@ function publish(selector) { /***/ }), -/* 448 */ +/* 461 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return publishBehavior; }); /* harmony import */ var _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(32); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(442); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); /** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ @@ -53604,14 +56377,14 @@ function publishBehavior(value) { /***/ }), -/* 449 */ +/* 462 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return publishLast; }); /* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(50); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(442); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); /** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ @@ -53622,14 +56395,14 @@ function publishLast() { /***/ }), -/* 450 */ +/* 463 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return publishReplay; }); /* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(442); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); /** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ @@ -53645,7 +56418,7 @@ function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { /***/ }), -/* 451 */ +/* 464 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53672,7 +56445,7 @@ function race() { /***/ }), -/* 452 */ +/* 465 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53737,7 +56510,7 @@ var RepeatSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 453 */ +/* 466 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53833,7 +56606,7 @@ var RepeatWhenSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 454 */ +/* 467 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53886,7 +56659,7 @@ var RetrySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 455 */ +/* 468 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53974,7 +56747,7 @@ var RetryWhenSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 456 */ +/* 469 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54031,7 +56804,7 @@ var SampleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 457 */ +/* 470 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54091,7 +56864,7 @@ function dispatchNotification(state) { /***/ }), -/* 458 */ +/* 471 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54214,13 +56987,13 @@ var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 459 */ +/* 472 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "share", function() { return share; }); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(442); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(455); /* harmony import */ var _refCount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(30); /* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27); /** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ @@ -54237,7 +57010,7 @@ function share() { /***/ }), -/* 460 */ +/* 473 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54302,7 +57075,7 @@ function shareReplayOperator(_a) { /***/ }), -/* 461 */ +/* 474 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54382,7 +57155,7 @@ var SingleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 462 */ +/* 475 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54424,7 +57197,7 @@ var SkipSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 463 */ +/* 476 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54486,7 +57259,7 @@ var SkipLastSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 464 */ +/* 477 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54547,7 +57320,7 @@ var SkipUntilSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 465 */ +/* 478 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54603,7 +57376,7 @@ var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 466 */ +/* 479 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54632,13 +57405,13 @@ function startWith() { /***/ }), -/* 467 */ +/* 480 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return subscribeOn; }); -/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(468); +/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(481); /** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */ function subscribeOn(scheduler, delay) { @@ -54663,7 +57436,7 @@ var SubscribeOnOperator = /*@__PURE__*/ (function () { /***/ }), -/* 468 */ +/* 481 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54727,13 +57500,13 @@ var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { /***/ }), -/* 469 */ +/* 482 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return switchAll; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(470); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(483); /* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); /** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ @@ -54745,7 +57518,7 @@ function switchAll() { /***/ }), -/* 470 */ +/* 483 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54839,13 +57612,13 @@ var SwitchMapSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 471 */ +/* 484 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return switchMapTo; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(470); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(483); /** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */ function switchMapTo(innerObservable, resultSelector) { @@ -54855,7 +57628,7 @@ function switchMapTo(innerObservable, resultSelector) { /***/ }), -/* 472 */ +/* 485 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54905,7 +57678,7 @@ var TakeUntilSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 473 */ +/* 486 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54973,7 +57746,7 @@ var TakeWhileSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 474 */ +/* 487 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55061,7 +57834,7 @@ var TapSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 475 */ +/* 488 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55165,7 +57938,7 @@ var ThrottleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 476 */ +/* 489 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55174,7 +57947,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55); -/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(475); +/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(488); /** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */ @@ -55263,7 +58036,7 @@ function dispatchNext(arg) { /***/ }), -/* 477 */ +/* 490 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55271,7 +58044,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return timeInterval; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeInterval", function() { return TimeInterval; }); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(437); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(450); /* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(90); /* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(66); /** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */ @@ -55307,7 +58080,7 @@ var TimeInterval = /*@__PURE__*/ (function () { /***/ }), -/* 478 */ +/* 491 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55315,7 +58088,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return timeout; }); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); /* harmony import */ var _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64); -/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(479); +/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(492); /* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(49); /** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */ @@ -55332,7 +58105,7 @@ function timeout(due, scheduler) { /***/ }), -/* 479 */ +/* 492 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55340,7 +58113,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return timeoutWith; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(411); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(424); /* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); /* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70); /** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ @@ -55414,7 +58187,7 @@ var TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 480 */ +/* 493 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55444,13 +58217,13 @@ var Timestamp = /*@__PURE__*/ (function () { /***/ }), -/* 481 */ +/* 494 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(436); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(449); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function toArrayReducer(arr, item, index) { @@ -55467,7 +58240,7 @@ function toArray() { /***/ }), -/* 482 */ +/* 495 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55547,7 +58320,7 @@ var WindowSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 483 */ +/* 496 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55637,7 +58410,7 @@ var WindowCountSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 484 */ +/* 497 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55807,7 +58580,7 @@ function dispatchWindowClose(state) { /***/ }), -/* 485 */ +/* 498 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55950,7 +58723,7 @@ var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 486 */ +/* 499 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56047,7 +58820,7 @@ var WindowSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 487 */ +/* 500 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56142,7 +58915,7 @@ var WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 488 */ +/* 501 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56164,7 +58937,7 @@ function zip() { /***/ }), -/* 489 */ +/* 502 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56180,17 +58953,17 @@ function zipAll(project) { /***/ }), -/* 490 */ +/* 503 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runCommand", function() { return runCommand; }); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(161); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(142); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); -/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(491); -/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(492); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); +/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(504); +/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(505); 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; } @@ -56272,13 +59045,13 @@ function toArray(value) { } /***/ }), -/* 491 */ +/* 504 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderProjectsTree", function() { return renderProjectsTree; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(112); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(235); /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); @@ -56425,7 +59198,7 @@ function addProjectToTree(tree, pathParts, project) { } /***/ }), -/* 492 */ +/* 505 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56433,12 +59206,12 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Kibana", function() { return Kibana; }); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(493); +/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(506); /* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(multimatch__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(497); +/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(510); /* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(is_path_inside__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(144); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(272); +/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(288); 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; } @@ -56579,15 +59352,15 @@ class Kibana { } /***/ }), -/* 493 */ +/* 506 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const minimatch = __webpack_require__(148); -const arrayUnion = __webpack_require__(494); -const arrayDiffer = __webpack_require__(495); -const arrify = __webpack_require__(496); +const minimatch = __webpack_require__(149); +const arrayUnion = __webpack_require__(507); +const arrayDiffer = __webpack_require__(508); +const arrify = __webpack_require__(509); module.exports = (list, patterns, options = {}) => { list = arrify(list); @@ -56611,7 +59384,7 @@ module.exports = (list, patterns, options = {}) => { /***/ }), -/* 494 */ +/* 507 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56623,7 +59396,7 @@ module.exports = (...arguments_) => { /***/ }), -/* 495 */ +/* 508 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56638,7 +59411,7 @@ module.exports = arrayDiffer; /***/ }), -/* 496 */ +/* 509 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56668,7 +59441,7 @@ module.exports = arrify; /***/ }), -/* 497 */ +/* 510 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56696,15 +59469,15 @@ module.exports = (childPath, parentPath) => { /***/ }), -/* 498 */ +/* 511 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(499); +/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(512); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _build_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildProductionProjects"]; }); -/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(735); +/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(748); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); /* @@ -56729,23 +59502,23 @@ __webpack_require__.r(__webpack_exports__); /***/ }), -/* 499 */ +/* 512 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return buildProductionProjects; }); -/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(500); +/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(513); /* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cpy__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(281); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(296); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(272); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(129); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(142); -/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(163); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(144); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(288); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(130); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(143); +/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(164); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(145); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -56877,21 +59650,21 @@ async function copyToBuild(project, kibanaRoot, buildRoot) { } /***/ }), -/* 500 */ +/* 513 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const EventEmitter = __webpack_require__(154); +const EventEmitter = __webpack_require__(155); const path = __webpack_require__(4); -const os = __webpack_require__(121); -const pAll = __webpack_require__(501); -const arrify = __webpack_require__(503); -const globby = __webpack_require__(504); -const isGlob = __webpack_require__(719); -const cpFile = __webpack_require__(720); -const junk = __webpack_require__(732); -const CpyError = __webpack_require__(733); +const os = __webpack_require__(120); +const pAll = __webpack_require__(514); +const arrify = __webpack_require__(516); +const globby = __webpack_require__(517); +const isGlob = __webpack_require__(732); +const cpFile = __webpack_require__(733); +const junk = __webpack_require__(745); +const CpyError = __webpack_require__(746); const defaultOptions = { ignoreJunk: true @@ -57010,12 +59783,12 @@ module.exports = (source, destination, { /***/ }), -/* 501 */ +/* 514 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pMap = __webpack_require__(502); +const pMap = __webpack_require__(515); module.exports = (iterable, options) => pMap(iterable, element => element(), options); // TODO: Remove this for the next major release @@ -57023,7 +59796,7 @@ module.exports.default = module.exports; /***/ }), -/* 502 */ +/* 515 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -57102,7 +59875,7 @@ module.exports.default = pMap; /***/ }), -/* 503 */ +/* 516 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -57132,17 +59905,17 @@ module.exports = arrify; /***/ }), -/* 504 */ +/* 517 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); -const arrayUnion = __webpack_require__(505); -const glob = __webpack_require__(507); -const fastGlob = __webpack_require__(512); -const dirGlob = __webpack_require__(712); -const gitignore = __webpack_require__(715); +const fs = __webpack_require__(133); +const arrayUnion = __webpack_require__(518); +const glob = __webpack_require__(520); +const fastGlob = __webpack_require__(525); +const dirGlob = __webpack_require__(725); +const gitignore = __webpack_require__(728); const DEFAULT_FILTER = () => false; @@ -57287,12 +60060,12 @@ module.exports.gitignore = gitignore; /***/ }), -/* 505 */ +/* 518 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var arrayUniq = __webpack_require__(506); +var arrayUniq = __webpack_require__(519); module.exports = function () { return arrayUniq([].concat.apply([], arguments)); @@ -57300,7 +60073,7 @@ module.exports = function () { /***/ }), -/* 506 */ +/* 519 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -57369,7 +60142,7 @@ if ('Set' in global) { /***/ }), -/* 507 */ +/* 520 */ /***/ (function(module, exports, __webpack_require__) { // Approach: @@ -57414,27 +60187,27 @@ if ('Set' in global) { module.exports = glob -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(508) -var EE = __webpack_require__(154).EventEmitter +var inherits = __webpack_require__(521) +var EE = __webpack_require__(155).EventEmitter var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var globSync = __webpack_require__(510) -var common = __webpack_require__(511) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var globSync = __webpack_require__(523) +var common = __webpack_require__(524) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp -var inflight = __webpack_require__(158) +var inflight = __webpack_require__(159) var util = __webpack_require__(111) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(160) +var once = __webpack_require__(161) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -58165,7 +60938,7 @@ Glob.prototype._stat2 = function (f, abs, er, stat, cb) { /***/ }), -/* 508 */ +/* 521 */ /***/ (function(module, exports, __webpack_require__) { try { @@ -58175,12 +60948,12 @@ try { module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ - module.exports = __webpack_require__(509); + module.exports = __webpack_require__(522); } /***/ }), -/* 509 */ +/* 522 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -58213,22 +60986,22 @@ if (typeof Object.create === 'function') { /***/ }), -/* 510 */ +/* 523 */ /***/ (function(module, exports, __webpack_require__) { module.exports = globSync globSync.GlobSync = GlobSync -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(507).Glob +var Glob = __webpack_require__(520).Glob var util = __webpack_require__(111) var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var common = __webpack_require__(511) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var common = __webpack_require__(524) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts @@ -58705,7 +61478,7 @@ GlobSync.prototype._makeAbs = function (f) { /***/ }), -/* 511 */ +/* 524 */ /***/ (function(module, exports, __webpack_require__) { exports.alphasort = alphasort @@ -58723,8 +61496,8 @@ function ownProp (obj, field) { } var path = __webpack_require__(4) -var minimatch = __webpack_require__(148) -var isAbsolute = __webpack_require__(155) +var minimatch = __webpack_require__(149) +var isAbsolute = __webpack_require__(156) var Minimatch = minimatch.Minimatch function alphasorti (a, b) { @@ -58951,10 +61724,10 @@ function childrenIgnored (self, path) { /***/ }), -/* 512 */ +/* 525 */ /***/ (function(module, exports, __webpack_require__) { -const pkg = __webpack_require__(513); +const pkg = __webpack_require__(526); module.exports = pkg.async; module.exports.default = pkg.async; @@ -58967,19 +61740,19 @@ module.exports.generateTasks = pkg.generateTasks; /***/ }), -/* 513 */ +/* 526 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var optionsManager = __webpack_require__(514); -var taskManager = __webpack_require__(515); -var reader_async_1 = __webpack_require__(683); -var reader_stream_1 = __webpack_require__(707); -var reader_sync_1 = __webpack_require__(708); -var arrayUtils = __webpack_require__(710); -var streamUtils = __webpack_require__(711); +var optionsManager = __webpack_require__(527); +var taskManager = __webpack_require__(528); +var reader_async_1 = __webpack_require__(696); +var reader_stream_1 = __webpack_require__(720); +var reader_sync_1 = __webpack_require__(721); +var arrayUtils = __webpack_require__(723); +var streamUtils = __webpack_require__(724); /** * Synchronous API. */ @@ -59045,7 +61818,7 @@ function isString(source) { /***/ }), -/* 514 */ +/* 527 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -59083,13 +61856,13 @@ exports.prepare = prepare; /***/ }), -/* 515 */ +/* 528 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var patternUtils = __webpack_require__(516); +var patternUtils = __webpack_require__(529); /** * Generate tasks based on parent directory of each pattern. */ @@ -59180,16 +61953,16 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 516 */ +/* 529 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var path = __webpack_require__(4); -var globParent = __webpack_require__(517); -var isGlob = __webpack_require__(520); -var micromatch = __webpack_require__(521); +var globParent = __webpack_require__(530); +var isGlob = __webpack_require__(533); +var micromatch = __webpack_require__(534); var GLOBSTAR = '**'; /** * Return true for static pattern. @@ -59335,16 +62108,16 @@ exports.matchAny = matchAny; /***/ }), -/* 517 */ +/* 530 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var path = __webpack_require__(4); -var isglob = __webpack_require__(518); -var pathDirname = __webpack_require__(519); -var isWin32 = __webpack_require__(121).platform() === 'win32'; +var isglob = __webpack_require__(531); +var pathDirname = __webpack_require__(532); +var isWin32 = __webpack_require__(120).platform() === 'win32'; module.exports = function globParent(str) { // flip windows path separators @@ -59366,7 +62139,7 @@ module.exports = function globParent(str) { /***/ }), -/* 518 */ +/* 531 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -59376,7 +62149,7 @@ module.exports = function globParent(str) { * Licensed under the MIT License. */ -var isExtglob = __webpack_require__(300); +var isExtglob = __webpack_require__(315); module.exports = function isGlob(str) { if (typeof str !== 'string' || str === '') { @@ -59397,7 +62170,7 @@ module.exports = function isGlob(str) { /***/ }), -/* 519 */ +/* 532 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -59547,7 +62320,7 @@ module.exports.win32 = win32; /***/ }), -/* 520 */ +/* 533 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -59557,7 +62330,7 @@ module.exports.win32 = win32; * Released under the MIT License. */ -var isExtglob = __webpack_require__(300); +var isExtglob = __webpack_require__(315); var chars = { '{': '}', '(': ')', '[': ']'}; module.exports = function isGlob(str, options) { @@ -59599,7 +62372,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 521 */ +/* 534 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -59610,18 +62383,18 @@ module.exports = function isGlob(str, options) { */ var util = __webpack_require__(111); -var braces = __webpack_require__(522); -var toRegex = __webpack_require__(635); -var extend = __webpack_require__(643); +var braces = __webpack_require__(535); +var toRegex = __webpack_require__(648); +var extend = __webpack_require__(656); /** * Local dependencies */ -var compilers = __webpack_require__(646); -var parsers = __webpack_require__(679); -var cache = __webpack_require__(680); -var utils = __webpack_require__(681); +var compilers = __webpack_require__(659); +var parsers = __webpack_require__(692); +var cache = __webpack_require__(693); +var utils = __webpack_require__(694); var MAX_LENGTH = 1024 * 64; /** @@ -60483,7 +63256,7 @@ module.exports = micromatch; /***/ }), -/* 522 */ +/* 535 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -60493,18 +63266,18 @@ module.exports = micromatch; * Module dependencies */ -var toRegex = __webpack_require__(523); -var unique = __webpack_require__(537); -var extend = __webpack_require__(532); +var toRegex = __webpack_require__(536); +var unique = __webpack_require__(550); +var extend = __webpack_require__(545); /** * Local dependencies */ -var compilers = __webpack_require__(538); -var parsers = __webpack_require__(555); -var Braces = __webpack_require__(565); -var utils = __webpack_require__(539); +var compilers = __webpack_require__(551); +var parsers = __webpack_require__(568); +var Braces = __webpack_require__(578); +var utils = __webpack_require__(552); var MAX_LENGTH = 1024 * 64; var cache = {}; @@ -60808,15 +63581,15 @@ module.exports = braces; /***/ }), -/* 523 */ +/* 536 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(524); -var extend = __webpack_require__(532); -var not = __webpack_require__(534); +var define = __webpack_require__(537); +var extend = __webpack_require__(545); +var not = __webpack_require__(547); var MAX_LENGTH = 1024 * 64; /** @@ -60963,7 +63736,7 @@ module.exports.makeRe = makeRe; /***/ }), -/* 524 */ +/* 537 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -60976,7 +63749,7 @@ module.exports.makeRe = makeRe; -var isDescriptor = __webpack_require__(525); +var isDescriptor = __webpack_require__(538); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -61001,7 +63774,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 525 */ +/* 538 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61014,9 +63787,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(526); -var isAccessor = __webpack_require__(527); -var isData = __webpack_require__(530); +var typeOf = __webpack_require__(539); +var isAccessor = __webpack_require__(540); +var isData = __webpack_require__(543); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -61030,7 +63803,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 526 */ +/* 539 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -61183,7 +63956,7 @@ function isBuffer(val) { /***/ }), -/* 527 */ +/* 540 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61196,7 +63969,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(528); +var typeOf = __webpack_require__(541); // accessor descriptor properties var accessor = { @@ -61259,10 +64032,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 528 */ +/* 541 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -61381,7 +64154,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 529 */ +/* 542 */ /***/ (function(module, exports) { /*! @@ -61408,7 +64181,7 @@ function isSlowBuffer (obj) { /***/ }), -/* 530 */ +/* 543 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61421,7 +64194,7 @@ function isSlowBuffer (obj) { -var typeOf = __webpack_require__(531); +var typeOf = __webpack_require__(544); // data descriptor properties var data = { @@ -61470,10 +64243,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 531 */ +/* 544 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -61592,13 +64365,13 @@ module.exports = function kindOf(val) { /***/ }), -/* 532 */ +/* 545 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(533); +var isObject = __webpack_require__(546); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -61632,7 +64405,7 @@ function hasOwn(obj, key) { /***/ }), -/* 533 */ +/* 546 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61652,13 +64425,13 @@ module.exports = function isExtendable(val) { /***/ }), -/* 534 */ +/* 547 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(535); +var extend = __webpack_require__(548); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -61725,13 +64498,13 @@ module.exports = toRegex; /***/ }), -/* 535 */ +/* 548 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(536); +var isObject = __webpack_require__(549); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -61765,7 +64538,7 @@ function hasOwn(obj, key) { /***/ }), -/* 536 */ +/* 549 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61785,7 +64558,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 537 */ +/* 550 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61835,13 +64608,13 @@ module.exports.immutable = function uniqueImmutable(arr) { /***/ }), -/* 538 */ +/* 551 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(539); +var utils = __webpack_require__(552); module.exports = function(braces, options) { braces.compiler @@ -62124,25 +64897,25 @@ function hasQueue(node) { /***/ }), -/* 539 */ +/* 552 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var splitString = __webpack_require__(540); +var splitString = __webpack_require__(553); var utils = module.exports; /** * Module dependencies */ -utils.extend = __webpack_require__(532); -utils.flatten = __webpack_require__(546); -utils.isObject = __webpack_require__(544); -utils.fillRange = __webpack_require__(547); -utils.repeat = __webpack_require__(554); -utils.unique = __webpack_require__(537); +utils.extend = __webpack_require__(545); +utils.flatten = __webpack_require__(559); +utils.isObject = __webpack_require__(557); +utils.fillRange = __webpack_require__(560); +utils.repeat = __webpack_require__(567); +utils.unique = __webpack_require__(550); utils.define = function(obj, key, val) { Object.defineProperty(obj, key, { @@ -62474,7 +65247,7 @@ utils.escapeRegex = function(str) { /***/ }), -/* 540 */ +/* 553 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62487,7 +65260,7 @@ utils.escapeRegex = function(str) { -var extend = __webpack_require__(541); +var extend = __webpack_require__(554); module.exports = function(str, options, fn) { if (typeof str !== 'string') { @@ -62652,14 +65425,14 @@ function keepEscaping(opts, str, idx) { /***/ }), -/* 541 */ +/* 554 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(542); -var assignSymbols = __webpack_require__(545); +var isExtendable = __webpack_require__(555); +var assignSymbols = __webpack_require__(558); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -62719,7 +65492,7 @@ function isEnum(obj, key) { /***/ }), -/* 542 */ +/* 555 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62732,7 +65505,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(543); +var isPlainObject = __webpack_require__(556); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -62740,7 +65513,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 543 */ +/* 556 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62753,7 +65526,7 @@ module.exports = function isExtendable(val) { -var isObject = __webpack_require__(544); +var isObject = __webpack_require__(557); function isObjectObject(o) { return isObject(o) === true @@ -62784,7 +65557,7 @@ module.exports = function isPlainObject(o) { /***/ }), -/* 544 */ +/* 557 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62803,7 +65576,7 @@ module.exports = function isObject(val) { /***/ }), -/* 545 */ +/* 558 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62850,7 +65623,7 @@ module.exports = function(receiver, objects) { /***/ }), -/* 546 */ +/* 559 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62879,7 +65652,7 @@ function flat(arr, res) { /***/ }), -/* 547 */ +/* 560 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62893,10 +65666,10 @@ function flat(arr, res) { var util = __webpack_require__(111); -var isNumber = __webpack_require__(548); -var extend = __webpack_require__(550); -var repeat = __webpack_require__(552); -var toRegex = __webpack_require__(553); +var isNumber = __webpack_require__(561); +var extend = __webpack_require__(563); +var repeat = __webpack_require__(565); +var toRegex = __webpack_require__(566); /** * Return a range of numbers or letters. @@ -63094,7 +65867,7 @@ module.exports = fillRange; /***/ }), -/* 548 */ +/* 561 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63107,7 +65880,7 @@ module.exports = fillRange; -var typeOf = __webpack_require__(549); +var typeOf = __webpack_require__(562); module.exports = function isNumber(num) { var type = typeOf(num); @@ -63123,10 +65896,10 @@ module.exports = function isNumber(num) { /***/ }), -/* 549 */ +/* 562 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -63245,13 +66018,13 @@ module.exports = function kindOf(val) { /***/ }), -/* 550 */ +/* 563 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(551); +var isObject = __webpack_require__(564); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -63285,7 +66058,7 @@ function hasOwn(obj, key) { /***/ }), -/* 551 */ +/* 564 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63305,7 +66078,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 552 */ +/* 565 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63382,7 +66155,7 @@ function repeat(str, num) { /***/ }), -/* 553 */ +/* 566 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63395,8 +66168,8 @@ function repeat(str, num) { -var repeat = __webpack_require__(552); -var isNumber = __webpack_require__(548); +var repeat = __webpack_require__(565); +var isNumber = __webpack_require__(561); var cache = {}; function toRegexRange(min, max, options) { @@ -63683,7 +66456,7 @@ module.exports = toRegexRange; /***/ }), -/* 554 */ +/* 567 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63708,14 +66481,14 @@ module.exports = function repeat(ele, num) { /***/ }), -/* 555 */ +/* 568 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Node = __webpack_require__(556); -var utils = __webpack_require__(539); +var Node = __webpack_require__(569); +var utils = __webpack_require__(552); /** * Braces parsers @@ -64075,15 +66848,15 @@ function concatNodes(pos, node, parent, options) { /***/ }), -/* 556 */ +/* 569 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(544); -var define = __webpack_require__(557); -var utils = __webpack_require__(564); +var isObject = __webpack_require__(557); +var define = __webpack_require__(570); +var utils = __webpack_require__(577); var ownNames; /** @@ -64574,7 +67347,7 @@ exports = module.exports = Node; /***/ }), -/* 557 */ +/* 570 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64587,7 +67360,7 @@ exports = module.exports = Node; -var isDescriptor = __webpack_require__(558); +var isDescriptor = __webpack_require__(571); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -64612,7 +67385,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 558 */ +/* 571 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64625,9 +67398,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(559); -var isAccessor = __webpack_require__(560); -var isData = __webpack_require__(562); +var typeOf = __webpack_require__(572); +var isAccessor = __webpack_require__(573); +var isData = __webpack_require__(575); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -64641,7 +67414,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 559 */ +/* 572 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -64776,7 +67549,7 @@ function isBuffer(val) { /***/ }), -/* 560 */ +/* 573 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64789,7 +67562,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(561); +var typeOf = __webpack_require__(574); // accessor descriptor properties var accessor = { @@ -64852,7 +67625,7 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 561 */ +/* 574 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -64987,7 +67760,7 @@ function isBuffer(val) { /***/ }), -/* 562 */ +/* 575 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65000,7 +67773,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(563); +var typeOf = __webpack_require__(576); module.exports = function isDataDescriptor(obj, prop) { // data descriptor properties @@ -65043,7 +67816,7 @@ module.exports = function isDataDescriptor(obj, prop) { /***/ }), -/* 563 */ +/* 576 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -65178,13 +67951,13 @@ function isBuffer(val) { /***/ }), -/* 564 */ +/* 577 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(549); +var typeOf = __webpack_require__(562); var utils = module.exports; /** @@ -66204,17 +68977,17 @@ function assert(val, message) { /***/ }), -/* 565 */ +/* 578 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(532); -var Snapdragon = __webpack_require__(566); -var compilers = __webpack_require__(538); -var parsers = __webpack_require__(555); -var utils = __webpack_require__(539); +var extend = __webpack_require__(545); +var Snapdragon = __webpack_require__(579); +var compilers = __webpack_require__(551); +var parsers = __webpack_require__(568); +var utils = __webpack_require__(552); /** * Customize Snapdragon parser and renderer @@ -66315,17 +69088,17 @@ module.exports = Braces; /***/ }), -/* 566 */ +/* 579 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Base = __webpack_require__(567); -var define = __webpack_require__(593); -var Compiler = __webpack_require__(603); -var Parser = __webpack_require__(632); -var utils = __webpack_require__(612); +var Base = __webpack_require__(580); +var define = __webpack_require__(606); +var Compiler = __webpack_require__(616); +var Parser = __webpack_require__(645); +var utils = __webpack_require__(625); var regexCache = {}; var cache = {}; @@ -66496,20 +69269,20 @@ module.exports.Parser = Parser; /***/ }), -/* 567 */ +/* 580 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(111); -var define = __webpack_require__(568); -var CacheBase = __webpack_require__(569); -var Emitter = __webpack_require__(570); -var isObject = __webpack_require__(544); -var merge = __webpack_require__(587); -var pascal = __webpack_require__(590); -var cu = __webpack_require__(591); +var define = __webpack_require__(581); +var CacheBase = __webpack_require__(582); +var Emitter = __webpack_require__(583); +var isObject = __webpack_require__(557); +var merge = __webpack_require__(600); +var pascal = __webpack_require__(603); +var cu = __webpack_require__(604); /** * Optionally define a custom `cache` namespace to use. @@ -66938,7 +69711,7 @@ module.exports.namespace = namespace; /***/ }), -/* 568 */ +/* 581 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -66951,7 +69724,7 @@ module.exports.namespace = namespace; -var isDescriptor = __webpack_require__(558); +var isDescriptor = __webpack_require__(571); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -66976,21 +69749,21 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 569 */ +/* 582 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(544); -var Emitter = __webpack_require__(570); -var visit = __webpack_require__(571); -var toPath = __webpack_require__(574); -var union = __webpack_require__(575); -var del = __webpack_require__(579); -var get = __webpack_require__(577); -var has = __webpack_require__(584); -var set = __webpack_require__(578); +var isObject = __webpack_require__(557); +var Emitter = __webpack_require__(583); +var visit = __webpack_require__(584); +var toPath = __webpack_require__(587); +var union = __webpack_require__(588); +var del = __webpack_require__(592); +var get = __webpack_require__(590); +var has = __webpack_require__(597); +var set = __webpack_require__(591); /** * Create a `Cache` constructor that when instantiated will @@ -67244,7 +70017,7 @@ module.exports.namespace = namespace; /***/ }), -/* 570 */ +/* 583 */ /***/ (function(module, exports, __webpack_require__) { @@ -67413,7 +70186,7 @@ Emitter.prototype.hasListeners = function(event){ /***/ }), -/* 571 */ +/* 584 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67426,8 +70199,8 @@ Emitter.prototype.hasListeners = function(event){ -var visit = __webpack_require__(572); -var mapVisit = __webpack_require__(573); +var visit = __webpack_require__(585); +var mapVisit = __webpack_require__(586); module.exports = function(collection, method, val) { var result; @@ -67450,7 +70223,7 @@ module.exports = function(collection, method, val) { /***/ }), -/* 572 */ +/* 585 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67463,7 +70236,7 @@ module.exports = function(collection, method, val) { -var isObject = __webpack_require__(544); +var isObject = __webpack_require__(557); module.exports = function visit(thisArg, method, target, val) { if (!isObject(thisArg) && typeof thisArg !== 'function') { @@ -67490,14 +70263,14 @@ module.exports = function visit(thisArg, method, target, val) { /***/ }), -/* 573 */ +/* 586 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(111); -var visit = __webpack_require__(572); +var visit = __webpack_require__(585); /** * Map `visit` over an array of objects. @@ -67534,7 +70307,7 @@ function isObject(val) { /***/ }), -/* 574 */ +/* 587 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67547,7 +70320,7 @@ function isObject(val) { -var typeOf = __webpack_require__(549); +var typeOf = __webpack_require__(562); module.exports = function toPath(args) { if (typeOf(args) !== 'arguments') { @@ -67574,16 +70347,16 @@ function filter(arr) { /***/ }), -/* 575 */ +/* 588 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(536); -var union = __webpack_require__(576); -var get = __webpack_require__(577); -var set = __webpack_require__(578); +var isObject = __webpack_require__(549); +var union = __webpack_require__(589); +var get = __webpack_require__(590); +var set = __webpack_require__(591); module.exports = function unionValue(obj, prop, value) { if (!isObject(obj)) { @@ -67611,7 +70384,7 @@ function arrayify(val) { /***/ }), -/* 576 */ +/* 589 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67647,7 +70420,7 @@ module.exports = function union(init) { /***/ }), -/* 577 */ +/* 590 */ /***/ (function(module, exports) { /*! @@ -67703,7 +70476,7 @@ function toString(val) { /***/ }), -/* 578 */ +/* 591 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67716,10 +70489,10 @@ function toString(val) { -var split = __webpack_require__(540); -var extend = __webpack_require__(535); -var isPlainObject = __webpack_require__(543); -var isObject = __webpack_require__(536); +var split = __webpack_require__(553); +var extend = __webpack_require__(548); +var isPlainObject = __webpack_require__(556); +var isObject = __webpack_require__(549); module.exports = function(obj, prop, val) { if (!isObject(obj)) { @@ -67765,7 +70538,7 @@ function isValidKey(key) { /***/ }), -/* 579 */ +/* 592 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67778,8 +70551,8 @@ function isValidKey(key) { -var isObject = __webpack_require__(544); -var has = __webpack_require__(580); +var isObject = __webpack_require__(557); +var has = __webpack_require__(593); module.exports = function unset(obj, prop) { if (!isObject(obj)) { @@ -67804,7 +70577,7 @@ module.exports = function unset(obj, prop) { /***/ }), -/* 580 */ +/* 593 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67817,9 +70590,9 @@ module.exports = function unset(obj, prop) { -var isObject = __webpack_require__(581); -var hasValues = __webpack_require__(583); -var get = __webpack_require__(577); +var isObject = __webpack_require__(594); +var hasValues = __webpack_require__(596); +var get = __webpack_require__(590); module.exports = function(obj, prop, noZero) { if (isObject(obj)) { @@ -67830,7 +70603,7 @@ module.exports = function(obj, prop, noZero) { /***/ }), -/* 581 */ +/* 594 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67843,7 +70616,7 @@ module.exports = function(obj, prop, noZero) { -var isArray = __webpack_require__(582); +var isArray = __webpack_require__(595); module.exports = function isObject(val) { return val != null && typeof val === 'object' && isArray(val) === false; @@ -67851,7 +70624,7 @@ module.exports = function isObject(val) { /***/ }), -/* 582 */ +/* 595 */ /***/ (function(module, exports) { var toString = {}.toString; @@ -67862,7 +70635,7 @@ module.exports = Array.isArray || function (arr) { /***/ }), -/* 583 */ +/* 596 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67905,7 +70678,7 @@ module.exports = function hasValue(o, noZero) { /***/ }), -/* 584 */ +/* 597 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67918,9 +70691,9 @@ module.exports = function hasValue(o, noZero) { -var isObject = __webpack_require__(544); -var hasValues = __webpack_require__(585); -var get = __webpack_require__(577); +var isObject = __webpack_require__(557); +var hasValues = __webpack_require__(598); +var get = __webpack_require__(590); module.exports = function(val, prop) { return hasValues(isObject(val) && prop ? get(val, prop) : val); @@ -67928,7 +70701,7 @@ module.exports = function(val, prop) { /***/ }), -/* 585 */ +/* 598 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67941,8 +70714,8 @@ module.exports = function(val, prop) { -var typeOf = __webpack_require__(586); -var isNumber = __webpack_require__(548); +var typeOf = __webpack_require__(599); +var isNumber = __webpack_require__(561); module.exports = function hasValue(val) { // is-number checks for NaN and other edge cases @@ -67995,10 +70768,10 @@ module.exports = function hasValue(val) { /***/ }), -/* 586 */ +/* 599 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -68120,14 +70893,14 @@ module.exports = function kindOf(val) { /***/ }), -/* 587 */ +/* 600 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(588); -var forIn = __webpack_require__(589); +var isExtendable = __webpack_require__(601); +var forIn = __webpack_require__(602); function mixinDeep(target, objects) { var len = arguments.length, i = 0; @@ -68191,7 +70964,7 @@ module.exports = mixinDeep; /***/ }), -/* 588 */ +/* 601 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68204,7 +70977,7 @@ module.exports = mixinDeep; -var isPlainObject = __webpack_require__(543); +var isPlainObject = __webpack_require__(556); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -68212,7 +70985,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 589 */ +/* 602 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68235,7 +71008,7 @@ module.exports = function forIn(obj, fn, thisArg) { /***/ }), -/* 590 */ +/* 603 */ /***/ (function(module, exports) { /*! @@ -68262,14 +71035,14 @@ module.exports = pascalcase; /***/ }), -/* 591 */ +/* 604 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(111); -var utils = __webpack_require__(592); +var utils = __webpack_require__(605); /** * Expose class utils @@ -68634,7 +71407,7 @@ cu.bubble = function(Parent, events) { /***/ }), -/* 592 */ +/* 605 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68648,10 +71421,10 @@ var utils = {}; * Lazily required module dependencies */ -utils.union = __webpack_require__(576); -utils.define = __webpack_require__(593); -utils.isObj = __webpack_require__(544); -utils.staticExtend = __webpack_require__(600); +utils.union = __webpack_require__(589); +utils.define = __webpack_require__(606); +utils.isObj = __webpack_require__(557); +utils.staticExtend = __webpack_require__(613); /** @@ -68662,7 +71435,7 @@ module.exports = utils; /***/ }), -/* 593 */ +/* 606 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68675,7 +71448,7 @@ module.exports = utils; -var isDescriptor = __webpack_require__(594); +var isDescriptor = __webpack_require__(607); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -68700,7 +71473,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 594 */ +/* 607 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68713,9 +71486,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(595); -var isAccessor = __webpack_require__(596); -var isData = __webpack_require__(598); +var typeOf = __webpack_require__(608); +var isAccessor = __webpack_require__(609); +var isData = __webpack_require__(611); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -68729,7 +71502,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 595 */ +/* 608 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -68882,7 +71655,7 @@ function isBuffer(val) { /***/ }), -/* 596 */ +/* 609 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68895,7 +71668,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(597); +var typeOf = __webpack_require__(610); // accessor descriptor properties var accessor = { @@ -68958,10 +71731,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 597 */ +/* 610 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -69080,7 +71853,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 598 */ +/* 611 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69093,7 +71866,7 @@ module.exports = function kindOf(val) { -var typeOf = __webpack_require__(599); +var typeOf = __webpack_require__(612); // data descriptor properties var data = { @@ -69142,10 +71915,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 599 */ +/* 612 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -69264,7 +72037,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 600 */ +/* 613 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69277,8 +72050,8 @@ module.exports = function kindOf(val) { -var copy = __webpack_require__(601); -var define = __webpack_require__(593); +var copy = __webpack_require__(614); +var define = __webpack_require__(606); var util = __webpack_require__(111); /** @@ -69361,15 +72134,15 @@ module.exports = extend; /***/ }), -/* 601 */ +/* 614 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(549); -var copyDescriptor = __webpack_require__(602); -var define = __webpack_require__(593); +var typeOf = __webpack_require__(562); +var copyDescriptor = __webpack_require__(615); +var define = __webpack_require__(606); /** * Copy static properties, prototype properties, and descriptors from one object to another. @@ -69542,7 +72315,7 @@ module.exports.has = has; /***/ }), -/* 602 */ +/* 615 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69630,16 +72403,16 @@ function isObject(val) { /***/ }), -/* 603 */ +/* 616 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(604); -var define = __webpack_require__(593); -var debug = __webpack_require__(606)('snapdragon:compiler'); -var utils = __webpack_require__(612); +var use = __webpack_require__(617); +var define = __webpack_require__(606); +var debug = __webpack_require__(619)('snapdragon:compiler'); +var utils = __webpack_require__(625); /** * Create a new `Compiler` with the given `options`. @@ -69793,7 +72566,7 @@ Compiler.prototype = { // source map support if (opts.sourcemap) { - var sourcemaps = __webpack_require__(631); + var sourcemaps = __webpack_require__(644); sourcemaps(this); this.mapVisit(this.ast.nodes); this.applySourceMaps(); @@ -69814,7 +72587,7 @@ module.exports = Compiler; /***/ }), -/* 604 */ +/* 617 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69827,7 +72600,7 @@ module.exports = Compiler; -var utils = __webpack_require__(605); +var utils = __webpack_require__(618); module.exports = function base(app, opts) { if (!utils.isObject(app) && typeof app !== 'function') { @@ -69942,7 +72715,7 @@ module.exports = function base(app, opts) { /***/ }), -/* 605 */ +/* 618 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69956,8 +72729,8 @@ var utils = {}; * Lazily required module dependencies */ -utils.define = __webpack_require__(593); -utils.isObject = __webpack_require__(544); +utils.define = __webpack_require__(606); +utils.isObject = __webpack_require__(557); utils.isString = function(val) { @@ -69972,7 +72745,7 @@ module.exports = utils; /***/ }), -/* 606 */ +/* 619 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -69981,14 +72754,14 @@ module.exports = utils; */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(607); + module.exports = __webpack_require__(620); } else { - module.exports = __webpack_require__(610); + module.exports = __webpack_require__(623); } /***/ }), -/* 607 */ +/* 620 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -69997,7 +72770,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(608); +exports = module.exports = __webpack_require__(621); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -70179,7 +72952,7 @@ function localstorage() { /***/ }), -/* 608 */ +/* 621 */ /***/ (function(module, exports, __webpack_require__) { @@ -70195,7 +72968,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(609); +exports.humanize = __webpack_require__(622); /** * The currently active debug mode names, and names to skip. @@ -70387,7 +73160,7 @@ function coerce(val) { /***/ }), -/* 609 */ +/* 622 */ /***/ (function(module, exports) { /** @@ -70545,14 +73318,14 @@ function plural(ms, n, name) { /***/ }), -/* 610 */ +/* 623 */ /***/ (function(module, exports, __webpack_require__) { /** * Module dependencies. */ -var tty = __webpack_require__(278); +var tty = __webpack_require__(121); var util = __webpack_require__(111); /** @@ -70561,7 +73334,7 @@ var util = __webpack_require__(111); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(608); +exports = module.exports = __webpack_require__(621); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -70733,14 +73506,14 @@ function createWritableStdioStream (fd) { break; case 'FILE': - var fs = __webpack_require__(132); + var fs = __webpack_require__(133); stream = new fs.SyncWriteStream(fd, { autoClose: false }); stream._type = 'fs'; break; case 'PIPE': case 'TCP': - var net = __webpack_require__(611); + var net = __webpack_require__(624); stream = new net.Socket({ fd: fd, readable: false, @@ -70799,13 +73572,13 @@ exports.enable(load()); /***/ }), -/* 611 */ +/* 624 */ /***/ (function(module, exports) { module.exports = require("net"); /***/ }), -/* 612 */ +/* 625 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70815,9 +73588,9 @@ module.exports = require("net"); * Module dependencies */ -exports.extend = __webpack_require__(535); -exports.SourceMap = __webpack_require__(613); -exports.sourceMapResolve = __webpack_require__(624); +exports.extend = __webpack_require__(548); +exports.SourceMap = __webpack_require__(626); +exports.sourceMapResolve = __webpack_require__(637); /** * Convert backslash in the given string to forward slashes @@ -70860,7 +73633,7 @@ exports.last = function(arr, n) { /***/ }), -/* 613 */ +/* 626 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -70868,13 +73641,13 @@ exports.last = function(arr, n) { * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ -exports.SourceMapGenerator = __webpack_require__(614).SourceMapGenerator; -exports.SourceMapConsumer = __webpack_require__(620).SourceMapConsumer; -exports.SourceNode = __webpack_require__(623).SourceNode; +exports.SourceMapGenerator = __webpack_require__(627).SourceMapGenerator; +exports.SourceMapConsumer = __webpack_require__(633).SourceMapConsumer; +exports.SourceNode = __webpack_require__(636).SourceNode; /***/ }), -/* 614 */ +/* 627 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -70884,10 +73657,10 @@ exports.SourceNode = __webpack_require__(623).SourceNode; * http://opensource.org/licenses/BSD-3-Clause */ -var base64VLQ = __webpack_require__(615); -var util = __webpack_require__(617); -var ArraySet = __webpack_require__(618).ArraySet; -var MappingList = __webpack_require__(619).MappingList; +var base64VLQ = __webpack_require__(628); +var util = __webpack_require__(630); +var ArraySet = __webpack_require__(631).ArraySet; +var MappingList = __webpack_require__(632).MappingList; /** * An instance of the SourceMapGenerator represents a source map which is @@ -71296,7 +74069,7 @@ exports.SourceMapGenerator = SourceMapGenerator; /***/ }), -/* 615 */ +/* 628 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -71336,7 +74109,7 @@ exports.SourceMapGenerator = SourceMapGenerator; * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var base64 = __webpack_require__(616); +var base64 = __webpack_require__(629); // A single base 64 digit can contain 6 bits of data. For the base 64 variable // length quantities we use in the source map spec, the first bit is the sign, @@ -71442,7 +74215,7 @@ exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { /***/ }), -/* 616 */ +/* 629 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -71515,7 +74288,7 @@ exports.decode = function (charCode) { /***/ }), -/* 617 */ +/* 630 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -71938,7 +74711,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate /***/ }), -/* 618 */ +/* 631 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -71948,7 +74721,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(617); +var util = __webpack_require__(630); var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; @@ -72065,7 +74838,7 @@ exports.ArraySet = ArraySet; /***/ }), -/* 619 */ +/* 632 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -72075,7 +74848,7 @@ exports.ArraySet = ArraySet; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(617); +var util = __webpack_require__(630); /** * Determine whether mappingB is after mappingA with respect to generated @@ -72150,7 +74923,7 @@ exports.MappingList = MappingList; /***/ }), -/* 620 */ +/* 633 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -72160,11 +74933,11 @@ exports.MappingList = MappingList; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(617); -var binarySearch = __webpack_require__(621); -var ArraySet = __webpack_require__(618).ArraySet; -var base64VLQ = __webpack_require__(615); -var quickSort = __webpack_require__(622).quickSort; +var util = __webpack_require__(630); +var binarySearch = __webpack_require__(634); +var ArraySet = __webpack_require__(631).ArraySet; +var base64VLQ = __webpack_require__(628); +var quickSort = __webpack_require__(635).quickSort; function SourceMapConsumer(aSourceMap) { var sourceMap = aSourceMap; @@ -73238,7 +76011,7 @@ exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; /***/ }), -/* 621 */ +/* 634 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -73355,7 +76128,7 @@ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { /***/ }), -/* 622 */ +/* 635 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -73475,7 +76248,7 @@ exports.quickSort = function (ary, comparator) { /***/ }), -/* 623 */ +/* 636 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -73485,8 +76258,8 @@ exports.quickSort = function (ary, comparator) { * http://opensource.org/licenses/BSD-3-Clause */ -var SourceMapGenerator = __webpack_require__(614).SourceMapGenerator; -var util = __webpack_require__(617); +var SourceMapGenerator = __webpack_require__(627).SourceMapGenerator; +var util = __webpack_require__(630); // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other // operating systems these days (capturing the result). @@ -73894,17 +76667,17 @@ exports.SourceNode = SourceNode; /***/ }), -/* 624 */ +/* 637 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014, 2015, 2016, 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var sourceMappingURL = __webpack_require__(625) -var resolveUrl = __webpack_require__(626) -var decodeUriComponent = __webpack_require__(627) -var urix = __webpack_require__(629) -var atob = __webpack_require__(630) +var sourceMappingURL = __webpack_require__(638) +var resolveUrl = __webpack_require__(639) +var decodeUriComponent = __webpack_require__(640) +var urix = __webpack_require__(642) +var atob = __webpack_require__(643) @@ -74202,7 +76975,7 @@ module.exports = { /***/ }), -/* 625 */ +/* 638 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright 2014 Simon Lydell @@ -74265,13 +77038,13 @@ void (function(root, factory) { /***/ }), -/* 626 */ +/* 639 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var url = __webpack_require__(189) +var url = __webpack_require__(196) function resolveUrl(/* ...urls */) { return Array.prototype.reduce.call(arguments, function(resolved, nextUrl) { @@ -74283,13 +77056,13 @@ module.exports = resolveUrl /***/ }), -/* 627 */ +/* 640 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var decodeUriComponent = __webpack_require__(628) +var decodeUriComponent = __webpack_require__(641) function customDecodeUriComponent(string) { // `decodeUriComponent` turns `+` into ` `, but that's not wanted. @@ -74300,7 +77073,7 @@ module.exports = customDecodeUriComponent /***/ }), -/* 628 */ +/* 641 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74401,7 +77174,7 @@ module.exports = function (encodedURI) { /***/ }), -/* 629 */ +/* 642 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell @@ -74424,7 +77197,7 @@ module.exports = urix /***/ }), -/* 630 */ +/* 643 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74438,16 +77211,16 @@ module.exports = atob.atob = atob; /***/ }), -/* 631 */ +/* 644 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var fs = __webpack_require__(132); +var fs = __webpack_require__(133); var path = __webpack_require__(4); -var define = __webpack_require__(593); -var utils = __webpack_require__(612); +var define = __webpack_require__(606); +var utils = __webpack_require__(625); /** * Expose `mixin()`. @@ -74590,19 +77363,19 @@ exports.comment = function(node) { /***/ }), -/* 632 */ +/* 645 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(604); +var use = __webpack_require__(617); var util = __webpack_require__(111); -var Cache = __webpack_require__(633); -var define = __webpack_require__(593); -var debug = __webpack_require__(606)('snapdragon:parser'); -var Position = __webpack_require__(634); -var utils = __webpack_require__(612); +var Cache = __webpack_require__(646); +var define = __webpack_require__(606); +var debug = __webpack_require__(619)('snapdragon:parser'); +var Position = __webpack_require__(647); +var utils = __webpack_require__(625); /** * Create a new `Parser` with the given `input` and `options`. @@ -75130,7 +77903,7 @@ module.exports = Parser; /***/ }), -/* 633 */ +/* 646 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -75237,13 +78010,13 @@ MapCache.prototype.del = function mapDelete(key) { /***/ }), -/* 634 */ +/* 647 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(593); +var define = __webpack_require__(606); /** * Store position for a node @@ -75258,16 +78031,16 @@ module.exports = function Position(start, parser) { /***/ }), -/* 635 */ +/* 648 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var safe = __webpack_require__(636); -var define = __webpack_require__(642); -var extend = __webpack_require__(643); -var not = __webpack_require__(645); +var safe = __webpack_require__(649); +var define = __webpack_require__(655); +var extend = __webpack_require__(656); +var not = __webpack_require__(658); var MAX_LENGTH = 1024 * 64; /** @@ -75420,10 +78193,10 @@ module.exports.makeRe = makeRe; /***/ }), -/* 636 */ +/* 649 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(637); +var parse = __webpack_require__(650); var types = parse.types; module.exports = function (re, opts) { @@ -75469,13 +78242,13 @@ function isRegExp (x) { /***/ }), -/* 637 */ +/* 650 */ /***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(638); -var types = __webpack_require__(639); -var sets = __webpack_require__(640); -var positions = __webpack_require__(641); +var util = __webpack_require__(651); +var types = __webpack_require__(652); +var sets = __webpack_require__(653); +var positions = __webpack_require__(654); module.exports = function(regexpStr) { @@ -75757,11 +78530,11 @@ module.exports.types = types; /***/ }), -/* 638 */ +/* 651 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(639); -var sets = __webpack_require__(640); +var types = __webpack_require__(652); +var sets = __webpack_require__(653); // All of these are private and only used by randexp. @@ -75874,7 +78647,7 @@ exports.error = function(regexp, msg) { /***/ }), -/* 639 */ +/* 652 */ /***/ (function(module, exports) { module.exports = { @@ -75890,10 +78663,10 @@ module.exports = { /***/ }), -/* 640 */ +/* 653 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(639); +var types = __webpack_require__(652); var INTS = function() { return [{ type: types.RANGE , from: 48, to: 57 }]; @@ -75978,10 +78751,10 @@ exports.anyChar = function() { /***/ }), -/* 641 */ +/* 654 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(639); +var types = __webpack_require__(652); exports.wordBoundary = function() { return { type: types.POSITION, value: 'b' }; @@ -76001,7 +78774,7 @@ exports.end = function() { /***/ }), -/* 642 */ +/* 655 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -76014,8 +78787,8 @@ exports.end = function() { -var isobject = __webpack_require__(544); -var isDescriptor = __webpack_require__(558); +var isobject = __webpack_require__(557); +var isDescriptor = __webpack_require__(571); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -76046,14 +78819,14 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 643 */ +/* 656 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(644); -var assignSymbols = __webpack_require__(545); +var isExtendable = __webpack_require__(657); +var assignSymbols = __webpack_require__(558); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -76113,7 +78886,7 @@ function isEnum(obj, key) { /***/ }), -/* 644 */ +/* 657 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -76126,7 +78899,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(543); +var isPlainObject = __webpack_require__(556); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -76134,14 +78907,14 @@ module.exports = function isExtendable(val) { /***/ }), -/* 645 */ +/* 658 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(643); -var safe = __webpack_require__(636); +var extend = __webpack_require__(656); +var safe = __webpack_require__(649); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -76213,14 +78986,14 @@ module.exports = toRegex; /***/ }), -/* 646 */ +/* 659 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var nanomatch = __webpack_require__(647); -var extglob = __webpack_require__(663); +var nanomatch = __webpack_require__(660); +var extglob = __webpack_require__(676); module.exports = function(snapdragon) { var compilers = snapdragon.compiler.compilers; @@ -76297,7 +79070,7 @@ function escapeExtglobs(compiler) { /***/ }), -/* 647 */ +/* 660 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -76308,17 +79081,17 @@ function escapeExtglobs(compiler) { */ var util = __webpack_require__(111); -var toRegex = __webpack_require__(648); -var extend = __webpack_require__(649); +var toRegex = __webpack_require__(661); +var extend = __webpack_require__(662); /** * Local dependencies */ -var compilers = __webpack_require__(651); -var parsers = __webpack_require__(652); -var cache = __webpack_require__(655); -var utils = __webpack_require__(657); +var compilers = __webpack_require__(664); +var parsers = __webpack_require__(665); +var cache = __webpack_require__(668); +var utils = __webpack_require__(670); var MAX_LENGTH = 1024 * 64; /** @@ -77142,15 +79915,15 @@ module.exports = nanomatch; /***/ }), -/* 648 */ +/* 661 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(593); -var extend = __webpack_require__(535); -var not = __webpack_require__(534); +var define = __webpack_require__(606); +var extend = __webpack_require__(548); +var not = __webpack_require__(547); var MAX_LENGTH = 1024 * 64; /** @@ -77297,14 +80070,14 @@ module.exports.makeRe = makeRe; /***/ }), -/* 649 */ +/* 662 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(650); -var assignSymbols = __webpack_require__(545); +var isExtendable = __webpack_require__(663); +var assignSymbols = __webpack_require__(558); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -77364,7 +80137,7 @@ function isEnum(obj, key) { /***/ }), -/* 650 */ +/* 663 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77377,7 +80150,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(543); +var isPlainObject = __webpack_require__(556); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -77385,7 +80158,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 651 */ +/* 664 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77731,15 +80504,15 @@ module.exports = function(nanomatch, options) { /***/ }), -/* 652 */ +/* 665 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regexNot = __webpack_require__(534); -var toRegex = __webpack_require__(648); -var isOdd = __webpack_require__(653); +var regexNot = __webpack_require__(547); +var toRegex = __webpack_require__(661); +var isOdd = __webpack_require__(666); /** * Characters to use in negation regex (we want to "not" match @@ -78125,7 +80898,7 @@ module.exports.not = NOT_REGEX; /***/ }), -/* 653 */ +/* 666 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78138,7 +80911,7 @@ module.exports.not = NOT_REGEX; -var isNumber = __webpack_require__(654); +var isNumber = __webpack_require__(667); module.exports = function isOdd(i) { if (!isNumber(i)) { @@ -78152,7 +80925,7 @@ module.exports = function isOdd(i) { /***/ }), -/* 654 */ +/* 667 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78180,14 +80953,14 @@ module.exports = function isNumber(num) { /***/ }), -/* 655 */ +/* 668 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(656))(); +module.exports = new (__webpack_require__(669))(); /***/ }), -/* 656 */ +/* 669 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78200,7 +80973,7 @@ module.exports = new (__webpack_require__(656))(); -var MapCache = __webpack_require__(633); +var MapCache = __webpack_require__(646); /** * Create a new `FragmentCache` with an optional object to use for `caches`. @@ -78322,7 +81095,7 @@ exports = module.exports = FragmentCache; /***/ }), -/* 657 */ +/* 670 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78335,14 +81108,14 @@ var path = __webpack_require__(4); * Module dependencies */ -var isWindows = __webpack_require__(658)(); -var Snapdragon = __webpack_require__(566); -utils.define = __webpack_require__(659); -utils.diff = __webpack_require__(660); -utils.extend = __webpack_require__(649); -utils.pick = __webpack_require__(661); -utils.typeOf = __webpack_require__(662); -utils.unique = __webpack_require__(537); +var isWindows = __webpack_require__(671)(); +var Snapdragon = __webpack_require__(579); +utils.define = __webpack_require__(672); +utils.diff = __webpack_require__(673); +utils.extend = __webpack_require__(662); +utils.pick = __webpack_require__(674); +utils.typeOf = __webpack_require__(675); +utils.unique = __webpack_require__(550); /** * Returns true if the given value is effectively an empty string @@ -78708,7 +81481,7 @@ utils.unixify = function(options) { /***/ }), -/* 658 */ +/* 671 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -78736,7 +81509,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ /***/ }), -/* 659 */ +/* 672 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78749,8 +81522,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ -var isobject = __webpack_require__(544); -var isDescriptor = __webpack_require__(558); +var isobject = __webpack_require__(557); +var isDescriptor = __webpack_require__(571); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -78781,7 +81554,7 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 660 */ +/* 673 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78835,7 +81608,7 @@ function diffArray(one, two) { /***/ }), -/* 661 */ +/* 674 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78848,7 +81621,7 @@ function diffArray(one, two) { -var isObject = __webpack_require__(544); +var isObject = __webpack_require__(557); module.exports = function pick(obj, keys) { if (!isObject(obj) && typeof obj !== 'function') { @@ -78877,7 +81650,7 @@ module.exports = function pick(obj, keys) { /***/ }), -/* 662 */ +/* 675 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -79012,7 +81785,7 @@ function isBuffer(val) { /***/ }), -/* 663 */ +/* 676 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79022,18 +81795,18 @@ function isBuffer(val) { * Module dependencies */ -var extend = __webpack_require__(535); -var unique = __webpack_require__(537); -var toRegex = __webpack_require__(648); +var extend = __webpack_require__(548); +var unique = __webpack_require__(550); +var toRegex = __webpack_require__(661); /** * Local dependencies */ -var compilers = __webpack_require__(664); -var parsers = __webpack_require__(675); -var Extglob = __webpack_require__(678); -var utils = __webpack_require__(677); +var compilers = __webpack_require__(677); +var parsers = __webpack_require__(688); +var Extglob = __webpack_require__(691); +var utils = __webpack_require__(690); var MAX_LENGTH = 1024 * 64; /** @@ -79350,13 +82123,13 @@ module.exports = extglob; /***/ }), -/* 664 */ +/* 677 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(665); +var brackets = __webpack_require__(678); /** * Extglob compilers @@ -79526,7 +82299,7 @@ module.exports = function(extglob) { /***/ }), -/* 665 */ +/* 678 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79536,17 +82309,17 @@ module.exports = function(extglob) { * Local dependencies */ -var compilers = __webpack_require__(666); -var parsers = __webpack_require__(668); +var compilers = __webpack_require__(679); +var parsers = __webpack_require__(681); /** * Module dependencies */ -var debug = __webpack_require__(670)('expand-brackets'); -var extend = __webpack_require__(535); -var Snapdragon = __webpack_require__(566); -var toRegex = __webpack_require__(648); +var debug = __webpack_require__(683)('expand-brackets'); +var extend = __webpack_require__(548); +var Snapdragon = __webpack_require__(579); +var toRegex = __webpack_require__(661); /** * Parses the given POSIX character class `pattern` and returns a @@ -79744,13 +82517,13 @@ module.exports = brackets; /***/ }), -/* 666 */ +/* 679 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var posix = __webpack_require__(667); +var posix = __webpack_require__(680); module.exports = function(brackets) { brackets.compiler @@ -79838,7 +82611,7 @@ module.exports = function(brackets) { /***/ }), -/* 667 */ +/* 680 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79867,14 +82640,14 @@ module.exports = { /***/ }), -/* 668 */ +/* 681 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(669); -var define = __webpack_require__(593); +var utils = __webpack_require__(682); +var define = __webpack_require__(606); /** * Text regex @@ -80093,14 +82866,14 @@ module.exports.TEXT_REGEX = TEXT_REGEX; /***/ }), -/* 669 */ +/* 682 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var toRegex = __webpack_require__(648); -var regexNot = __webpack_require__(534); +var toRegex = __webpack_require__(661); +var regexNot = __webpack_require__(547); var cached; /** @@ -80134,7 +82907,7 @@ exports.createRegex = function(pattern, include) { /***/ }), -/* 670 */ +/* 683 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -80143,14 +82916,14 @@ exports.createRegex = function(pattern, include) { */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(671); + module.exports = __webpack_require__(684); } else { - module.exports = __webpack_require__(674); + module.exports = __webpack_require__(687); } /***/ }), -/* 671 */ +/* 684 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -80159,7 +82932,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(672); +exports = module.exports = __webpack_require__(685); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -80341,7 +83114,7 @@ function localstorage() { /***/ }), -/* 672 */ +/* 685 */ /***/ (function(module, exports, __webpack_require__) { @@ -80357,7 +83130,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(673); +exports.humanize = __webpack_require__(686); /** * The currently active debug mode names, and names to skip. @@ -80549,7 +83322,7 @@ function coerce(val) { /***/ }), -/* 673 */ +/* 686 */ /***/ (function(module, exports) { /** @@ -80707,14 +83480,14 @@ function plural(ms, n, name) { /***/ }), -/* 674 */ +/* 687 */ /***/ (function(module, exports, __webpack_require__) { /** * Module dependencies. */ -var tty = __webpack_require__(278); +var tty = __webpack_require__(121); var util = __webpack_require__(111); /** @@ -80723,7 +83496,7 @@ var util = __webpack_require__(111); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(672); +exports = module.exports = __webpack_require__(685); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -80895,14 +83668,14 @@ function createWritableStdioStream (fd) { break; case 'FILE': - var fs = __webpack_require__(132); + var fs = __webpack_require__(133); stream = new fs.SyncWriteStream(fd, { autoClose: false }); stream._type = 'fs'; break; case 'PIPE': case 'TCP': - var net = __webpack_require__(611); + var net = __webpack_require__(624); stream = new net.Socket({ fd: fd, readable: false, @@ -80961,15 +83734,15 @@ exports.enable(load()); /***/ }), -/* 675 */ +/* 688 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(665); -var define = __webpack_require__(676); -var utils = __webpack_require__(677); +var brackets = __webpack_require__(678); +var define = __webpack_require__(689); +var utils = __webpack_require__(690); /** * Characters to use in text regex (we want to "not" match @@ -81124,7 +83897,7 @@ module.exports = parsers; /***/ }), -/* 676 */ +/* 689 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81137,7 +83910,7 @@ module.exports = parsers; -var isDescriptor = __webpack_require__(558); +var isDescriptor = __webpack_require__(571); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -81162,14 +83935,14 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 677 */ +/* 690 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regex = __webpack_require__(534); -var Cache = __webpack_require__(656); +var regex = __webpack_require__(547); +var Cache = __webpack_require__(669); /** * Utils @@ -81238,7 +84011,7 @@ utils.createRegex = function(str) { /***/ }), -/* 678 */ +/* 691 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81248,16 +84021,16 @@ utils.createRegex = function(str) { * Module dependencies */ -var Snapdragon = __webpack_require__(566); -var define = __webpack_require__(676); -var extend = __webpack_require__(535); +var Snapdragon = __webpack_require__(579); +var define = __webpack_require__(689); +var extend = __webpack_require__(548); /** * Local dependencies */ -var compilers = __webpack_require__(664); -var parsers = __webpack_require__(675); +var compilers = __webpack_require__(677); +var parsers = __webpack_require__(688); /** * Customize Snapdragon parser and renderer @@ -81323,16 +84096,16 @@ module.exports = Extglob; /***/ }), -/* 679 */ +/* 692 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extglob = __webpack_require__(663); -var nanomatch = __webpack_require__(647); -var regexNot = __webpack_require__(534); -var toRegex = __webpack_require__(635); +var extglob = __webpack_require__(676); +var nanomatch = __webpack_require__(660); +var regexNot = __webpack_require__(547); +var toRegex = __webpack_require__(648); var not; /** @@ -81413,14 +84186,14 @@ function textRegex(pattern) { /***/ }), -/* 680 */ +/* 693 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(656))(); +module.exports = new (__webpack_require__(669))(); /***/ }), -/* 681 */ +/* 694 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81433,13 +84206,13 @@ var path = __webpack_require__(4); * Module dependencies */ -var Snapdragon = __webpack_require__(566); -utils.define = __webpack_require__(642); -utils.diff = __webpack_require__(660); -utils.extend = __webpack_require__(643); -utils.pick = __webpack_require__(661); -utils.typeOf = __webpack_require__(682); -utils.unique = __webpack_require__(537); +var Snapdragon = __webpack_require__(579); +utils.define = __webpack_require__(655); +utils.diff = __webpack_require__(673); +utils.extend = __webpack_require__(656); +utils.pick = __webpack_require__(674); +utils.typeOf = __webpack_require__(695); +utils.unique = __webpack_require__(550); /** * Returns true if the platform is windows, or `path.sep` is `\\`. @@ -81736,7 +84509,7 @@ utils.unixify = function(options) { /***/ }), -/* 682 */ +/* 695 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -81871,7 +84644,7 @@ function isBuffer(val) { /***/ }), -/* 683 */ +/* 696 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81890,9 +84663,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(684); -var reader_1 = __webpack_require__(697); -var fs_stream_1 = __webpack_require__(701); +var readdir = __webpack_require__(697); +var reader_1 = __webpack_require__(710); +var fs_stream_1 = __webpack_require__(714); var ReaderAsync = /** @class */ (function (_super) { __extends(ReaderAsync, _super); function ReaderAsync() { @@ -81953,15 +84726,15 @@ exports.default = ReaderAsync; /***/ }), -/* 684 */ +/* 697 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const readdirSync = __webpack_require__(685); -const readdirAsync = __webpack_require__(693); -const readdirStream = __webpack_require__(696); +const readdirSync = __webpack_require__(698); +const readdirAsync = __webpack_require__(706); +const readdirStream = __webpack_require__(709); module.exports = exports = readdirAsyncPath; exports.readdir = exports.readdirAsync = exports.async = readdirAsyncPath; @@ -82045,7 +84818,7 @@ function readdirStreamStat (dir, options) { /***/ }), -/* 685 */ +/* 698 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82053,11 +84826,11 @@ function readdirStreamStat (dir, options) { module.exports = readdirSync; -const DirectoryReader = __webpack_require__(686); +const DirectoryReader = __webpack_require__(699); let syncFacade = { - fs: __webpack_require__(691), - forEach: __webpack_require__(692), + fs: __webpack_require__(704), + forEach: __webpack_require__(705), sync: true }; @@ -82086,18 +84859,18 @@ function readdirSync (dir, options, internalOptions) { /***/ }), -/* 686 */ +/* 699 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const Readable = __webpack_require__(136).Readable; -const EventEmitter = __webpack_require__(154).EventEmitter; +const Readable = __webpack_require__(137).Readable; +const EventEmitter = __webpack_require__(155).EventEmitter; const path = __webpack_require__(4); -const normalizeOptions = __webpack_require__(687); -const stat = __webpack_require__(689); -const call = __webpack_require__(690); +const normalizeOptions = __webpack_require__(700); +const stat = __webpack_require__(702); +const call = __webpack_require__(703); /** * Asynchronously reads the contents of a directory and streams the results @@ -82473,14 +85246,14 @@ module.exports = DirectoryReader; /***/ }), -/* 687 */ +/* 700 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const globToRegExp = __webpack_require__(688); +const globToRegExp = __webpack_require__(701); module.exports = normalizeOptions; @@ -82657,7 +85430,7 @@ function normalizeOptions (options, internalOptions) { /***/ }), -/* 688 */ +/* 701 */ /***/ (function(module, exports) { module.exports = function (glob, opts) { @@ -82794,13 +85567,13 @@ module.exports = function (glob, opts) { /***/ }), -/* 689 */ +/* 702 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const call = __webpack_require__(690); +const call = __webpack_require__(703); module.exports = stat; @@ -82875,7 +85648,7 @@ function symlinkStat (fs, path, lstats, callback) { /***/ }), -/* 690 */ +/* 703 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82936,14 +85709,14 @@ function callOnce (fn) { /***/ }), -/* 691 */ +/* 704 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); -const call = __webpack_require__(690); +const fs = __webpack_require__(133); +const call = __webpack_require__(703); /** * A facade around {@link fs.readdirSync} that allows it to be called @@ -83007,7 +85780,7 @@ exports.lstat = function (path, callback) { /***/ }), -/* 692 */ +/* 705 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83036,7 +85809,7 @@ function syncForEach (array, iterator, done) { /***/ }), -/* 693 */ +/* 706 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83044,12 +85817,12 @@ function syncForEach (array, iterator, done) { module.exports = readdirAsync; -const maybe = __webpack_require__(694); -const DirectoryReader = __webpack_require__(686); +const maybe = __webpack_require__(707); +const DirectoryReader = __webpack_require__(699); let asyncFacade = { - fs: __webpack_require__(132), - forEach: __webpack_require__(695), + fs: __webpack_require__(133), + forEach: __webpack_require__(708), async: true }; @@ -83091,7 +85864,7 @@ function readdirAsync (dir, options, callback, internalOptions) { /***/ }), -/* 694 */ +/* 707 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83118,7 +85891,7 @@ module.exports = function maybe (cb, promise) { /***/ }), -/* 695 */ +/* 708 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83154,7 +85927,7 @@ function asyncForEach (array, iterator, done) { /***/ }), -/* 696 */ +/* 709 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83162,11 +85935,11 @@ function asyncForEach (array, iterator, done) { module.exports = readdirStream; -const DirectoryReader = __webpack_require__(686); +const DirectoryReader = __webpack_require__(699); let streamFacade = { - fs: __webpack_require__(132), - forEach: __webpack_require__(695), + fs: __webpack_require__(133), + forEach: __webpack_require__(708), async: true }; @@ -83186,16 +85959,16 @@ function readdirStream (dir, options, internalOptions) { /***/ }), -/* 697 */ +/* 710 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var path = __webpack_require__(4); -var deep_1 = __webpack_require__(698); -var entry_1 = __webpack_require__(700); -var pathUtil = __webpack_require__(699); +var deep_1 = __webpack_require__(711); +var entry_1 = __webpack_require__(713); +var pathUtil = __webpack_require__(712); var Reader = /** @class */ (function () { function Reader(options) { this.options = options; @@ -83261,14 +86034,14 @@ exports.default = Reader; /***/ }), -/* 698 */ +/* 711 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(699); -var patternUtils = __webpack_require__(516); +var pathUtils = __webpack_require__(712); +var patternUtils = __webpack_require__(529); var DeepFilter = /** @class */ (function () { function DeepFilter(options, micromatchOptions) { this.options = options; @@ -83351,7 +86124,7 @@ exports.default = DeepFilter; /***/ }), -/* 699 */ +/* 712 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83382,14 +86155,14 @@ exports.makeAbsolute = makeAbsolute; /***/ }), -/* 700 */ +/* 713 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(699); -var patternUtils = __webpack_require__(516); +var pathUtils = __webpack_require__(712); +var patternUtils = __webpack_require__(529); var EntryFilter = /** @class */ (function () { function EntryFilter(options, micromatchOptions) { this.options = options; @@ -83474,7 +86247,7 @@ exports.default = EntryFilter; /***/ }), -/* 701 */ +/* 714 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83493,9 +86266,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var stream = __webpack_require__(136); -var fsStat = __webpack_require__(702); -var fs_1 = __webpack_require__(706); +var stream = __webpack_require__(137); +var fsStat = __webpack_require__(715); +var fs_1 = __webpack_require__(719); var FileSystemStream = /** @class */ (function (_super) { __extends(FileSystemStream, _super); function FileSystemStream() { @@ -83545,14 +86318,14 @@ exports.default = FileSystemStream; /***/ }), -/* 702 */ +/* 715 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const optionsManager = __webpack_require__(703); -const statProvider = __webpack_require__(705); +const optionsManager = __webpack_require__(716); +const statProvider = __webpack_require__(718); /** * Asynchronous API. */ @@ -83583,13 +86356,13 @@ exports.statSync = statSync; /***/ }), -/* 703 */ +/* 716 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsAdapter = __webpack_require__(704); +const fsAdapter = __webpack_require__(717); function prepare(opts) { const options = Object.assign({ fs: fsAdapter.getFileSystemAdapter(opts ? opts.fs : undefined), @@ -83602,13 +86375,13 @@ exports.prepare = prepare; /***/ }), -/* 704 */ +/* 717 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); exports.FILE_SYSTEM_ADAPTER = { lstat: fs.lstat, stat: fs.stat, @@ -83625,7 +86398,7 @@ exports.getFileSystemAdapter = getFileSystemAdapter; /***/ }), -/* 705 */ +/* 718 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83677,7 +86450,7 @@ exports.isFollowedSymlink = isFollowedSymlink; /***/ }), -/* 706 */ +/* 719 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83708,7 +86481,7 @@ exports.default = FileSystem; /***/ }), -/* 707 */ +/* 720 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83727,10 +86500,10 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var stream = __webpack_require__(136); -var readdir = __webpack_require__(684); -var reader_1 = __webpack_require__(697); -var fs_stream_1 = __webpack_require__(701); +var stream = __webpack_require__(137); +var readdir = __webpack_require__(697); +var reader_1 = __webpack_require__(710); +var fs_stream_1 = __webpack_require__(714); var TransformStream = /** @class */ (function (_super) { __extends(TransformStream, _super); function TransformStream(reader) { @@ -83798,7 +86571,7 @@ exports.default = ReaderStream; /***/ }), -/* 708 */ +/* 721 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83817,9 +86590,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(684); -var reader_1 = __webpack_require__(697); -var fs_sync_1 = __webpack_require__(709); +var readdir = __webpack_require__(697); +var reader_1 = __webpack_require__(710); +var fs_sync_1 = __webpack_require__(722); var ReaderSync = /** @class */ (function (_super) { __extends(ReaderSync, _super); function ReaderSync() { @@ -83879,7 +86652,7 @@ exports.default = ReaderSync; /***/ }), -/* 709 */ +/* 722 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83898,8 +86671,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var fsStat = __webpack_require__(702); -var fs_1 = __webpack_require__(706); +var fsStat = __webpack_require__(715); +var fs_1 = __webpack_require__(719); var FileSystemSync = /** @class */ (function (_super) { __extends(FileSystemSync, _super); function FileSystemSync() { @@ -83945,7 +86718,7 @@ exports.default = FileSystemSync; /***/ }), -/* 710 */ +/* 723 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83961,13 +86734,13 @@ exports.flatten = flatten; /***/ }), -/* 711 */ +/* 724 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var merge2 = __webpack_require__(284); +var merge2 = __webpack_require__(299); /** * Merge multiple streams and propagate their errors into one stream in parallel. */ @@ -83982,13 +86755,13 @@ exports.merge = merge; /***/ }), -/* 712 */ +/* 725 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const pathType = __webpack_require__(713); +const pathType = __webpack_require__(726); const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; @@ -84054,13 +86827,13 @@ module.exports.sync = (input, opts) => { /***/ }), -/* 713 */ +/* 726 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); -const pify = __webpack_require__(714); +const fs = __webpack_require__(133); +const pify = __webpack_require__(727); function type(fn, fn2, fp) { if (typeof fp !== 'string') { @@ -84103,7 +86876,7 @@ exports.symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 714 */ +/* 727 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84194,17 +86967,17 @@ module.exports = (obj, opts) => { /***/ }), -/* 715 */ +/* 728 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); const path = __webpack_require__(4); -const fastGlob = __webpack_require__(512); -const gitIgnore = __webpack_require__(716); -const pify = __webpack_require__(717); -const slash = __webpack_require__(718); +const fastGlob = __webpack_require__(525); +const gitIgnore = __webpack_require__(729); +const pify = __webpack_require__(730); +const slash = __webpack_require__(731); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -84302,7 +87075,7 @@ module.exports.sync = options => { /***/ }), -/* 716 */ +/* 729 */ /***/ (function(module, exports) { // A simple implementation of make-array @@ -84771,7 +87544,7 @@ module.exports = options => new IgnoreBase(options) /***/ }), -/* 717 */ +/* 730 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84846,7 +87619,7 @@ module.exports = (input, options) => { /***/ }), -/* 718 */ +/* 731 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84864,7 +87637,7 @@ module.exports = input => { /***/ }), -/* 719 */ +/* 732 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -84874,7 +87647,7 @@ module.exports = input => { * Released under the MIT License. */ -var isExtglob = __webpack_require__(300); +var isExtglob = __webpack_require__(315); var chars = { '{': '}', '(': ')', '[': ']'}; var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; @@ -84918,17 +87691,17 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 720 */ +/* 733 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const {constants: fsConstants} = __webpack_require__(132); -const pEvent = __webpack_require__(721); -const CpFileError = __webpack_require__(724); -const fs = __webpack_require__(728); -const ProgressEmitter = __webpack_require__(731); +const {constants: fsConstants} = __webpack_require__(133); +const pEvent = __webpack_require__(734); +const CpFileError = __webpack_require__(737); +const fs = __webpack_require__(741); +const ProgressEmitter = __webpack_require__(744); const cpFileAsync = async (source, destination, options, progressEmitter) => { let readError; @@ -85042,12 +87815,12 @@ module.exports.sync = (source, destination, options) => { /***/ }), -/* 721 */ +/* 734 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pTimeout = __webpack_require__(722); +const pTimeout = __webpack_require__(735); const symbolAsyncIterator = Symbol.asyncIterator || '@@asyncIterator'; @@ -85338,12 +88111,12 @@ module.exports.iterator = (emitter, event, options) => { /***/ }), -/* 722 */ +/* 735 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pFinally = __webpack_require__(723); +const pFinally = __webpack_require__(736); class TimeoutError extends Error { constructor(message) { @@ -85389,7 +88162,7 @@ module.exports.TimeoutError = TimeoutError; /***/ }), -/* 723 */ +/* 736 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85411,12 +88184,12 @@ module.exports = (promise, onFinally) => { /***/ }), -/* 724 */ +/* 737 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(725); +const NestedError = __webpack_require__(738); class CpFileError extends NestedError { constructor(message, nested) { @@ -85430,10 +88203,10 @@ module.exports = CpFileError; /***/ }), -/* 725 */ +/* 738 */ /***/ (function(module, exports, __webpack_require__) { -var inherits = __webpack_require__(726); +var inherits = __webpack_require__(739); var NestedError = function (message, nested) { this.nested = nested; @@ -85484,7 +88257,7 @@ module.exports = NestedError; /***/ }), -/* 726 */ +/* 739 */ /***/ (function(module, exports, __webpack_require__) { try { @@ -85492,12 +88265,12 @@ try { if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { - module.exports = __webpack_require__(727); + module.exports = __webpack_require__(740); } /***/ }), -/* 727 */ +/* 740 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -85526,16 +88299,16 @@ if (typeof Object.create === 'function') { /***/ }), -/* 728 */ +/* 741 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(111); -const fs = __webpack_require__(131); -const makeDir = __webpack_require__(729); -const pEvent = __webpack_require__(721); -const CpFileError = __webpack_require__(724); +const fs = __webpack_require__(132); +const makeDir = __webpack_require__(742); +const pEvent = __webpack_require__(734); +const CpFileError = __webpack_require__(737); const stat = promisify(fs.stat); const lstat = promisify(fs.lstat); @@ -85632,15 +88405,15 @@ exports.copyFileSync = (source, destination, flags) => { /***/ }), -/* 729 */ +/* 742 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); const path = __webpack_require__(4); const {promisify} = __webpack_require__(111); -const semver = __webpack_require__(730); +const semver = __webpack_require__(743); const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); @@ -85795,7 +88568,7 @@ module.exports.sync = (input, options) => { /***/ }), -/* 730 */ +/* 743 */ /***/ (function(module, exports) { exports = module.exports = SemVer @@ -87397,12 +90170,12 @@ function coerce (version, options) { /***/ }), -/* 731 */ +/* 744 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const EventEmitter = __webpack_require__(154); +const EventEmitter = __webpack_require__(155); const written = new WeakMap(); @@ -87438,7 +90211,7 @@ module.exports = ProgressEmitter; /***/ }), -/* 732 */ +/* 745 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87484,12 +90257,12 @@ exports.default = module.exports; /***/ }), -/* 733 */ +/* 746 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(734); +const NestedError = __webpack_require__(747); class CpyError extends NestedError { constructor(message, nested) { @@ -87503,7 +90276,7 @@ module.exports = CpyError; /***/ }), -/* 734 */ +/* 747 */ /***/ (function(module, exports, __webpack_require__) { var inherits = __webpack_require__(111).inherits; @@ -87559,14 +90332,14 @@ module.exports = NestedError; /***/ }), -/* 735 */ +/* 748 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return prepareExternalProjectDependencies; }); -/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(163); -/* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(162); +/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(164); +/* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(163); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with diff --git a/packages/kbn-pm/package.json b/packages/kbn-pm/package.json index 3e40bf40222e6..78fa48979c1b5 100644 --- a/packages/kbn-pm/package.json +++ b/packages/kbn-pm/package.json @@ -35,7 +35,7 @@ "@kbn/dev-utils": "1.0.0", "@yarnpkg/lockfile": "^1.1.0", "babel-loader": "^8.0.6", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "cmd-shim": "^2.1.0", "cpy": "^8.0.0", "dedent": "^0.7.0", diff --git a/packages/kbn-test/package.json b/packages/kbn-test/package.json index 9482ea83cc257..f86bcfd2bb7b2 100644 --- a/packages/kbn-test/package.json +++ b/packages/kbn-test/package.json @@ -21,7 +21,7 @@ "diff": "^4.0.1" }, "dependencies": { - "chalk": "^2.4.2", + "chalk": "^4.1.0", "dedent": "^0.7.0", "del": "^5.1.0", "exit-hook": "^2.2.0", diff --git a/packages/kbn-ui-framework/package.json b/packages/kbn-ui-framework/package.json index a095d9ac2a77f..a2151ca3381bc 100644 --- a/packages/kbn-ui-framework/package.json +++ b/packages/kbn-ui-framework/package.json @@ -36,7 +36,7 @@ "@kbn/optimizer": "1.0.0", "babel-loader": "^8.0.6", "brace": "0.11.1", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "chokidar": "3.2.1", "core-js": "^3.6.4", "css-loader": "^3.4.2", diff --git a/src/dev/typescript/exec_in_projects.ts b/src/dev/typescript/exec_in_projects.ts index 5197aa67c7268..92f71b9bb864a 100644 --- a/src/dev/typescript/exec_in_projects.ts +++ b/src/dev/typescript/exec_in_projects.ts @@ -43,7 +43,7 @@ export function execInProjects( // execute in the current working directory so that relative paths in errors // are relative from the right location cwd: process.cwd(), - env: chalk.enabled ? { FORCE_COLOR: 'true' } : {}, + env: chalk.level > 0 ? { FORCE_COLOR: 'true' } : {}, stdio: ['ignore', 'pipe', 'pipe'], preferLocal: true, }).catch((error) => { diff --git a/x-pack/package.json b/x-pack/package.json index 7533741391f8e..962233a3a3973 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -131,7 +131,7 @@ "base64-js": "^1.3.1", "base64url": "^3.0.1", "canvas": "^2.6.1", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "chance": "1.0.18", "cheerio": "0.22.0", "commander": "3.0.2", diff --git a/yarn.lock b/yarn.lock index 6f82c8126ac06..101f735355f0b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9905,14 +9905,14 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.8.2, color-convert@^1.9.0: +color-convert@^1.8.2: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== dependencies: color-name "^1.1.1" -color-convert@^1.9.1: +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -28888,14 +28888,14 @@ supports-color@^3.1.2: dependencies: has-flag "^1.0.0" -supports-color@^5.0.0, supports-color@^5.4.0, supports-color@^5.5.0: +supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^5.2.0, supports-color@^5.3.0: +supports-color@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" integrity sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg== From 67025579ba6650154e5b565f6d8e2c6d35c8fec0 Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Tue, 11 Aug 2020 15:00:02 +0100 Subject: [PATCH 047/113] [Event log] Use Alerts client & Actions client when fetching these types of SOs (#73257) Introduces a pluggable API to Event Log which allows custom Providers for Saved Objects which is used to ensure a user is authorised to get the Saved Object referenced in the Event Log whenever the find api is called. --- x-pack/.i18nrc.json | 1 + x-pack/plugins/actions/server/plugin.ts | 7 ++ x-pack/plugins/alerts/server/plugin.ts | 7 ++ .../event_log/server/event_log_client.test.ts | 55 ++++++----- .../event_log/server/event_log_client.ts | 18 ++-- .../server/event_log_service.mock.ts | 1 + .../server/event_log_service.test.ts | 25 +++++ .../event_log/server/event_log_service.ts | 16 ++- .../server/event_log_start_service.test.ts | 11 +-- .../server/event_log_start_service.ts | 29 +++--- .../event_log/server/event_logger.test.ts | 2 + x-pack/plugins/event_log/server/plugin.ts | 11 ++- .../saved_object_provider_registry.mock.ts | 19 ++++ .../saved_object_provider_registry.test.ts | 98 +++++++++++++++++++ .../server/saved_object_provider_registry.ts | 68 +++++++++++++ x-pack/plugins/event_log/server/types.ts | 3 +- .../plugins/alerts/server/alert_types.ts | 4 +- .../fixtures/plugins/alerts/server/plugin.ts | 6 ++ 18 files changed, 319 insertions(+), 62 deletions(-) create mode 100644 x-pack/plugins/event_log/server/saved_object_provider_registry.mock.ts create mode 100644 x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts create mode 100644 x-pack/plugins/event_log/server/saved_object_provider_registry.ts diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index d0055008eb9bf..69ad9ad33bf72 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -4,6 +4,7 @@ "xpack.actions": "plugins/actions", "xpack.uiActionsEnhanced": ["plugins/ui_actions_enhanced", "examples/ui_actions_enhanced_examples"], "xpack.alerts": "plugins/alerts", + "xpack.eventLog": "plugins/event_log", "xpack.alertingBuiltins": "plugins/alerting_builtins", "xpack.apm": ["legacy/plugins/apm", "plugins/apm"], "xpack.beatsManagement": ["legacy/plugins/beats_management", "plugins/beats_management"], diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index 54d137cc0f617..ee50ee81d507c 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -123,6 +123,7 @@ export class ActionsPlugin implements Plugin, Plugi private licenseState: ILicenseState | null = null; private spaces?: SpacesServiceSetup; private security?: SecurityPluginSetup; + private eventLogService?: IEventLogService; private eventLogger?: IEventLogger; private isESOUsingEphemeralEncryptionKey?: boolean; private readonly telemetryLogger: Logger; @@ -160,6 +161,7 @@ export class ActionsPlugin implements Plugin, Plugi plugins.features.registerFeature(ACTIONS_FEATURE); setupSavedObjects(core.savedObjects, plugins.encryptedSavedObjects); + this.eventLogService = plugins.eventLog; plugins.eventLog.registerProviderActions(EVENT_LOG_PROVIDER, Object.values(EVENT_LOG_ACTIONS)); this.eventLogger = plugins.eventLog.getLogger({ event: { provider: EVENT_LOG_PROVIDER }, @@ -295,6 +297,11 @@ export class ActionsPlugin implements Plugin, Plugi }); }; + this.eventLogService!.registerSavedObjectProvider('action', (request) => { + const client = getActionsClientWithRequest(request); + return async (type: string, id: string) => (await client).get({ id }); + }); + const getScopedSavedObjectsClientWithoutAccessToActions = (request: KibanaRequest) => core.savedObjects.getScopedClient(request); diff --git a/x-pack/plugins/alerts/server/plugin.ts b/x-pack/plugins/alerts/server/plugin.ts index 2f0df44197553..5d69887bd5bf0 100644 --- a/x-pack/plugins/alerts/server/plugin.ts +++ b/x-pack/plugins/alerts/server/plugin.ts @@ -106,6 +106,7 @@ export class AlertingPlugin { private readonly alertsClientFactory: AlertsClientFactory; private readonly telemetryLogger: Logger; private readonly kibanaIndex: Promise; + private eventLogService?: IEventLogService; private eventLogger?: IEventLogger; constructor(initializerContext: PluginInitializerContext) { @@ -150,6 +151,7 @@ export class AlertingPlugin { setupSavedObjects(core.savedObjects, plugins.encryptedSavedObjects); + this.eventLogService = plugins.eventLog; plugins.eventLog.registerProviderActions(EVENT_LOG_PROVIDER, Object.values(EVENT_LOG_ACTIONS)); this.eventLogger = plugins.eventLog.getLogger({ event: { provider: EVENT_LOG_PROVIDER }, @@ -255,6 +257,11 @@ export class AlertingPlugin { eventLogger: this.eventLogger!, }); + this.eventLogService!.registerSavedObjectProvider('alert', (request) => { + const client = getAlertsClientWithRequest(request); + return (type: string, id: string) => client.get({ id }); + }); + scheduleAlertingTelemetry(this.telemetryLogger, plugins.taskManager); return { diff --git a/x-pack/plugins/event_log/server/event_log_client.test.ts b/x-pack/plugins/event_log/server/event_log_client.test.ts index 917d517a6e27d..3273fe847080f 100644 --- a/x-pack/plugins/event_log/server/event_log_client.test.ts +++ b/x-pack/plugins/event_log/server/event_log_client.test.ts @@ -7,7 +7,6 @@ import { KibanaRequest } from 'src/core/server'; import { EventLogClient } from './event_log_client'; import { contextMock } from './es/context.mock'; -import { savedObjectsClientMock } from 'src/core/server/mocks'; import { merge } from 'lodash'; import moment from 'moment'; @@ -15,14 +14,15 @@ describe('EventLogStart', () => { describe('findEventsBySavedObject', () => { test('verifies that the user can access the specified saved object', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockResolvedValueOnce({ + savedObjectGetter.mockResolvedValueOnce({ id: 'saved-object-id', type: 'saved-object-type', attributes: {}, @@ -31,19 +31,21 @@ describe('EventLogStart', () => { await eventLogClient.findEventsBySavedObject('saved-object-type', 'saved-object-id'); - expect(savedObjectsClient.get).toHaveBeenCalledWith('saved-object-type', 'saved-object-id'); + expect(savedObjectGetter).toHaveBeenCalledWith('saved-object-type', 'saved-object-id'); }); test('throws when the user doesnt have permission to access the specified saved object', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockRejectedValue(new Error('Fail')); + savedObjectGetter.mockRejectedValue(new Error('Fail')); expect( eventLogClient.findEventsBySavedObject('saved-object-type', 'saved-object-id') @@ -52,14 +54,16 @@ describe('EventLogStart', () => { test('fetches all event that reference the saved object', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockResolvedValueOnce({ + savedObjectGetter.mockResolvedValueOnce({ id: 'saved-object-id', type: 'saved-object-type', attributes: {}, @@ -125,14 +129,16 @@ describe('EventLogStart', () => { test('fetches all events in time frame that reference the saved object', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockResolvedValueOnce({ + savedObjectGetter.mockResolvedValueOnce({ id: 'saved-object-id', type: 'saved-object-type', attributes: {}, @@ -206,14 +212,16 @@ describe('EventLogStart', () => { test('validates that the start date is valid', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockResolvedValueOnce({ + savedObjectGetter.mockResolvedValueOnce({ id: 'saved-object-id', type: 'saved-object-type', attributes: {}, @@ -236,14 +244,16 @@ describe('EventLogStart', () => { test('validates that the end date is valid', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockResolvedValueOnce({ + savedObjectGetter.mockResolvedValueOnce({ id: 'saved-object-id', type: 'saved-object-type', attributes: {}, @@ -297,7 +307,8 @@ function fakeEvent(overrides = {}) { } function FakeRequest(): KibanaRequest { - const savedObjectsClient = savedObjectsClientMock.create(); + const savedObjectGetter = jest.fn(); + return ({ headers: {}, getBasePath: () => '', @@ -311,6 +322,6 @@ function FakeRequest(): KibanaRequest { url: '/', }, }, - getSavedObjectsClient: () => savedObjectsClient, + getSavedObjectsClient: () => savedObjectGetter, } as unknown) as KibanaRequest; } diff --git a/x-pack/plugins/event_log/server/event_log_client.ts b/x-pack/plugins/event_log/server/event_log_client.ts index f4115e06160d7..32fd99d170026 100644 --- a/x-pack/plugins/event_log/server/event_log_client.ts +++ b/x-pack/plugins/event_log/server/event_log_client.ts @@ -6,12 +6,13 @@ import { Observable } from 'rxjs'; import { schema, TypeOf } from '@kbn/config-schema'; -import { LegacyClusterClient, SavedObjectsClientContract, KibanaRequest } from 'src/core/server'; +import { LegacyClusterClient, KibanaRequest } from 'src/core/server'; import { SpacesServiceSetup } from '../../spaces/server'; import { EsContext } from './es'; import { IEventLogClient } from './types'; import { QueryEventsBySavedObjectResult } from './es/cluster_client_adapter'; +import { SavedObjectGetter } from './saved_object_provider_registry'; export type PluginClusterClient = Pick; export type AdminClusterClient$ = Observable; @@ -58,7 +59,7 @@ export type FindOptionsType = Pick< interface EventLogServiceCtorParams { esContext: EsContext; - savedObjectsClient: SavedObjectsClientContract; + savedObjectGetter: SavedObjectGetter; spacesService?: SpacesServiceSetup; request: KibanaRequest; } @@ -66,18 +67,13 @@ interface EventLogServiceCtorParams { // note that clusterClient may be null, indicating we can't write to ES export class EventLogClient implements IEventLogClient { private esContext: EsContext; - private savedObjectsClient: SavedObjectsClientContract; + private savedObjectGetter: SavedObjectGetter; private spacesService?: SpacesServiceSetup; private request: KibanaRequest; - constructor({ - esContext, - savedObjectsClient, - spacesService, - request, - }: EventLogServiceCtorParams) { + constructor({ esContext, savedObjectGetter, spacesService, request }: EventLogServiceCtorParams) { this.esContext = esContext; - this.savedObjectsClient = savedObjectsClient; + this.savedObjectGetter = savedObjectGetter; this.spacesService = spacesService; this.request = request; } @@ -93,7 +89,7 @@ export class EventLogClient implements IEventLogClient { const namespace = space && this.spacesService?.spaceIdToNamespace(space.id); // verify the user has the required permissions to view this saved object - await this.savedObjectsClient.get(type, id); + await this.savedObjectGetter(type, id); return await this.esContext.esAdapter.queryEventsBySavedObject( this.esContext.esNames.alias, diff --git a/x-pack/plugins/event_log/server/event_log_service.mock.ts b/x-pack/plugins/event_log/server/event_log_service.mock.ts index 805c241414a2e..877e5d59a1831 100644 --- a/x-pack/plugins/event_log/server/event_log_service.mock.ts +++ b/x-pack/plugins/event_log/server/event_log_service.mock.ts @@ -15,6 +15,7 @@ const createEventLogServiceMock = () => { registerProviderActions: jest.fn(), isProviderActionRegistered: jest.fn(), getProviderActions: jest.fn(), + registerSavedObjectProvider: jest.fn(), getLogger: jest.fn().mockReturnValue(eventLoggerMock.create()), }; return mock; diff --git a/x-pack/plugins/event_log/server/event_log_service.test.ts b/x-pack/plugins/event_log/server/event_log_service.test.ts index 2cf68592f2fa1..2b92443569f4f 100644 --- a/x-pack/plugins/event_log/server/event_log_service.test.ts +++ b/x-pack/plugins/event_log/server/event_log_service.test.ts @@ -8,9 +8,11 @@ import { IEventLogConfig } from './types'; import { EventLogService } from './event_log_service'; import { contextMock } from './es/context.mock'; import { loggingSystemMock } from 'src/core/server/mocks'; +import { savedObjectProviderRegistryMock } from './saved_object_provider_registry.mock'; const loggingService = loggingSystemMock.create(); const systemLogger = loggingService.get(); +const savedObjectProviderRegistry = savedObjectProviderRegistryMock.create(); describe('EventLogService', () => { const esContext = contextMock.create(); @@ -21,6 +23,7 @@ describe('EventLogService', () => { esContext, systemLogger, kibanaUUID: '42', + savedObjectProviderRegistry, config: { enabled, logEntries, @@ -65,6 +68,7 @@ describe('EventLogService', () => { esContext, systemLogger, kibanaUUID: '42', + savedObjectProviderRegistry, config: { enabled: true, logEntries: true, @@ -102,6 +106,7 @@ describe('EventLogService', () => { esContext, systemLogger, kibanaUUID: '42', + savedObjectProviderRegistry, config: { enabled: true, logEntries: true, @@ -112,4 +117,24 @@ describe('EventLogService', () => { const eventLogger = service.getLogger({}); expect(eventLogger).toBeTruthy(); }); + + describe('registerSavedObjectProvider', () => { + test('register SavedObject Providers in the registry', () => { + const params = { + esContext, + systemLogger, + kibanaUUID: '42', + savedObjectProviderRegistry, + config: { + enabled: true, + logEntries: true, + indexEntries: true, + }, + }; + const service = new EventLogService(params); + const provider = jest.fn(); + service.registerSavedObjectProvider('myType', provider); + expect(savedObjectProviderRegistry.registerProvider).toHaveBeenCalledWith('myType', provider); + }); + }); }); diff --git a/x-pack/plugins/event_log/server/event_log_service.ts b/x-pack/plugins/event_log/server/event_log_service.ts index f7f915f1cf0ef..9249288d33939 100644 --- a/x-pack/plugins/event_log/server/event_log_service.ts +++ b/x-pack/plugins/event_log/server/event_log_service.ts @@ -11,6 +11,7 @@ import { Plugin } from './plugin'; import { EsContext } from './es'; import { IEvent, IEventLogger, IEventLogService, IEventLogConfig } from './types'; import { EventLogger } from './event_logger'; +import { SavedObjectProvider, SavedObjectProviderRegistry } from './saved_object_provider_registry'; export type PluginClusterClient = Pick; export type AdminClusterClient$ = Observable; @@ -21,6 +22,7 @@ interface EventLogServiceCtorParams { esContext: EsContext; kibanaUUID: string; systemLogger: SystemLogger; + savedObjectProviderRegistry: SavedObjectProviderRegistry; } // note that clusterClient may be null, indicating we can't write to ES @@ -29,15 +31,23 @@ export class EventLogService implements IEventLogService { private esContext: EsContext; private systemLogger: SystemLogger; private registeredProviderActions: Map>; + private savedObjectProviderRegistry: SavedObjectProviderRegistry; public readonly kibanaUUID: string; - constructor({ config, esContext, kibanaUUID, systemLogger }: EventLogServiceCtorParams) { + constructor({ + config, + esContext, + kibanaUUID, + systemLogger, + savedObjectProviderRegistry, + }: EventLogServiceCtorParams) { this.config = config; this.esContext = esContext; this.kibanaUUID = kibanaUUID; this.systemLogger = systemLogger; this.registeredProviderActions = new Map>(); + this.savedObjectProviderRegistry = savedObjectProviderRegistry; } public isEnabled(): boolean { @@ -77,6 +87,10 @@ export class EventLogService implements IEventLogService { return new Map(this.registeredProviderActions.entries()); } + registerSavedObjectProvider(type: string, provider: SavedObjectProvider) { + return this.savedObjectProviderRegistry.registerProvider(type, provider); + } + getLogger(initialProperties: IEvent): IEventLogger { return new EventLogger({ esContext: this.esContext, diff --git a/x-pack/plugins/event_log/server/event_log_start_service.test.ts b/x-pack/plugins/event_log/server/event_log_start_service.test.ts index 3bd5ef7c0b3ba..cbdc168a8ffde 100644 --- a/x-pack/plugins/event_log/server/event_log_start_service.test.ts +++ b/x-pack/plugins/event_log/server/event_log_start_service.test.ts @@ -5,10 +5,11 @@ */ import { KibanaRequest } from 'src/core/server'; -import { savedObjectsClientMock, savedObjectsServiceMock } from 'src/core/server/mocks'; +import { savedObjectsClientMock } from 'src/core/server/mocks'; import { EventLogClientService } from './event_log_start_service'; import { contextMock } from './es/context.mock'; +import { savedObjectProviderRegistryMock } from './saved_object_provider_registry.mock'; jest.mock('./event_log_client'); @@ -17,19 +18,17 @@ describe('EventLogClientService', () => { describe('getClient', () => { test('creates a client with a scoped SavedObjects client', () => { - const savedObjectsService = savedObjectsServiceMock.createStartContract(); + const savedObjectProviderRegistry = savedObjectProviderRegistryMock.create(); const request = fakeRequest(); const eventLogStartService = new EventLogClientService({ esContext, - savedObjectsService, + savedObjectProviderRegistry, }); eventLogStartService.getClient(request); - expect(savedObjectsService.getScopedClient).toHaveBeenCalledWith(request, { - includedHiddenTypes: ['action', 'alert'], - }); + expect(savedObjectProviderRegistry.getProvidersClient).toHaveBeenCalledWith(request); }); }); }); diff --git a/x-pack/plugins/event_log/server/event_log_start_service.ts b/x-pack/plugins/event_log/server/event_log_start_service.ts index 8b752684c1cc3..5cadab4df3ed7 100644 --- a/x-pack/plugins/event_log/server/event_log_start_service.ts +++ b/x-pack/plugins/event_log/server/event_log_start_service.ts @@ -5,49 +5,42 @@ */ import { Observable } from 'rxjs'; -import { - LegacyClusterClient, - KibanaRequest, - SavedObjectsServiceStart, - SavedObjectsClientContract, -} from 'src/core/server'; +import { LegacyClusterClient, KibanaRequest } from 'src/core/server'; import { SpacesServiceSetup } from '../../spaces/server'; import { EsContext } from './es'; import { IEventLogClientService } from './types'; import { EventLogClient } from './event_log_client'; +import { SavedObjectProviderRegistry } from './saved_object_provider_registry'; export type PluginClusterClient = Pick; export type AdminClusterClient$ = Observable; -const includedHiddenTypes = ['action', 'alert']; - interface EventLogServiceCtorParams { esContext: EsContext; - savedObjectsService: SavedObjectsServiceStart; + savedObjectProviderRegistry: SavedObjectProviderRegistry; spacesService?: SpacesServiceSetup; } // note that clusterClient may be null, indicating we can't write to ES export class EventLogClientService implements IEventLogClientService { private esContext: EsContext; - private savedObjectsService: SavedObjectsServiceStart; + private savedObjectProviderRegistry: SavedObjectProviderRegistry; private spacesService?: SpacesServiceSetup; - constructor({ esContext, savedObjectsService, spacesService }: EventLogServiceCtorParams) { + constructor({ + esContext, + savedObjectProviderRegistry, + spacesService, + }: EventLogServiceCtorParams) { this.esContext = esContext; - this.savedObjectsService = savedObjectsService; + this.savedObjectProviderRegistry = savedObjectProviderRegistry; this.spacesService = spacesService; } getClient(request: KibanaRequest) { - const savedObjectsClient: SavedObjectsClientContract = this.savedObjectsService.getScopedClient( - request, - { includedHiddenTypes } - ); - return new EventLogClient({ esContext: this.esContext, - savedObjectsClient, + savedObjectGetter: this.savedObjectProviderRegistry.getProvidersClient(request), spacesService: this.spacesService, request, }); diff --git a/x-pack/plugins/event_log/server/event_logger.test.ts b/x-pack/plugins/event_log/server/event_logger.test.ts index fde3b2de8dd36..0ab3071f70efa 100644 --- a/x-pack/plugins/event_log/server/event_logger.test.ts +++ b/x-pack/plugins/event_log/server/event_logger.test.ts @@ -12,6 +12,7 @@ import { contextMock } from './es/context.mock'; import { loggingSystemMock } from 'src/core/server/mocks'; import { delay } from './lib/delay'; import { EVENT_LOGGED_PREFIX } from './event_logger'; +import { savedObjectProviderRegistryMock } from './saved_object_provider_registry.mock'; const KIBANA_SERVER_UUID = '424-24-2424'; const WRITE_LOG_WAIT_MILLIS = 3000; @@ -31,6 +32,7 @@ describe('EventLogger', () => { systemLogger, config: { enabled: true, logEntries: true, indexEntries: true }, kibanaUUID: KIBANA_SERVER_UUID, + savedObjectProviderRegistry: savedObjectProviderRegistryMock.create(), }); eventLogger = service.getLogger({}); }); diff --git a/x-pack/plugins/event_log/server/plugin.ts b/x-pack/plugins/event_log/server/plugin.ts index 9e36ca10b71f2..1353877fa4629 100644 --- a/x-pack/plugins/event_log/server/plugin.ts +++ b/x-pack/plugins/event_log/server/plugin.ts @@ -30,6 +30,7 @@ import { findRoute } from './routes'; import { EventLogService } from './event_log_service'; import { createEsContext, EsContext } from './es'; import { EventLogClientService } from './event_log_start_service'; +import { SavedObjectProviderRegistry } from './saved_object_provider_registry'; export type PluginClusterClient = Pick; @@ -53,11 +54,13 @@ export class Plugin implements CorePlugin; private eventLogClientService?: EventLogClientService; private spacesService?: SpacesServiceSetup; + private savedObjectProviderRegistry: SavedObjectProviderRegistry; constructor(private readonly context: PluginInitializerContext) { this.systemLogger = this.context.logger.get(); this.config$ = this.context.config.create(); this.globalConfig$ = this.context.config.legacy.globalConfig$; + this.savedObjectProviderRegistry = new SavedObjectProviderRegistry(); } async setup(core: CoreSetup, { spaces }: PluginSetupDeps): Promise { @@ -83,6 +86,7 @@ export class Plugin implements CorePlugin { + const client = core.savedObjects.getScopedClient(request); + return client.get.bind(client); + }); + this.eventLogClientService = new EventLogClientService({ esContext: this.esContext, - savedObjectsService: core.savedObjects, + savedObjectProviderRegistry: this.savedObjectProviderRegistry, spacesService: this.spacesService, }); return this.eventLogClientService; diff --git a/x-pack/plugins/event_log/server/saved_object_provider_registry.mock.ts b/x-pack/plugins/event_log/server/saved_object_provider_registry.mock.ts new file mode 100644 index 0000000000000..433deaf7bff72 --- /dev/null +++ b/x-pack/plugins/event_log/server/saved_object_provider_registry.mock.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SavedObjectProviderRegistry } from './saved_object_provider_registry'; + +const createSavedObjectProviderRegistryMock = () => { + return ({ + registerProvider: jest.fn(), + registerDefaultProvider: jest.fn(), + getProvidersClient: jest.fn(), + } as unknown) as jest.Mocked; +}; + +export const savedObjectProviderRegistryMock = { + create: createSavedObjectProviderRegistryMock, +}; diff --git a/x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts b/x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts new file mode 100644 index 0000000000000..6a02d54c87514 --- /dev/null +++ b/x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SavedObjectProviderRegistry } from './saved_object_provider_registry'; +import uuid from 'uuid'; +import { KibanaRequest } from 'src/core/server'; +import { savedObjectsClientMock } from 'src/core/server/mocks'; + +describe('SavedObjectProviderRegistry', () => { + beforeEach(() => jest.resetAllMocks()); + + describe('registerProvider()', () => { + test('should register providers', () => { + const registry = new SavedObjectProviderRegistry(); + registry.registerProvider('alert', jest.fn()); + }); + + test('should throw an error if type is already registered', () => { + const registry = new SavedObjectProviderRegistry(); + registry.registerProvider('alert', jest.fn()); + expect(() => + registry.registerProvider('alert', jest.fn()) + ).toThrowErrorMatchingInlineSnapshot( + `"The Event Log has already registered a Provider for the Save Object type \\"alert\\"."` + ); + }); + }); + + describe('getProvidersClient()', () => { + test('should get SavedObject using the registered provider by type', async () => { + const registry = new SavedObjectProviderRegistry(); + registry.registerDefaultProvider(jest.fn()); + + const getter = jest.fn(); + const provider = jest.fn().mockReturnValue(getter); + registry.registerProvider('alert', provider); + + const request = fakeRequest(); + const alert = { + id: uuid.v4(), + }; + + getter.mockResolvedValue(alert); + + expect(await registry.getProvidersClient(request)('alert', alert.id)).toMatchObject(alert); + + expect(provider).toHaveBeenCalledWith(request); + expect(getter).toHaveBeenCalledWith('alert', alert.id); + }); + + test('should get SavedObject using the default provider for unregistered types', async () => { + const registry = new SavedObjectProviderRegistry(); + const defaultProvider = jest.fn(); + registry.registerDefaultProvider(defaultProvider); + + registry.registerProvider('alert', jest.fn().mockReturnValue(jest.fn())); + + const request = fakeRequest(); + const action = { + id: uuid.v4(), + type: 'action', + attributes: {}, + references: [], + }; + + const getter = jest.fn(); + defaultProvider.mockReturnValue(getter); + getter.mockResolvedValue(action); + + expect(await registry.getProvidersClient(request)('action', action.id)).toMatchObject(action); + + expect(getter).toHaveBeenCalledWith('action', action.id); + expect(defaultProvider).toHaveBeenCalledWith(request); + }); + }); +}); + +function fakeRequest(): KibanaRequest { + const savedObjectsClient = savedObjectsClientMock.create(); + return ({ + headers: {}, + getBasePath: () => '', + path: '/', + route: { settings: {} }, + url: { + href: '/', + }, + raw: { + req: { + url: '/', + }, + }, + getSavedObjectsClient: () => savedObjectsClient, + } as unknown) as KibanaRequest; +} diff --git a/x-pack/plugins/event_log/server/saved_object_provider_registry.ts b/x-pack/plugins/event_log/server/saved_object_provider_registry.ts new file mode 100644 index 0000000000000..87a1da5dd6f4a --- /dev/null +++ b/x-pack/plugins/event_log/server/saved_object_provider_registry.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +import { KibanaRequest, SavedObjectsClientContract } from 'src/core/server'; + +import { fromNullable, getOrElse } from 'fp-ts/lib/Option'; +import { pipe } from 'fp-ts/lib/pipeable'; + +export type SavedObjectGetter = ( + ...params: Parameters +) => Promise; +export type SavedObjectProvider = (request: KibanaRequest) => SavedObjectGetter; + +export class SavedObjectProviderRegistry { + private providers = new Map(); + private defaultProvider?: SavedObjectProvider; + + constructor() {} + + public registerDefaultProvider(provider: SavedObjectProvider) { + this.defaultProvider = provider; + } + + public registerProvider(type: string, provider: SavedObjectProvider) { + if (this.providers.has(type)) { + throw new Error( + `The Event Log has already registered a Provider for the Save Object type "${type}".` + ); + } + this.providers.set(type, provider); + } + + public getProvidersClient(request: KibanaRequest): SavedObjectGetter { + if (!this.defaultProvider) { + throw new Error( + i18n.translate( + 'xpack.eventLog.savedObjectProviderRegistry.getProvidersClient.noDefaultProvider', + { + defaultMessage: 'The Event Log requires a default Provider.', + } + ) + ); + } + + // `scopedProviders` is a cache of providers which are scoped t othe current request. + // The client will only instantiate a provider on-demand and it will cache each + // one to enable the request to reuse each provider. + const scopedProviders = new Map(); + const defaultGetter = this.defaultProvider(request); + return (type: string, id: string) => { + const getter = pipe( + fromNullable(scopedProviders.get(type)), + getOrElse(() => { + const client = this.providers.has(type) + ? this.providers.get(type)!(request) + : defaultGetter; + scopedProviders.set(type, client); + return client; + }) + ); + return getter(type, id); + }; + } +} diff --git a/x-pack/plugins/event_log/server/types.ts b/x-pack/plugins/event_log/server/types.ts index 1a37c4e58d079..cda9579220623 100644 --- a/x-pack/plugins/event_log/server/types.ts +++ b/x-pack/plugins/event_log/server/types.ts @@ -12,6 +12,7 @@ export { IEvent, IValidatedEvent, EventSchema, ECS_VERSION } from '../generated/ import { IEvent } from '../generated/schemas'; import { FindOptionsType } from './event_log_client'; import { QueryEventsBySavedObjectResult } from './es/cluster_client_adapter'; +import { SavedObjectProvider } from './saved_object_provider_registry'; export const SAVED_OBJECT_REL_PRIMARY = 'primary'; @@ -40,7 +41,7 @@ export interface IEventLogService { registerProviderActions(provider: string, actions: string[]): void; isProviderActionRegistered(provider: string, action: string): boolean; getProviderActions(): Map>; - + registerSavedObjectProvider(type: string, provider: SavedObjectProvider): void; getLogger(properties: IEvent): IEventLogger; } diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts index ebf639067518f..269a9d3a504a2 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts @@ -296,7 +296,7 @@ export function defineAlertTypes( name: 'Default', }, ], - producer: 'alerting', + producer: 'alertsFixture', defaultActionGroupId: 'default', async executor({ services, params, state }: AlertExecutorOptions) { throw new Error('this alert is intended to fail'); @@ -306,7 +306,7 @@ export function defineAlertTypes( id: 'test.patternFiring', name: 'Test: Firing on a Pattern', actionGroups: [{ id: 'default', name: 'Default' }], - producer: 'alerting', + producer: 'alertsFixture', defaultActionGroupId: 'default', async executor(alertExecutorOptions: AlertExecutorOptions) { const { services, state, params } = alertExecutorOptions; diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/plugin.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/plugin.ts index 5881201a82e09..1b8a380eaaeb2 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/plugin.ts +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/plugin.ts @@ -40,6 +40,8 @@ export class FixturePlugin implements Plugin Date: Tue, 11 Aug 2020 10:03:41 -0400 Subject: [PATCH 048/113] [Ingest pipelines] Implement tabs in processor flyout (#74469) --- .../pipeline_processors_editor.test.tsx | 2 +- .../components/index.ts | 6 +- .../documentation_button.tsx | 0 .../field_components/index.ts | 0 .../field_components/xjson_editor.tsx | 0 .../index.ts | 6 +- .../manage_processor_form.container.tsx} | 8 +- .../manage_processor_form.tsx} | 122 +++++++++++------- .../processor_settings_fields.tsx | 52 ++++++++ .../common_fields/common_processor_fields.tsx | 0 .../processors/common_fields/index.ts | 0 .../common_fields/processor_type_field.tsx | 0 .../processors/custom.tsx | 0 .../processors/gsub.tsx | 0 .../processors/set.tsx | 0 .../pipeline_processors_editor_item.tsx | 43 +++--- .../context/processors_context.tsx | 10 +- .../pipeline_processors_editor/types.ts | 2 +- .../translations/translations/ja-JP.json | 3 - .../translations/translations/zh-CN.json | 3 - 20 files changed, 159 insertions(+), 98 deletions(-) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/documentation_button.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/field_components/index.ts (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/field_components/xjson_editor.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/index.ts (71%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form/processor_settings_form.container.tsx => manage_processor_form/manage_processor_form.container.tsx} (85%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form/processor_settings_form.tsx => manage_processor_form/manage_processor_form.tsx} (60%) create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/common_fields/common_processor_fields.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/common_fields/index.ts (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/common_fields/processor_type_field.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/custom.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/gsub.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/set.tsx (100%) diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx index a45a677846b2e..d3c5df02c837e 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx @@ -186,7 +186,7 @@ describe('Pipeline Editor', () => { it('prevents moving a processor while in edit mode', () => { const { find, exists } = testBed; - find('processors>0.editItemButton').simulate('click'); + find('processors>0.manageItemButton').simulate('click'); expect(exists('processorSettingsForm')).toBe(true); expect(find('processors>0.moveItemButton').props().disabled).toBe(true); expect(find('processors>1.moveItemButton').props().disabled).toBe(true); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts index bf724be950fdf..3b0ae477c871f 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts @@ -5,10 +5,10 @@ */ export { - ProcessorSettingsForm, - ProcessorSettingsFromOnSubmitArg, + ManageProcessorForm, + ManageProcessorFormOnSubmitArg, OnSubmitHandler, -} from './processor_settings_form'; +} from './manage_processor_form'; export { ProcessorsTree, ProcessorInfo, OnActionHandler } from './processors_tree'; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/documentation_button.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/documentation_button.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/documentation_button.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/documentation_button.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/field_components/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/index.ts similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/field_components/index.ts rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/index.ts diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/field_components/xjson_editor.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/xjson_editor.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/field_components/xjson_editor.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/xjson_editor.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/index.ts similarity index 71% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/index.ts rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/index.ts index 1a7da4891967a..986bd52e911bf 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/index.ts +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/index.ts @@ -5,7 +5,7 @@ */ export { - ProcessorSettingsForm, - ProcessorSettingsFromOnSubmitArg, + ManageProcessorForm, + ManageProcessorFormOnSubmitArg, OnSubmitHandler, -} from './processor_settings_form.container'; +} from './manage_processor_form.container'; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.container.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.container.tsx similarity index 85% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.container.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.container.tsx index 2a537ba082eec..ea137b87e66d5 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.container.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.container.tsx @@ -9,12 +9,12 @@ import React, { FunctionComponent, useCallback, useEffect } from 'react'; import { useForm, OnFormUpdateArg, FormData } from '../../../../../shared_imports'; import { ProcessorInternal } from '../../types'; -import { ProcessorSettingsForm as ViewComponent } from './processor_settings_form'; +import { ManageProcessorForm as ViewComponent } from './manage_processor_form'; import { usePipelineProcessorsContext } from '../../context'; -export type ProcessorSettingsFromOnSubmitArg = Omit; +export type ManageProcessorFormOnSubmitArg = Omit; -export type OnSubmitHandler = (processor: ProcessorSettingsFromOnSubmitArg) => void; +export type OnSubmitHandler = (processor: ManageProcessorFormOnSubmitArg) => void; export type OnFormUpdateHandler = (form: OnFormUpdateArg) => void; @@ -27,7 +27,7 @@ interface Props { processor?: ProcessorInternal; } -export const ProcessorSettingsForm: FunctionComponent = ({ +export const ManageProcessorForm: FunctionComponent = ({ processor, onFormUpdate, onSubmit, diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.tsx similarity index 60% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.tsx index b5b3a38bb6a6c..4e172cce63027 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.tsx @@ -6,15 +6,17 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import React, { FunctionComponent, memo, useEffect } from 'react'; +import React, { FunctionComponent, memo, useEffect, useState } from 'react'; import { EuiButton, EuiButtonEmpty, - EuiHorizontalRule, EuiFlyout, EuiFlyoutHeader, EuiFlyoutBody, EuiFlyoutFooter, + EuiSpacer, + EuiTabs, + EuiTab, EuiTitle, EuiFlexGroup, EuiFlexItem, @@ -22,12 +24,10 @@ import { import { Form, FormDataProvider, FormHook } from '../../../../../shared_imports'; import { ProcessorInternal } from '../../types'; - import { getProcessorDescriptor } from '../shared'; +import { ProcessorSettingsFields } from './processor_settings_fields'; import { DocumentationButton } from './documentation_button'; -import { CommonProcessorFields, ProcessorTypeField } from './processors/common_fields'; -import { Custom } from './processors/custom'; export interface Props { isOnFailure: boolean; @@ -42,6 +42,7 @@ const updateButtonLabel = i18n.translate( 'xpack.ingestPipelines.settingsFormOnFailureFlyout.updateButtonLabel', { defaultMessage: 'Update' } ); + const addButtonLabel = i18n.translate( 'xpack.ingestPipelines.settingsFormOnFailureFlyout.addButtonLabel', { defaultMessage: 'Add' } @@ -52,20 +53,55 @@ const cancelButtonLabel = i18n.translate( { defaultMessage: 'Cancel' } ); -export const ProcessorSettingsForm: FunctionComponent = memo( - ({ processor, form, isOnFailure, onClose, onOpen, esDocsBasePath }) => { - const flyoutTitleContent = isOnFailure ? ( +export type TabType = 'configuration'; + +interface Tab { + id: TabType; + name: string; +} + +const tabs: Tab[] = [ + { + id: 'configuration', + name: i18n.translate( + 'xpack.ingestPipelines.settingsFormOnFailureFlyout.configurationTabTitle', + { + defaultMessage: 'Configuration', + } + ), + }, +]; + +const getFlyoutTitle = (isOnFailure: boolean, isExistingProcessor: boolean) => { + if (isExistingProcessor) { + return isOnFailure ? ( ) : ( ); + } + return isOnFailure ? ( + + ) : ( + + ); +}; + +export const ManageProcessorForm: FunctionComponent = memo( + ({ processor, form, isOnFailure, onClose, onOpen, esDocsBasePath }) => { useEffect( () => { onOpen(); @@ -73,6 +109,10 @@ export const ProcessorSettingsForm: FunctionComponent = memo( [] /* eslint-disable-line react-hooks/exhaustive-deps */ ); + const [activeTab, setActiveTab] = useState('configuration'); + + const flyoutContent = ; + return (
@@ -81,11 +121,10 @@ export const ProcessorSettingsForm: FunctionComponent = memo(
-

{flyoutTitleContent}

+

{getFlyoutTitle(isOnFailure, Boolean(processor))}

- {({ type }) => { @@ -106,32 +145,27 @@ export const ProcessorSettingsForm: FunctionComponent = memo( - - - - - - {(arg: any) => { - const { type } = arg; - - if (type?.length) { - const formDescriptor = getProcessorDescriptor(type as any); - - if (formDescriptor?.FieldsComponent) { - return ( - <> - - - - ); - } - return ; - } - - // If the user has not yet defined a type, we do not show any settings fields - return null; - }} - + {processor ? ( + <> + + {tabs.map((tab) => ( + { + setActiveTab(tab.id); + }} + isSelected={tab.id === activeTab} + key={tab.id} + data-test-subj={`${tab.id}Tab`} + > + {tab.name} + + ))} + + + + ) : undefined} + + {flyoutContent} @@ -139,13 +173,7 @@ export const ProcessorSettingsForm: FunctionComponent = memo( {cancelButtonLabel} - { - form.submit(); - }} - > + {processor ? updateButtonLabel : addButtonLabel} diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx new file mode 100644 index 0000000000000..6b2568bad3afc --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent } from 'react'; +import { EuiHorizontalRule } from '@elastic/eui'; + +import { FormDataProvider } from '../../../../../shared_imports'; +import { ProcessorInternal } from '../../types'; + +import { getProcessorDescriptor } from '../shared'; +import { CommonProcessorFields, ProcessorTypeField } from './processors/common_fields'; +import { Custom } from './processors/custom'; + +export interface Props { + processor?: ProcessorInternal; +} + +export const ProcessorSettingsFields: FunctionComponent = ({ processor }) => { + return ( + <> + + + + + + {(arg: any) => { + const { type } = arg; + + if (type?.length) { + const formDescriptor = getProcessorDescriptor(type as any); + + if (formDescriptor?.FieldsComponent) { + return ( + <> + + + + ); + } + return ; + } + + // If the user has not yet defined a type, we do not show any settings fields + return null; + }} + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/common_processor_fields.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/common_processor_fields.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/common_processor_fields.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/common_processor_fields.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/index.ts similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/index.ts rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/index.ts diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/processor_type_field.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/processor_type_field.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/processor_type_field.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/processor_type_field.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/custom.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/custom.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/custom.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/custom.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/gsub.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/gsub.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/gsub.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/gsub.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/set.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/set.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/set.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/set.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx index edabbe277e5d9..a13321c38c193 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx @@ -7,10 +7,10 @@ import classNames from 'classnames'; import React, { FunctionComponent, memo } from 'react'; import { - EuiButtonIcon, EuiButtonToggle, EuiFlexGroup, EuiFlexItem, + EuiLink, EuiPanel, EuiText, EuiToolTip, @@ -57,9 +57,9 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( const isInMoveMode = Boolean(movingProcessor); const isMovingThisProcessor = processor.id === movingProcessor?.id; const isEditingThisProcessor = - editor.mode.id === 'editingProcessor' && processor.id === editor.mode.arg.processor.id; + editor.mode.id === 'managingProcessor' && processor.id === editor.mode.arg.processor.id; const isEditingOtherProcessor = - editor.mode.id === 'editingProcessor' && !isEditingThisProcessor; + editor.mode.id === 'managingProcessor' && !isEditingThisProcessor; const isMovingOtherProcessor = editor.mode.id === 'movingProcessor' && !isMovingThisProcessor; const isDimmed = isEditingOtherProcessor || isMovingOtherProcessor; @@ -70,11 +70,6 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( 'pipelineProcessorsEditor__item--dimmed': isDimmed, }); - const actionElementClasses = classNames({ - // eslint-disable-next-line @typescript-eslint/naming-convention - 'pipelineProcessorsEditor__item--displayNone': isInMoveMode, - }); - const inlineTextInputContainerClasses = classNames({ // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__item--displayNone': isInMoveMode && !processor.options.description, @@ -141,7 +136,18 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( className="pipelineProcessorsEditor__item__processorTypeLabel" color={isDimmed ? 'subdued' : undefined} > - {getProcessorDescriptor(processor.type)?.label ?? processor.type} + { + editor.setMode({ + id: 'managingProcessor', + arg: { processor, selector }, + }); + }} + data-test-subj="manageItemButton" + > + {getProcessorDescriptor(processor.type)?.label ?? processor.type} + @@ -174,25 +180,6 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( placeholder={i18nTexts.descriptionPlaceholder} /> - - {!isInMoveMode && ( - - { - editor.setMode({ - id: 'editingProcessor', - arg: { processor, selector }, - }); - }} - /> - - )} - diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/processors_context.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/processors_context.tsx index db4629823ef52..7124efc4905a7 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/processors_context.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/processors_context.tsx @@ -42,7 +42,7 @@ import { OnActionHandler } from '../components/processors_tree'; import { ProcessorRemoveModal, PipelineProcessorsItemTooltip, - ProcessorSettingsForm, + ManageProcessorForm, OnSubmitHandler, } from '../components'; @@ -148,7 +148,7 @@ export const PipelineProcessorsContextProvider: FunctionComponent = ({ }, }); break; - case 'editingProcessor': + case 'managingProcessor': processorsDispatch({ type: 'updateProcessor', payload: { @@ -229,10 +229,10 @@ export const PipelineProcessorsContextProvider: FunctionComponent = ({ /> )} - {mode.id === 'editingProcessor' || mode.id === 'creatingProcessor' ? ( - void; export type EditorMode = | { id: 'creatingProcessor'; arg: { selector: ProcessorSelector } } | { id: 'movingProcessor'; arg: ProcessorInfo } - | { id: 'editingProcessor'; arg: { processor: ProcessorInternal; selector: ProcessorSelector } } + | { id: 'managingProcessor'; arg: { processor: ProcessorInternal; selector: ProcessorSelector } } | { id: 'removingProcessor'; arg: { selector: ProcessorSelector } } | { id: 'idle' }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c796aacda10a0..720ec2892093b 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -9837,11 +9837,8 @@ "xpack.ingestPipelines.requestFlyout.descriptionText": "このElasticsearchリクエストは、このパイプラインを作成または更新します。", "xpack.ingestPipelines.requestFlyout.namedTitle": "「{name}」のリクエスト", "xpack.ingestPipelines.requestFlyout.unnamedTitle": "リクエスト", - "xpack.ingestPipelines.settingsFormFlyout.title": "プロセッサーの構成", "xpack.ingestPipelines.settingsFormOnFailureFlyout.addButtonLabel": "追加", "xpack.ingestPipelines.settingsFormOnFailureFlyout.cancelButtonLabel": "キャンセル", - "xpack.ingestPipelines.settingsFormOnFailureFlyout.title": "エラープロセッサーの構成", - "xpack.ingestPipelines.settingsFormOnFailureFlyout.updateButtonLabel": "更新", "xpack.ingestPipelines.tabs.documentsTabTitle": "ドキュメント", "xpack.ingestPipelines.tabs.outputTabTitle": "アウトプット", "xpack.ingestPipelines.testPipelineFlyout.documentsForm.documentsFieldLabel": "ドキュメント", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 4c48a66b3c3c8..69820834cad5d 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -9839,11 +9839,8 @@ "xpack.ingestPipelines.requestFlyout.descriptionText": "此 Elasticsearch 请求将创建或更新管道。", "xpack.ingestPipelines.requestFlyout.namedTitle": "对“{name}”的请求", "xpack.ingestPipelines.requestFlyout.unnamedTitle": "请求", - "xpack.ingestPipelines.settingsFormFlyout.title": "配置处理器", "xpack.ingestPipelines.settingsFormOnFailureFlyout.addButtonLabel": "添加", "xpack.ingestPipelines.settingsFormOnFailureFlyout.cancelButtonLabel": "取消", - "xpack.ingestPipelines.settingsFormOnFailureFlyout.title": "配置失败时处理器", - "xpack.ingestPipelines.settingsFormOnFailureFlyout.updateButtonLabel": "更新", "xpack.ingestPipelines.tabs.documentsTabTitle": "文档", "xpack.ingestPipelines.tabs.outputTabTitle": "输出", "xpack.ingestPipelines.testPipelineFlyout.documentsForm.documentsFieldLabel": "文档", From f9c303675978934efa41c50aecf7c8ade3cc02ce Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Tue, 11 Aug 2020 10:18:12 -0400 Subject: [PATCH 049/113] Update links that pointed to CONTRIBUTING.md (#74757) * Update links that pointed to CONTRIBUTING.md * Update .github/PULL_REQUEST_TEMPLATE.md point to master instead of 7.x --- .github/PULL_REQUEST_TEMPLATE.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 754043ee0ef77..534b1cea6242f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,12 +7,12 @@ Summarize your PR. If it involves visual changes include a screenshot or gif. Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) -- [ ] [Documentation](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#writing-documentation) was added for features that require explanation or tutorials -- [ ] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios +- [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials +- [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] This was checked for [keyboard-only and screenreader accessibility](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Accessibility#Accessibility_testing_checklist) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers -- [ ] This was checked for breaking API changes and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process) +- [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) From f621b0e2b68cd47341074a93c96ab7a5ede3d9bc Mon Sep 17 00:00:00 2001 From: Brittany Joiner Date: Tue, 11 Aug 2020 09:20:15 -0500 Subject: [PATCH 050/113] pluralized for occurrences vs occurrence (#74564) Co-authored-by: Elastic Machine --- .../components/app/ErrorGroupDetails/Distribution/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/Distribution/index.tsx b/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/Distribution/index.tsx index 80c749e58c88c..ecdd52e31730c 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/Distribution/index.tsx +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/Distribution/index.tsx @@ -107,7 +107,8 @@ export function ErrorDistribution({ distribution, title }: Props) { } formatYLong={(value: number) => i18n.translate('xpack.apm.errorGroupDetails.occurrencesLongLabel', { - defaultMessage: '{occCount} occurrences', + defaultMessage: + '{occCount} {occCount, plural, one {occurrence} other {occurrences}}', values: { occCount: value }, }) } From 461d68418c01e2b9e822c971d875993a80524e84 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Tue, 11 Aug 2020 09:25:04 -0600 Subject: [PATCH 051/113] [security solutions][lists] Adds end to end tests (#74473) ## Summary Adds initial set of end to end tests for lists You can run all of these with the command from kibana root: ```ts node scripts/functional_tests --config x-pack/test/lists_api_integration/security_and_spaces/config.ts ``` Fixes a few minor bugs found such as... * Validation for importing lists was not checking if the indexes were created first * Some wording for the error messages had duplicate words within them ### Checklist - [x] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios --- x-pack/plugins/lists/common/constants.mock.ts | 1 + .../request/create_list_item_schema.mock.ts | 17 ++ .../request/create_list_schema.mock.ts | 19 +++ .../request/import_list_item_schema.mock.ts | 9 + .../request/update_list_item_schema.mock.ts | 10 +- .../request/update_list_schema.mock.ts | 27 +++ .../request/update_list_schema.test.ts | 48 ++++++ .../schemas/response/list_item_schema.mock.ts | 13 ++ .../schemas/response/list_schema.mock.ts | 15 ++ .../server/routes/create_list_item_route.ts | 9 + .../server/routes/delete_list_item_route.ts | 2 +- .../server/routes/import_list_item_route.ts | 7 + .../lists/server/routes/patch_list_route.ts | 2 +- .../routes/update_exception_list_route.ts | 2 +- .../lists/server/routes/update_list_route.ts | 2 +- .../common/config.ts | 1 - .../lists_api_integration/common/config.ts | 69 ++++++++ .../common/ftr_provider_context.d.ts | 11 ++ .../lists_api_integration/common/services.ts | 7 + .../security_and_spaces/config.ts | 14 ++ .../tests/create_list_items.ts | 115 +++++++++++++ .../security_and_spaces/tests/create_lists.ts | 95 +++++++++++ .../tests/delete_list_items.ts | 98 +++++++++++ .../security_and_spaces/tests/delete_lists.ts | 83 ++++++++++ .../tests/export_list_items.ts | 104 ++++++++++++ .../tests/find_list_items.ts | 116 +++++++++++++ .../security_and_spaces/tests/find_lists.ts | 77 +++++++++ .../tests/import_list_items.ts | 112 +++++++++++++ .../security_and_spaces/tests/index.ts | 27 +++ .../tests/read_list_items.ts | 98 +++++++++++ .../security_and_spaces/tests/read_lists.ts | 84 ++++++++++ .../tests/update_list_items.ts | 154 ++++++++++++++++++ .../security_and_spaces/tests/update_lists.ts | 141 ++++++++++++++++ x-pack/test/lists_api_integration/utils.ts | 126 ++++++++++++++ 34 files changed, 1709 insertions(+), 6 deletions(-) create mode 100644 x-pack/plugins/lists/common/schemas/request/update_list_schema.mock.ts create mode 100644 x-pack/plugins/lists/common/schemas/request/update_list_schema.test.ts create mode 100644 x-pack/test/lists_api_integration/common/config.ts create mode 100644 x-pack/test/lists_api_integration/common/ftr_provider_context.d.ts create mode 100644 x-pack/test/lists_api_integration/common/services.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/config.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/create_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/create_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/delete_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/find_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/find_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/read_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/read_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/update_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/update_lists.ts create mode 100644 x-pack/test/lists_api_integration/utils.ts diff --git a/x-pack/plugins/lists/common/constants.mock.ts b/x-pack/plugins/lists/common/constants.mock.ts index b7609b5a3602a..428cc90d2908b 100644 --- a/x-pack/plugins/lists/common/constants.mock.ts +++ b/x-pack/plugins/lists/common/constants.mock.ts @@ -9,6 +9,7 @@ import { EntriesArray } from './schemas/types'; export const DATE_NOW = '2020-04-20T15:25:31.830Z'; export const OLD_DATE_RELATIVE_TO_DATE_NOW = '2020-04-19T15:25:31.830Z'; export const USER = 'some user'; +export const ELASTIC_USER = 'elastic'; export const LIST_INDEX = '.lists'; export const LIST_ITEM_INDEX = '.items'; export const NAME = 'some name'; diff --git a/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.mock.ts index f0d4af520bdbb..5a9e50554865b 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.mock.ts @@ -14,3 +14,20 @@ export const getCreateListItemSchemaMock = (): CreateListItemSchema => ({ meta: META, value: VALUE, }); + +/** + * Useful for end to end testing + */ +export const getCreateMinimalListItemSchemaMock = (): CreateListItemSchema => ({ + id: LIST_ITEM_ID, + list_id: LIST_ID, + value: VALUE, +}); + +/** + * Useful for end to end testing + */ +export const getCreateMinimalListItemSchemaMockWithoutId = (): CreateListItemSchema => ({ + list_id: LIST_ID, + value: VALUE, +}); diff --git a/x-pack/plugins/lists/common/schemas/request/create_list_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/create_list_schema.mock.ts index 461890b944bfa..194625c09fb79 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_list_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_list_schema.mock.ts @@ -18,3 +18,22 @@ export const getCreateListSchemaMock = (): CreateListSchema => ({ type: TYPE, version: VERSION, }); + +/** + * Useful for end to end tests and other mechanisms which want to fill in the values + */ +export const getCreateMinimalListSchemaMock = (): CreateListSchema => ({ + description: DESCRIPTION, + id: LIST_ID, + name: NAME, + type: TYPE, +}); + +/** + * Useful for end to end tests and other mechanisms which want to fill in the values + */ +export const getCreateMinimalListSchemaMockWithoutId = (): CreateListSchema => ({ + description: DESCRIPTION, + name: NAME, + type: TYPE, +}); diff --git a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.mock.ts index 69e4d2f8293c7..57bb66f746f67 100644 --- a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.mock.ts @@ -9,3 +9,12 @@ import { ImportListItemSchema } from './import_list_item_schema'; export const getImportListItemSchemaMock = (): ImportListItemSchema => ({ file: {}, }); + +/** + * This is useful for end to end tests, it will return a buffer given a string array + * of things to import. + * @param input Array of strings of things to import + */ +export const getImportListItemAsBuffer = (input: string[]): Buffer => { + return Buffer.from(input.join('\r\n')); +}; diff --git a/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.mock.ts index c95de1e99b4f0..be8ba3516a754 100644 --- a/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ID, META, VALUE } from '../../constants.mock'; +import { ID, LIST_ITEM_ID, META, VALUE } from '../../constants.mock'; import { UpdateListItemSchema } from './update_list_item_schema'; @@ -13,3 +13,11 @@ export const getUpdateListItemSchemaMock = (): UpdateListItemSchema => ({ meta: META, value: VALUE, }); + +/** + * Useful for end to end testing + */ +export const getUpdateMinimalListItemSchemaMock = (): UpdateListItemSchema => ({ + id: LIST_ITEM_ID, + value: VALUE, +}); diff --git a/x-pack/plugins/lists/common/schemas/request/update_list_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/update_list_schema.mock.ts new file mode 100644 index 0000000000000..b044d40a5d88f --- /dev/null +++ b/x-pack/plugins/lists/common/schemas/request/update_list_schema.mock.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DESCRIPTION, LIST_ID, META, NAME, _VERSION } from '../../constants.mock'; + +import { UpdateListSchema } from './update_list_schema'; + +export const getUpdateListSchemaMock = (): UpdateListSchema => ({ + _version: _VERSION, + description: DESCRIPTION, + id: LIST_ID, + meta: META, + name: NAME, +}); + +/** + * Useful for end to end tests and other mechanisms which want to fill in the values + * after doing a get of the structure. + */ +export const getUpdateMinimalListSchemaMock = (): UpdateListSchema => ({ + description: DESCRIPTION, + id: LIST_ID, + name: NAME, +}); diff --git a/x-pack/plugins/lists/common/schemas/request/update_list_schema.test.ts b/x-pack/plugins/lists/common/schemas/request/update_list_schema.test.ts new file mode 100644 index 0000000000000..21d20a6b85bce --- /dev/null +++ b/x-pack/plugins/lists/common/schemas/request/update_list_schema.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { left } from 'fp-ts/lib/Either'; +import { pipe } from 'fp-ts/lib/pipeable'; + +import { exactCheck, foldLeftRight, getPaths } from '../../shared_imports'; + +import { UpdateListSchema, updateListSchema } from './update_list_schema'; +import { getUpdateListSchemaMock } from './update_list_schema.mock'; + +describe('update_list_schema', () => { + test('it should validate a typical list request', () => { + const payload = getUpdateListSchemaMock(); + const decoded = updateListSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should accept an undefined for "meta" but strip it out', () => { + const payload = getUpdateListSchemaMock(); + const outputPayload = getUpdateListSchemaMock(); + delete payload.meta; + const decoded = updateListSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + delete outputPayload.meta; + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(outputPayload); + }); + + test('it should not allow an extra key to be sent in', () => { + const payload: UpdateListSchema & { + extraKey?: string; + } = getUpdateListSchemaMock(); + payload.extraKey = 'some new value'; + const decoded = updateListSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "extraKey"']); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/lists/common/schemas/response/list_item_schema.mock.ts b/x-pack/plugins/lists/common/schemas/response/list_item_schema.mock.ts index e122f6a2bbe3b..f4e36d1d060c0 100644 --- a/x-pack/plugins/lists/common/schemas/response/list_item_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/response/list_item_schema.mock.ts @@ -7,6 +7,7 @@ import { ListItemSchema } from '../../../common/schemas'; import { DATE_NOW, + ELASTIC_USER, LIST_ID, LIST_ITEM_ID, META, @@ -31,3 +32,15 @@ export const getListItemResponseMock = (): ListItemSchema => ({ updated_by: USER, value: VALUE, }); + +/** + * This is useful for end to end tests where we remove the auto generated parts for comparisons + * such as created_at, updated_at, and id. + */ +export const getListItemResponseMockWithoutAutoGeneratedValues = (): Partial => ({ + created_by: ELASTIC_USER, + list_id: LIST_ID, + type: TYPE, + updated_by: ELASTIC_USER, + value: VALUE, +}); diff --git a/x-pack/plugins/lists/common/schemas/response/list_schema.mock.ts b/x-pack/plugins/lists/common/schemas/response/list_schema.mock.ts index 900c7ea4322a3..4ae77e12a8294 100644 --- a/x-pack/plugins/lists/common/schemas/response/list_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/response/list_schema.mock.ts @@ -8,6 +8,7 @@ import { ListSchema } from '../../../common/schemas'; import { DATE_NOW, DESCRIPTION, + ELASTIC_USER, IMMUTABLE, LIST_ID, META, @@ -35,3 +36,17 @@ export const getListResponseMock = (): ListSchema => ({ updated_by: USER, version: VERSION, }); + +/** + * This is useful for end to end tests where we remove the auto generated parts for comparisons + * such as created_at, updated_at, and id. + */ +export const getListResponseMockWithoutAutoGeneratedValues = (): Partial => ({ + created_by: ELASTIC_USER, + description: DESCRIPTION, + immutable: IMMUTABLE, + name: NAME, + type: TYPE, + updated_by: ELASTIC_USER, + version: VERSION, +}); diff --git a/x-pack/plugins/lists/server/routes/create_list_item_route.ts b/x-pack/plugins/lists/server/routes/create_list_item_route.ts index 0a4a1c739ae7c..bd2828d331d83 100644 --- a/x-pack/plugins/lists/server/routes/create_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/create_list_item_route.ts @@ -36,6 +36,15 @@ export const createListItemRoute = (router: IRouter): void => { statusCode: 404, }); } else { + if (id != null) { + const listItem = await lists.getListItem({ id }); + if (listItem != null) { + return siemResponse.error({ + body: `list item id: "${id}" already exists`, + statusCode: 409, + }); + } + } const createdListItem = await lists.createListItem({ deserializer: list.deserializer, id, diff --git a/x-pack/plugins/lists/server/routes/delete_list_item_route.ts b/x-pack/plugins/lists/server/routes/delete_list_item_route.ts index 2284068552485..fa1adf8a39ed8 100644 --- a/x-pack/plugins/lists/server/routes/delete_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/delete_list_item_route.ts @@ -33,7 +33,7 @@ export const deleteListItemRoute = (router: IRouter): void => { const deleted = await lists.deleteListItem({ id }); if (deleted == null) { return siemResponse.error({ - body: `list item with id: "${id}" item not found`, + body: `list item with id: "${id}" not found`, statusCode: 404, }); } else { diff --git a/x-pack/plugins/lists/server/routes/import_list_item_route.ts b/x-pack/plugins/lists/server/routes/import_list_item_route.ts index ce5fdaccae251..d46c943d95fe9 100644 --- a/x-pack/plugins/lists/server/routes/import_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/import_list_item_route.ts @@ -41,6 +41,13 @@ export const importListItemRoute = (router: IRouter, config: ConfigType): void = const stream = createStreamFromBuffer(request.body); const { deserializer, list_id: listId, serializer, type } = request.query; const lists = getListClient(context); + const listExists = await lists.getListIndexExists(); + if (!listExists) { + return siemResponse.error({ + body: `To import a list item, the index must exist first. Index "${lists.getListIndex()}" does not exist`, + statusCode: 400, + }); + } if (listId != null) { const list = await lists.getList({ id: listId }); if (list == null) { diff --git a/x-pack/plugins/lists/server/routes/patch_list_route.ts b/x-pack/plugins/lists/server/routes/patch_list_route.ts index e33d8d7c9c598..763f3f495ca17 100644 --- a/x-pack/plugins/lists/server/routes/patch_list_route.ts +++ b/x-pack/plugins/lists/server/routes/patch_list_route.ts @@ -32,7 +32,7 @@ export const patchListRoute = (router: IRouter): void => { const list = await lists.updateList({ _version, description, id, meta, name, version }); if (list == null) { return siemResponse.error({ - body: `list id: "${id}" found found`, + body: `list id: "${id}" not found`, statusCode: 404, }); } else { diff --git a/x-pack/plugins/lists/server/routes/update_exception_list_route.ts b/x-pack/plugins/lists/server/routes/update_exception_list_route.ts index bead10802df4f..8102210b8430d 100644 --- a/x-pack/plugins/lists/server/routes/update_exception_list_route.ts +++ b/x-pack/plugins/lists/server/routes/update_exception_list_route.ts @@ -69,7 +69,7 @@ export const updateExceptionListRoute = (router: IRouter): void => { }); if (list == null) { return siemResponse.error({ - body: `exception list id: "${id}" found found`, + body: `exception list id: "${id}" not found`, statusCode: 404, }); } else { diff --git a/x-pack/plugins/lists/server/routes/update_list_route.ts b/x-pack/plugins/lists/server/routes/update_list_route.ts index 816ad13d3770e..8d7d08be4130b 100644 --- a/x-pack/plugins/lists/server/routes/update_list_route.ts +++ b/x-pack/plugins/lists/server/routes/update_list_route.ts @@ -32,7 +32,7 @@ export const updateListRoute = (router: IRouter): void => { const list = await lists.updateList({ _version, description, id, meta, name, version }); if (list == null) { return siemResponse.error({ - body: `list id: "${id}" found found`, + body: `list id: "${id}" not found`, statusCode: 404, }); } else { diff --git a/x-pack/test/detection_engine_api_integration/common/config.ts b/x-pack/test/detection_engine_api_integration/common/config.ts index bb9b3d9e96664..46fb877e94f23 100644 --- a/x-pack/test/detection_engine_api_integration/common/config.ts +++ b/x-pack/test/detection_engine_api_integration/common/config.ts @@ -73,7 +73,6 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) ])}`, `--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`, '--xpack.eventLog.logEntries=true', - '--xpack.lists.enabled=true', ...disabledPlugins.map((key) => `--xpack.${key}.enabled=false`), `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'alerts')}`, `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'actions')}`, diff --git a/x-pack/test/lists_api_integration/common/config.ts b/x-pack/test/lists_api_integration/common/config.ts new file mode 100644 index 0000000000000..ca3cc3a5eee2f --- /dev/null +++ b/x-pack/test/lists_api_integration/common/config.ts @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import path from 'path'; +import { CA_CERT_PATH } from '@kbn/dev-utils'; +import { FtrConfigProviderContext } from '@kbn/test/types/ftr'; +import { services } from './services'; + +interface CreateTestConfigOptions { + license: string; + disabledPlugins?: string[]; + ssl?: boolean; +} + +export function createTestConfig(name: string, options: CreateTestConfigOptions) { + const { license = 'trial', disabledPlugins = [], ssl = false } = options; + + return async ({ readConfigFile }: FtrConfigProviderContext) => { + const xPackApiIntegrationTestsConfig = await readConfigFile( + require.resolve('../../api_integration/config.ts') + ); + const servers = { + ...xPackApiIntegrationTestsConfig.get('servers'), + elasticsearch: { + ...xPackApiIntegrationTestsConfig.get('servers.elasticsearch'), + protocol: ssl ? 'https' : 'http', + }, + }; + + return { + testFiles: [require.resolve(`../${name}/tests/`)], + servers, + services, + junit: { + reportName: 'X-Pack Lists Integration Tests', + }, + esArchiver: xPackApiIntegrationTestsConfig.get('esArchiver'), + esTestCluster: { + ...xPackApiIntegrationTestsConfig.get('esTestCluster'), + license, + ssl, + serverArgs: [ + `xpack.license.self_generated.type=${license}`, + `xpack.security.enabled=${!disabledPlugins.includes('security')}`, + ], + }, + kbnTestServer: { + ...xPackApiIntegrationTestsConfig.get('kbnTestServer'), + serverArgs: [ + ...xPackApiIntegrationTestsConfig.get('kbnTestServer.serverArgs'), + ...disabledPlugins.map((key) => `--xpack.${key}.enabled=false`), + `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'alerts')}`, + `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'actions')}`, + `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'task_manager')}`, + `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'aad')}`, + ...(ssl + ? [ + `--elasticsearch.hosts=${servers.elasticsearch.protocol}://${servers.elasticsearch.hostname}:${servers.elasticsearch.port}`, + `--elasticsearch.ssl.certificateAuthorities=${CA_CERT_PATH}`, + ] + : []), + ], + }, + }; + }; +} diff --git a/x-pack/test/lists_api_integration/common/ftr_provider_context.d.ts b/x-pack/test/lists_api_integration/common/ftr_provider_context.d.ts new file mode 100644 index 0000000000000..e3add3748f56d --- /dev/null +++ b/x-pack/test/lists_api_integration/common/ftr_provider_context.d.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { GenericFtrProviderContext } from '@kbn/test/types/ftr'; + +import { services } from './services'; + +export type FtrProviderContext = GenericFtrProviderContext; diff --git a/x-pack/test/lists_api_integration/common/services.ts b/x-pack/test/lists_api_integration/common/services.ts new file mode 100644 index 0000000000000..a927a31469bab --- /dev/null +++ b/x-pack/test/lists_api_integration/common/services.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { services } from '../../api_integration/services'; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/config.ts b/x-pack/test/lists_api_integration/security_and_spaces/config.ts new file mode 100644 index 0000000000000..081b901c47fc3 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/config.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { createTestConfig } from '../common/config'; + +// eslint-disable-next-line import/no-default-export +export default createTestConfig('security_and_spaces', { + disabledPlugins: [], + license: 'trial', + ssl: true, +}); diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_list_items.ts new file mode 100644 index 0000000000000..906e9a9ef4456 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_list_items.ts @@ -0,0 +1,115 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { LIST_URL, LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; + +import { + getCreateMinimalListItemSchemaMock, + getCreateMinimalListItemSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; + +import { + createListsIndex, + deleteListsIndex, + removeListItemServerGeneratedProperties, +} from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('create_list_items', () => { + describe('validation errors', () => { + it('should give a 404 error that the list must exist first before being able to add a list item', async () => { + const { body } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(404); + + expect(body).to.eql({ + message: 'list id: "some-list-id" does not exist', + status_code: 404, + }); + }); + }); + + describe('creating list items', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should create a simple list item with a list item id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should create a simple list item without an id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMockWithoutId()) + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should cause a 409 conflict if we attempt to create the same list item twice', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(409); + + expect(body).to.eql({ + message: 'list item id: "some-list-item-id" already exists', + status_code: 409, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_lists.ts new file mode 100644 index 0000000000000..b9d61eeacfee8 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_lists.ts @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { LIST_URL } from '../../../../plugins/lists/common/constants'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { + getCreateMinimalListSchemaMock, + getCreateMinimalListSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; + +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, +} from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('create_lists', () => { + describe('validation errors', () => { + it('should give an error that the index must exist first if it does not exist before creating a list', async () => { + const { body } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(400); + + expect(body).to.eql({ + message: + 'To create a list, the index must exist first. Index ".lists-default" does not exist', + status_code: 400, + }); + }); + }); + + describe('creating lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should create a simple list with a list_id', async () => { + const { body } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should create a simple list without a list_id', async () => { + const { body } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMockWithoutId()) + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should cause a 409 conflict if we attempt to create the same list_id twice', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(409); + + expect(body).to.eql({ + message: 'list id: "some-list-id" already exists', + status_code: 409, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_list_items.ts new file mode 100644 index 0000000000000..83ba9728efdc9 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_list_items.ts @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; +import { getCreateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL, LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListItemServerGeneratedProperties, +} from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('delete_list_items', () => { + describe('deleting list items', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should delete a single list item with a list item id', async () => { + // create a list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // create a list item + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + // delete the list item by its list item id + const { body } = await supertest + .delete(`${LIST_ITEM_URL}?id=${getCreateMinimalListItemSchemaMock().id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should delete a single list using an auto generated id', async () => { + // create a list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // create a list item + const { body: bodyWithCreateListItem } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + // delete that list by its auto-generated id + const { body } = await supertest + .delete(`${LIST_ITEM_URL}?id=${bodyWithCreateListItem.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should return an error if the id does not exist when trying to delete it', async () => { + const { body } = await supertest + .delete(`${LIST_ITEM_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + message: 'list item with id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" not found', + status_code: 404, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts new file mode 100644 index 0000000000000..3703e1b6ca306 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, +} from '../../utils'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('delete_lists', () => { + describe('deleting lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should delete a single list with a list id', async () => { + // create a list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // delete the list by its list id + const { body } = await supertest + .delete(`${LIST_URL}?id=${getCreateMinimalListSchemaMock().id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should delete a single list using an auto generated id', async () => { + // add a list + const { body: bodyWithCreatedList } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // delete that list by its auto-generated id + const { body } = await supertest + .delete(`${LIST_URL}?id=${bodyWithCreatedList.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should return an error if the id does not exist when trying to delete it', async () => { + const { body } = await supertest + .delete(`${LIST_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + message: 'list id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" was not found', + status_code: 404, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts new file mode 100644 index 0000000000000..6fe783fc497f2 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { getCreateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { LIST_ID, NAME } from '../../../../plugins/lists/common/constants.mock'; +import { CreateListItemSchema } from '../../../../plugins/lists/common/schemas'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +import { LIST_ITEM_URL, LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { createListsIndex, deleteListsIndex, binaryToString } from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext): void => { + const supertest = getService('supertest'); + + describe('export_list_items', () => { + describe('exporting lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should set the response content types to be expected', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + await supertest + .post(`${LIST_ITEM_URL}/_export?list_id=${LIST_ID}`) + .set('kbn-xsrf', 'true') + .expect('Content-Disposition', `attachment; filename="${NAME}"`) + .expect(200); + }); + + it('should export a single list item with a list id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(`${LIST_ITEM_URL}/_export?list_id=${LIST_ID}`) + .set('kbn-xsrf', 'true') + .expect(200) + .parse(binaryToString); + + expect(body.toString()).to.eql('127.0.0.1\n'); + }); + + it('should export two list items with a list id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const secondList: CreateListItemSchema = { + ...getCreateMinimalListItemSchemaMock(), + id: 'list-item-2', + value: '127.0.0.2', + }; + await supertest.post(LIST_ITEM_URL).set('kbn-xsrf', 'true').send(secondList).expect(200); + + const { body } = await supertest + .post(`${LIST_ITEM_URL}/_export?list_id=${LIST_ID}`) + .set('kbn-xsrf', 'true') + .expect(200) + .parse(binaryToString); + + expect(body.toString()).to.eql('127.0.0.2\n127.0.0.1\n'); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_list_items.ts new file mode 100644 index 0000000000000..4c1f3dfdb6703 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_list_items.ts @@ -0,0 +1,116 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { LIST_ITEM_ID, LIST_ID } from '../../../../plugins/lists/common/constants.mock'; +import { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; +import { getCreateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL, LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListItemServerGeneratedProperties, +} from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext): void => { + const supertest = getService('supertest'); + + describe('find_list_items', () => { + describe('find list items', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should give a validation error if the list_id is not supplied', async () => { + const { body } = await supertest + .get(`${LIST_ITEM_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(400); + + expect(body).to.eql({ + error: 'Bad Request', + message: '[request query]: Invalid value "undefined" supplied to "list_id"', + statusCode: 400, + }); + }); + + it('should give a 404 if the list has not been created yet', async () => { + const { body } = await supertest + .get(`${LIST_ITEM_URL}/_find?list_id=${LIST_ITEM_ID}`) + .set('kbn-xsrf', 'true') + .send() + .expect(404); + + expect(body).to.eql({ + message: 'list id: "some-list-item-id" does not exist', + status_code: 404, + }); + }); + + it('should return an empty find body correctly if no list items are loaded', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_ITEM_URL}/_find?list_id=${LIST_ID}`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql({ + cursor: 'WzBd', + data: [], + page: 1, + per_page: 20, + total: 0, + }); + }); + + it('should return a single list item when a single list item is loaded from a find with defaults added', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_ITEM_URL}/_find?list_id=${LIST_ID}`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + body.data = [removeListItemServerGeneratedProperties(body.data[0])]; + // cursor is a constant changing value so we have to delete it as well. + delete body.cursor; + expect(body).to.eql({ + data: [getListItemResponseMockWithoutAutoGeneratedValues()], + page: 1, + per_page: 20, + total: 1, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_lists.ts new file mode 100644 index 0000000000000..7efe28a0b01a1 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_lists.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, +} from '../../utils'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext): void => { + const supertest = getService('supertest'); + + describe('find_lists', () => { + describe('find lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should return an empty find body correctly if no lists are loaded', async () => { + const { body } = await supertest + .get(`${LIST_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql({ + cursor: 'WzBd', + data: [], + page: 1, + per_page: 20, + total: 0, + }); + }); + + it('should return a single list when a single list is loaded from a find with defaults added', async () => { + // add a single list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // query the single list from _find + const { body } = await supertest + .get(`${LIST_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + body.data = [removeListServerGeneratedProperties(body.data[0])]; + // cursor is a constant changing value so we have to delete it as well. + delete body.cursor; + expect(body).to.eql({ + data: [getListResponseMockWithoutAutoGeneratedValues()], + page: 1, + per_page: 20, + total: 1, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts new file mode 100644 index 0000000000000..4befb6bbaf050 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { ListItemSchema } from '../../../../plugins/lists/common/schemas'; +import { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; +import { ListSchema } from '../../../../plugins/lists/common'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +import { LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; + +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, + removeListItemServerGeneratedProperties, + waitFor, +} from '../../utils'; + +import { getImportListItemAsBuffer } from '../../../../plugins/lists/common/schemas/request/import_list_item_schema.mock'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext): void => { + const supertest = getService('supertest'); + + describe('import_list_items', () => { + describe('importing list items without an index', () => { + it('should not import a list item if the index does not exist yet', async () => { + const { body } = await supertest + .post(`${LIST_ITEM_URL}/_import?type=ip`) + .set('kbn-xsrf', 'true') + .attach('file', getImportListItemAsBuffer(['127.0.0.1', '127.0.0.2']), 'list_items.txt') + .expect('Content-Type', 'application/json; charset=utf-8') + .expect(400); + + expect(body).to.eql({ + status_code: 400, + message: + 'To import a list item, the index must exist first. Index ".lists-default" does not exist', + }); + }); + }); + + describe('importing rules with an index', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should set the response content types to be expected when importing two items', async () => { + await supertest + .post(`${LIST_ITEM_URL}/_import?type=ip`) + .set('kbn-xsrf', 'true') + .attach('file', getImportListItemAsBuffer(['127.0.0.1', '127.0.0.2']), 'list_items.txt') + .expect('Content-Type', 'application/json; charset=utf-8') + .expect(200); + }); + + it('should report that it imported a simple list successfully', async () => { + const { body } = await supertest + .post(`${LIST_ITEM_URL}/_import?type=ip`) + .set('kbn-xsrf', 'true') + .attach('file', getImportListItemAsBuffer(['127.0.0.1', '127.0.0.2']), 'list_items.txt') + .expect('Content-Type', 'application/json; charset=utf-8') + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + const outputtedList: Partial = { + ...getListResponseMockWithoutAutoGeneratedValues(), + name: 'list_items.txt', + description: 'File uploaded from file system of list_items.txt', + }; + expect(bodyToCompare).to.eql(outputtedList); + }); + + it('should be able to read imported list items back out correctly', async () => { + await supertest + .post(`${LIST_ITEM_URL}/_import?type=ip`) + .set('kbn-xsrf', 'true') + .attach('file', getImportListItemAsBuffer(['127.0.0.1', '127.0.0.2']), 'list_items.txt') + .expect(200); + + // Although we try to be aggressive with waitFor in the lists code base, there is still not guarantees + // that we will have the data just yet so we have to do a waitFor here for when it shows up + await waitFor(async () => { + const { status } = await supertest + .get(`${LIST_ITEM_URL}?list_id=list_items.txt&value=127.0.0.1`) + .send(); + return status !== 404; + }); + const { body } = await supertest + .get(`${LIST_ITEM_URL}?list_id=list_items.txt&value=127.0.0.1`) + .send() + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body[0]); + const outputtedList: Partial = { + ...getListItemResponseMockWithoutAutoGeneratedValues(), + list_id: 'list_items.txt', + }; + expect(bodyToCompare).to.eql(outputtedList); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts new file mode 100644 index 0000000000000..302877a680aa6 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default ({ loadTestFile }: FtrProviderContext): void => { + describe('lists api security and spaces enabled', function () { + this.tags('ciGroup1'); + + loadTestFile(require.resolve('./create_lists')); + loadTestFile(require.resolve('./create_list_items')); + loadTestFile(require.resolve('./read_lists')); + loadTestFile(require.resolve('./read_list_items')); + loadTestFile(require.resolve('./update_lists')); + loadTestFile(require.resolve('./update_list_items')); + loadTestFile(require.resolve('./delete_lists')); + loadTestFile(require.resolve('./delete_list_items')); + loadTestFile(require.resolve('./find_lists')); + loadTestFile(require.resolve('./find_list_items')); + loadTestFile(require.resolve('./import_list_items')); + loadTestFile(require.resolve('./export_list_items')); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_list_items.ts new file mode 100644 index 0000000000000..5469973d70e50 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_list_items.ts @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; +import { getCreateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL, LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListItemServerGeneratedProperties, +} from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('read_list_items', () => { + describe('reading list items', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should be able to read a single list item using id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_ITEM_URL}?id=${getCreateMinimalListItemSchemaMock().id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should be able to read a single list item with an auto-generated list id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body: createListBody } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_ITEM_URL}?id=${createListBody.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should return 404 if given a fake id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_ITEM_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'list item id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_lists.ts new file mode 100644 index 0000000000000..c3c8cb39d023b --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_lists.ts @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { + getCreateMinimalListSchemaMock, + getCreateMinimalListSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, +} from '../../utils'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('read_lists', () => { + describe('reading lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should be able to read a single list using id', async () => { + // create a simple list to read + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_URL}?id=${getCreateMinimalListSchemaMock().id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should be able to read a single list with an auto-generated list id', async () => { + // create a simple list to read + const { body: createListBody } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMockWithoutId()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_URL}?id=${createListBody.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should return 404 if given a fake id', async () => { + const { body } = await supertest + .get(`${LIST_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'list id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_list_items.ts new file mode 100644 index 0000000000000..3ff496216eb71 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_list_items.ts @@ -0,0 +1,154 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; +import { getCreateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL, LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListItemServerGeneratedProperties, +} from '../../utils'; +import { getUpdateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/update_list_item_schema.mock'; +import { + UpdateListItemSchema, + CreateListItemSchema, + ListItemSchema, +} from '../../../../plugins/lists/common/schemas'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('update_list_items', () => { + describe('update list items', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should update a single list item property of value using an id', async () => { + // create a simple list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // create a simple list item + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + // update a simple list item's value + const updatedListItem: UpdateListItemSchema = { + ...getUpdateMinimalListItemSchemaMock(), + value: '192.168.0.2', + }; + + const { body } = await supertest + .put(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(updatedListItem) + .expect(200); + + const outputListItem: Partial = { + ...getListItemResponseMockWithoutAutoGeneratedValues(), + value: '192.168.0.2', + }; + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputListItem); + }); + + it('should update a single list item of value using an auto-generated id of both list and list item', async () => { + const { id, ...listNoId } = getCreateMinimalListSchemaMock(); + // create a simple list with no id which will use an auto-generated id + const { body: createListBody } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(listNoId) + .expect(200); + + // create a simple list item also with an auto-generated id using the list's auto-generated id + const listItem: CreateListItemSchema = { + ...getCreateMinimalListItemSchemaMock(), + list_id: createListBody.id, + }; + const { body: createListItemBody } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(listItem) + .expect(200); + + // update a simple list item's value + const updatedList: UpdateListItemSchema = { + ...getUpdateMinimalListItemSchemaMock(), + id: createListItemBody.id, + value: '192.168.0.2', + }; + const { body } = await supertest + .put(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(200); + + const outputListItem: Partial = { + ...getListItemResponseMockWithoutAutoGeneratedValues(), + value: '192.168.0.2', + }; + const bodyToCompare = { + ...removeListItemServerGeneratedProperties(body), + list_id: outputListItem.list_id, + }; + expect(bodyToCompare).to.eql(outputListItem); + }); + + it('should give a 404 if it is given a fake id', async () => { + // create a simple list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // create a simple list item + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + // update a simple list item's value + const updatedListItem: UpdateListItemSchema = { + ...getUpdateMinimalListItemSchemaMock(), + id: 'some-other-id', + value: '192.168.0.2', + }; + + const { body } = await supertest + .put(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(updatedListItem) + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'list item id: "some-other-id" not found', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_lists.ts new file mode 100644 index 0000000000000..04d77ffe21370 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_lists.ts @@ -0,0 +1,141 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, +} from '../../utils'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; +import { getUpdateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/update_list_schema.mock'; +import { UpdateListSchema, ListSchema } from '../../../../plugins/lists/common/schemas'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('update_lists', () => { + describe('update lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should update a single list property of name using an id', async () => { + // create a simple list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // update a simple list's name + const updatedList: UpdateListSchema = { + ...getUpdateMinimalListSchemaMock(), + name: 'some other name', + }; + + const { body } = await supertest + .put(LIST_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(200); + + const outputList: Partial = { + ...getListResponseMockWithoutAutoGeneratedValues(), + name: 'some other name', + version: 2, + }; + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputList); + }); + + it('should update a single list property of name using an auto-generated id', async () => { + const { id, ...listNoId } = getCreateMinimalListSchemaMock(); + // create a simple list with no id which will use an auto-generated id + const { body: createListBody } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(listNoId) + .expect(200); + + // update a simple list's name + const updatedList: UpdateListSchema = { + ...getUpdateMinimalListSchemaMock(), + id: createListBody.id, + name: 'some other name', + }; + const { body } = await supertest + .put(LIST_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(200); + + const outputList: Partial = { + ...getListResponseMockWithoutAutoGeneratedValues(), + name: 'some other name', + version: 2, + }; + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputList); + }); + + it('should change the version of a list when it updates a property', async () => { + // create a simple list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // update a simple list property of name and description + const updatedList: UpdateListSchema = { + ...getUpdateMinimalListSchemaMock(), + name: 'some other name', + description: 'some other description', + }; + + const { body } = await supertest.put(LIST_URL).set('kbn-xsrf', 'true').send(updatedList); + + const outputList: Partial = { + ...getListResponseMockWithoutAutoGeneratedValues(), + name: 'some other name', + description: 'some other description', + version: 2, + }; + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputList); + }); + + it('should give a 404 if it is given a fake id', async () => { + const simpleList: UpdateListSchema = { + ...getUpdateMinimalListSchemaMock(), + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', + }; + const { body } = await supertest + .put(LIST_URL) + .set('kbn-xsrf', 'true') + .send(simpleList) + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'list id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/utils.ts b/x-pack/test/lists_api_integration/utils.ts new file mode 100644 index 0000000000000..272768fdf50b3 --- /dev/null +++ b/x-pack/test/lists_api_integration/utils.ts @@ -0,0 +1,126 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SuperTest } from 'supertest'; +import supertestAsPromised from 'supertest-as-promised'; + +import { ListItemSchema } from '../../plugins/lists/common/schemas'; +import { ListSchema } from '../../plugins/lists/common'; +import { LIST_INDEX } from '../../plugins/lists/common/constants'; + +/** + * Creates the lists and lists items index for use inside of beforeEach blocks of tests + * This will retry 20 times before giving up and hopefully still not interfere with other tests + * @param supertest The supertest client library + */ +export const createListsIndex = async ( + supertest: SuperTest, + retryCount = 20 +): Promise => { + if (retryCount > 0) { + try { + await supertest.post(LIST_INDEX).set('kbn-xsrf', 'true').send(); + } catch (err) { + // eslint-disable-next-line no-console + console.log( + `Failure trying to create the lists index, retries left are: ${retryCount - 1}`, + err + ); + await createListsIndex(supertest, retryCount - 1); + } + } else { + // eslint-disable-next-line no-console + console.log('Could not createListsIndex, no retries are left'); + } +}; + +/** + * Deletes the lists index for use inside of afterEach blocks of tests + * @param supertest The supertest client library + */ +export const deleteListsIndex = async ( + supertest: SuperTest, + retryCount = 20 +): Promise => { + if (retryCount > 0) { + try { + await supertest.delete(LIST_INDEX).set('kbn-xsrf', 'true').send(); + } catch (err) { + // eslint-disable-next-line no-console + console.log(`Failure trying to deleteListsIndex, retries left are: ${retryCount - 1}`, err); + await deleteListsIndex(supertest, retryCount - 1); + } + } else { + // eslint-disable-next-line no-console + console.log('Could not deleteListsIndex, no retries are left'); + } +}; + +/** + * This will remove server generated properties such as date times, etc... + * @param list List to pass in to remove typical server generated properties + */ +export const removeListServerGeneratedProperties = ( + list: Partial +): Partial => { + /* eslint-disable-next-line @typescript-eslint/naming-convention */ + const { created_at, updated_at, id, tie_breaker_id, _version, ...removedProperties } = list; + return removedProperties; +}; + +/** + * This will remove server generated properties such as date times, etc... + * @param list List to pass in to remove typical server generated properties + */ +export const removeListItemServerGeneratedProperties = ( + list: Partial +): Partial => { + /* eslint-disable-next-line @typescript-eslint/naming-convention */ + const { created_at, updated_at, id, tie_breaker_id, _version, ...removedProperties } = list; + return removedProperties; +}; + +// Similar to ReactJs's waitFor from here: https://testing-library.com/docs/dom-testing-library/api-async#waitfor +export const waitFor = async ( + functionToTest: () => Promise, + maxTimeout: number = 5000, + timeoutWait: number = 10 +) => { + await new Promise(async (resolve, reject) => { + let found = false; + let numberOfTries = 0; + while (!found && numberOfTries < Math.floor(maxTimeout / timeoutWait)) { + const itPasses = await functionToTest(); + if (itPasses) { + found = true; + } else { + numberOfTries++; + } + await new Promise((resolveTimeout) => setTimeout(resolveTimeout, timeoutWait)); + } + if (found) { + resolve(); + } else { + reject(new Error('timed out waiting for function condition to be true')); + } + }); +}; + +/** + * Useful for export_api testing to convert from a multi-part binary back to a string + * @param res Response + * @param callback Callback + */ +export const binaryToString = (res: any, callback: any): void => { + res.setEncoding('binary'); + res.data = ''; + res.on('data', (chunk: any) => { + res.data += chunk; + }); + res.on('end', () => { + callback(null, Buffer.from(res.data)); + }); +}; From bc0b4821ad747aeae82422316da5505d361be46f Mon Sep 17 00:00:00 2001 From: Corey Robertson Date: Tue, 11 Aug 2020 11:36:08 -0400 Subject: [PATCH 052/113] [Canvas][tech-debt] Convert renderers (#74134) * Convert renderers to typescript * Fix typo * Fix type issues * Fixes * Fix issue with data table render Co-authored-by: Elastic Machine --- .../functions/browser/markdown.ts | 2 +- .../functions/common/containerStyle.ts | 1 - .../functions/common/image.ts | 3 +- .../functions/common/index.ts | 2 +- .../canvas_plugin_src/functions/common/pie.ts | 2 +- .../functions/common/progress.ts | 6 ++- .../functions/common/repeat_image.test.js | 2 +- .../{repeatImage.ts => repeat_image.ts} | 9 +++- .../functions/common/revealImage.ts | 10 +++- .../functions/common/shape.ts | 2 +- .../functions/common/table.ts | 4 +- .../lib/{elastic_logo.js => elastic_logo.ts} | 0 ...{elastic_outline.js => elastic_outline.ts} | 0 .../canvas/canvas_plugin_src/plugin.ts | 1 - .../renderers/{core.js => core.ts} | 0 .../renderers/{debug.js => debug.tsx} | 3 +- .../renderers/embeddable/embeddable.tsx | 13 +++-- .../renderers/error/{index.js => index.tsx} | 11 +++-- .../filters/advanced_filter/index.tsx | 2 +- .../renderers/filters/{index.js => index.ts} | 0 .../renderers/{image.js => image.tsx} | 4 +- .../renderers/{index.js => index.ts} | 0 .../markdown/{index.js => index.tsx} | 8 +-- .../renderers/pie/{index.js => index.tsx} | 26 +++++++--- .../renderers/plot/{index.js => index.ts} | 12 +++-- .../renderers/progress/{index.js => index.ts} | 49 ++++++++++--------- .../progress/shapes/{index.js => index.ts} | 0 .../{repeat_image.js => repeat_image.ts} | 14 +++--- .../reveal_image/{index.js => index.ts} | 19 ++++--- .../renderers/shape/{index.js => index.ts} | 28 ++++++----- .../renderers/{table.js => table.tsx} | 20 +++++--- .../renderers/{text.js => text.tsx} | 7 +-- x-pack/plugins/canvas/common/lib/index.ts | 2 - .../{missing_asset.js => missing_asset.ts} | 0 .../common/lib/{url.test.js => url.test.ts} | 0 .../canvas/common/lib/{url.js => url.ts} | 2 +- .../i18n/functions/dict/repeat_image.ts | 2 +- .../components/error/{error.js => error.tsx} | 10 +++- .../components/error/{index.js => index.ts} | 0 .../{show_debugging.js => show_debugging.tsx} | 17 +++---- x-pack/plugins/canvas/public/plugin_api.ts | 12 +++-- .../public/services/stubs/expressions.ts | 13 ++--- .../__stories__/rendered_element.stories.tsx | 1 - .../components/rendered_element.tsx | 4 +- x-pack/plugins/canvas/types/renderers.ts | 3 ++ 45 files changed, 197 insertions(+), 129 deletions(-) rename x-pack/plugins/canvas/canvas_plugin_src/functions/common/{repeatImage.ts => repeat_image.ts} (93%) rename x-pack/plugins/canvas/canvas_plugin_src/lib/{elastic_logo.js => elastic_logo.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/lib/{elastic_outline.js => elastic_outline.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{core.js => core.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{debug.js => debug.tsx} (91%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/error/{index.js => index.tsx} (84%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/{index.js => index.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{image.js => image.tsx} (86%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{index.js => index.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/{index.js => index.tsx} (78%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/{index.js => index.tsx} (74%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/{index.js => index.ts} (82%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/{index.js => index.ts} (64%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/{index.js => index.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{repeat_image.js => repeat_image.ts} (81%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/{index.js => index.ts} (80%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/{index.js => index.ts} (73%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{table.js => table.tsx} (61%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{text.js => text.tsx} (71%) rename x-pack/plugins/canvas/common/lib/{missing_asset.js => missing_asset.ts} (100%) rename x-pack/plugins/canvas/common/lib/{url.test.js => url.test.ts} (100%) rename x-pack/plugins/canvas/common/lib/{url.js => url.ts} (90%) rename x-pack/plugins/canvas/public/components/error/{error.js => error.tsx} (86%) rename x-pack/plugins/canvas/public/components/error/{index.js => index.ts} (100%) rename x-pack/plugins/canvas/public/components/error/{show_debugging.js => show_debugging.tsx} (64%) diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts index e44fb903ef042..947106fd9397a 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts @@ -22,7 +22,7 @@ interface Arguments { openLinksInNewTab: boolean; } -interface Return { +export interface Return { content: string; font: Style; openLinksInNewTab: boolean; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts index 09ce2b2bf1755..93e4a3636b914 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts @@ -6,7 +6,6 @@ import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common'; import { ContainerStyle, Overflow, BackgroundRepeat, BackgroundSize } from '../../../types'; import { getFunctionHelp, getFunctionErrors } from '../../../i18n'; -// @ts-expect-error untyped local import { isValidUrl } from '../../../common/lib/url'; interface Output extends ContainerStyle { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts index 3ef956b41ce20..21157660ed414 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts @@ -8,7 +8,6 @@ import { getFunctionHelp, getFunctionErrors } from '../../../i18n'; // @ts-expect-error untyped local import { resolveWithMissingImage } from '../../../common/lib/resolve_dataurl'; -// @ts-expect-error .png file import { elasticLogo } from '../../lib/elastic_logo'; export enum ImageMode { @@ -22,7 +21,7 @@ interface Arguments { mode: ImageMode | null; } -interface Return { +export interface Return { type: 'image'; mode: string; dataurl: string; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts index 79538941bbbfa..5ec831efbe35f 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts @@ -46,7 +46,7 @@ import { render } from './render'; import { replace } from './replace'; import { rounddate } from './rounddate'; import { rowCount } from './rowCount'; -import { repeatImage } from './repeatImage'; +import { repeatImage } from './repeat_image'; import { revealImage } from './revealImage'; import { seriesStyle } from './seriesStyle'; import { shape } from './shape'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/pie.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/pie.ts index c32c553fffc1b..16eee349475ef 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/pie.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/pie.ts @@ -57,7 +57,7 @@ interface PieData { color?: string; } -interface Pie { +export interface Pie { font: Style; data: PieData[]; options: PieOptions; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.ts index 6fc1e509cd5e6..4c4dba3ef7a3b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.ts @@ -20,7 +20,7 @@ export enum Shape { WHEEL = 'wheel', } -interface Arguments { +export interface Arguments { barColor: string; barWeight: number; font: Style; @@ -31,6 +31,10 @@ interface Arguments { valueWeight: number; } +export type Output = Arguments & { + value: number; +}; + export function progress(): ExpressionFunctionDefinition< 'progress', number, diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js index 723c5eb4c6823..f7c1ecc94a240 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js @@ -7,7 +7,7 @@ import { functionWrapper } from '../../../__tests__/helpers/function_wrapper'; import { elasticOutline } from '../../lib/elastic_outline'; import { elasticLogo } from '../../lib/elastic_logo'; -import { repeatImage } from './repeatImage'; +import { repeatImage } from './repeat_image'; describe('repeatImage', () => { const fn = functionWrapper(repeatImage); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeatImage.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.ts similarity index 93% rename from x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeatImage.ts rename to x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.ts index 9e296f2b9a92a..cbb118c0db807 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeatImage.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.ts @@ -7,7 +7,6 @@ import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common'; // @ts-expect-error untyped local import { resolveWithMissingImage } from '../../../common/lib/resolve_dataurl'; -// @ts-expect-error .png file import { elasticOutline } from '../../lib/elastic_outline'; import { Render } from '../../../types'; import { getFunctionHelp } from '../../../i18n'; @@ -19,6 +18,14 @@ interface Arguments { emptyImage: string | null; } +export interface Return { + count: number; + image: string; + size: number; + max: number; + emptyImage: string | null; +} + export function repeatImage(): ExpressionFunctionDefinition< 'repeatImage', number, diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts index 3e721cc49b411..9288a417f9d29 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts @@ -7,7 +7,6 @@ import { ExpressionFunctionDefinition, ExpressionValueRender } from 'src/plugins/expressions'; // @ts-expect-error untyped local import { resolveWithMissingImage } from '../../../common/lib/resolve_dataurl'; -// @ts-expect-error .png file import { elasticOutline } from '../../lib/elastic_outline'; import { getFunctionHelp, getFunctionErrors } from '../../../i18n'; @@ -24,11 +23,18 @@ interface Arguments { origin: Origin; } +export interface Output { + image: string; + emptyImage: string; + origin: Origin; + percent: number; +} + export function revealImage(): ExpressionFunctionDefinition< 'revealImage', number, Arguments, - ExpressionValueRender + ExpressionValueRender > { const { help, args: argHelp } = getFunctionHelp().revealImage; const errors = getFunctionErrors().revealImage; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/shape.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/shape.ts index a3fedebd36cfe..e7178ab4eef5b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/shape.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/shape.ts @@ -34,7 +34,7 @@ interface Arguments { maintainAspect: boolean; } -interface Output extends Arguments { +export interface Output extends Arguments { type: 'shape'; } diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.ts index 689f3f969d1c8..744d426d3bc6c 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.ts @@ -15,11 +15,13 @@ interface Arguments { showHeader: boolean; } +export type Return = { datatable: Datatable } & Arguments; + export function table(): ExpressionFunctionDefinition< 'table', Datatable, Arguments, - Render + Render > { const { help, args: argHelp } = getFunctionHelp().table; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.js b/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.js rename to x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.js b/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.js rename to x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/plugin.ts b/x-pack/plugins/canvas/canvas_plugin_src/plugin.ts index 59f0287805eac..55f5319bbadb7 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/plugin.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/plugin.ts @@ -12,7 +12,6 @@ import { Start as InspectorStart } from '../../../../src/plugins/inspector/publi import { functions } from './functions/browser'; import { typeFunctions } from './expression_types'; -// @ts-expect-error: untyped local import { renderFunctions, renderFunctionFactories } from './renderers'; import { initializeElements } from './elements'; // @ts-expect-error untyped local diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/core.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/core.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/core.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/core.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.tsx similarity index 91% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.tsx index 79ec0078fa98a..b4fbba96e8dfb 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.tsx @@ -8,10 +8,11 @@ import ReactDOM from 'react-dom'; import React from 'react'; import { Debug } from '../../public/components/debug'; import { RendererStrings } from '../../i18n'; +import { RendererFactory } from '../../types'; const { debug: strings } = RendererStrings; -export const debug = () => ({ +export const debug: RendererFactory = () => ({ name: 'debug', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx index ad368a912cd8c..641580d9c58a5 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx @@ -17,7 +17,7 @@ import { EmbeddableExpression } from '../../expression_types/embeddable'; import { RendererStrings } from '../../../i18n'; import { embeddableInputToExpression } from './embeddable_input_to_expression'; import { EmbeddableInput } from '../../expression_types'; -import { RendererHandlers } from '../../../types'; +import { RendererFactory } from '../../../types'; import { CANVAS_EMBEDDABLE_CLASSNAME } from '../../../common/lib'; const { embeddable: strings } = RendererStrings; @@ -43,18 +43,17 @@ const renderEmbeddableFactory = (core: CoreStart, plugins: StartDeps) => { }; }; -export const embeddableRendererFactory = (core: CoreStart, plugins: StartDeps) => { +export const embeddableRendererFactory = ( + core: CoreStart, + plugins: StartDeps +): RendererFactory> => { const renderEmbeddable = renderEmbeddableFactory(core, plugins); return () => ({ name: 'embeddable', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), reuseDomNode: true, - render: async ( - domNode: HTMLElement, - { input, embeddableType }: EmbeddableExpression, - handlers: RendererHandlers - ) => { + render: async (domNode, { input, embeddableType }, handlers) => { const uniqueId = handlers.getElementId(); if (!embeddablesRegistry[uniqueId]) { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.tsx similarity index 84% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.tsx index b7e3fc300a189..a9296bd9a1241 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.tsx @@ -5,15 +5,20 @@ */ import ReactDOM from 'react-dom'; -import React from 'react'; +import React, { MouseEventHandler } from 'react'; import { EuiIcon } from '@elastic/eui'; import { Error } from '../../../public/components/error'; import { Popover } from '../../../public/components/popover'; import { RendererStrings } from '../../../i18n'; +import { RendererFactory } from '../../../types'; + +interface Config { + error: Error; +} const { error: strings } = RendererStrings; -export const error = () => ({ +export const error: RendererFactory = () => ({ name: 'error', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), @@ -21,7 +26,7 @@ export const error = () => ({ render(domNode, config, handlers) { const draw = () => { const buttonSize = Math.min(domNode.clientHeight, domNode.clientWidth); - const button = (handleClick) => ( + const button = (handleClick: MouseEventHandler) => ( ({ +export const advancedFilter: RendererFactory<{}> = () => ({ name: 'advanced_filter', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/index.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/index.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.tsx similarity index 86% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/image.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/image.tsx index fd76f0106f7d5..cbd81f0143da8 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.tsx @@ -8,11 +8,13 @@ import ReactDOM from 'react-dom'; import React from 'react'; import { elasticLogo } from '../lib/elastic_logo'; import { isValidUrl } from '../../common/lib/url'; +import { Return as Arguments } from '../functions/common/image'; import { RendererStrings } from '../../i18n'; +import { RendererFactory } from '../../types'; const { image: strings } = RendererStrings; -export const image = () => ({ +export const image: RendererFactory = () => ({ name: 'image', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/index.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx similarity index 78% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx index a7b0f620cf710..1ce05b77a5109 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx @@ -4,14 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { CSSProperties } from 'react'; import ReactDOM from 'react-dom'; import { RendererStrings } from '../../../i18n'; +import { Return as Config } from '../../functions/browser/markdown'; import { Markdown } from '../../../../../../src/plugins/kibana_react/public'; +import { RendererFactory } from '../../../types'; const { markdown: strings } = RendererStrings; -export const markdown = () => ({ +export const markdown: RendererFactory = () => ({ name: 'markdown', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), @@ -22,7 +24,7 @@ export const markdown = () => ({ ReactDOM.render( , diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.tsx similarity index 74% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.tsx index cb423af30094c..622e73ccf2223 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.tsx @@ -10,11 +10,14 @@ import '../../lib/flot-charts'; import { debounce, includes } from 'lodash'; import { RendererStrings } from '../../../i18n'; +// @ts-expect-error Untyped local: Will not convert import { pie as piePlugin } from './plugins/pie'; +import { Pie } from '../../functions/common/pie'; +import { RendererFactory } from '../../../types'; const { pie: strings } = RendererStrings; -export const pie = () => ({ +export const pie: RendererFactory = () => ({ name: 'pie', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), @@ -27,7 +30,10 @@ export const pie = () => ({ config.options.legend.labelBoxBorderColor = 'transparent'; if (config.font) { - const labelFormatter = (label, slice) => { + const labelFormatter = ( + label: string, + slice: jquery.flot.dataSeries & { percent: number } + ) => { // font color defaults to slice color if not specified const fontSpec = { ...config.font.spec, color: config.font.spec.color || slice.color }; const labelDiv = document.createElement('div'); @@ -36,23 +42,28 @@ export const pie = () => ({ const lineBreak = document.createElement('br'); const percentText = document.createTextNode(`${Math.round(slice.percent)}%`); - labelDiv.appendChild(labelSpan); + if (labelSpan) { + labelDiv.appendChild(labelSpan); + } labelDiv.appendChild(lineBreak); labelDiv.appendChild(percentText); return labelDiv.outerHTML; }; + // @ts-ignore ignoring missing propery config.options.series.pie.label.formatter = labelFormatter; - const legendFormatter = (label) => { + const legendFormatter = (label: string) => { const labelSpan = document.createElement('span'); Object.assign(labelSpan.style, config.font.spec); labelSpan.textContent = label; return labelSpan.outerHTML; }; + // @ts-ignore ignoring missing propery config.options.legend.labelFormatter = legendFormatter; } - let plot; + let plot: jquery.flot.plot; + function draw() { if (domNode.clientHeight < 1 || domNode.clientWidth < 1) { return; @@ -63,10 +74,11 @@ export const pie = () => ({ if (!config.data || !config.data.length) { $(domNode).empty(); } else { - plot = $.plot($(domNode), config.data, config.options); + // Casting config.options to any here as the flot typings do not appear to be accurate. + // For example, it does not have colors as a valid option. + plot = $.plot($(domNode), config.data, config.options as any); } } catch (e) { - console.log(e); // Nope } } diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.ts similarity index 82% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.ts index ab523f1526e16..8c84f54f8746b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.ts @@ -10,12 +10,15 @@ import '../../lib/flot-charts'; import { debounce, includes } from 'lodash'; import { RendererStrings } from '../../../i18n'; +import { RendererFactory, RendererSpec } from '../../../types'; +// @ts-expect-error Not going to convert import { size } from './plugins/size'; +// @ts-expect-error Not going to convert import { text } from './plugins/text'; const { plot: strings } = RendererStrings; -const render = (domNode, config, handlers) => { +const render: RendererSpec['render'] = (domNode, config, handlers) => { // TODO: OH NOES if (!includes($.plot.plugins, size)) { $.plot.plugins.push(size); @@ -24,14 +27,14 @@ const render = (domNode, config, handlers) => { $.plot.plugins.push(text); } - let plot; + let plot: jquery.flot.plot; function draw() { if (domNode.clientHeight < 1 || domNode.clientWidth < 1) { return; } if (config.font) { - const legendFormatter = (label) => { + const legendFormatter = (label: string) => { const labelSpan = document.createElement('span'); Object.assign(labelSpan.style, config.font.spec); labelSpan.textContent = label; @@ -67,9 +70,10 @@ const render = (domNode, config, handlers) => { return handlers.done(); }; -export const plot = () => ({ +export const plot: RendererFactory = () => ({ name: 'plot', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), + reuseDomNode: false, render, }); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.ts similarity index 64% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.ts index 67d0abb65837d..ea57655c230b9 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.ts @@ -7,10 +7,12 @@ import { getId } from '../../../public/lib/get_id'; import { RendererStrings } from '../../../i18n'; import { shapes } from './shapes'; +import { Output as Arguments } from '../../functions/common/progress'; +import { RendererFactory } from '../../../types'; const { progress: strings } = RendererStrings; -export const progress = () => ({ +export const progress: RendererFactory = () => ({ name: 'progress', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), @@ -23,12 +25,13 @@ export const progress = () => ({ if (shapeDef) { const parser = new DOMParser(); - const [shapeSvg] = parser - .parseFromString(shapes[shape], 'image/svg+xml') - .getElementsByTagName('svg'); + const shapeSvg = parser + .parseFromString(shapeDef, 'image/svg+xml') + .getElementsByTagName('svg') + .item(0)!; const initialViewBox = shapeSvg - .getAttribute('viewBox') + .getAttribute('viewBox')! .split(' ') .map((v) => parseInt(v, 10)); let [minX, minY, width, height] = initialViewBox; @@ -51,35 +54,35 @@ export const progress = () => ({ const svgId = getId('svg'); shapeSvg.id = svgId; - const [bar] = shapeSvg.getElementsByTagName('path'); + const bar = shapeSvg.getElementsByTagName('path').item(0)!; bar.setAttribute('className', 'canvasProgress__background'); bar.setAttribute('fill', 'none'); bar.setAttribute('stroke', barColor); bar.setAttribute('stroke-width', `${barWeight}px`); - const value = bar.cloneNode(true); - value.setAttribute('className', 'canvasProgress__value'); - value.setAttribute('stroke', valueColor); - value.setAttribute('stroke-width', `${valueWeight}px`); + const valueSvg = bar.cloneNode(true) as SVGPathElement; + valueSvg.setAttribute('className', 'canvasProgress__value'); + valueSvg.setAttribute('stroke', valueColor); + valueSvg.setAttribute('stroke-width', `${valueWeight}px`); - const length = value.getTotalLength(); + const length = valueSvg.getTotalLength(); const to = length * (1 - percent); - value.setAttribute('stroke-dasharray', length); - value.setAttribute('stroke-dashoffset', Math.max(0, to)); + valueSvg.setAttribute('stroke-dasharray', String(length)); + valueSvg.setAttribute('stroke-dashoffset', String(Math.max(0, to))); - shapeSvg.appendChild(value); + shapeSvg.appendChild(valueSvg); - const [text] = shapeSvg.getElementsByTagName('text'); + const text = shapeSvg.getElementsByTagName('text').item(0); if (label && text) { - text.textContent = label; + text.textContent = String(label); text.setAttribute('className', 'canvasProgress__label'); if (shape === 'horizontalPill') { - text.setAttribute('x', parseInt(text.getAttribute('x'), 10) + offset / 2); + text.setAttribute('x', String(parseInt(text.getAttribute('x')!, 10) + offset / 2)); } if (shape === 'verticalPill') { - text.setAttribute('y', parseInt(text.getAttribute('y'), 10) - offset / 2); + text.setAttribute('y', String(parseInt(text.getAttribute('y')!, 10) - offset / 2)); } Object.assign(text.style, font.spec); @@ -89,7 +92,7 @@ export const progress = () => ({ const { width: labelWidth, height: labelHeight } = text.getBBox(); if (shape === 'horizontalBar' || shape === 'horizontalPill') { - text.setAttribute('x', parseInt(text.getAttribute('x'), 10)); + text.setAttribute('x', String(parseInt(text.getAttribute('x')!, 10))); width += labelWidth; } if (shape === 'verticalBar' || shape === 'verticalPill') { @@ -103,8 +106,8 @@ export const progress = () => ({ } shapeSvg.setAttribute('viewBox', [minX, minY, width, height].join(' ')); - shapeSvg.setAttribute('width', domNode.offsetWidth); - shapeSvg.setAttribute('height', domNode.offsetHeight); + shapeSvg.setAttribute('width', String(domNode.offsetWidth)); + shapeSvg.setAttribute('height', String(domNode.offsetHeight)); if (domNode.firstChild) { domNode.removeChild(domNode.firstChild); @@ -112,8 +115,8 @@ export const progress = () => ({ domNode.appendChild(shapeSvg); handlers.onResize(() => { - shapeSvg.setAttribute('width', domNode.offsetWidth); - shapeSvg.setAttribute('height', domNode.offsetHeight); + shapeSvg.setAttribute('width', String(domNode.offsetWidth)); + shapeSvg.setAttribute('height', String(domNode.offsetHeight)); }); } diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.ts similarity index 81% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.ts index 2e48c8a2d5ec3..ff37ca7a0e3dd 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.ts @@ -9,25 +9,27 @@ import { times } from 'lodash'; import { elasticOutline } from '../lib/elastic_outline'; import { isValidUrl } from '../../common/lib/url'; import { RendererStrings, ErrorStrings } from '../../i18n'; +import { Return as Arguments } from '../functions/common/repeat_image'; +import { RendererFactory } from '../../types'; const { repeatImage: strings } = RendererStrings; const { RepeatImage: errors } = ErrorStrings; -export const repeatImage = () => ({ +export const repeatImage: RendererFactory = () => ({ name: 'repeatImage', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), reuseDomNode: true, render(domNode, config, handlers) { const settings = { - count: 10, ...config, image: isValidUrl(config.image) ? config.image : elasticOutline, + emptyImage: config.emptyImage || '', }; const container = $('
'); - function setSize(img) { + function setSize(img: HTMLImageElement) { if (img.naturalHeight > img.naturalWidth) { img.height = settings.size; } else { @@ -36,7 +38,7 @@ export const repeatImage = () => ({ } function finish() { - $(domNode).html(container); + $(domNode).append(container); handlers.done(); } @@ -46,7 +48,7 @@ export const repeatImage = () => ({ if (settings.max && settings.count > settings.max) { settings.count = settings.max; } - times(settings.count, () => container.append(img.cloneNode(true))); + times(settings.count, () => container.append($(img).clone())); if (isValidUrl(settings.emptyImage)) { if (settings.max == null) { @@ -56,7 +58,7 @@ export const repeatImage = () => ({ const emptyImage = new Image(); emptyImage.onload = function () { setSize(emptyImage); - times(settings.max - settings.count, () => container.append(emptyImage.cloneNode(true))); + times(settings.max - settings.count, () => container.append($(emptyImage).clone())); finish(); }; emptyImage.src = settings.emptyImage; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.ts similarity index 80% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.ts index 96c8d80794c0c..c52556f8564c1 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.ts @@ -7,10 +7,12 @@ import { elasticOutline } from '../../lib/elastic_outline'; import { isValidUrl } from '../../../common/lib/url'; import { RendererStrings } from '../../../i18n'; +import { RendererFactory } from '../../../types'; +import { Output as Arguments } from '../../functions/common/revealImage'; const { revealImage: strings } = RendererStrings; -export const revealImage = () => ({ +export const revealImage: RendererFactory = () => ({ name: 'revealImage', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), @@ -23,16 +25,17 @@ export const revealImage = () => ({ domNode.className = 'revealImage'; // set up the overlay image - img.onload = function () { + function onLoad() { setSize(); finish(); - }; + } + img.onload = onLoad; img.className = 'revealImage__image'; img.style.clipPath = getClipPath(config.percent, config.origin); - img.style['-webkit-clip-path'] = getClipPath(config.percent, config.origin); + img.style.setProperty('-webkit-clip-path', getClipPath(config.percent, config.origin)); img.src = isValidUrl(config.image) ? config.image : elasticOutline; - handlers.onResize(img.onload); + handlers.onResize(onLoad); // set up the underlay, "empty" image aligner.className = 'revealImageAligner'; @@ -52,9 +55,9 @@ export const revealImage = () => ({ handlers.done(); } - function getClipPath(percent, origin = 'bottom') { - const directions = { bottom: 0, left: 1, top: 2, right: 3 }; - const values = [0, 0, 0, 0]; + function getClipPath(percent: number, origin = 'bottom') { + const directions: Record = { bottom: 0, left: 1, top: 2, right: 3 }; + const values: Array = [0, 0, 0, 0]; values[directions[origin]] = `${100 - percent * 100}%`; return `inset(${values.join(' ')})`; } diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.ts similarity index 73% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.ts index 5684c8c4602b5..7c61ff69b18e0 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.ts @@ -6,22 +6,26 @@ import { RendererStrings } from '../../../i18n'; import { shapes } from './shapes'; +import { RendererFactory } from '../../../types'; +import { Output } from '../../functions/common/shape'; const { shape: strings } = RendererStrings; -export const shape = () => ({ +export const shape: RendererFactory = () => ({ name: 'shape', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), reuseDomNode: true, render(domNode, config, handlers) { - const { shape, fill, border, borderWidth, maintainAspect } = config; + const { shape: shapeType, fill, border, borderWidth, maintainAspect } = config; + const parser = new DOMParser(); - const [shapeSvg] = parser - .parseFromString(shapes[shape], 'image/svg+xml') - .getElementsByTagName('svg'); + const shapeSvg = parser + .parseFromString(shapes[shapeType], 'image/svg+xml') + .getElementsByTagName('svg') + .item(0)!; - const shapeContent = shapeSvg.firstElementChild; + const shapeContent = shapeSvg.firstElementChild!; if (fill) { shapeContent.setAttribute('fill', fill); @@ -30,15 +34,15 @@ export const shape = () => ({ shapeContent.setAttribute('stroke', border); } const strokeWidth = Math.max(borderWidth, 0); - shapeContent.setAttribute('stroke-width', strokeWidth); - shapeContent.setAttribute('stroke-miterlimit', 999); + shapeContent.setAttribute('stroke-width', String(strokeWidth)); + shapeContent.setAttribute('stroke-miterlimit', '999'); shapeContent.setAttribute('vector-effect', 'non-scaling-stroke'); shapeSvg.setAttribute('preserveAspectRatio', maintainAspect ? 'xMidYMid meet' : 'none'); shapeSvg.setAttribute('overflow', 'visible'); const initialViewBox = shapeSvg - .getAttribute('viewBox') + .getAttribute('viewBox')! .split(' ') .map((v) => parseInt(v, 10)); @@ -66,8 +70,8 @@ export const shape = () => ({ shapeHeight = 0; } - shapeSvg.setAttribute('width', width); - shapeSvg.setAttribute('height', height); + shapeSvg.setAttribute('width', String(width)); + shapeSvg.setAttribute('height', String(height)); shapeSvg.setAttribute('viewBox', [minX, minY, shapeWidth, shapeHeight].join(' ')); const oldShape = domNode.firstElementChild; @@ -75,7 +79,7 @@ export const shape = () => ({ domNode.removeChild(oldShape); } - domNode.style.lineHeight = 0; + domNode.style.lineHeight = '0'; domNode.appendChild(shapeSvg); }; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.tsx similarity index 61% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/table.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/table.tsx index 971ba577643ed..ada159e07f6ae 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.tsx @@ -6,22 +6,30 @@ import ReactDOM from 'react-dom'; import React from 'react'; -import { get } from 'lodash'; -import { Datatable } from '../../public/components/datatable'; +import { Datatable as DatatableComponent } from '../../public/components/datatable'; import { RendererStrings } from '../../i18n'; +import { RendererFactory, Style, Datatable } from '../../types'; const { dropdownFilter: strings } = RendererStrings; -export const table = () => ({ +interface TableArguments { + font?: Style; + paginate: boolean; + perPage: number; + showHeader: boolean; + datatable: Datatable; +} + +export const table: RendererFactory = () => ({ name: 'table', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), reuseDomNode: true, render(domNode, config, handlers) { - const { datatable, paginate, perPage, font, showHeader } = config; + const { datatable, paginate, perPage, font = { spec: {} }, showHeader } = config; ReactDOM.render( -
- + ({ +export const text: RendererFactory<{ text: string }> = () => ({ name: 'text', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), reuseDomNode: true, - render(domNode, { text }, handlers) { - ReactDOM.render(
{text}
, domNode, () => handlers.done()); + render(domNode, { text: textString }, handlers) { + ReactDOM.render(
{textString}
, domNode, () => handlers.done()); handlers.onDestroy(() => ReactDOM.unmountComponentAtNode(domNode)); }, }); diff --git a/x-pack/plugins/canvas/common/lib/index.ts b/x-pack/plugins/canvas/common/lib/index.ts index 6bd7e0bc9948f..055f6ce7739b7 100644 --- a/x-pack/plugins/canvas/common/lib/index.ts +++ b/x-pack/plugins/canvas/common/lib/index.ts @@ -24,12 +24,10 @@ export * from './get_legend_config'; export * from './handlebars'; export * from './hex_to_rgb'; export * from './httpurl'; -// @ts-expect-error missing local definition export * from './missing_asset'; export * from './palettes'; export * from './pivot_object_array'; // @ts-expect-error missing local definition export * from './resolve_dataurl'; export * from './unquote_string'; -// @ts-expect-error missing local definition export * from './url'; diff --git a/x-pack/plugins/canvas/common/lib/missing_asset.js b/x-pack/plugins/canvas/common/lib/missing_asset.ts similarity index 100% rename from x-pack/plugins/canvas/common/lib/missing_asset.js rename to x-pack/plugins/canvas/common/lib/missing_asset.ts diff --git a/x-pack/plugins/canvas/common/lib/url.test.js b/x-pack/plugins/canvas/common/lib/url.test.ts similarity index 100% rename from x-pack/plugins/canvas/common/lib/url.test.js rename to x-pack/plugins/canvas/common/lib/url.test.ts diff --git a/x-pack/plugins/canvas/common/lib/url.js b/x-pack/plugins/canvas/common/lib/url.ts similarity index 90% rename from x-pack/plugins/canvas/common/lib/url.js rename to x-pack/plugins/canvas/common/lib/url.ts index bed5e30cbff3b..d2e031159d969 100644 --- a/x-pack/plugins/canvas/common/lib/url.js +++ b/x-pack/plugins/canvas/common/lib/url.ts @@ -7,6 +7,6 @@ import { isValidDataUrl } from '../../common/lib/dataurl'; import { isValidHttpUrl } from '../../common/lib/httpurl'; -export function isValidUrl(url) { +export function isValidUrl(url: string) { return isValidDataUrl(url) || isValidHttpUrl(url); } diff --git a/x-pack/plugins/canvas/i18n/functions/dict/repeat_image.ts b/x-pack/plugins/canvas/i18n/functions/dict/repeat_image.ts index aafaec11c4d1d..222947779a758 100644 --- a/x-pack/plugins/canvas/i18n/functions/dict/repeat_image.ts +++ b/x-pack/plugins/canvas/i18n/functions/dict/repeat_image.ts @@ -5,7 +5,7 @@ */ import { i18n } from '@kbn/i18n'; -import { repeatImage } from '../../../canvas_plugin_src/functions/common/repeatImage'; +import { repeatImage } from '../../../canvas_plugin_src/functions/common/repeat_image'; import { FunctionHelp } from '../function_help'; import { FunctionFactory } from '../../../types'; import { CONTEXT, BASE64, URL } from '../../constants'; diff --git a/x-pack/plugins/canvas/public/components/error/error.js b/x-pack/plugins/canvas/public/components/error/error.tsx similarity index 86% rename from x-pack/plugins/canvas/public/components/error/error.js rename to x-pack/plugins/canvas/public/components/error/error.tsx index 2f82e7d669bd5..93650df93cbeb 100644 --- a/x-pack/plugins/canvas/public/components/error/error.js +++ b/x-pack/plugins/canvas/public/components/error/error.tsx @@ -4,16 +4,22 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; import { EuiCallOut } from '@elastic/eui'; import { get } from 'lodash'; import { ComponentStrings } from '../../../i18n'; import { ShowDebugging } from './show_debugging'; +export interface Props { + payload: { + error: Error; + }; +} + const { Error: strings } = ComponentStrings; -export const Error = ({ payload }) => { +export const Error: FC = ({ payload }) => { const message = get(payload, 'error.message'); return ( diff --git a/x-pack/plugins/canvas/public/components/error/index.js b/x-pack/plugins/canvas/public/components/error/index.ts similarity index 100% rename from x-pack/plugins/canvas/public/components/error/index.js rename to x-pack/plugins/canvas/public/components/error/index.ts diff --git a/x-pack/plugins/canvas/public/components/error/show_debugging.js b/x-pack/plugins/canvas/public/components/error/show_debugging.tsx similarity index 64% rename from x-pack/plugins/canvas/public/components/error/show_debugging.js rename to x-pack/plugins/canvas/public/components/error/show_debugging.tsx index 102ebc3f8a7e8..0d5d74903828b 100644 --- a/x-pack/plugins/canvas/public/components/error/show_debugging.js +++ b/x-pack/plugins/canvas/public/components/error/show_debugging.tsx @@ -4,14 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC, useState } from 'react'; import PropTypes from 'prop-types'; -import { withState } from 'recompose'; import { EuiButtonEmpty } from '@elastic/eui'; import { Debug } from '../debug'; +import { Props } from './error'; -const ShowDebuggingComponent = ({ payload, expanded, setExpanded }) => - process.env.NODE_ENV === 'production' ? null : ( +export const ShowDebugging: FC = ({ payload }) => { + const [expanded, setExpanded] = useState(false); + + return process.env.NODE_ENV === 'production' ? null : (
)}
); +}; -ShowDebuggingComponent.propTypes = { - expanded: PropTypes.bool.isRequired, - setExpanded: PropTypes.func.isRequired, +ShowDebugging.propTypes = { payload: PropTypes.object.isRequired, }; - -export const ShowDebugging = withState('expanded', 'setExpanded', false)(ShowDebuggingComponent); diff --git a/x-pack/plugins/canvas/public/plugin_api.ts b/x-pack/plugins/canvas/public/plugin_api.ts index 4074d240c06e9..62e82df4b0d04 100644 --- a/x-pack/plugins/canvas/public/plugin_api.ts +++ b/x-pack/plugins/canvas/public/plugin_api.ts @@ -6,7 +6,8 @@ import { AnyExpressionFunctionDefinition, AnyExpressionTypeDefinition, - RendererFactory, + AnyExpressionRenderDefinition, + AnyRendererFactory, } from '../types'; import { ElementFactory } from '../types'; import { ExpressionsSetup } from '../../../../src/plugins/expressions/public'; @@ -19,7 +20,7 @@ export interface CanvasApi { addElements: AddToRegistry; addFunctions: AddToRegistry<() => AnyExpressionFunctionDefinition>; addModelUIs: AddToRegistry; - addRenderers: AddToRegistry; + addRenderers: AddToRegistry; addTagUIs: AddToRegistry; addTransformUIs: AddToRegistry; addTransitions: AddToRegistry; @@ -65,8 +66,11 @@ export function getPluginApi( }); }, addRenderers: (renderers) => { - renderers.forEach((r: any) => { - expressionsPluginSetup.registerRenderer(r); + renderers.forEach((r) => { + // There is an issue of the canvas render definition not matching the expression render definition + // due to our handlers needing additional methods. For now, we are going to cast to get to the proper + // type, but we should work with AppArch to figure out how the Handlers can be genericized + expressionsPluginSetup.registerRenderer((r as unknown) as AnyExpressionRenderDefinition); }); }, diff --git a/x-pack/plugins/canvas/public/services/stubs/expressions.ts b/x-pack/plugins/canvas/public/services/stubs/expressions.ts index 26a90670106d0..ee332e20c4ca3 100644 --- a/x-pack/plugins/canvas/public/services/stubs/expressions.ts +++ b/x-pack/plugins/canvas/public/services/stubs/expressions.ts @@ -4,13 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ +import { AnyExpressionRenderDefinition } from 'src/plugins/expressions'; import { ExpressionsService } from '../'; -import { - plugin, - ExpressionRenderDefinition, -} from '../../../../../../src/plugins/expressions/public'; +import { plugin } from '../../../../../../src/plugins/expressions/public'; import { functions as functionDefinitions } from '../../../canvas_plugin_src/functions/common'; -// @ts-expect-error untyped local import { renderFunctions } from '../../../canvas_plugin_src/renderers/core'; const placeholder = {} as any; @@ -22,6 +19,6 @@ const setup = expressionsPlugin.setup(placeholder, { export const expressionsService: ExpressionsService = setup.fork(); functionDefinitions.forEach((fn) => expressionsService.registerFunction(fn)); -renderFunctions.forEach((fn: ExpressionRenderDefinition) => - expressionsService.registerRenderer(fn) -); +renderFunctions.forEach((fn) => { + expressionsService.registerRenderer((fn as unknown) as AnyExpressionRenderDefinition); +}); diff --git a/x-pack/plugins/canvas/shareable_runtime/components/__stories__/rendered_element.stories.tsx b/x-pack/plugins/canvas/shareable_runtime/components/__stories__/rendered_element.stories.tsx index 899edee7f0481..aba510b8e736a 100644 --- a/x-pack/plugins/canvas/shareable_runtime/components/__stories__/rendered_element.stories.tsx +++ b/x-pack/plugins/canvas/shareable_runtime/components/__stories__/rendered_element.stories.tsx @@ -7,7 +7,6 @@ import { storiesOf } from '@storybook/react'; import React from 'react'; import { ExampleContext } from '../../test/context_example'; -// @ts-expect-error import { image } from '../../../canvas_plugin_src/renderers/image'; import { sharedWorkpads } from '../../test'; import { RenderedElement, RenderedElementComponent } from '../rendered_element'; diff --git a/x-pack/plugins/canvas/shareable_runtime/components/rendered_element.tsx b/x-pack/plugins/canvas/shareable_runtime/components/rendered_element.tsx index 6bcc0db92f1cc..2291eff0db0ec 100644 --- a/x-pack/plugins/canvas/shareable_runtime/components/rendered_element.tsx +++ b/x-pack/plugins/canvas/shareable_runtime/components/rendered_element.tsx @@ -12,7 +12,7 @@ import { Positionable } from '../../public/components/positionable/positionable' import { elementToShape } from '../../public/components/workpad_page/utils'; import { CanvasRenderedElement } from '../types'; import { CanvasShareableContext, useCanvasShareableState } from '../context'; -import { RendererSpec } from '../../types'; +import { AnyRendererSpec } from '../../types'; import { createHandlers } from '../../public/lib/create_handlers'; import css from './rendered_element.module.scss'; @@ -33,7 +33,7 @@ export interface Props { * The Expression function that evaluates the state of the Element and renders * it to the Page. */ - fn: RendererSpec; + fn: AnyRendererSpec; } /** diff --git a/x-pack/plugins/canvas/types/renderers.ts b/x-pack/plugins/canvas/types/renderers.ts index 772a16aa94c60..7dcb94507b632 100644 --- a/x-pack/plugins/canvas/types/renderers.ts +++ b/x-pack/plugins/canvas/types/renderers.ts @@ -47,3 +47,6 @@ export interface RendererSpec { } export type RendererFactory = () => RendererSpec; + +export type AnyRendererFactory = RendererFactory; +export type AnyRendererSpec = RendererSpec; From d84777f053f6e2be1a6b7b8f19ba498cc6972730 Mon Sep 17 00:00:00 2001 From: Luke Elmers Date: Tue, 11 Aug 2020 09:53:42 -0600 Subject: [PATCH 053/113] [data.search.SearchSource] Move some SearchSource dependencies to the server. (#74607) --- ...-plugins-data-public.getsearcherrortype.md | 22 ------- .../kibana-plugin-plugins-data-public.md | 3 +- ...s-data-public.searcherror._constructor_.md | 20 ------ ...-plugin-plugins-data-public.searcherror.md | 26 +++----- src/plugins/data/public/index.ts | 1 - src/plugins/data/public/public.api.md | 39 +++++------- src/plugins/data/public/search/fetch/index.ts | 1 - .../data/public/search/fetch/request_error.ts | 4 +- .../data/public/search/fetch/search_error.ts | 62 ------------------- src/plugins/data/public/search/fetch/types.ts | 9 +++ src/plugins/data/public/search/index.ts | 1 - .../search_source/create_search_source.ts | 2 +- .../public/search/search_source/parse_json.ts | 2 +- .../search/search_source/search_source.ts | 2 +- .../common}/index.ts | 3 +- .../utils => common}/migrate_legacy_query.ts | 0 src/plugins/kibana_legacy/kibana.json | 2 +- src/plugins/kibana_legacy/public/index.ts | 2 +- .../kibana_legacy/public/utils/index.ts | 1 - src/plugins/kibana_legacy/server/index.ts | 2 +- .../field_wildcard.test.ts | 0 .../field_wildcard.ts | 1 + src/plugins/kibana_utils/common/index.ts | 1 + src/plugins/kibana_utils/public/index.ts | 3 +- src/plugins/kibana_utils/server/index.ts | 9 ++- 25 files changed, 58 insertions(+), 160 deletions(-) delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearcherrortype.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror._constructor_.md delete mode 100644 src/plugins/data/public/search/fetch/search_error.ts rename src/plugins/{kibana_utils/public/field_wildcard => kibana_legacy/common}/index.ts (91%) rename src/plugins/kibana_legacy/{public/utils => common}/migrate_legacy_query.ts (100%) rename src/plugins/kibana_utils/{public/field_wildcard => common}/field_wildcard.test.ts (100%) rename src/plugins/kibana_utils/{public/field_wildcard => common}/field_wildcard.ts (99%) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearcherrortype.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearcherrortype.md deleted file mode 100644 index b46728c093792..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearcherrortype.md +++ /dev/null @@ -1,22 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [getSearchErrorType](./kibana-plugin-plugins-data-public.getsearcherrortype.md) - -## getSearchErrorType() function - -Signature: - -```typescript -export declare function getSearchErrorType({ message }: Pick): "UNSUPPORTED_QUERY" | undefined; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| { message } | Pick<SearchError, 'message'> | | - -Returns: - -`"UNSUPPORTED_QUERY" | undefined` - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index c8d45804a3729..53c30b52cb985 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -18,7 +18,6 @@ | [OptionedParamType](./kibana-plugin-plugins-data-public.optionedparamtype.md) | | | [Plugin](./kibana-plugin-plugins-data-public.plugin.md) | | | [RequestTimeoutError](./kibana-plugin-plugins-data-public.requesttimeouterror.md) | Class used to signify that a request timed out. Useful for applications to conditionally handle this type of error differently than other errors. | -| [SearchError](./kibana-plugin-plugins-data-public.searcherror.md) | | | [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) | | | [TimeHistory](./kibana-plugin-plugins-data-public.timehistory.md) | | @@ -39,7 +38,6 @@ | --- | --- | | [getDefaultQuery(language)](./kibana-plugin-plugins-data-public.getdefaultquery.md) | | | [getEsPreference(uiSettings, sessionId)](./kibana-plugin-plugins-data-public.getespreference.md) | | -| [getSearchErrorType({ message })](./kibana-plugin-plugins-data-public.getsearcherrortype.md) | | | [getSearchParamsFromRequest(searchRequest, dependencies)](./kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md) | | | [getTime(indexPattern, timeRange, options)](./kibana-plugin-plugins-data-public.gettime.md) | | | [plugin(initializerContext)](./kibana-plugin-plugins-data-public.plugin.md) | | @@ -80,6 +78,7 @@ | [RefreshInterval](./kibana-plugin-plugins-data-public.refreshinterval.md) | | | [SavedQuery](./kibana-plugin-plugins-data-public.savedquery.md) | | | [SavedQueryService](./kibana-plugin-plugins-data-public.savedqueryservice.md) | | +| [SearchError](./kibana-plugin-plugins-data-public.searcherror.md) | | | [SearchInterceptorDeps](./kibana-plugin-plugins-data-public.searchinterceptordeps.md) | | | [SearchSourceFields](./kibana-plugin-plugins-data-public.searchsourcefields.md) | | | [TabbedAggColumn](./kibana-plugin-plugins-data-public.tabbedaggcolumn.md) | \* | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror._constructor_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror._constructor_.md deleted file mode 100644 index 4d7691d24a79d..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror._constructor_.md +++ /dev/null @@ -1,20 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchError](./kibana-plugin-plugins-data-public.searcherror.md) > [(constructor)](./kibana-plugin-plugins-data-public.searcherror._constructor_.md) - -## SearchError.(constructor) - -Constructs a new instance of the `SearchError` class - -Signature: - -```typescript -constructor({ status, title, message, path, type }: SearchErrorOptions); -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| { status, title, message, path, type } | SearchErrorOptions | | - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror.md index 06e60cadf4a85..65b46bf6cba4d 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror.md @@ -2,28 +2,22 @@ [Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchError](./kibana-plugin-plugins-data-public.searcherror.md) -## SearchError class +## SearchError interface Signature: ```typescript -export declare class SearchError extends Error +export interface SearchError ``` -## Constructors - -| Constructor | Modifiers | Description | -| --- | --- | --- | -| [(constructor)({ status, title, message, path, type })](./kibana-plugin-plugins-data-public.searcherror._constructor_.md) | | Constructs a new instance of the SearchError class | - ## Properties -| Property | Modifiers | Type | Description | -| --- | --- | --- | --- | -| [message](./kibana-plugin-plugins-data-public.searcherror.message.md) | | string | | -| [name](./kibana-plugin-plugins-data-public.searcherror.name.md) | | string | | -| [path](./kibana-plugin-plugins-data-public.searcherror.path.md) | | string | | -| [status](./kibana-plugin-plugins-data-public.searcherror.status.md) | | string | | -| [title](./kibana-plugin-plugins-data-public.searcherror.title.md) | | string | | -| [type](./kibana-plugin-plugins-data-public.searcherror.type.md) | | string | | +| Property | Type | Description | +| --- | --- | --- | +| [message](./kibana-plugin-plugins-data-public.searcherror.message.md) | string | | +| [name](./kibana-plugin-plugins-data-public.searcherror.name.md) | string | | +| [path](./kibana-plugin-plugins-data-public.searcherror.path.md) | string | | +| [status](./kibana-plugin-plugins-data-public.searcherror.status.md) | string | | +| [title](./kibana-plugin-plugins-data-public.searcherror.title.md) | string | | +| [type](./kibana-plugin-plugins-data-public.searcherror.type.md) | string | | diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index 5a9930d2b6b56..f036d5f30a0e2 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -337,7 +337,6 @@ export { // search ES_SEARCH_STRATEGY, getEsPreference, - getSearchErrorType, ISearch, ISearchOptions, ISearchGeneric, diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index adff7b205b931..216ed018957e0 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -703,11 +703,6 @@ export function getEsPreference(uiSettings: IUiSettingsClient_2, sessionId?: str // @public export const getKbnTypeNames: () => string[]; -// Warning: (ae-missing-release-tag) "getSearchErrorType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function getSearchErrorType({ message }: Pick): "UNSUPPORTED_QUERY" | undefined; - // Warning: (ae-forgotten-export) The symbol "ISearchRequestParams" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "getSearchParamsFromRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1696,9 +1691,7 @@ export type SearchBarProps = SearchBarOwnProps & SearchBarInjectedDeps; // Warning: (ae-missing-release-tag) "SearchError" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export class SearchError extends Error { - // Warning: (ae-forgotten-export) The symbol "SearchErrorOptions" needs to be exported by the entry point index.d.ts - constructor({ status, title, message, path, type }: SearchErrorOptions); +export interface SearchError { // (undocumented) message: string; // (undocumented) @@ -1968,21 +1961,21 @@ export const UI_SETTINGS: { // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:372:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:373:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:382:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:385:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:397:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:371:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:372:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:381:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:382:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:392:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:396:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:45:5 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:54:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:55:5 - (ae-forgotten-export) The symbol "createFiltersFromRangeSelectAction" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/search/fetch/index.ts b/src/plugins/data/public/search/fetch/index.ts index ab856d681ba12..79cdad1897f9c 100644 --- a/src/plugins/data/public/search/fetch/index.ts +++ b/src/plugins/data/public/search/fetch/index.ts @@ -27,6 +27,5 @@ export { getMaxConcurrentShardRequests, } from './get_search_params'; -export { SearchError, getSearchErrorType } from './search_error'; export { RequestFailure } from './request_error'; export { handleResponse } from './handle_response'; diff --git a/src/plugins/data/public/search/fetch/request_error.ts b/src/plugins/data/public/search/fetch/request_error.ts index e216d32e127cd..5e42a6fcf5b65 100644 --- a/src/plugins/data/public/search/fetch/request_error.ts +++ b/src/plugins/data/public/search/fetch/request_error.ts @@ -17,8 +17,8 @@ * under the License. */ -import { KbnError } from '../../../../kibana_utils/public'; -import { SearchResponse, SearchError } from '..'; +import { KbnError } from '../../../../kibana_utils/common'; +import { SearchError, SearchResponse } from './types'; /** * Request Failure - When an entire multi request fails diff --git a/src/plugins/data/public/search/fetch/search_error.ts b/src/plugins/data/public/search/fetch/search_error.ts deleted file mode 100644 index d4042fb17499c..0000000000000 --- a/src/plugins/data/public/search/fetch/search_error.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -interface SearchErrorOptions { - status: string; - title: string; - message: string; - path: string; - type: string; -} - -export class SearchError extends Error { - public name: string; - public status: string; - public title: string; - public message: string; - public path: string; - public type: string; - - constructor({ status, title, message, path, type }: SearchErrorOptions) { - super(message); - this.name = 'SearchError'; - this.status = status; - this.title = title; - this.message = message; - this.path = path; - this.type = type; - - // captureStackTrace is only available in the V8 engine, so any browser using - // a different JS engine won't have access to this method. - if (Error.captureStackTrace) { - Error.captureStackTrace(this, SearchError); - } - - // Babel doesn't support traditional `extends` syntax for built-in classes. - // https://babeljs.io/docs/en/caveats/#classes - Object.setPrototypeOf(this, SearchError.prototype); - } -} - -export function getSearchErrorType({ message }: Pick) { - const msg = message.toLowerCase(); - if (msg.indexOf('unsupported query') > -1) { - return 'UNSUPPORTED_QUERY'; - } -} diff --git a/src/plugins/data/public/search/fetch/types.ts b/src/plugins/data/public/search/fetch/types.ts index 1aba4f66bb4d7..dda66d6b5238d 100644 --- a/src/plugins/data/public/search/fetch/types.ts +++ b/src/plugins/data/public/search/fetch/types.ts @@ -33,3 +33,12 @@ export interface FetchHandlers { config: IUiSettingsClient; esShardTimeout: number; } + +export interface SearchError { + name: string; + status: string; + title: string; + message: string; + path: string; + type: string; +} diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts index 40d45ab88ea9f..96445e5367147 100644 --- a/src/plugins/data/public/search/index.ts +++ b/src/plugins/data/public/search/index.ts @@ -34,7 +34,6 @@ export { FetchOptions, SearchRequest, SearchResponse, - getSearchErrorType, getSearchParamsFromRequest, } from './fetch'; diff --git a/src/plugins/data/public/search/search_source/create_search_source.ts b/src/plugins/data/public/search/search_source/create_search_source.ts index 3466d60e5dd7e..4c44f4d62d469 100644 --- a/src/plugins/data/public/search/search_source/create_search_source.ts +++ b/src/plugins/data/public/search/search_source/create_search_source.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { migrateLegacyQuery } from '../../../../kibana_legacy/public'; +import { migrateLegacyQuery } from '../../../../kibana_legacy/common'; import { SearchSource, SearchSourceDependencies } from './search_source'; import { IndexPatternsContract } from '../../index_patterns/index_patterns'; import { SearchSourceFields } from './types'; diff --git a/src/plugins/data/public/search/search_source/parse_json.ts b/src/plugins/data/public/search/search_source/parse_json.ts index f0eb377cedc77..8f46525311424 100644 --- a/src/plugins/data/public/search/search_source/parse_json.ts +++ b/src/plugins/data/public/search/search_source/parse_json.ts @@ -18,7 +18,7 @@ */ import { SearchSourceFields } from './types'; -import { InvalidJSONProperty } from '../../../../kibana_utils/public'; +import { InvalidJSONProperty } from '../../../../kibana_utils/common'; export const parseSearchSourceJSON = (searchSourceJSON: string) => { // if we have a searchSource, set its values based on the searchSourceJson field diff --git a/src/plugins/data/public/search/search_source/search_source.ts b/src/plugins/data/public/search/search_source/search_source.ts index c97a5d0638a6a..847dc8853d6ba 100644 --- a/src/plugins/data/public/search/search_source/search_source.ts +++ b/src/plugins/data/public/search/search_source/search_source.ts @@ -75,7 +75,7 @@ import { map } from 'rxjs/operators'; import { CoreStart } from 'kibana/public'; import { normalizeSortRequest } from './normalize_sort_request'; import { filterDocvalueFields } from './filter_docvalue_fields'; -import { fieldWildcardFilter } from '../../../../kibana_utils/public'; +import { fieldWildcardFilter } from '../../../../kibana_utils/common'; import { IIndexPattern, ISearchGeneric, SearchRequest } from '../..'; import { SearchSourceOptions, SearchSourceFields } from './types'; import { FetchOptions, RequestFailure, handleResponse, getSearchParamsFromRequest } from '../fetch'; diff --git a/src/plugins/kibana_utils/public/field_wildcard/index.ts b/src/plugins/kibana_legacy/common/index.ts similarity index 91% rename from src/plugins/kibana_utils/public/field_wildcard/index.ts rename to src/plugins/kibana_legacy/common/index.ts index db9f830e450b8..9c16d7b273862 100644 --- a/src/plugins/kibana_utils/public/field_wildcard/index.ts +++ b/src/plugins/kibana_legacy/common/index.ts @@ -17,4 +17,5 @@ * under the License. */ -export * from './field_wildcard'; +export * from './kbn_base_url'; +export * from './migrate_legacy_query'; diff --git a/src/plugins/kibana_legacy/public/utils/migrate_legacy_query.ts b/src/plugins/kibana_legacy/common/migrate_legacy_query.ts similarity index 100% rename from src/plugins/kibana_legacy/public/utils/migrate_legacy_query.ts rename to src/plugins/kibana_legacy/common/migrate_legacy_query.ts diff --git a/src/plugins/kibana_legacy/kibana.json b/src/plugins/kibana_legacy/kibana.json index 606acd8b88b05..79264d95dcc27 100644 --- a/src/plugins/kibana_legacy/kibana.json +++ b/src/plugins/kibana_legacy/kibana.json @@ -3,5 +3,5 @@ "version": "kibana", "server": true, "ui": true, - "extraPublicDirs": ["common/kbn_base_url"] + "extraPublicDirs": ["common", "common/kbn_base_url"] } diff --git a/src/plugins/kibana_legacy/public/index.ts b/src/plugins/kibana_legacy/public/index.ts index 75e81b0505747..27b940b0a456b 100644 --- a/src/plugins/kibana_legacy/public/index.ts +++ b/src/plugins/kibana_legacy/public/index.ts @@ -24,7 +24,7 @@ export const plugin = (initializerContext: PluginInitializerContext) => new KibanaLegacyPlugin(initializerContext); export * from './plugin'; -export { kbnBaseUrl } from '../common/kbn_base_url'; +export { kbnBaseUrl, migrateLegacyQuery } from '../common'; export { initAngularBootstrap } from './angular_bootstrap'; export { PaginateDirectiveProvider, PaginateControlsDirectiveProvider } from './paginate/paginate'; diff --git a/src/plugins/kibana_legacy/public/utils/index.ts b/src/plugins/kibana_legacy/public/utils/index.ts index e7dd55ec5582b..a32cd5e40a047 100644 --- a/src/plugins/kibana_legacy/public/utils/index.ts +++ b/src/plugins/kibana_legacy/public/utils/index.ts @@ -17,7 +17,6 @@ * under the License. */ -export * from './migrate_legacy_query'; export * from './system_api'; export * from './normalize_path'; // @ts-ignore diff --git a/src/plugins/kibana_legacy/server/index.ts b/src/plugins/kibana_legacy/server/index.ts index 0188f9b1ec515..3ddcac1517f74 100644 --- a/src/plugins/kibana_legacy/server/index.ts +++ b/src/plugins/kibana_legacy/server/index.ts @@ -50,7 +50,7 @@ export const config: PluginConfigDescriptor = { ], }; -export { kbnBaseUrl } from '../common/kbn_base_url'; +export { kbnBaseUrl, migrateLegacyQuery } from '../common'; class Plugin { public setup(core: CoreSetup) {} diff --git a/src/plugins/kibana_utils/public/field_wildcard/field_wildcard.test.ts b/src/plugins/kibana_utils/common/field_wildcard.test.ts similarity index 100% rename from src/plugins/kibana_utils/public/field_wildcard/field_wildcard.test.ts rename to src/plugins/kibana_utils/common/field_wildcard.test.ts diff --git a/src/plugins/kibana_utils/public/field_wildcard/field_wildcard.ts b/src/plugins/kibana_utils/common/field_wildcard.ts similarity index 99% rename from src/plugins/kibana_utils/public/field_wildcard/field_wildcard.ts rename to src/plugins/kibana_utils/common/field_wildcard.ts index 2aa9a255bd5cf..bfe5a0f3a0a8e 100644 --- a/src/plugins/kibana_utils/public/field_wildcard/field_wildcard.ts +++ b/src/plugins/kibana_utils/common/field_wildcard.ts @@ -19,6 +19,7 @@ import { escapeRegExp, memoize } from 'lodash'; +// @internal export const makeRegEx = memoize(function makeRegEx(glob: string) { const globRegex = glob.split('*').map(escapeRegExp).join('.*'); return new RegExp(`^${globRegex}$`); diff --git a/src/plugins/kibana_utils/common/index.ts b/src/plugins/kibana_utils/common/index.ts index c94021872b4e1..1ec5737c5a38b 100644 --- a/src/plugins/kibana_utils/common/index.ts +++ b/src/plugins/kibana_utils/common/index.ts @@ -18,6 +18,7 @@ */ export * from './defer'; +export * from './field_wildcard'; export * from './of'; export * from './ui'; export * from './state_containers'; diff --git a/src/plugins/kibana_utils/public/index.ts b/src/plugins/kibana_utils/public/index.ts index d1c9eec0e9906..7edf62ce04e81 100644 --- a/src/plugins/kibana_utils/public/index.ts +++ b/src/plugins/kibana_utils/public/index.ts @@ -21,6 +21,8 @@ export { calculateObjectHash, defer, Defer, + fieldWildcardFilter, + fieldWildcardMatcher, Get, JsonArray, JsonObject, @@ -34,7 +36,6 @@ export { } from '../common'; export * from './core'; export * from '../common/errors'; -export * from './field_wildcard'; export * from './render_complete'; export * from './resize_checker'; export * from '../common/state_containers'; diff --git a/src/plugins/kibana_utils/server/index.ts b/src/plugins/kibana_utils/server/index.ts index b8b768da0192e..bf3361d1e5369 100644 --- a/src/plugins/kibana_utils/server/index.ts +++ b/src/plugins/kibana_utils/server/index.ts @@ -17,4 +17,11 @@ * under the License. */ -export { Get, Set, createGetterSetter, url } from '../common'; +export { + createGetterSetter, + fieldWildcardFilter, + fieldWildcardMatcher, + Get, + Set, + url, +} from '../common'; From 910c8836078264a7a6f362271f7185887be0ab83 Mon Sep 17 00:00:00 2001 From: Luke Elmers Date: Tue, 11 Aug 2020 09:55:09 -0600 Subject: [PATCH 054/113] [data.ui.query] Write filters to query log from default editor. (#74474) --- .../query_string_input.test.tsx | 38 +++++++++++++++++++ .../query_string_input/query_string_input.tsx | 5 ++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/plugins/data/public/ui/query_string_input/query_string_input.test.tsx b/src/plugins/data/public/ui/query_string_input/query_string_input.test.tsx index 0397c34d0c2b8..bb0a8b848c89e 100644 --- a/src/plugins/data/public/ui/query_string_input/query_string_input.test.tsx +++ b/src/plugins/data/public/ui/query_string_input/query_string_input.test.tsx @@ -186,6 +186,44 @@ describe('QueryStringInput', () => { expect(mockCallback).toHaveBeenCalledWith({ query: 'response:200', language: 'kuery' }); }); + it('Should fire onBlur callback on input blur', () => { + const mockCallback = jest.fn(); + + const component = mount( + wrapQueryStringInputInContext({ + query: kqlQuery, + onBlur: mockCallback, + indexPatterns: [stubIndexPatternWithFields], + disableAutoFocus: true, + }) + ); + + const inputWrapper = component.find(EuiTextArea).find('textarea'); + inputWrapper.simulate('blur'); + + expect(mockCallback).toHaveBeenCalledTimes(1); + expect(mockCallback).toHaveBeenCalledWith(); + }); + + it('Should fire onChangeQueryInputFocus callback on input blur', () => { + const mockCallback = jest.fn(); + + const component = mount( + wrapQueryStringInputInContext({ + query: kqlQuery, + onChangeQueryInputFocus: mockCallback, + indexPatterns: [stubIndexPatternWithFields], + disableAutoFocus: true, + }) + ); + + const inputWrapper = component.find(EuiTextArea).find('textarea'); + inputWrapper.simulate('blur'); + + expect(mockCallback).toHaveBeenCalledTimes(1); + expect(mockCallback).toHaveBeenCalledWith(false); + }); + it('Should use PersistedLog for recent search suggestions', async () => { const component = mount( wrapQueryStringInputInContext({ diff --git a/src/plugins/data/public/ui/query_string_input/query_string_input.tsx b/src/plugins/data/public/ui/query_string_input/query_string_input.tsx index 6f72aa829d8f3..86ee98b7af9d8 100644 --- a/src/plugins/data/public/ui/query_string_input/query_string_input.tsx +++ b/src/plugins/data/public/ui/query_string_input/query_string_input.tsx @@ -33,7 +33,7 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { debounce, compact, isEqual } from 'lodash'; +import { debounce, compact, isEqual, isFunction } from 'lodash'; import { Toast } from 'src/core/public'; import { IDataPluginServices, IIndexPattern, Query } from '../..'; import { QuerySuggestion, QuerySuggestionTypes } from '../../autocomplete'; @@ -460,6 +460,9 @@ export class QueryStringInputUI extends Component { if (this.props.onChangeQueryInputFocus) { this.props.onChangeQueryInputFocus(false); } + if (isFunction(this.props.onBlur)) { + this.props.onBlur(); + } }; private onClickSuggestion = (suggestion: QuerySuggestion) => { From 0ef17f92a61b406e13b67af7752af7d2a146a270 Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Tue, 11 Aug 2020 17:58:47 +0200 Subject: [PATCH 055/113] theme function (#73451) --- .../common/expression_functions/specs/font.ts | 15 +-- .../expression_functions/specs/index.ts | 3 + .../specs/tests/font.test.ts | 97 ++++++------------- .../specs/tests/theme.test.ts | 63 ++++++++++++ .../expression_functions/specs/theme.ts | 65 +++++++++++++ .../common/expression_functions/types.ts | 2 + 6 files changed, 172 insertions(+), 73 deletions(-) create mode 100644 src/plugins/expressions/common/expression_functions/specs/tests/theme.test.ts create mode 100644 src/plugins/expressions/common/expression_functions/specs/theme.ts diff --git a/src/plugins/expressions/common/expression_functions/specs/font.ts b/src/plugins/expressions/common/expression_functions/specs/font.ts index c46ce0adadef0..52692f72cebb2 100644 --- a/src/plugins/expressions/common/expression_functions/specs/font.ts +++ b/src/plugins/expressions/common/expression_functions/specs/font.ts @@ -64,7 +64,7 @@ export const font: ExpressionFunctionFont = { inputTypes: ['null'], args: { align: { - default: 'left', + default: '{ theme "font.align" default="left" }', help: i18n.translate('expressions.functions.font.args.alignHelpText', { defaultMessage: 'The horizontal text alignment.', }), @@ -72,13 +72,14 @@ export const font: ExpressionFunctionFont = { types: ['string'], }, color: { + default: `{ theme "font.color" }`, help: i18n.translate('expressions.functions.font.args.colorHelpText', { defaultMessage: 'The text color.', }), types: ['string'], }, family: { - default: `"${openSans.value}"`, + default: `{ theme "font.family" default="${openSans.value}" }`, help: i18n.translate('expressions.functions.font.args.familyHelpText', { defaultMessage: 'An acceptable {css} web font string', values: { @@ -88,7 +89,7 @@ export const font: ExpressionFunctionFont = { types: ['string'], }, italic: { - default: false, + default: `{ theme "font.italic" default=false }`, help: i18n.translate('expressions.functions.font.args.italicHelpText', { defaultMessage: 'Italicize the text?', }), @@ -96,7 +97,7 @@ export const font: ExpressionFunctionFont = { types: ['boolean'], }, lHeight: { - default: null, + default: `{ theme "font.lHeight" }`, aliases: ['lineHeight'], help: i18n.translate('expressions.functions.font.args.lHeightHelpText', { defaultMessage: 'The line height in pixels', @@ -104,14 +105,14 @@ export const font: ExpressionFunctionFont = { types: ['number', 'null'], }, size: { - default: 14, + default: `{ theme "font.size" default=14 }`, help: i18n.translate('expressions.functions.font.args.sizeHelpText', { defaultMessage: 'The font size in pixels', }), types: ['number'], }, underline: { - default: false, + default: `{ theme "font.underline" default=false }`, help: i18n.translate('expressions.functions.font.args.underlineHelpText', { defaultMessage: 'Underline the text?', }), @@ -119,7 +120,7 @@ export const font: ExpressionFunctionFont = { types: ['boolean'], }, weight: { - default: 'normal', + default: `{ theme "font.weight" default="normal" }`, help: i18n.translate('expressions.functions.font.args.weightHelpText', { defaultMessage: 'The font weight. For example, {list}, or {end}.', values: { diff --git a/src/plugins/expressions/common/expression_functions/specs/index.ts b/src/plugins/expressions/common/expression_functions/specs/index.ts index f7471a8fd9d75..5b9562dae5f2e 100644 --- a/src/plugins/expressions/common/expression_functions/specs/index.ts +++ b/src/plugins/expressions/common/expression_functions/specs/index.ts @@ -24,6 +24,7 @@ import { kibanaContextFunction } from './kibana_context'; import { variableSet } from './var_set'; import { variable } from './var'; import { AnyExpressionFunctionDefinition } from '../types'; +import { theme } from './theme'; export const functionSpecs: AnyExpressionFunctionDefinition[] = [ clog, @@ -32,6 +33,7 @@ export const functionSpecs: AnyExpressionFunctionDefinition[] = [ kibanaContextFunction, variableSet, variable, + theme, ]; export * from './clog'; @@ -40,3 +42,4 @@ export * from './kibana'; export * from './kibana_context'; export * from './var_set'; export * from './var'; +export * from './theme'; diff --git a/src/plugins/expressions/common/expression_functions/specs/tests/font.test.ts b/src/plugins/expressions/common/expression_functions/specs/tests/font.test.ts index 62e5fd4e0b668..ca4570e9589ca 100644 --- a/src/plugins/expressions/common/expression_functions/specs/tests/font.test.ts +++ b/src/plugins/expressions/common/expression_functions/specs/tests/font.test.ts @@ -24,8 +24,19 @@ import { functionWrapper } from './utils'; describe('font', () => { const fn = functionWrapper(font); + const args = { + align: 'left', + color: null, + family: openSans.value, + italic: false, + lHeight: null, + size: 14, + underline: false, + weight: 'normal', + }; + describe('default output', () => { - const result = fn(null); + const result = fn(null, args); it('returns a style', () => { expect(result).toMatchObject({ @@ -39,7 +50,7 @@ describe('font', () => { describe('args', () => { describe('size', () => { it('sets font size', () => { - const result = fn(null, { size: 20 }); + const result = fn(null, { ...args, size: 20 }); expect(result).toMatchObject({ spec: { fontSize: '20px', @@ -47,21 +58,11 @@ describe('font', () => { }); expect(result.css).toContain('font-size:20px'); }); - - it('defaults to 14px', () => { - const result = fn(null); - expect(result).toMatchObject({ - spec: { - fontSize: '14px', - }, - }); - expect(result.css).toContain('font-size:14px'); - }); }); describe('lHeight', () => { it('sets line height', () => { - const result = fn(null, { lHeight: 30 }); + const result = fn(null, { ...args, lHeight: 30 }); expect(result).toMatchObject({ spec: { lineHeight: '30px', @@ -69,31 +70,19 @@ describe('font', () => { }); expect(result.css).toContain('line-height:30px'); }); - - it('defaults to 1', () => { - const result = fn(null); - expect(result.spec.lineHeight).toBe('1'); - expect(result.css).toContain('line-height:1'); - }); }); describe('family', () => { it('sets font family', () => { - const result = fn(null, { family: 'Optima, serif' }); + const result = fn(null, { ...args, family: 'Optima, serif' }); expect(result.spec.fontFamily).toBe('Optima, serif'); expect(result.css).toContain('font-family:Optima, serif'); }); - - it(`defaults to "${openSans.value}"`, () => { - const result = fn(null); - expect(result.spec.fontFamily).toBe(`"${openSans.value}"`); - expect(result.css).toContain(`font-family:"${openSans.value}"`); - }); }); describe('color', () => { it('sets font color', () => { - const result = fn(null, { color: 'blue' }); + const result = fn(null, { ...args, color: 'blue' }); expect(result.spec.color).toBe('blue'); expect(result.css).toContain('color:blue'); }); @@ -101,51 +90,39 @@ describe('font', () => { describe('weight', () => { it('sets font weight', () => { - let result = fn(null, { weight: 'normal' }); + let result = fn(null, { ...args, weight: 'normal' }); expect(result.spec.fontWeight).toBe('normal'); expect(result.css).toContain('font-weight:normal'); - result = fn(null, { weight: 'bold' }); + result = fn(null, { ...args, weight: 'bold' }); expect(result.spec.fontWeight).toBe('bold'); expect(result.css).toContain('font-weight:bold'); - result = fn(null, { weight: 'bolder' }); + result = fn(null, { ...args, weight: 'bolder' }); expect(result.spec.fontWeight).toBe('bolder'); expect(result.css).toContain('font-weight:bolder'); - result = fn(null, { weight: 'lighter' }); + result = fn(null, { ...args, weight: 'lighter' }); expect(result.spec.fontWeight).toBe('lighter'); expect(result.css).toContain('font-weight:lighter'); - result = fn(null, { weight: '400' }); + result = fn(null, { ...args, weight: '400' }); expect(result.spec.fontWeight).toBe('400'); expect(result.css).toContain('font-weight:400'); }); - it("defaults to 'normal'", () => { - const result = fn(null); - expect(result.spec.fontWeight).toBe('normal'); - expect(result.css).toContain('font-weight:normal'); - }); - it('throws when provided an invalid weight', () => { - expect(() => fn(null, { weight: 'foo' })).toThrow(); + expect(() => fn(null, { ...args, weight: 'foo' })).toThrow(); }); }); describe('underline', () => { it('sets text underline', () => { - let result = fn(null, { underline: true }); + let result = fn(null, { ...args, underline: true }); expect(result.spec.textDecoration).toBe('underline'); expect(result.css).toContain('text-decoration:underline'); - result = fn(null, { underline: false }); - expect(result.spec.textDecoration).toBe('none'); - expect(result.css).toContain('text-decoration:none'); - }); - - it('defaults to false', () => { - const result = fn(null); + result = fn(null, { ...args, underline: false }); expect(result.spec.textDecoration).toBe('none'); expect(result.css).toContain('text-decoration:none'); }); @@ -153,17 +130,11 @@ describe('font', () => { describe('italic', () => { it('sets italic', () => { - let result = fn(null, { italic: true }); + let result = fn(null, { ...args, italic: true }); expect(result.spec.fontStyle).toBe('italic'); expect(result.css).toContain('font-style:italic'); - result = fn(null, { italic: false }); - expect(result.spec.fontStyle).toBe('normal'); - expect(result.css).toContain('font-style:normal'); - }); - - it('defaults to false', () => { - const result = fn(null); + result = fn(null, { ...args, italic: false }); expect(result.spec.fontStyle).toBe('normal'); expect(result.css).toContain('font-style:normal'); }); @@ -171,31 +142,25 @@ describe('font', () => { describe('align', () => { it('sets text alignment', () => { - let result = fn(null, { align: 'left' }); + let result = fn(null, { ...args, align: 'left' }); expect(result.spec.textAlign).toBe('left'); expect(result.css).toContain('text-align:left'); - result = fn(null, { align: 'center' }); + result = fn(null, { ...args, align: 'center' }); expect(result.spec.textAlign).toBe('center'); expect(result.css).toContain('text-align:center'); - result = fn(null, { align: 'right' }); + result = fn(null, { ...args, align: 'right' }); expect(result.spec.textAlign).toBe('right'); expect(result.css).toContain('text-align:right'); - result = fn(null, { align: 'justify' }); + result = fn(null, { ...args, align: 'justify' }); expect(result.spec.textAlign).toBe('justify'); expect(result.css).toContain('text-align:justify'); }); - it(`defaults to 'left'`, () => { - const result = fn(null); - expect(result.spec.textAlign).toBe('left'); - expect(result.css).toContain('text-align:left'); - }); - it('throws when provided an invalid alignment', () => { - expect(() => fn(null, { align: 'foo' })).toThrow(); + expect(() => fn(null, { ...args, align: 'foo' })).toThrow(); }); }); }); diff --git a/src/plugins/expressions/common/expression_functions/specs/tests/theme.test.ts b/src/plugins/expressions/common/expression_functions/specs/tests/theme.test.ts new file mode 100644 index 0000000000000..263409f0caca2 --- /dev/null +++ b/src/plugins/expressions/common/expression_functions/specs/tests/theme.test.ts @@ -0,0 +1,63 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { functionWrapper } from './utils'; +import { theme } from '../theme'; +import { ExecutionContext } from '../../../execution/types'; + +describe('expression_functions', () => { + describe('theme', () => { + const fn = functionWrapper(theme); + let context: ExecutionContext; + + let themeProps; + + beforeEach(() => { + themeProps = { + font: { + family: 'Arial', + size: 14, + }, + }; + + context = { + getInitialInput: () => {}, + types: {}, + variables: { theme: themeProps }, + abortSignal: {} as any, + inspectorAdapters: {} as any, + }; + }); + + it('returns the selected variable', () => { + const actual = fn(null, { variable: 'font.family' }, context); + expect(actual).toEqual('Arial'); + }); + + it('returns undefined if variable does not exist', () => { + const actual = fn(null, { variable: 'font.weight' }, context); + expect(actual).toEqual(undefined); + }); + + it('returns default if variable does not exist and default is provided', () => { + const actual = fn(null, { variable: 'font.weight', default: 'normal' }, context); + expect(actual).toEqual('normal'); + }); + }); +}); diff --git a/src/plugins/expressions/common/expression_functions/specs/theme.ts b/src/plugins/expressions/common/expression_functions/specs/theme.ts new file mode 100644 index 0000000000000..e27b01674cb5e --- /dev/null +++ b/src/plugins/expressions/common/expression_functions/specs/theme.ts @@ -0,0 +1,65 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { i18n } from '@kbn/i18n'; +import { get } from 'lodash'; +import { ExpressionFunctionDefinition } from '../types'; + +interface Arguments { + variable: string; + default: string | number | boolean; +} + +type Output = any; + +export type ExpressionFunctionTheme = ExpressionFunctionDefinition< + 'theme', + null, + Arguments, + Output +>; + +export const theme: ExpressionFunctionTheme = { + name: 'theme', + aliases: [], + help: i18n.translate('expressions.functions.themeHelpText', { + defaultMessage: 'Reads a theme setting.', + }), + inputTypes: ['null'], + args: { + variable: { + aliases: ['_'], + help: i18n.translate('expressions.functions.theme.args.variableHelpText', { + defaultMessage: 'Name of the theme variable to read.', + }), + required: true, + types: ['string'], + }, + default: { + help: i18n.translate('expressions.functions.theme.args.defaultHelpText', { + defaultMessage: 'default value in case theming info is not available.', + }), + }, + }, + fn: (input, args, handlers) => { + // currently we use variable `theme`, but external theme service would be preferable + const vars = handlers.variables.theme || {}; + return get(vars, args.variable, args.default); + }, +}; diff --git a/src/plugins/expressions/common/expression_functions/types.ts b/src/plugins/expressions/common/expression_functions/types.ts index 5979bcffb3175..d58d872aff722 100644 --- a/src/plugins/expressions/common/expression_functions/types.ts +++ b/src/plugins/expressions/common/expression_functions/types.ts @@ -28,6 +28,7 @@ import { ExpressionFunctionKibana, ExpressionFunctionVarSet, ExpressionFunctionVar, + ExpressionFunctionTheme, } from './specs'; /** @@ -122,4 +123,5 @@ export interface ExpressionFunctionDefinitions { kibana: ExpressionFunctionKibana; var_set: ExpressionFunctionVarSet; var: ExpressionFunctionVar; + theme: ExpressionFunctionTheme; } From 75b8a3cb710eb13c05b61c85bf345dd3e6d92cb3 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 11 Aug 2020 10:18:36 -0600 Subject: [PATCH 056/113] [Maps] add initial location option that fits to data bounds (#74583) * [Maps] add initial location option that fits to data bounds * update navigation_panel snapshot * add functional test to ensure sync is called when auto fit to bounds with no data * add functional test for auto fit to bounds on map load Co-authored-by: Elastic Machine --- x-pack/plugins/maps/common/constants.ts | 1 + .../public/actions/data_request_actions.ts | 34 +++++++++++++++- .../maps/public/actions/layer_actions.ts | 2 - .../maps/public/actions/map_actions.ts | 40 ++++++++----------- .../map/mb/get_initial_view.ts | 5 +++ .../navigation_panel.test.tsx.snap | 12 ++++++ .../map_settings_panel/navigation_panel.tsx | 11 ++++- .../apps/maps/auto_fit_to_bounds.js | 27 +++++++++++++ .../es_archives/maps/kibana/data.json | 29 ++++++++++++++ 9 files changed, 132 insertions(+), 29 deletions(-) diff --git a/x-pack/plugins/maps/common/constants.ts b/x-pack/plugins/maps/common/constants.ts index cf67ac4dd999f..eec23f95bb17b 100644 --- a/x-pack/plugins/maps/common/constants.ts +++ b/x-pack/plugins/maps/common/constants.ts @@ -234,6 +234,7 @@ export enum INITIAL_LOCATION { LAST_SAVED_LOCATION = 'LAST_SAVED_LOCATION', FIXED_LOCATION = 'FIXED_LOCATION', BROWSER_LOCATION = 'BROWSER_LOCATION', + AUTO_FIT_TO_BOUNDS = 'AUTO_FIT_TO_BOUNDS', } export enum LAYER_WIZARD_CATEGORY { diff --git a/x-pack/plugins/maps/public/actions/data_request_actions.ts b/x-pack/plugins/maps/public/actions/data_request_actions.ts index 4c829f8e75c20..a22e8d582bc5e 100644 --- a/x-pack/plugins/maps/public/actions/data_request_actions.ts +++ b/x-pack/plugins/maps/public/actions/data_request_actions.ts @@ -7,6 +7,7 @@ import { Dispatch } from 'redux'; import bbox from '@turf/bbox'; +import uuid from 'uuid/v4'; import { multiPoint } from '@turf/helpers'; import { FeatureCollection } from 'geojson'; import { MapStoreState } from '../reducers/store'; @@ -133,7 +134,7 @@ export function syncDataForAllLayers() { }; } -export function syncDataForAllJoinLayers() { +function syncDataForAllJoinLayers() { return async (dispatch: Dispatch, getState: () => MapStoreState) => { const syncPromises = getLayerList(getState()) .filter((layer) => { @@ -318,7 +319,7 @@ export function fitToLayerExtent(layerId: string) { }; } -export function fitToDataBounds() { +export function fitToDataBounds(onNoBounds?: () => void) { return async (dispatch: Dispatch, getState: () => MapStoreState) => { const layerList = getFittableLayers(getState()); @@ -365,6 +366,9 @@ export function fitToDataBounds() { } if (!corners.length) { + if (onNoBounds) { + onNoBounds(); + } return; } @@ -374,6 +378,32 @@ export function fitToDataBounds() { }; } +let lastSetQueryCallId: string = ''; +export function autoFitToBounds() { + return async (dispatch: Dispatch) => { + // Method can be triggered before async actions complete + // Use localSetQueryCallId to only continue execution path if method has not been re-triggered. + const localSetQueryCallId = uuid(); + lastSetQueryCallId = localSetQueryCallId; + + // Joins are performed on the client. + // As a result, bounds for join layers must also be performed on the client. + // Therefore join layers need to fetch data prior to auto fitting bounds. + await dispatch(syncDataForAllJoinLayers()); + + if (localSetQueryCallId === lastSetQueryCallId) { + // In cases where there are no bounds, such as no matching documents, fitToDataBounds does not trigger setGotoWithBounds. + // Ensure layer syncing occurs when setGotoWithBounds is not triggered. + function onNoBounds() { + if (localSetQueryCallId === lastSetQueryCallId) { + dispatch(syncDataForAllLayers()); + } + } + dispatch(fitToDataBounds(onNoBounds)); + } + }; +} + function setGotoWithBounds(bounds: MapExtent) { return { type: SET_GOTO, diff --git a/x-pack/plugins/maps/public/actions/layer_actions.ts b/x-pack/plugins/maps/public/actions/layer_actions.ts index 208f6dc6c6f85..472e42129816b 100644 --- a/x-pack/plugins/maps/public/actions/layer_actions.ts +++ b/x-pack/plugins/maps/public/actions/layer_actions.ts @@ -125,8 +125,6 @@ export function addLayer(layerDescriptor: LayerDescriptor) { }; } -// Do not use when rendering a map. Method exists to enable selectors for getLayerList when -// rendering is not needed. export function addLayerWithoutDataSync(layerDescriptor: LayerDescriptor) { return { type: ADD_LAYER, diff --git a/x-pack/plugins/maps/public/actions/map_actions.ts b/x-pack/plugins/maps/public/actions/map_actions.ts index 7191fb312b211..08826276c12ad 100644 --- a/x-pack/plugins/maps/public/actions/map_actions.ts +++ b/x-pack/plugins/maps/public/actions/map_actions.ts @@ -6,7 +6,6 @@ import { Dispatch } from 'redux'; import turfBboxPolygon from '@turf/bbox-polygon'; import turfBooleanContains from '@turf/boolean-contains'; -import uuid from 'uuid/v4'; import { Filter, Query, TimeRange } from 'src/plugins/data/public'; import { MapStoreState } from '../reducers/store'; @@ -44,12 +43,8 @@ import { UPDATE_DRAW_STATE, UPDATE_MAP_SETTING, } from './map_action_constants'; -import { - fitToDataBounds, - syncDataForAllJoinLayers, - syncDataForAllLayers, -} from './data_request_actions'; -import { addLayer } from './layer_actions'; +import { autoFitToBounds, syncDataForAllLayers } from './data_request_actions'; +import { addLayer, addLayerWithoutDataSync } from './layer_actions'; import { MapSettings } from '../reducers/map'; import { DrawState, @@ -57,6 +52,7 @@ import { MapExtent, MapRefreshConfig, } from '../../common/descriptor_types'; +import { INITIAL_LOCATION } from '../../common/constants'; import { scaleBounds } from '../elasticsearch_geo_utils'; export function setMapInitError(errorMessage: string) { @@ -98,13 +94,21 @@ export function mapReady() { type: MAP_READY, }); - getWaitingForMapReadyLayerListRaw(getState()).forEach((layerDescriptor) => { - dispatch(addLayer(layerDescriptor)); - }); - + const waitingForMapReadyLayerList = getWaitingForMapReadyLayerListRaw(getState()); dispatch({ type: CLEAR_WAITING_FOR_MAP_READY_LAYER_LIST, }); + + if (getMapSettings(getState()).initialLocation === INITIAL_LOCATION.AUTO_FIT_TO_BOUNDS) { + waitingForMapReadyLayerList.forEach((layerDescriptor) => { + dispatch(addLayerWithoutDataSync(layerDescriptor)); + }); + dispatch(autoFitToBounds()); + } else { + waitingForMapReadyLayerList.forEach((layerDescriptor) => { + dispatch(addLayer(layerDescriptor)); + }); + } }; } @@ -196,7 +200,6 @@ function generateQueryTimestamp() { return new Date().toISOString(); } -let lastSetQueryCallId: string = ''; export function setQuery({ query, timeFilters, @@ -227,18 +230,7 @@ export function setQuery({ }); if (getMapSettings(getState()).autoFitToDataBounds) { - // Joins are performed on the client. - // As a result, bounds for join layers must also be performed on the client. - // Therefore join layers need to fetch data prior to auto fitting bounds. - const localSetQueryCallId = uuid(); - lastSetQueryCallId = localSetQueryCallId; - await dispatch(syncDataForAllJoinLayers()); - - // setQuery can be triggered before async data fetching completes - // Only continue execution path if setQuery has not been re-triggered. - if (localSetQueryCallId === lastSetQueryCallId) { - dispatch(fitToDataBounds()); - } + dispatch(autoFitToBounds()); } else { await dispatch(syncDataForAllLayers()); } diff --git a/x-pack/plugins/maps/public/connected_components/map/mb/get_initial_view.ts b/x-pack/plugins/maps/public/connected_components/map/mb/get_initial_view.ts index b9d446d390ffb..20fb8186f9870 100644 --- a/x-pack/plugins/maps/public/connected_components/map/mb/get_initial_view.ts +++ b/x-pack/plugins/maps/public/connected_components/map/mb/get_initial_view.ts @@ -41,5 +41,10 @@ export async function getInitialView( }); } + if (settings.initialLocation === INITIAL_LOCATION.AUTO_FIT_TO_BOUNDS) { + // map bounds pulled from data sources. Just use default map location + return null; + } + return goto && goto.center ? goto.center : null; } diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap index 18e30d9446e05..1859c7d8177f8 100644 --- a/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap @@ -75,6 +75,10 @@ exports[`should render 1`] = ` "id": "LAST_SAVED_LOCATION", "label": "Map location at save", }, + Object { + "id": "AUTO_FIT_TO_BOUNDS", + "label": "Auto fit map to data bounds", + }, Object { "id": "FIXED_LOCATION", "label": "Fixed location", @@ -165,6 +169,10 @@ exports[`should render browser location form when initialLocation is BROWSER_LOC "id": "LAST_SAVED_LOCATION", "label": "Map location at save", }, + Object { + "id": "AUTO_FIT_TO_BOUNDS", + "label": "Auto fit map to data bounds", + }, Object { "id": "FIXED_LOCATION", "label": "Fixed location", @@ -275,6 +283,10 @@ exports[`should render fixed location form when initialLocation is FIXED_LOCATIO "id": "LAST_SAVED_LOCATION", "label": "Map location at save", }, + Object { + "id": "AUTO_FIT_TO_BOUNDS", + "label": "Auto fit map to data bounds", + }, Object { "id": "FIXED_LOCATION", "label": "Fixed location", diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx b/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx index 428a50e03515d..161c0c3576f8f 100644 --- a/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx @@ -41,6 +41,12 @@ const initialLocationOptions = [ defaultMessage: 'Map location at save', }), }, + { + id: INITIAL_LOCATION.AUTO_FIT_TO_BOUNDS, + label: i18n.translate('xpack.maps.mapSettingsPanel.autoFitToBoundsLocationLabel', { + defaultMessage: 'Auto fit map to data bounds', + }), + }, { id: INITIAL_LOCATION.FIXED_LOCATION, label: i18n.translate('xpack.maps.mapSettingsPanel.fixedLocationLabel', { @@ -125,7 +131,10 @@ export function NavigationPanel({ center, settings, updateMapSetting, zoom }: Pr }; function renderInitialLocationInputs() { - if (settings.initialLocation === INITIAL_LOCATION.LAST_SAVED_LOCATION) { + if ( + settings.initialLocation === INITIAL_LOCATION.LAST_SAVED_LOCATION || + settings.initialLocation === INITIAL_LOCATION.AUTO_FIT_TO_BOUNDS + ) { return null; } diff --git a/x-pack/test/functional/apps/maps/auto_fit_to_bounds.js b/x-pack/test/functional/apps/maps/auto_fit_to_bounds.js index c8e8db84df96f..d3d4fe054ec34 100644 --- a/x-pack/test/functional/apps/maps/auto_fit_to_bounds.js +++ b/x-pack/test/functional/apps/maps/auto_fit_to_bounds.js @@ -10,6 +10,23 @@ export default function ({ getPageObjects }) { const PageObjects = getPageObjects(['maps']); describe('auto fit map to bounds', () => { + describe('initial location', () => { + before(async () => { + await PageObjects.maps.loadSavedMap( + 'document example - auto fit to bounds for initial location' + ); + }); + + it('should automatically fit to bounds on initial map load', async () => { + const hits = await PageObjects.maps.getHits(); + expect(hits).to.equal('6'); + + const { lat, lon } = await PageObjects.maps.getView(); + expect(Math.round(lat)).to.equal(41); + expect(Math.round(lon)).to.equal(-99); + }); + }); + describe('without joins', () => { before(async () => { await PageObjects.maps.loadSavedMap('document example'); @@ -25,10 +42,20 @@ export default function ({ getPageObjects }) { await PageObjects.maps.setAndSubmitQuery('machine.os.raw : "ios"'); await PageObjects.maps.waitForMapPanAndZoom(origView); + const hits = await PageObjects.maps.getHits(); + expect(hits).to.equal('2'); + const { lat, lon } = await PageObjects.maps.getView(); expect(Math.round(lat)).to.equal(43); expect(Math.round(lon)).to.equal(-102); }); + + it('should sync layers even when there is not data', async () => { + await PageObjects.maps.setAndSubmitQuery('machine.os.raw : "fake_os_with_no_matches"'); + + const hits = await PageObjects.maps.getHits(); + expect(hits).to.equal('0'); + }); }); describe('with joins', () => { diff --git a/x-pack/test/functional/es_archives/maps/kibana/data.json b/x-pack/test/functional/es_archives/maps/kibana/data.json index 7690c92589312..198174bccb286 100644 --- a/x-pack/test/functional/es_archives/maps/kibana/data.json +++ b/x-pack/test/functional/es_archives/maps/kibana/data.json @@ -979,6 +979,35 @@ } } +{ + "type": "doc", + "value": { + "id": "map:13776f20-db37-11ea-8fbb-3da39bb9bff2", + "index": ".kibana", + "source": { + "map" : { + "title" : "document example - auto fit to bounds for initial location", + "description" : "", + "mapStateJSON" : "{\"zoom\":5.2,\"center\":{\"lon\":-67.80052,\"lat\":-55.25331},\"timeFilters\":{\"from\":\"2015-09-20T00:00:00.000Z\",\"to\":\"2015-09-20T01:00:00.000Z\"},\"refreshConfig\":{\"isPaused\":true,\"interval\":1000},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"settings\":{\"autoFitToDataBounds\":false,\"initialLocation\":\"AUTO_FIT_TO_BOUNDS\",\"fixedLocation\":{\"lat\":0,\"lon\":0,\"zoom\":2},\"browserLocation\":{\"zoom\":2},\"maxZoom\":24,\"minZoom\":0,\"showSpatialFilters\":true,\"spatialFiltersAlpa\":0.3,\"spatialFiltersFillColor\":\"#DA8B45\",\"spatialFiltersLineColor\":\"#DA8B45\"}}", + "layerListJSON" : "[{\"id\":\"0hmz5\",\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"id\":\"road_map\"},\"visible\":true,\"temporary\":false,\"style\":{\"type\":\"TILE\",\"properties\":{}},\"type\":\"VECTOR_TILE\",\"minZoom\":0,\"maxZoom\":24},{\"id\":\"z52lq\",\"label\":\"logstash\",\"minZoom\":0,\"maxZoom\":24,\"sourceDescriptor\":{\"id\":\"e1a5e1a6-676c-4a89-8ea9-0d91d64b73c6\",\"type\":\"ES_SEARCH\",\"geoField\":\"geo.coordinates\",\"limit\":2048,\"filterByMapBounds\":true,\"showTooltip\":true,\"tooltipProperties\":[],\"applyGlobalQuery\":true,\"scalingType\":\"LIMIT\",\"indexPatternRefName\":\"layer_1_source_index_pattern\"},\"visible\":true,\"temporary\":false,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#e6194b\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}},\"symbolizeAs\":{\"options\":{\"value\":\"circle\"}},\"icon\":{\"type\":\"STATIC\",\"options\":{\"value\":\"marker\"}}},\"previousStyle\":null},\"type\":\"VECTOR\"}]", + "uiStateJSON" : "{\"isLayerTOCOpen\":true,\"openTOCDetails\":[]}" + }, + "type" : "map", + "references" : [ + { + "name" : "layer_1_source_index_pattern", + "type" : "index-pattern", + "id" : "c698b940-e149-11e8-a35a-370a8516603a" + } + ], + "migrationVersion" : { + "map" : "7.9.0" + }, + "updated_at" : "2020-08-10T18:27:39.805Z" + } + } +} + { "type": "doc", "value": { From 0cfc7b464c329858effc6cef952c2d311c0aab52 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 11 Aug 2020 20:10:35 +0300 Subject: [PATCH 057/113] [Lens] Add styling options for x and y axes on the settings popover (#71829) * [Lens] Add styling options for x axis on the settings popover * ts related changes * Changes to the popover's design and y-axis implementatin * fix types and add unit tests * Add extra translations * Fix functional test and change the logic of the yTitle * fixes * fix showTitle settings bug * Fix ticklabels bug on y axes * fix some tests * Change the user flow on x and y titles on settings popover and enable the gridlines by default * disable linter warning * PR Comments * Add a comment to callback to explain the decision to listen only to open changes Co-authored-by: Elastic Machine --- .../__snapshots__/to_expression.test.ts.snap | 48 +++- .../__snapshots__/xy_expression.test.tsx.snap | 49 +++- .../lens/public/xy_visualization/index.ts | 4 +- .../xy_visualization/to_expression.test.ts | 77 +++++- .../public/xy_visualization/to_expression.ts | 63 +++-- .../lens/public/xy_visualization/types.ts | 85 ++++++ .../xy_visualization/xy_config_panel.test.tsx | 69 ++++- .../xy_visualization/xy_config_panel.tsx | 261 ++++++++++++++++-- .../xy_visualization/xy_expression.test.tsx | 173 +++++++++++- .../public/xy_visualization/xy_expression.tsx | 68 +++-- .../xy_visualization/xy_suggestions.test.ts | 20 ++ .../public/xy_visualization/xy_suggestions.ts | 12 + 12 files changed, 852 insertions(+), 77 deletions(-) diff --git a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap index b5783803b803c..19ea75239ddb2 100644 --- a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap +++ b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap @@ -8,6 +8,25 @@ Object { "fittingFunction": Array [ "Carry", ], + "gridlinesVisibilitySettings": Array [ + Object { + "chain": Array [ + Object { + "arguments": Object { + "x": Array [ + false, + ], + "y": Array [ + true, + ], + }, + "function": "lens_xy_gridlinesConfig", + "type": "function", + }, + ], + "type": "expression", + }, + ], "layers": Array [ Object { "chain": Array [ @@ -73,11 +92,36 @@ Object { "type": "expression", }, ], + "showXAxisTitle": Array [ + true, + ], + "showYAxisTitle": Array [ + true, + ], + "tickLabelsVisibilitySettings": Array [ + Object { + "chain": Array [ + Object { + "arguments": Object { + "x": Array [ + false, + ], + "y": Array [ + true, + ], + }, + "function": "lens_xy_tickLabelsConfig", + "type": "function", + }, + ], + "type": "expression", + }, + ], "xTitle": Array [ - "col_a", + "", ], "yTitle": Array [ - "col_b", + "", ], }, "function": "lens_xy_chart", diff --git a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap index c7c173f87ad7c..f0c233b44a285 100644 --- a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap +++ b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap @@ -20,9 +20,14 @@ exports[`xy_expression XYChart component it renders area 1`] = ` } /> @@ -146,9 +151,14 @@ exports[`xy_expression XYChart component it renders bar 1`] = ` } /> @@ -262,9 +272,14 @@ exports[`xy_expression XYChart component it renders horizontal bar 1`] = ` } /> @@ -378,9 +393,14 @@ exports[`xy_expression XYChart component it renders line 1`] = ` } /> @@ -504,9 +524,14 @@ exports[`xy_expression XYChart component it renders stacked area 1`] = ` } /> @@ -628,9 +653,14 @@ exports[`xy_expression XYChart component it renders stacked bar 1`] = ` } /> @@ -752,9 +782,14 @@ exports[`xy_expression XYChart component it renders stacked horizontal bar 1`] = } /> diff --git a/x-pack/plugins/lens/public/xy_visualization/index.ts b/x-pack/plugins/lens/public/xy_visualization/index.ts index 77cab1ee21344..fddcad7989b25 100644 --- a/x-pack/plugins/lens/public/xy_visualization/index.ts +++ b/x-pack/plugins/lens/public/xy_visualization/index.ts @@ -10,7 +10,7 @@ import { ExpressionsSetup } from '../../../../../src/plugins/expressions/public' import { UI_SETTINGS } from '../../../../../src/plugins/data/public'; import { xyVisualization } from './xy_visualization'; import { xyChart, getXyChartRenderer } from './xy_expression'; -import { legendConfig, layerConfig, yAxisConfig } from './types'; +import { legendConfig, layerConfig, yAxisConfig, tickLabelsConfig, gridlinesConfig } from './types'; import { EditorFrameSetup, FormatFactory } from '../types'; import { ChartsPluginSetup } from '../../../../../src/plugins/charts/public'; @@ -39,6 +39,8 @@ export class XyVisualization { ) { expressions.registerFunction(() => legendConfig); expressions.registerFunction(() => yAxisConfig); + expressions.registerFunction(() => tickLabelsConfig); + expressions.registerFunction(() => gridlinesConfig); expressions.registerFunction(() => layerConfig); expressions.registerFunction(() => xyChart); diff --git a/x-pack/plugins/lens/public/xy_visualization/to_expression.test.ts b/x-pack/plugins/lens/public/xy_visualization/to_expression.test.ts index 31b34e41e82db..876d1141740e1 100644 --- a/x-pack/plugins/lens/public/xy_visualization/to_expression.test.ts +++ b/x-pack/plugins/lens/public/xy_visualization/to_expression.test.ts @@ -41,6 +41,8 @@ describe('#toExpression', () => { legend: { position: Position.Bottom, isVisible: true }, preferredSeriesType: 'bar', fittingFunction: 'Carry', + tickLabelsVisibilitySettings: { x: false, y: true }, + gridlinesVisibilitySettings: { x: false, y: true }, layers: [ { layerId: 'first', @@ -77,6 +79,27 @@ describe('#toExpression', () => { ).toEqual('None'); }); + it('should default the showXAxisTitle and showYAxisTitle to true', () => { + const expression = xyVisualization.toExpression( + { + legend: { position: Position.Bottom, isVisible: true }, + preferredSeriesType: 'bar', + layers: [ + { + layerId: 'first', + seriesType: 'area', + splitAccessor: 'd', + xAccessor: 'a', + accessors: ['b', 'c'], + }, + ], + }, + frame + ) as Ast; + expect(expression.chain[0].arguments.showXAxisTitle[0]).toBe(true); + expect(expression.chain[0].arguments.showYAxisTitle[0]).toBe(true); + }); + it('should not generate an expression when missing x', () => { expect( xyVisualization.toExpression( @@ -140,8 +163,8 @@ describe('#toExpression', () => { expect(mockDatasource.publicAPIMock.getOperationForColumnId).toHaveBeenCalledWith('b'); expect(mockDatasource.publicAPIMock.getOperationForColumnId).toHaveBeenCalledWith('c'); expect(mockDatasource.publicAPIMock.getOperationForColumnId).toHaveBeenCalledWith('d'); - expect(expression.chain[0].arguments.xTitle).toEqual(['col_a']); - expect(expression.chain[0].arguments.yTitle).toEqual(['col_b']); + expect(expression.chain[0].arguments.xTitle).toEqual(['']); + expect(expression.chain[0].arguments.yTitle).toEqual(['']); expect( (expression.chain[0].arguments.layers[0] as Ast).chain[0].arguments.columnToLabel ).toEqual([ @@ -152,4 +175,54 @@ describe('#toExpression', () => { }), ]); }); + + it('should default the tick labels visibility settings to true', () => { + const expression = xyVisualization.toExpression( + { + legend: { position: Position.Bottom, isVisible: true }, + preferredSeriesType: 'bar', + layers: [ + { + layerId: 'first', + seriesType: 'area', + splitAccessor: 'd', + xAccessor: 'a', + accessors: ['b', 'c'], + }, + ], + }, + frame + ) as Ast; + expect( + (expression.chain[0].arguments.tickLabelsVisibilitySettings[0] as Ast).chain[0].arguments + ).toEqual({ + x: [true], + y: [true], + }); + }); + + it('should default the gridlines visibility settings to true', () => { + const expression = xyVisualization.toExpression( + { + legend: { position: Position.Bottom, isVisible: true }, + preferredSeriesType: 'bar', + layers: [ + { + layerId: 'first', + seriesType: 'area', + splitAccessor: 'd', + xAccessor: 'a', + accessors: ['b', 'c'], + }, + ], + }, + frame + ) as Ast; + expect( + (expression.chain[0].arguments.gridlinesVisibilitySettings[0] as Ast).chain[0].arguments + ).toEqual({ + x: [true], + y: [true], + }); + }); }); diff --git a/x-pack/plugins/lens/public/xy_visualization/to_expression.ts b/x-pack/plugins/lens/public/xy_visualization/to_expression.ts index b17704b38cdec..9b9c159af265e 100644 --- a/x-pack/plugins/lens/public/xy_visualization/to_expression.ts +++ b/x-pack/plugins/lens/public/xy_visualization/to_expression.ts @@ -13,28 +13,6 @@ interface ValidLayer extends LayerConfig { xAccessor: NonNullable; } -function xyTitles(layer: LayerConfig, frame: FramePublicAPI) { - const defaults = { - xTitle: 'x', - yTitle: 'y', - }; - - if (!layer || !layer.accessors.length) { - return defaults; - } - const datasource = frame.datasourceLayers[layer.layerId]; - if (!datasource) { - return defaults; - } - const x = layer.xAccessor ? datasource.getOperationForColumnId(layer.xAccessor) : null; - const y = layer.accessors[0] ? datasource.getOperationForColumnId(layer.accessors[0]) : null; - - return { - xTitle: x ? x.label : defaults.xTitle, - yTitle: y ? y.label : defaults.yTitle, - }; -} - export const toExpression = (state: State, frame: FramePublicAPI): Ast | null => { if (!state || !state.layers.length) { return null; @@ -52,7 +30,7 @@ export const toExpression = (state: State, frame: FramePublicAPI): Ast | null => }); }); - return buildExpression(state, metadata, frame, xyTitles(state.layers[0], frame)); + return buildExpression(state, metadata, frame); }; export function toPreviewExpression(state: State, frame: FramePublicAPI) { @@ -99,8 +77,7 @@ export function getScaleType(metadata: OperationMetadata | null, defaultScale: S export const buildExpression = ( state: State, metadata: Record>, - frame?: FramePublicAPI, - { xTitle, yTitle }: { xTitle: string; yTitle: string } = { xTitle: '', yTitle: '' } + frame?: FramePublicAPI ): Ast | null => { const validLayers = state.layers.filter((layer): layer is ValidLayer => Boolean(layer.xAccessor && layer.accessors.length) @@ -116,8 +93,8 @@ export const buildExpression = ( type: 'function', function: 'lens_xy_chart', arguments: { - xTitle: [xTitle], - yTitle: [yTitle], + xTitle: [state.xTitle || ''], + yTitle: [state.yTitle || ''], legend: [ { type: 'expression', @@ -137,6 +114,38 @@ export const buildExpression = ( }, ], fittingFunction: [state.fittingFunction || 'None'], + showXAxisTitle: [state.showXAxisTitle ?? true], + showYAxisTitle: [state.showYAxisTitle ?? true], + tickLabelsVisibilitySettings: [ + { + type: 'expression', + chain: [ + { + type: 'function', + function: 'lens_xy_tickLabelsConfig', + arguments: { + x: [state?.tickLabelsVisibilitySettings?.x ?? true], + y: [state?.tickLabelsVisibilitySettings?.y ?? true], + }, + }, + ], + }, + ], + gridlinesVisibilitySettings: [ + { + type: 'expression', + chain: [ + { + type: 'function', + function: 'lens_xy_gridlinesConfig', + arguments: { + x: [state?.gridlinesVisibilitySettings?.x ?? true], + y: [state?.gridlinesVisibilitySettings?.y ?? true], + }, + }, + ], + }, + ], layers: validLayers.map((layer) => { const columnToLabel: Record = {}; diff --git a/x-pack/plugins/lens/public/xy_visualization/types.ts b/x-pack/plugins/lens/public/xy_visualization/types.ts index 605119535d1f0..ab689ceb183be 100644 --- a/x-pack/plugins/lens/public/xy_visualization/types.ts +++ b/x-pack/plugins/lens/public/xy_visualization/types.ts @@ -75,6 +75,81 @@ export const legendConfig: ExpressionFunctionDefinition< }, }; +export interface AxesSettingsConfig { + x: boolean; + y: boolean; +} + +type TickLabelsConfigResult = AxesSettingsConfig & { type: 'lens_xy_tickLabelsConfig' }; + +export const tickLabelsConfig: ExpressionFunctionDefinition< + 'lens_xy_tickLabelsConfig', + null, + AxesSettingsConfig, + TickLabelsConfigResult +> = { + name: 'lens_xy_tickLabelsConfig', + aliases: [], + type: 'lens_xy_tickLabelsConfig', + help: `Configure the xy chart's tick labels appearance`, + inputTypes: ['null'], + args: { + x: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.xAxisTickLabels.help', { + defaultMessage: 'Specifies whether or not the tick labels of the x-axis are visible.', + }), + }, + y: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.yAxisTickLabels.help', { + defaultMessage: 'Specifies whether or not the tick labels of the y-axis are visible.', + }), + }, + }, + fn: function fn(input: unknown, args: AxesSettingsConfig) { + return { + type: 'lens_xy_tickLabelsConfig', + ...args, + }; + }, +}; + +type GridlinesConfigResult = AxesSettingsConfig & { type: 'lens_xy_gridlinesConfig' }; + +export const gridlinesConfig: ExpressionFunctionDefinition< + 'lens_xy_gridlinesConfig', + null, + AxesSettingsConfig, + GridlinesConfigResult +> = { + name: 'lens_xy_gridlinesConfig', + aliases: [], + type: 'lens_xy_gridlinesConfig', + help: `Configure the xy chart's gridlines appearance`, + inputTypes: ['null'], + args: { + x: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.xAxisGridlines.help', { + defaultMessage: 'Specifies whether or not the gridlines of the x-axis are visible.', + }), + }, + y: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.yAxisgridlines.help', { + defaultMessage: 'Specifies whether or not the gridlines of the y-axis are visible.', + }), + }, + }, + fn: function fn(input: unknown, args: AxesSettingsConfig) { + return { + type: 'lens_xy_gridlinesConfig', + ...args, + }; + }, +}; + interface AxisConfig { title: string; hide?: boolean; @@ -243,6 +318,10 @@ export interface XYArgs { legend: LegendConfig & { type: 'lens_xy_legendConfig' }; layers: LayerArgs[]; fittingFunction?: FittingFunction; + showXAxisTitle?: boolean; + showYAxisTitle?: boolean; + tickLabelsVisibilitySettings?: AxesSettingsConfig & { type: 'lens_xy_tickLabelsConfig' }; + gridlinesVisibilitySettings?: AxesSettingsConfig & { type: 'lens_xy_gridlinesConfig' }; } // Persisted parts of the state @@ -251,6 +330,12 @@ export interface XYState { legend: LegendConfig; fittingFunction?: FittingFunction; layers: LayerConfig[]; + xTitle?: string; + yTitle?: string; + showXAxisTitle?: boolean; + showYAxisTitle?: boolean; + tickLabelsVisibilitySettings?: AxesSettingsConfig; + gridlinesVisibilitySettings?: AxesSettingsConfig; } export type State = XYState; diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx index 375eaf736cc95..31ba1bc83d970 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx @@ -109,7 +109,6 @@ describe('XY Config panels', () => { it('should disable the select if there is no unstacked area or line series', () => { const state = testState(); - const component = shallow( { expect(component.find(EuiSuperSelect).prop('disabled')).toEqual(true); }); + + it('should show the values of the X and Y axes titles on the corresponding input text', () => { + const state = testState(); + const component = shallow( + + ); + + expect(component.find('[data-test-subj="lnsXAxisTitle"]').prop('value')).toBe( + 'My custom X axis title' + ); + expect(component.find('[data-test-subj="lnsYAxisTitle"]').prop('value')).toBe( + 'My custom Y axis title' + ); + }); + + it('should disable the input texts if the switch is off', () => { + const state = testState(); + const component = shallow( + + ); + + expect(component.find('[data-test-subj="lnsXAxisTitle"]').prop('disabled')).toBe(true); + expect(component.find('[data-test-subj="lnsYAxisTitle"]').prop('disabled')).toBe(true); + }); + + it('has the tick labels buttons enabled', () => { + const state = testState(); + const component = shallow(); + + const options = component + .find('[data-test-subj="lnsTickLabelsSettings"]') + .prop('options') as EuiButtonGroupProps['options']; + + expect(options!.map(({ label }) => label)).toEqual(['X-axis', 'Y-axis']); + + const selections = component + .find('[data-test-subj="lnsTickLabelsSettings"]') + .prop('idToSelectedMap'); + + expect(selections!).toEqual({ x: true, y: true }); + }); + + it('has the gridlines buttons enabled', () => { + const state = testState(); + const component = shallow(); + + const selections = component + .find('[data-test-subj="lnsGridlinesSettings"]') + .prop('idToSelectedMap'); + + expect(selections!).toEqual({ x: true, y: true }); + }); }); }); diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.tsx index e4bc6de5cc68a..d64eb9451a50e 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.tsx @@ -5,7 +5,7 @@ */ import './xy_config_panel.scss'; -import React, { useState } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import { Position } from '@elastic/charts'; import { debounce } from 'lodash'; @@ -24,14 +24,17 @@ import { EuiColorPickerProps, EuiToolTip, EuiIcon, + EuiFieldText, + EuiSwitch, EuiHorizontalRule, + EuiTitle, } from '@elastic/eui'; import { VisualizationLayerWidgetProps, VisualizationDimensionEditorProps, VisualizationToolbarProps, } from '../types'; -import { State, SeriesType, visualizationTypes, YAxisMode } from './types'; +import { State, SeriesType, visualizationTypes, YAxisMode, AxesSettingsConfig } from './types'; import { isHorizontalChart, isHorizontalSeries, getSeriesColor } from './state_helpers'; import { trackUiEvent } from '../lens_ui_telemetry'; import { fittingFunctionDefinitions } from './fitting_functions'; @@ -118,14 +121,117 @@ export function LayerContextMenu(props: VisualizationLayerWidgetProps) { } export function XyToolbar(props: VisualizationToolbarProps) { + const axes = [ + { + id: 'x', + label: 'X-axis', + }, + { + id: 'y', + label: 'Y-axis', + }, + ]; + + const { frame, state, setState } = props; + const [open, setOpen] = useState(false); - const hasNonBarSeries = props.state?.layers.some( + const hasNonBarSeries = state?.layers.some( (layer) => layer.seriesType === 'line' || layer.seriesType === 'area' ); + + const [xAxisTitle, setXAxisTitle] = useState(state?.xTitle); + const [yAxisTitle, setYAxisTitle] = useState(state?.yTitle); + + const xyTitles = useCallback(() => { + const defaults = { + xTitle: xAxisTitle, + yTitle: yAxisTitle, + }; + const layer = state?.layers[0]; + if (!layer || !layer.accessors.length) { + return defaults; + } + const datasource = frame.datasourceLayers[layer.layerId]; + if (!datasource) { + return defaults; + } + const x = layer.xAccessor ? datasource.getOperationForColumnId(layer.xAccessor) : null; + const y = layer.accessors[0] ? datasource.getOperationForColumnId(layer.accessors[0]) : null; + + return { + xTitle: defaults.xTitle || x?.label, + yTitle: defaults.yTitle || y?.label, + }; + /* We want this callback to run only if open changes its state. What we want to accomplish here is to give the user a better UX. + By default these input fields have the axis legends. If the user changes the input text, the axis legends should also change. + BUT if the user cleans up the input text, it should remain empty until the user closes and reopens the panel. + In that case, the default axes legend should appear. */ + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [open]); + + useEffect(() => { + const { + xTitle, + yTitle, + }: { xTitle: string | undefined; yTitle: string | undefined } = xyTitles(); + setXAxisTitle(xTitle); + setYAxisTitle(yTitle); + }, [xyTitles]); + + const onXTitleChange = (value: string): void => { + setXAxisTitle(value); + setState({ ...state, xTitle: value }); + }; + + const onYTitleChange = (value: string): void => { + setYAxisTitle(value); + setState({ ...state, yTitle: value }); + }; + + type AxesSettingsConfigKeys = keyof AxesSettingsConfig; + + const tickLabelsVisibilitySettings = { + x: state?.tickLabelsVisibilitySettings?.x ?? true, + y: state?.tickLabelsVisibilitySettings?.y ?? true, + }; + + const onTickLabelsVisibilitySettingsChange = (optionId: string): void => { + const id = optionId as AxesSettingsConfigKeys; + const newTickLabelsVisibilitySettings = { + ...tickLabelsVisibilitySettings, + ...{ + [id]: !tickLabelsVisibilitySettings[id], + }, + }; + setState({ + ...state, + tickLabelsVisibilitySettings: newTickLabelsVisibilitySettings, + }); + }; + + const gridlinesVisibilitySettings = { + x: state?.gridlinesVisibilitySettings?.x ?? true, + y: state?.gridlinesVisibilitySettings?.y ?? true, + }; + + const onGridlinesVisibilitySettingsChange = (optionId: string): void => { + const id = optionId as AxesSettingsConfigKeys; + const newGridlinesVisibilitySettings = { + ...gridlinesVisibilitySettings, + ...{ + [id]: !gridlinesVisibilitySettings[id], + }, + }; + setState({ + ...state, + gridlinesVisibilitySettings: newGridlinesVisibilitySettings, + }); + }; + const legendMode = - props.state?.legend.isVisible && !props.state?.legend.showSingleSeries + state?.legend.isVisible && !state?.legend.showSingleSeries ? 'auto' - : !props.state?.legend.isVisible + : !state?.legend.isVisible ? 'hide' : 'show'; return ( @@ -183,8 +289,8 @@ export function XyToolbar(props: VisualizationToolbarProps) { inputDisplay: title, }; })} - valueOfSelected={props.state?.fittingFunction || 'None'} - onChange={(value) => props.setState({ ...props.state, fittingFunction: value })} + valueOfSelected={state?.fittingFunction || 'None'} + onChange={(value) => setState({ ...state, fittingFunction: value })} itemLayoutAlign="top" hasDividers /> @@ -209,19 +315,19 @@ export function XyToolbar(props: VisualizationToolbarProps) { onChange={(optionId) => { const newMode = legendOptions.find(({ id }) => id === optionId)!.value; if (newMode === 'auto') { - props.setState({ - ...props.state, - legend: { ...props.state.legend, isVisible: true, showSingleSeries: false }, + setState({ + ...state, + legend: { ...state.legend, isVisible: true, showSingleSeries: false }, }); } else if (newMode === 'show') { - props.setState({ - ...props.state, - legend: { ...props.state.legend, isVisible: true, showSingleSeries: true }, + setState({ + ...state, + legend: { ...state.legend, isVisible: true, showSingleSeries: true }, }); } else if (newMode === 'hide') { - props.setState({ - ...props.state, - legend: { ...props.state.legend, isVisible: false, showSingleSeries: false }, + setState({ + ...state, + legend: { ...state.legend, isVisible: false, showSingleSeries: false }, }); } }} @@ -242,15 +348,130 @@ export function XyToolbar(props: VisualizationToolbarProps) { { value: Position.Right, text: 'Right' }, { value: Position.Bottom, text: 'Bottom' }, ]} - value={props.state?.legend.position} + value={state?.legend.position} onChange={(e) => { - props.setState({ - ...props.state, - legend: { ...props.state.legend, position: e.target.value as Position }, + setState({ + ...state, + legend: { ...state.legend, position: e.target.value as Position }, }); }} /> + + + onTickLabelsVisibilitySettingsChange(id)} + buttonSize="compressed" + isFullWidth + type="multi" + /> + + + onGridlinesVisibilitySettingsChange(id)} + buttonSize="compressed" + isFullWidth + type="multi" + /> + + + + + {i18n.translate('xpack.lens.xyChart.axisTitles', { defaultMessage: 'Axis titles' })} + + + + X-axis + + + setState({ ...state, showXAxisTitle: target.checked }) + } + checked={state?.showXAxisTitle ?? true} + /> + + + } + > + onXTitleChange(target.value)} + aria-label={i18n.translate('xpack.lens.xyChart.overwriteXaxis', { + defaultMessage: 'Overwrite X-axis title', + })} + /> + + + Y-axis + + + setState({ ...state, showYAxisTitle: target.checked }) + } + checked={state?.showYAxisTitle ?? true} + /> + + + } + > + onYTitleChange(target.value)} + aria-label={i18n.translate('xpack.lens.xyChart.overwriteYaxis', { + defaultMessage: 'Overwrite Y-axis title', + })} + /> + diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx index c880cbb641e5d..ba1ff6a1df030 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx @@ -22,7 +22,16 @@ import { LensMultiTable } from '../types'; import { KibanaDatatable, KibanaDatatableRow } from '../../../../../src/plugins/expressions/public'; import React from 'react'; import { shallow } from 'enzyme'; -import { XYArgs, LegendConfig, legendConfig, layerConfig, LayerArgs } from './types'; +import { + XYArgs, + LegendConfig, + legendConfig, + layerConfig, + LayerArgs, + AxesSettingsConfig, + tickLabelsConfig, + gridlinesConfig, +} from './types'; import { createMockExecutionContext } from '../../../../../src/plugins/expressions/common/mocks'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { chartPluginMock } from '../../../../../src/plugins/charts/public/mocks'; @@ -211,6 +220,18 @@ const createArgsWithLayers = (layers: LayerArgs[] = [sampleLayer]): XYArgs => ({ isVisible: false, position: Position.Top, }, + showXAxisTitle: true, + showYAxisTitle: true, + tickLabelsVisibilitySettings: { + type: 'lens_xy_tickLabelsConfig', + x: true, + y: false, + }, + gridlinesVisibilitySettings: { + type: 'lens_xy_gridlinesConfig', + x: true, + y: false, + }, layers, }); @@ -267,6 +288,34 @@ describe('xy_expression', () => { }); }); + test('tickLabelsConfig produces the correct arguments', () => { + const args: AxesSettingsConfig = { + x: true, + y: false, + }; + + const result = tickLabelsConfig.fn(null, args, createMockExecutionContext()); + + expect(result).toEqual({ + type: 'lens_xy_tickLabelsConfig', + ...args, + }); + }); + + test('gridlinesConfig produces the correct arguments', () => { + const args: AxesSettingsConfig = { + x: true, + y: false, + }; + + const result = gridlinesConfig.fn(null, args, createMockExecutionContext()); + + expect(result).toEqual({ + type: 'lens_xy_gridlinesConfig', + ...args, + }); + }); + describe('xyChart', () => { test('it renders with the specified data and args', () => { const { data, args } = sampleArgs(); @@ -1365,6 +1414,35 @@ describe('xy_expression', () => { expect(convertSpy).toHaveBeenCalledWith('I'); }); + test('it should not pass the formatter function to the x axis if the visibility of the tick labels is off', () => { + const { data, args } = sampleArgs(); + + args.tickLabelsVisibilitySettings = { x: false, y: true, type: 'lens_xy_tickLabelsConfig' }; + + const instance = shallow( + + ); + + const tickFormatter = instance.find(Axis).first().prop('tickFormat'); + + if (!tickFormatter) { + throw new Error('tickFormatter prop not found'); + } + + tickFormatter('I'); + + expect(convertSpy).toHaveBeenCalledTimes(0); + }); + test('it should remove invalid rows', () => { const data: LensMultiTable = { type: 'lens_multitable', @@ -1400,6 +1478,16 @@ describe('xy_expression', () => { xTitle: '', yTitle: '', legend: { type: 'lens_xy_legendConfig', isVisible: false, position: Position.Top }, + tickLabelsVisibilitySettings: { + type: 'lens_xy_tickLabelsConfig', + x: true, + y: true, + }, + gridlinesVisibilitySettings: { + type: 'lens_xy_gridlinesConfig', + x: true, + y: false, + }, layers: [ { layerId: 'first', @@ -1469,6 +1557,16 @@ describe('xy_expression', () => { xTitle: '', yTitle: '', legend: { type: 'lens_xy_legendConfig', isVisible: false, position: Position.Top }, + tickLabelsVisibilitySettings: { + type: 'lens_xy_tickLabelsConfig', + x: true, + y: false, + }, + gridlinesVisibilitySettings: { + type: 'lens_xy_gridlinesConfig', + x: true, + y: false, + }, layers: [ { layerId: 'first', @@ -1525,6 +1623,16 @@ describe('xy_expression', () => { xTitle: '', yTitle: '', legend: { type: 'lens_xy_legendConfig', isVisible: true, position: Position.Top }, + tickLabelsVisibilitySettings: { + type: 'lens_xy_tickLabelsConfig', + x: true, + y: false, + }, + gridlinesVisibilitySettings: { + type: 'lens_xy_gridlinesConfig', + x: true, + y: false, + }, layers: [ { layerId: 'first', @@ -1683,5 +1791,68 @@ describe('xy_expression', () => { expect(component.find(LineSeries).prop('fit')).toEqual({ type: Fit.None }); }); + + test('it should apply the xTitle if is specified', () => { + const { data, args } = sampleArgs(); + + args.xTitle = 'My custom x-axis title'; + + const component = shallow( + + ); + + expect(component.find(Axis).at(0).prop('title')).toEqual('My custom x-axis title'); + }); + + test('it should hide the X axis title if the corresponding switch is off', () => { + const { data, args } = sampleArgs(); + + args.showXAxisTitle = false; + + const component = shallow( + + ); + + expect(component.find(Axis).at(0).prop('title')).toEqual(undefined); + }); + + test('it should show the X axis gridlines if the setting is on', () => { + const { data, args } = sampleArgs(); + + args.gridlinesVisibilitySettings = { x: true, y: false, type: 'lens_xy_gridlinesConfig' }; + + const component = shallow( + + ); + + expect(component.find(Axis).at(0).prop('showGridLines')).toBeTruthy(); + }); }); }); diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx index a3468e109e75b..2037a3dbe6623 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx @@ -102,6 +102,30 @@ export const xyChart: ExpressionFunctionDefinition< defaultMessage: 'Define how missing values are treated', }), }, + tickLabelsVisibilitySettings: { + types: ['lens_xy_tickLabelsConfig'], + help: i18n.translate('xpack.lens.xyChart.tickLabelsSettings.help', { + defaultMessage: 'Show x and y axes tick labels', + }), + }, + gridlinesVisibilitySettings: { + types: ['lens_xy_gridlinesConfig'], + help: i18n.translate('xpack.lens.xyChart.gridlinesSettings.help', { + defaultMessage: 'Show x and y axes gridlines', + }), + }, + showXAxisTitle: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.showXAxisTitle.help', { + defaultMessage: 'Show x axis title', + }), + }, + showYAxisTitle: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.showYAxisTitle.help', { + defaultMessage: 'Show y axis title', + }), + }, layers: { // eslint-disable-next-line @typescript-eslint/no-explicit-any types: ['lens_xy_layer'] as any, @@ -199,7 +223,7 @@ export function XYChart({ onClickValue, onSelectRange, }: XYChartRenderProps) { - const { legend, layers, fittingFunction } = args; + const { legend, layers, fittingFunction, gridlinesVisibilitySettings } = args; const chartTheme = chartsThemeService.useChartsTheme(); const chartBaseTheme = chartsThemeService.useChartsBaseTheme(); @@ -237,7 +261,10 @@ export function XYChart({ shouldRotate ); - const xTitle = (xAxisColumn && xAxisColumn.name) || args.xTitle; + const xTitle = args.xTitle || (xAxisColumn && xAxisColumn.name); + const showXAxisTitle = args.showXAxisTitle ?? true; + const showYAxisTitle = args.showYAxisTitle ?? true; + const tickLabelsVisibilitySettings = args.tickLabelsVisibilitySettings || { x: true, y: true }; function calculateMinInterval() { // check all the tables to see if all of the rows have the same timestamp @@ -279,6 +306,22 @@ export function XYChart({ } : undefined; + const getYAxesTitles = ( + axisSeries: Array<{ layer: string; accessor: string }>, + index: number + ) => { + if (index > 0 && args.yTitle) return; + return ( + args.yTitle || + axisSeries + .map( + (series) => + data.tables[series.layer].columns.find((column) => column.id === series.accessor)?.name + ) + .filter((name) => Boolean(name))[0] + ); + }; + return ( xAxisFormatter.convert(d)} + tickFormat={tickLabelsVisibilitySettings?.x ? (d) => xAxisFormatter.convert(d) : () => ''} /> {yAxesConfiguration.map((axis, index) => ( @@ -389,18 +433,10 @@ export function XYChart({ id={axis.groupId} groupId={axis.groupId} position={axis.position} - title={ - axis.series - .map( - (series) => - data.tables[series.layer].columns.find((column) => column.id === series.accessor) - ?.name - ) - .filter((name) => Boolean(name))[0] || args.yTitle - } - showGridLines={false} + title={showYAxisTitle ? getYAxesTitles(axis.series, index) : undefined} + showGridLines={gridlinesVisibilitySettings?.y} hide={filteredLayers[0].hide} - tickFormat={(d) => axis.formatter.convert(d)} + tickFormat={tickLabelsVisibilitySettings?.y ? (d) => axis.formatter.convert(d) : () => ''} /> ))} diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.test.ts b/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.test.ts index 7b3398658a500..632f6fc8861a4 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.test.ts +++ b/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.test.ts @@ -445,6 +445,10 @@ describe('xy_suggestions', () => { const currentState: XYState = { legend: { isVisible: true, position: 'bottom' }, fittingFunction: 'None', + showXAxisTitle: true, + showYAxisTitle: true, + gridlinesVisibilitySettings: { x: true, y: true }, + tickLabelsVisibilitySettings: { x: true, y: false }, preferredSeriesType: 'bar', layers: [ { @@ -483,6 +487,10 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, preferredSeriesType: 'bar', fittingFunction: 'None', + showXAxisTitle: true, + showYAxisTitle: true, + gridlinesVisibilitySettings: { x: true, y: true }, + tickLabelsVisibilitySettings: { x: true, y: false }, layers: [ { accessors: ['price', 'quantity'], @@ -592,6 +600,10 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, preferredSeriesType: 'bar', fittingFunction: 'None', + showXAxisTitle: true, + showYAxisTitle: true, + gridlinesVisibilitySettings: { x: true, y: true }, + tickLabelsVisibilitySettings: { x: true, y: false }, layers: [ { accessors: ['price', 'quantity'], @@ -631,6 +643,10 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, preferredSeriesType: 'bar', fittingFunction: 'None', + showXAxisTitle: true, + showYAxisTitle: true, + gridlinesVisibilitySettings: { x: true, y: true }, + tickLabelsVisibilitySettings: { x: true, y: false }, layers: [ { accessors: ['price'], @@ -671,6 +687,10 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, preferredSeriesType: 'bar', fittingFunction: 'None', + showXAxisTitle: true, + showYAxisTitle: true, + gridlinesVisibilitySettings: { x: true, y: true }, + tickLabelsVisibilitySettings: { x: true, y: false }, layers: [ { accessors: ['price', 'quantity'], diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.ts b/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.ts index 1be8d566a8b64..387d56c03e31a 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.ts +++ b/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.ts @@ -407,6 +407,18 @@ function buildSuggestion({ const state: State = { legend: currentState ? currentState.legend : { isVisible: true, position: Position.Right }, fittingFunction: currentState?.fittingFunction || 'None', + xTitle: currentState?.xTitle, + yTitle: currentState?.yTitle, + showXAxisTitle: currentState?.showXAxisTitle ?? true, + showYAxisTitle: currentState?.showYAxisTitle ?? true, + tickLabelsVisibilitySettings: currentState?.tickLabelsVisibilitySettings || { + x: true, + y: true, + }, + gridlinesVisibilitySettings: currentState?.gridlinesVisibilitySettings || { + x: true, + y: true, + }, preferredSeriesType: seriesType, layers: Object.keys(existingLayer).length ? keptLayers : [...keptLayers, newLayer], }; From 78689b7ecd3d1e50ebb1a9269c80f1eeb2e8ef1d Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 11 Aug 2020 20:17:08 +0300 Subject: [PATCH 058/113] [Functional Tests] Adds a wait time between setting the index pattern and the time field on TSVB (#74736) * Adds a wait time between setting the index pattern and the time field on tsvb * Char by char to set indexpattern to give more time to load the time field * Add more time * uncomment commented lines --- test/functional/apps/visualize/_tsvb_chart.ts | 9 ++++++++- test/functional/page_objects/visual_builder_page.ts | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/test/functional/apps/visualize/_tsvb_chart.ts b/test/functional/apps/visualize/_tsvb_chart.ts index ab76598ae2ea5..18d6e93090e8b 100644 --- a/test/functional/apps/visualize/_tsvb_chart.ts +++ b/test/functional/apps/visualize/_tsvb_chart.ts @@ -26,7 +26,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const inspector = getService('inspector'); const retry = getService('retry'); const security = getService('security'); - const PageObjects = getPageObjects(['visualize', 'visualBuilder', 'timePicker', 'visChart']); + const PageObjects = getPageObjects([ + 'visualize', + 'visualBuilder', + 'timePicker', + 'visChart', + 'common', + ]); describe('visual builder', function describeIndexTests() { this.tags('includeFirefox'); @@ -132,6 +138,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.tryForTime(20000, async () => { await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime); await PageObjects.visualBuilder.setIndexPatternValue('kibana_sample_data_flights'); + await PageObjects.common.sleep(3000); await PageObjects.visualBuilder.selectIndexPatternTimeField('timestamp'); }); const newValue = await PageObjects.visualBuilder.getMetricValue(); diff --git a/test/functional/page_objects/visual_builder_page.ts b/test/functional/page_objects/visual_builder_page.ts index 2771982fecdea..f376c39ff67bb 100644 --- a/test/functional/page_objects/visual_builder_page.ts +++ b/test/functional/page_objects/visual_builder_page.ts @@ -420,7 +420,7 @@ export function VisualBuilderPageProvider({ getService, getPageObjects }: FtrPro public async setIndexPatternValue(value: string) { const el = await testSubjects.find('metricsIndexPatternInput'); await el.clearValue(); - await el.type(value); + await el.type(value, { charByChar: true }); await PageObjects.header.waitUntilLoadingHasFinished(); } From 7b5df7ce3be9bdcd9d0e8bb943c181458e5956ca Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 11 Aug 2020 20:22:46 +0300 Subject: [PATCH 059/113] Timelion deprecation doc (#74508) * timelion deprecation doc wip * Create Timelion Deprecation section to Visualize * Code review changes * minor changes * Make some changes in order to give priotization on how to replace an existing timelion worksheet to a dashboard * Syntax related improvements * Final touch * Remove extra lines and some minor changes --- docs/user/visualize.asciidoc | 1 + .../images/timelion-add-to-dashboard.png | Bin 0 -> 269400 bytes docs/visualize/images/timelion-app.png | Bin 0 -> 331761 bytes .../images/timelion-copy-expression.png | Bin 0 -> 228148 bytes .../images/timelion-create-new-dashboard.png | Bin 0 -> 423440 bytes docs/visualize/images/timelion-dashboard.png | Bin 0 -> 347125 bytes .../images/timelion-vis-paste-expression.png | Bin 0 -> 520063 bytes docs/visualize/timelion.asciidoc | 41 ++++++++++++++++++ 8 files changed, 42 insertions(+) create mode 100644 docs/visualize/images/timelion-add-to-dashboard.png create mode 100644 docs/visualize/images/timelion-app.png create mode 100644 docs/visualize/images/timelion-copy-expression.png create mode 100644 docs/visualize/images/timelion-create-new-dashboard.png create mode 100644 docs/visualize/images/timelion-dashboard.png create mode 100644 docs/visualize/images/timelion-vis-paste-expression.png diff --git a/docs/user/visualize.asciidoc b/docs/user/visualize.asciidoc index 6919b5a8772ef..dc116962f9e96 100644 --- a/docs/user/visualize.asciidoc +++ b/docs/user/visualize.asciidoc @@ -132,6 +132,7 @@ include::{kib-repo-dir}/visualize/lens.asciidoc[] include::{kib-repo-dir}/visualize/most-frequent.asciidoc[] include::{kib-repo-dir}/visualize/tsvb.asciidoc[] + include::{kib-repo-dir}/visualize/timelion.asciidoc[] include::{kib-repo-dir}/visualize/tilemap.asciidoc[] diff --git a/docs/visualize/images/timelion-add-to-dashboard.png b/docs/visualize/images/timelion-add-to-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..a0ccc0af735a808c814bcc0624e3503f789c4695 GIT binary patch literal 269400 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 pfY7D(<$MU0ATpX2t-U}@ykxCH0^M3%{0`dR= literal 0 HcmV?d00001 diff --git a/docs/visualize/images/timelion-app.png b/docs/visualize/images/timelion-app.png new file mode 100644 index 0000000000000000000000000000000000000000..236f9f2d41808b1097ccb7df8cef2c1f549bbb0d GIT binary patch literal 331761 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

Jnc(AxZw7GK|}X7 ze4NsCb8yF7#(LramyiumZQ?|W^r;evj*wQ&7Or7TCxa4tT_W0?xZeo5BUCl+=P}6ucUu{r4>!x0N)M z7XRQIE#7cUrh8s5J6VW{(_-h}N$)vR(wA`t$V|k?u6}G=6)q>H&A^Ignwm}{Kh`}! z>mkzeJ|gtbw&q9-Ee=^PKTzzWjjk}^oVE*c_I=O{`U3lWYVOok5rnn+ zXT6SdFlU7f_`w0Z%dLC-D46cO7Qh(4}@h@`svG zgS?GN?qis=L9s5yAiM)^jYooO=j^^Ez%rx5CE_qdHb$XL8}#W9*|ApF4~StQj(p}W z0wCVjPw|3QVaKu}-pgO|{Bd$NM1=%b$rjyBFEB{Gwg+~&73hB)X@q$fW=!5nT~I1C zi~DD-68$7A>JcOndN7&3+LEqMKfB+(6W4scblh-DXYnr+X>&zrs_`XYzIHQ;@#T** z#@T85cKgY|)QWC)4*=TuY5oerjKsAe5qZqGRzmeQDN=b;GeRGoDhs=84@#V5z*en) zgWg;8OSlsB@5Mi-y?#=~}V#=hZ$_dhkZkeWUPHK40=N z7~?(_Iy6GRb-Yip?^WIBv^MM;V0VVXYt7lQ*MkU7nS*p@{L0oC_H+i@l}qy%G71SW z;LWFe@TWoPTIH;$$MEiw?bj-rN{t#y0l|4K!_vsX_;*(vMZ_@mTmUV3iZ=E6b#~MB zaPwDUUa#*OiK`5jou^XgQ1HZGl;vY+DB+;zD*Bgm+iKQuMPGyT_lHNGWo_|dSsFw+ z(7n-#c=TAu>NW+PE@L%TMEI0U6oO5c3#F|sy>X^q356XUT~)oT=%7x(iDA)`IR7p3ezS`h23^^Ryj0vs;nz!J(WRiH9p8K zYUq8aHu&Pf>e(jJ^oS_-V1t&sh;Ky|dwoz~)HdyuZ5b*5 zmZ|!mGx6zAz)<6V-x^chuXcB?yKNFg+F7;Mr}+FdXgau)U#KawBV^%h>3W$6L4 z+L32WNzv#2_qe-?u6#)8o5=&w`UMuLEk`S5mts(pIrKuC{d!Tp4b3R8u7MN<8D(Y|*ZaIN zMT)dP5*!OY5%pLi3>NQ zso}cQCS8uWda2R$U^x)E{hRW~viTcRxwvjd;xo(O;N~!#bEKbdL24_iLbjW!N%n)u zWEw3dg9*cn-b4p9ee~!mBwC3ayMM2kL5nRqyThDWpI` z0jr4Qa zas$3%nc7xH8qAKHy%LP}q&&x|yuta`r4$v~=9*ZN_vc2vNhMyO(5C)en6Qmc`JqK7 z&KN`?=Y=y?_)Ba31iF!XVk?PtdF9rj(5+Uij{fky2#4B$1 z4|fGJ7>ZR-C_iJd+xI6{>-L}AIaTFbur4Al=zkvkF`k7$<0` zZ8SK7ZW~%Tj8>!NbYDq>i*#xTf1OvaVX9qH zV@%s(bU5!a7hDcD<58dn-yWeO`}otbuC+tI%zXNpjDNDo+!%JEjdZG*-h~Zwo!Q6E z$Z$@OCZ$pulg^^P0>DJqp5w9I3@Xr3rWf0j`h6VYuP!IYBl`iizjz&oaSPVJ)qOSp zzTN30LLMLVhC#66xKUC(92&~;vBX&F#h`*)?62XbE37l)8QPtDp`JU3kcXH^cSSvh z6G7TUZdMzVrT#RnjX8AGlw9*Pcpf^?Z2MP3kcIX6H#`Ap9w+z|Y3xOYf4*|4;f_(*(dr-X1akGp{e^QN zKx$#6;pJSqr@%sK^!ne26NNj#Sdy;>vok)tkow?|NHT^u5hL1(BAx)NmOGR9lN6tg ze~7WAxA20}CFo=Y4su=U8A*WNGs-hQ%i7Q4ly#yXh9Tr49Ohl?yBc3$(Eep&oij{W zjARbX;W%J%-i2^3QzhEObbAi$Ep7g_SdF66M@k1$;Ofb{*X+<3*YL9dc((CKt^HNG zOo{G-Lpxu_LOawG<#jRp*LAk5a9QD?C;T0R?7npaK>-tRj)Ra^L-Zk!l!z2{`}*LYFc!>1^k0W=vIp z^;6PGEjSO0HHHFXLX-Y0dcndl)GS=T@)=;Erk7fkF+7qNAs9vVSBmSOP=w|XUsQcG zZljiRp~_U*j9yLqmGu{vN9Z=Z(8tw`T!{NewaujM>=Z6&OIxWrNk$mSPw^kE!medO z`~a84+HAnHZkaMzE{%ci`CgfUd>)cF<;^W-H*jICWDCU%4==n(L;lc%uiN+olrF!< z(fzD|y}jFb53t3&eyr52q>(wYXg^zeTWeI#@rhQ(JbkA&Ao_BaeW>Ax(}XsoNad_77z-)_|C;HQ$SrF8Isog& zFf$(2LK`?1j!9`KupgdV?q-Q&Z?59oAIk!Z_|CP1J6ljvH2OvNijTzGZelUo2{mA@ z!Ll}nm|NW11PST=@;Yh1itlNV-(VJyGfdV>pb-E;HZuE&C@u<}d)!O8A`uT^M1B6% zRyZ$+ag}U5!(yBt@~EbZUBh)dD+S2M67zX{&L(Ul9EBkPyO>KcKwDTOiUbPJSEj#B zFd#93{%sHcbWZ;LTM;GrUJ@6TL+8PMr|0E`gtjYMv`wo`v(jpXiVR5!3Mni8b_WTF z(2##w9};W^4>L_Ok&y>l0qm=+{llB*44?=2qLgYRh3KsaJIg!(AGzB@*Dkb8;vqS<@(yeLw z;K{`|;GDW2(D|#ae=>%RaVH8tIY(T4GjdKXL*Lxv^!NP;O&GH+j%qRwUvV|qpZkqd zUuVPRI)s^3(v|#>1DTOi_Jgwo0pqk3F7XE10jfWfXjVaOH{>T=lzNp1eEv4Xd#|iu zzk+8K7j3_U5WWe9BF=AuN==Wjq+M>lZ^)cjp zaO%v9e!z*C)W^`Xi&-4_VZ>88MselZGB&+<>uOFOB)XTXZIB;gYQ8N0MJhi>I*8fV z1F1prq3g5%D3t&l-d4a@2!8VUI_W5p>dj%w@Clw@St*lGN~6ZhxWXk)IMn;M$+~)J z#?gI^2-eS)*wU)duYaiLel@Y}n2`7r>{A56=F_Q_2ZQME-8lA{*Wv-ks))AwXUL$t|dad=vdPdoslLi$+A<~iqT2L3X6*@l2`QTOBxO$ zu5X}_w#>I@lc*(k!-d@vh8oi~-am`-r*-%IHrjuIL+cCob)M$7VaFCl_@V+swAR~N zMlO{>_UWTs-I@u^y54E6odxwN1Nq_bDabX50FJ+e17JPtvu+kNPl&*#!;2u>@e7J; zIflJUp%zPsiebpMemr?Z=MLcr5$c8Zq)1ooB;yE`6x`k7?*09Alo>N@)J2mM83*c$ zDU}HcDcrTsKwJBfs3$&jJNUsPMB)}xKf;4#8{2>rDuh9k<||~3)|T^|$F1HoX90&f zX)rV%YsQ)r+;WWyL=*pW$d>qMDJ^GJtgYeCz~pzb@ImhNtNMjM^G7%bMu9I)vIUQ@ zAm;Z$NdiNgLezr(Wn45gJ=3KVWG4H$Vr3z2BV@{b*paUz=66dSz5z4t^>yKkjUjii**$sqCTdcf5hBjO0r4m8v z#}-{{@6}MD>k~+LBO)B7VTkDn#lGBk&{yZ+41AACQ>njAjDJJKxY6cxT@#(xLlJ>d zE^^uSKK}b?Zcy(BVPjg_z~NVceHa}QB2I3fE68D|=A%CgJSLHg-R z%GYIk%GH68d#3gmbO6mVf%n-1XTYWmBa7B7{$)uOuS^Up8DsPV_@Wi)aFw^{TnPnz z!o^Ty@YB|Y0+zV2TLUR%9v;08HwP=Pf(t>k&Tg4lI;P^OC*H6#p7|Sl_dRyBm98+F zouf+TllxOKa-z^vWRXcQXk9In1c8vxFiwmGk=%ju<^HVX@lzS~+&7Nz!5cG3`0RS(O6NoxK;o}fWyRo- zZd7PEVJbe^AnqG^ZzD4pKqimaChe)WlC`L;&B+{e%Yk)+_vYj7y?h(bh|e2oCtki^ z`3wrt&Yli)-pDYdy+A0k9?7&xIF5DP=)(&v0I%!IPlWMrg2Wx#Q=@Dj9e}i2yWNc zi|>$z)a~J=rjDu6aqCVQ#zH@9cR`@&ZX%_O5$>Uwvid!DF~QOzO*am1e0|Az=_~@b zHGk?bu7exz*N*$glIik>7n{-1a`4VgerVO$hEv4eojca{QhNiinRBe$L@GUakZ6Gs zFw6*T(ZoC>9KSIM z-D?kI0qABZ6qadsQ~Ut@+==<&i4;C%X*;VaYK^Xnh)+TWuh7FP`5a#2V~MEW1H8d} zA1pjQ4=p~U`O=FeRAS~2yG@0FO)qsl6FdK#VNM|#g{xe-^DImTIzk9FGL3@zypKGB zMS!i_ZO8hNJ+al|AirUijp%imK=l z!^vM0FEw;wp#209MrLiy37UQddMUChNcqDx&b~lT*psm2J;uq0Zd;*^fqdi7#)|I} z^mBVeQ9ngHfjpM10gCow=Igqfb( zL}wB}yHD%A8JKW;AJ_W{O5>4;4Sml&*2woHqbjeUr){~*zL7X`t zm`>J*KfdWZsnup*Li8AMNOYLE;W+(e$<3gN`6+o|)xaC!U2G<~_|U3VB|mY6dN-IJ zy_hOe0ZPo4Ltrzn8`s9OfSW<^1=*2aryi`ysi;)NUnyy)5}U?to_{gfiRmINitAk z?rb^=ZK)RcQ#+o$R)>)Tcvi6hMK zdiG*jbpA{U**1{*yeB>$M0azmFFn6QCaWXT1eq{?$02s{V6Rnc#|XIX0=Fs7&*ffh zS?@CkvC#&@l8JBxPj0HOud^RbCd>N`+oXBLo075Ddd>mhFi$#-TS9S696}DoVXg(n z7MPxI=u`Skqt@7iRt{SAr?Z81A%neFIdvH>mTLTaUl1lcNku2IuaMs((8+dlS$SF5 zr!#J0>0~5<*Hv201wNAgyNTh003oXI9}Hz-ou|~+ zHQ7u8C(cv00{_~C^PmESF@%8Q z9Q#u1Co#9n?DBAbZ~q-SZls^z#QOD>k=f^4-3~iOcmG-+S88vHKX`3uL157oX8n<) zR0*b2E4Uzd37BhL(;FSc>%p{Iox(0=JD9&>(`ZZ*u;?OO(3T%OU!f8WjVxa>y0(Up zMfaOi1P7f>qCW`ODBic0e60Ui54pIz{@*R5Yqz>p^QInwJ59V+3F@UqKRrJBDwZRo z7CGcZf2aK1jp;C=8({z?Q^qKP zq$y1cODV*;5^|; zcT!n&75qWWRZ_?ff3X`-P{nL?79K*RVv!@^iSa2np%9}Tq0X61q%i#;!$uCcZo87m zFvV2x5LqBRIrPKXPrix>?zaH>cYVQR1yhA72sUSl`Z{xzXmTb5O8IR$X7O6no6`Qu zcIfeRt$G+gbaPWe- zn@T-Iba!^AuaJxepn$YCLa>XYk-!qcN*5_`-}4>wUmui#!~Mg)%}< zAop}Z;0rvmmE0e}3%MicDl6D|!Fxmb{=gYbTE9SvIWemF9ge#~ld5zd=Nz^anGBZb zaY)ZV4<*J6nlKlRa9;pT4jAI+xZR~lYg{O$nYHW;*`s0g#tfe2KHlFS=Lkdc6jrJ( zn|N)a1a4R2oH2(oDzu7!Tep-U!stXrrvM=Q3JwYDujXM?XAc_a);*a3+XuLdtDkuR z-f1j6O*P#|#2eqb6N^=Rj`5}HN1Xh8ar|91Df6KCi)h(M*P$t&j!L|~?>>|Q-=tJ7 zqWK3DWenLv7dvIUz$-~O0Rdozxj#uqvmk6b&TC*$ar&2H8ZA?As*;MgR0o>oMq*(t%yb`m|p3f@fmpb4CB2hE@P=I^IlbUN* zw_1ek#Yp!;Q~Ge$Id}tzFbftAM8GXv4F)zq#s^=mtoFTR2GQ4}9aAyMaupQvF!XH1 z(0kF!HfZhJ@4A~|wwNEef#L(MULx8!;=*1}NL{RRs|wx1Oqv}DA;0`@g&4zDR-OE$ zhl4F`>EWqRR7Cf2e00N0_)d4DvMir;4EOWeK!DBBU@53P3S4Gvf$UGNjvShS0k$v$ zq52o)T7}W{6nIU{2#H|%&5`ajSw+4T&)(H=cIH)K4 zmaFyk7tF0y?@E0_oKRtL;PioLM5WI`9&5=Ys13BsS@x37M}d5FJI!!uU3ouT9z2EE#<)!iD4BZn?khkEC<8VDFwH&&B3FD}f;6m~Vm8ES;qj9|dbP&5 zudCS$?3Ag9&U|p6ptF`2wymYz2c~5dW)-7bfBJiw31d2qG}Z@uiEb zUbGu1D3Y$S8EZ!SzlAN>$?bLz*RnPWOJvxZH!H%3J4qH5NQwO=fEd{x$@bm4w_l@y z=vy7}g29FUW<7VGE7;AoM_gfupW*(N%%@QsJQ)|6IILd!Yu14wUTSvXjAPzk^yPTM zL$hEJRW0h@H)^-=ezKX16FAzs1R{}`D+#i|fDwn-NIc>WMr!7KdAR9oR59(=3QwU zCHS0bA9+(vk!FC2-;gUh_-^(0HVwoD7?IyF*9cM9heq8TB^q(}>`9K%MxG1hS~PHR zLv9q~$~XW|P3rY-HhHi888s(_QN%G0zKP@HpR>P|B>Eh*m_#Woe<{n>3RmqD&~Be# zwe*8Ne4#sNaZNhGkBzO9n+E9^4+99km zVl5ecEHIq@a`rj{niuD{)2?;3dNIqLcrW;NjdC24Tt4SmUHm)B>b8X~N~iYynOe1a zA*w^503~7r-fsmC-XcOKRa7?!z5ZL`k_2?M4_ELi>1qqK0olSng;)QbioP^YXs%;4 zJc|&uS1K+1;_mD$W-k2UW=ZzXbCU)7OctNbJ*&aJ>tlziJrETcr*B|fYlOgtExafv z2o?W$0?$slv<{I*`4^NNqLDpbuDKY_3CiIsh$63ONb#?unj@c=f6(O)qFzhTtz_%M zD8_Od49^)iDQk#?B~py)H_0yu?ta)0-LAv0L+7O!Ann=!b@v~@nUTA_G$DJLUHxlR zq>yY928>?iUM}dv+2;_(AA<9qZ;+-9UT2Q@M@{eO#K+=d)REB2!wlCf1L=&|?f;?b zAH(DNqW*C>W@B58o5pq;yRq3cjcwbuZCexDwry*|{-@vj{yq2gyqbA2*FJOh-e;Y) z*ZSbH(-rMjFM)eAak#%!s`YiQ8`Nz8akeJAyJffRB@FgFDd?5|lsLX%oPTvSEadyB z3h~3O;Sf*vtlGDroQ~;e>&3j;u%k!10q^$v(dq>4p?t&MEUD)?WAI-@J#m82qjB}6 zL9~|mI2*5l`ogyJdssBc($Li`(53i(n%cCyWSJYTq-3v`qOE45a}RHng7Rdps-7JEbdFFfn_cm_fN_jg;E~Ji)0eTQxCp zR8kZX-v_Q#KJ}*#4w$z8Uvy(wf*o9JataH0kb_6I zkM+g;SJS;CIES0C_ukAO-Bcp$NYsL#!g~iL)upmCm0Hc7LB6W~8hLURzxQ(aDvuz> zXTDP*88cJ$9|EWZ&%e_zz*DdafYO%aDHc>Kj{(hS#g)W%h}& zDB|FlybS)zctrqx5p=VyfxGM`s(4%EjURNvC5iX1&TIoU<&%#2`+=4`Zm36T1QmJ1 ztapPr`i>cc<$Ft{tB76fxbw?2Bu_o^8^ z-^U(Jxrdly9oYSPWbFUE%AklvpG;x1O#Ni&`PXhfY8U!e7el5NrL{LWP)f+SllqNO zvp%@U7+n!&4U3K5I81;uwcLE>5%AF&xJ^54aUk%OFm>l|(0Ko8$Mz$#S^5DU_wL9C z@YOusX8L}1^HwJzPiXXQWl`XHx%e%a6y^HOVkQ2c_sR+osJ#C7pf>mGjfYIw>lx}*8ZT3Mb2xhlK>STCBhUkpl zPM9!@t)5Q~UFZjVX!J3>>C!TD1AX_{!II~5P)PQ>K{#41O)~-qARg{YVC-@wchR>m zndK@KmOmJ(Tz^uXSZE7>={jljC2=1n)e?`FUf>?DvMv6T5kDA#uwn3JrFNHSwqm$@ zseK%4PbQJZ+-o?&TFz5{%xlN<%bT_}9^R=PlUwzLiko6_w(}MKTOzf3WSx5S2TF~ch z>^Mg7?+sQC`QKX!nk+j&%eY3TDG8DGKfk@Xc!S4 zsl;SlEmSS0$puSjXqUXY6!ymkVs0Xn+a4~6Q~(Pu$4O+%pd$IMA_Gh8BDD`dQ z-kf;8pkIrpau*8Tz`L`a<`*9K2mqbTiZS9FVYg4AfjA$yKWQ9TwG1Wj`5IV-lt}F( zZWQ#akEYp1E=8|{1XINH^#@_N#E5_5_lBj zdu*@~x(oZg;~-vT_Ju){{0(_JNy$z;D#RhTqpeuq4 z#T@-nc;PERr9PQR{xnj#q5u(>(1Gn$TOEN)uA}VTUz$nDY^o*R0}O?1G=2U3(U#|q zVsQ-6!SS<+ecSCgFpW}!0m3~1^bxO zRv=Ir|Mp>i9M@tyyjYMoiE$0Ma~XrnE&g!IJE97P2XT%yp5ioi6?wzjX&O~HmmA6E zbM@tCfjidl&U#V&a_nw_*l~5|07!Jf5-|ZAxQ1%$#vGNB!(%VZyy+^zJN4-Q5>-=z zbLkOJ72Q0f6v8PLpi-tHY*Ksin6xwrdE=W)*u7Yi**G*s#^Cz1_{2gFIl(#$`{u`W z>HvM!{2lMHD8cquE65@)Tw_R~>Hy5PHXVsLUPSHf)3B7uk}47(I;2N3VzAQ_X=l&B zCeYz~(^8*9(`zGkVaIw*;pDt9auIEz6zE|})Y~|=?xEwNCcgo?*8GYqe?1^>3#jpd_x;Z2C=Puz<*Oos;VH%Uq zInBT8x$m|)8dFBMX!pB2i5AgeQB)`vGhK z0Z;DA&jCv-t!HEOm5}m;4}lH#+7DB_nBJ}O;84shBPx}yXpcnJmIq+hT`imBTvEpH z-h2#zVGLlBR;x7wp-=_J2e+i8Xr`jxpLJv+<{`BQE%u5C|2su?)2RyxY>r&9FRARu z-0Qn-40ESAaBaPF%-;GV-rW|*)O!UnF5xZ*8@&usk0<;>U+`AcH$1dbH)*RxpJf&} z4j*AGbd`(c)%E_#(hP=gm2G7ag8BvqR3Qzy(=}b~nYz=bffXqvM>W40*4O-Z@bl0I z!!@)(zUeMeDvjJt*xig(70n4_gvDTuLo2iW1HfAac(`1!p~$SS!z#!YmT63PJ~^zn4W6#AXh^1$y!zNLS$#sbxKP)p*p0yel-F0s=a zj>08{7C(JnSKn=-_bPRS`zMA_)H3c_H2M$w0s>_adGdFPlsM}v}`v^hHgzbP5>dXxIh&==?e-L1Ys^rgXW8KahDX2bY zoWpRP@i=`(6k_(y^H9l|&GSVWoDCModZ~(u$fPAY_tQ!EyB^6dRDqiSE$ynM#{0wx zr*7^9_RYh1vQ=J%blwAQG>5Y^Mcl_#M@?laze`sT`L{5a)4ADpq#$j)3bjpZlP`Yr z_SV416#YH5qSR|pzgP5Wo*s{J6+VunFb?Scng6)7H=Q+daJ7NA_$_kFD;X zN2JTYI%E8z!7gzT3&pm>p%q%V8n4>DsC}vl`(B z-9lS%{!oH)56$C%@^`UzxBpseHGT#VXYqc&P^uwUA0CL+WExubyDlE!-r**)Av2n5_>UUulIjTb(Jd;*#V7ZhU|rSMlwpo|0U?=Q;pIUe^kR6WMY& zhUj}xwRMjL9q{G&1o@)&XDZR_-=2SMbbaZjOhTm50*dp=^97VxzXXiGe zpd!vG2zuH9l1VCc;gpEI|B9>!vc1_)ZaSQ8;}GdlwLw*?G~uOO=^L1xn@R){e&Jf!+x@KtU!>mc_UhPB?R zOjOa=iw1t{9LU?_46T+gw(PtiG6jnG`^mvRCjN4K{H?u>dGrR4Hm=<-N0mm;B_(IS zkEwHliCA-_Bet!3Y83L?@(?)rv9f`{8re*n2!29h4Q)W;@fQu3trM_V7VX73o@l>B~MyK;vrRO&REU zGGiF0N#_`!ONB5~Eaxz6|4xb`1#fVgvRx?l87J`KPCV7eq=3Oj2jyIQvIvM1b;HacNY)Pv?hPR*>WLxn>`g3B)WxhKSXFrJ~^^aAqM8O)lqpUXJs zC?!v(cd4;Y=zrL-ed5j=hw({dE5P~J(p)y(-v*{TixSsvk|m)6d=VGUcV+MYK0Iu0 z$yK??pTdr^O4E0F0hSL43hmix9SJ}75U2TDl?i$nt6q}{1nORWD1xN>Z?&9R1<-KF zBRLfGt~COz6A)_jda5prCj$&nc33WJiQYpm?l^uh!VNDo4W{gvL^k~^Y}+1^(4;dh|2LAsxg(Qn<0q9!F2h8fqW&a=U}nz9%96|FiPX-Zb< zgZh&vwUgE-{Q@vFG@0R{5x2_Y1Dp&FcA;l5$$RqT)o{oJ5fYLWG#H^Ed*HvfpNQN_ zZm#8PB}t#Lc9#pgiJvlU3RtghQ?YNu8>F%8bhXy+#t0g9!O`1pn14RQf}UMiYAX>bWN z3^=&pudjmc-sDwXuD!aHGNscXQ-;S2MpO;$j!y2ZZcxLfcn`q&dSz<5 zs2JuxL~Ej_u_~5I`6+0p3I}nWMdj}YyqVu7^Il%9%3@ETS6pm1aQ8AWzhRaW)VS7p zcO2|Rs4fT=+S_me#Sj>N)Upxoh?Dz+OsT?;ak?aH@+bI<4x_|g7I92aw9oT#c?BEPKfAKW}@HGq1?P;uUg85&Lt5@2+ zS<<@Q#emT2iP_5=zs)-f0J3+HfE)S$iAB7HXmI{1`Z}WW!_=-Dj51mQuG6ijFdzon zDw>}!zk0RCVH#v5@*LJ2TqCslH}(2RplVMkgRN?PL(tK_AK8(D0{;HzdY#)XZ>&$0X(v?m3GO9aeVm?Xt$lRle|bRJL=4XGNT(vBG?~z z@*wc#a`;r%dPGGH!tFc|PfKg(Jh0@-^xyIp?*G2qwAi+$%W<8;D7JN$rk29sU6gk1 zCjAqOa5!Ebsqf>}1hyS$T|PkEREXK<=9l){H{B*V z>@XUyEN$2>*cs5>Y=YQv8!;+;Xbh0QXzR=B_m3Gqz11!fh9#O)_F1%hz9$ydeeI>j zTyfQEw%rK3{3P}F+;*Y>;Qyv`t z#bds}^;peo@M5=e!#vg@5_E?K?_UOI=a?IPRpHuQ`e6$R4z9x4nx+{;R$Qd5q5c;n z_Lc((bW$OOj7Fyv5yil6NhzGEA@J=vU8(E%Ck}f1>zH`Yic0bdJLD}O4sN^vs=;*1 z3Clfr#--yaYcTaTp=w)U0s(!{#r^ZzCoe!54zFEz6~@SEwH`}es_>4!7j7KX(o){e zdn|^0-tPB2KJ4`V(1uVCfk6rj#Tc7_9`CI5^))zv z%G1-I9;d%PT=@iP9K*_mMg5Z~Y^}JoMoKwbEkgu=Lcl_L z@fZsS3um9L)96}8zmIpn;44faPe%5ax#Vzs--=xm+SyjeUFrm1sb(Fvi{DP9QVU}) z*hO+I1&2dHm$ymX%)mj=a8BhhJB~1keyb$>erWBn8i5q`Pa20+Fam+Xu!GXb(&dd0 zNH@xeuD>E5V8nypDzD{D?Ydhe7Ts3~l6LG!by&lP3|hG%}Bv*@6Lt%KxNGG{g^L`pe@AsA*K_WO&l6 z6;-ppBg1v=taBcEt)T2vy-?EoaLZSM8JT0WOMnt6tp@2un0fD0*Clz13kL`i+r4* z$VVPo=_1tL(j4QO7;w|E2r;wJVWNM+fa6d+b!ATxK&&*Vbft|;eE)QGGE_TBpafmyJ z&(!cJNF+7?E(kJ^)1+f*+DhBQ6AO3Iy1U$OquQoV(uV7?=&=g2_U)Wnu}k>I^RF;Z zPh5Z6b(rik^EoZhGSl8WOPljgu<0%%xI%%c+zv^ZT#ba>F_8gdt-;u`yWKU+LN>F; zwyVLKEc>3QCk9Nv51uK;F9!`d@|N<;1H%q}%`I5Lx6Eg|(;_l~P(9P}l+J38!3W|~ zPfX=Ka50uPQ=|~`sSev>XN6Vi{H1`BN@Cu@x^K}eVh%J&XagAfW32Hdv;f%!(6$iA z4}LZq2*VMi*Si-jd_SqeftPEAs4tp%7$kVJ)>t4BmU#wH|l&%L4%c_A`zWVg% zQedc*-Qrmjx$@DBa25(ClWgc zfyQCbk0zxe>2epwVL8stQno>|(u2YxD8sYQkC0F~!*7p@0kL%{Lu0cOhQiYNYMl}ki(#5_c0NX z-3hBVTMf1lqeUG4>6A6PRR$0*K1CyuXzuq6LEAYBZIkeN$KOp+*5DS>!zG#WIHX!D zV|-XP>748RM!>crvA}yWm(;ryo=&LJ5+n-(kG}g>#f=MVR45k_gG9hb&d^~o=h>{W z#Tb-|K5|a47BMZbo57PNmHbn{@G{BAqUM3ZZprz58d?tTgukPpd`!A2f5ay*uO@cZ{ke>5tb|DOrb(&FCxXQrfH% zc)yuf54hyIbIFNVV85J33JWv|(QxMKj|Z?N4FB|Jbqp?4r+|(tgj=xR)7i(8jJf&~ z>Gzqb9$IkloT0YDNQINfS0MgUtI6?MPR6a7z*?PhkVmD{eJ#YKC(*E09|LAZpgb?K zskaZ&Fo#5|D2zr;f6_CQr=WVdsJWOk zf~mdrNctm;^pgA2#pbs2JW`^(gk(Qj!|{+l99}RymygxL$!&Bn8}{hOE+&eJHRc4{ zUq+XySVjKVhKyZkOAjdD9k!>OdP{Vmx_b_d$O9uXvO z)B6Ku5#2N^d4p-Qg(k*Ta5jd-2aw<^0uNi6U_2z-NXxTW^+t+<-o)G8_&S)RI~z4N+(BKQ~F+Ef&iZnK(c+HaXF|RLU9zAkE3yOgFSAZ8N;l=PmgpOQx74rE$Xq}YK zKE8_kWy&uX*A#+0D@OLfgat|2W674wFL}F;!cm53NysZEfGrmg#2rp*D$o0Y&*(|} zS2Bm{hDBAP2aoT^UY74qOQ&8rTVe0Q5EzO zXz7@aA&G8o7?w$U6;HIZpD_+p0bY<7Nnxl*;L7$QM=+lQS0m2!d>8uW{r6zj_ zcXs7_#T@G#1g>KcwR2xt=xIKryDHD&LveKjfP1mz@b3hil@d7&#u5dTmnGXAF@-qQy{84S_!*j z3n|N?1DUO_*O7VJH?dcM;#`P6QTjFmDIP>&SA~J=;pp@p7^V=WdUpoMAG~g?g!g>j zga@yPAP;^e zthx+6oX3IiZu7H1Ej&Odwa{~w#agQUb(;)@(0n9-ZVnytN0D`>gxD-EV#Eb^gZA=e zb?ow>onfVTy}lSlYS_8)h|#UBTP=&l6d&z?j*d7`k_+{Y6uTTMC`z4JBD9uiiNgh=cM*;Atai!xt@U;lm=W@McQw?yhj`r@(ur+R87*VDK)6U+xHaTs3MM{qdC-zAFOV zOXYw31pGmZlZ%eJrX=e8wJN=s;!Ax5J@Yy%RG06v_NUIIrY7;@ios6dG=6U=!v<4d z`aD^ivTC3vR^m14YbP#!Vsal>qoA+t^J~i%n!2uCP?N+Cf_Ysri71~&(gj_Oa1lF{ zh-eJkA9Hx@UJ=SaApEqo`XMP2^Py z`404R#TFFZ!$Ec&r+hr*5#h@=&B?Nkm}1~}hc~5|+YQKLIaN!ji#dKz%wY3d_;c1z zRXb5hjIq~N*oOzySEPZ;%?f4?vPTFpeX%!zvW6l1r+G43mR)hUShAoHyTn%(=g z6NGuTY|}$9Z~&7F3lQXF;^y4hK@=x1o_1dvL;lFCQh5&$o0y2dI%4B|rNBva?w?K+ zgj)4@I01>Sdh1ZGR+?yoi=o3U_%I@=dp^t}i{0OURD^@r_b)!RJwxXO7BO8*8iLR7 z_oCz2a;o}l|9foUEN7?!{(A}KwQd&4z&eTh+xM?PEQPFFk29hKGotglc;~x*0HZ%} zTDlMg6TA>l2MPWtz#lHP$FSA8BDockPbu6DC9_*BtvFZSsbN zoN*|fHo8}KQkH@f#}oy6-o*Oe@P>f6{Y85(0oP!kkhJ6my0z9>arZPQJq7xnWLpWx zm~1IQ8Pu}3l(LUiuF)a+VhD&A&)~HJore2V6^y>mPe}jP zM`+~SW=1#?nkfW%A)REtzuapIH(PI7?-%$k&*h6@@VEQQVjibe#q-rzU0dOR7-}uQ zy1YLg)$2eQaRPqiq9^-!pCg$6d6yAvd4B|y%5-y4?w7>iOCpfHSyKNQk@NXoe?rGF zKIaF?w$`dfFbxr+W3}GAr`NUFx@5lr{F$%)++}_T-4Ib-vA_!UgBH72j6Vy6vgNj- zht@BaMIu5qyq6}>$mR@v+Wqk+!BF_aY{#}*ZoHV|(t+m-5Y#LfZ2wvOu$c|gMek~~ z=aVLedQiWFfgvIKJh>&6e+ zN3rPIs;ScEz>q*8QSFmL&7Te0juYvWAjU@ItA0LgGXT#S42-oyJy-Dt?h+td!f#;v zyb@1SBilFVq=|h=TpDrOCGUg8SN3{!#8Kdz4FVA63{y75le%0H9z?#Hp_i1hx`g_k z!#WvSl`y01Dce|N6C&?XE8tVCNmWol>D}+jO2T{RA)&x>VjjG_Zfk7a*fpt4 zJV3yS#SrnUG@7jo&sMK*|D91atIi+j)J~yR);!;2#EOHr9&^Uvrtt1N`+|%aIvpHZ zMHw>^Mv_a75aa=;UcFuW(~F!K1xoHa;6|lmkBUxdNw}wy^SA157GZ6lLTr3|ROZtC zNZj-y?;lx04ZF}{0l-}zTTWu59u@cRPV3l{&4P&5y)pVkRC|Fk*Dy#OB9<(hVbx(> zl$_FQRO~)r50K2a$BYXU@A=4IbT=fS?!-xsK7e7)RYeB5ik>~Tz_i!sfR4O?*EQ?i zKHS}XC^y4T3y{f{$*+C}oB8){YzAU1A|7Ye)!Ei}p(%bYM<|dWDX4Hx-b>J0Lb)xF zZNYL=Ey!XXz$s%`awuPzEvP-Xo(T^NaM6D zh|%=$yap@qyzc(XUQaB_L$Zob3$7=7 zp-Dk2-tap{D_APDWM_#=67gKVyNjRjrT4ZE$5j-P>c)I&LYBzuRxETlje?Rg-Dst+ z80%l5D6pzFSpUBujSqzcK^bRna@9-=xfsjYV;J?|?|PdrJG-oB!u&Y-UzpC87td+% z&$a4Fp`|qu0wNJGiJm~U3+|!m57Pq591ed^zSl&Vwc$9HXZ(5JW5+q=Lc-fne>mfx zSyK>pi`-TbHtc20WHGa(qaS(b?8k`FL`eHu66l3KdxROBZ9>`I>N1Tg=>Pu03SxOj z*GRRTwzGw4vs4XK`K=V<&DZj2Z~?$35+!|E7yFCwzVmB{WU#*B&6axWMx^ay5~~pf zBVAFqkN>bIJUfZi!+sf!Lp{1_|jZy zz-<)>cpaupc~^)e;@zmXKfy%yMg>~Vg9IX%qP<(c;{`$qhZ%{Drk#y;lgW4SxhVzh z66;yvRomP-w!ZmKqyZ}?y+SJ2)%DV;#YbPQzSjJL?Z@_)Rp8qiLQf~6s_H&d7hgf= z`mlfab7ISS%`mHJxG>M^moVDyk9s+;AXlr4F=jUu?6up+O-`wOlD>gRxCE7Gk=D?ioOGsOcd}?=0H%N1@cbe+*D=WM*4`AVoHoDGx=gvSy=C76tX1 ztI}yk3br!iOlRFUO5V0cXWqTOuQ1zd_3@oiiVt(g&#sgxpdeD0y!y|f{TXVu`kdZM z>bX>Wznv{pQjyF9h*rnzkQHr+mL<}NIgWZABDC4W(YPpyl6{qyBrEqB!?MS*PYFl( z`|_Rjn(yu6s$u%-qHFrCt9$$So{zVKmv`8udi(u|v)gS+>F2=rZgcy)Lm4C1Vg=?Q z{73GM9jQ9a9~Y$9*Q{C(hOQybt98Z%9B%>7xQSG?5xBeod0(R@DI5ecr)t-?84M{l zOd|x06eG+2u22NWqegdxke?=w+SC=xW!F!%;CrK5A%yeQzHj7tS&VZ;f99W$UurH_ z&#D!Ou2qgH1NyN58WO|;iOq|~4yuB-klHk}ICKXSOp>EmA`MGQJJ*Sj^d^r#xrc}Dd{>A-~dZf z6~F=3iB9G#V;yMyKVp&um6h^7Hu3b(zXJ27-hMh;bK)E48IoTI*!lYr845tV$)QZm zYgo;!^((}q2HpS^$-Y})K#38x5DfSoSGoU>&wrmXJYmP{e}}`y=s!^oC#a{rl^crSy-`l3criJo*ZKYJU2FRC`K2Ca#Pet> zyH|1h`9kh{NXAR%Ksep)t;!8$tYFzNgVxLQz3k<pIPb31>o){rw@V3CT*k;g6iQ@ndPXp%uywoGh9=_X2=Ii&! zC*P)SHJvS#Rex1}AuUoD!qF%Mke(zKx!J{BMCY<#%SW8@y6yPBUcTK`jl~q5aHHMM zK%-t~JAsK2CE}3jPA@YGn2!Y~@|k3fcBYux#tk&jToEM2NZJ6EYhkx9w8FPLtn)Lq z>_Zrmj@F9<4W3tcMlbHUQ))r-95@Pwn*nk`d38b8v~hhL6eD>XCvU9?>7xPV-Kgf!Fei8unvt>SS{-mCYlrQ-Mc{ z*xiv^3{%FvJ`2>q71Orb-OTU{ZefU&O@}?BpnH30xO>Ao;f;MF<9Be+EFV`GYgeUg zJkHY{5Y+Oo$s5qW*V`NO1N42e{!Z)*P45m(N-f-yPArVZ6>o19fE3BVH#7R|3%!-z zKDXxq4etn!lYBOx$wC9b?Os$<<_5p{g_p3P&1M@s`E*QnXtq)<*=S<>q*c)2=-ax_ z4jAu16$LTBdm>3(c96-w6YS%#wB4o+NY{kuBWgLWpYQtx`M_RswQDR6jg{3QB8;Lr z1cj|vG$C_R`1=tpgQtF*IT5H*9`OTIk0Ok#(rO|}R&&f1%}7k7-t$7`tee9W%>=pn zjoPwZ*#NSSCbAL^+it}bl1Dz@?-`%YKR+&J^7@Bvdo|k*85_$U zMD<&fmf1B7yFln?py+cj&A5s6+|d#WFfgYLt7((hgmOrXj*^d6^YQ?HNbyOsH<&={&K66 zdXHv1iC&-qi7u1_dcyg}+5KSUr}35pBx3>rki3oHJfa!C$<^*;1kL%TM_53d$S6h6 z8E+iCD@I#D4O$F4$Iaa_I48I+#O7BYJAt}?Z`?>(P!Gn%J|7EEP0=}e_VK->(0*RQqiZ&L5SbIMWx1d7yxYHM0WFT%uX1H9SsdR8@vr zw{7O+AiL+G>OD0nr_rE=+J5^APkzipK<0aHgH6whN8~tb&CxyoH@>rj+YeAz_L=d` zl>`Wa?bpg~l=`Ztk*=l6zmOb#>u9^<0~+3V)DoJAfx?|G3q{MRxZc7oyJeeKsxiwi zU}}hwY(F2u-K6UhmE$r)g?r)tYO$PPooTj}H5ByVW*Elsh{5w+JHYA<83qy|_58Sf z7e=on;E+{igZa6CgBIu5=KKErq$}L}h=4c#w)YgIfsQX9*13${8*^gG_qM=v2}UQG z9aJ?Bt`UQEb}2~Fc7M5kLYeN(6! zucPky3l{G?c#agexc`q9&E;Z6CLiGi=)+m3JSUygNufaM}X++L?f5i5EJ0OR(I@ z({s!*6Xu_ZrydgU% z0&GwmPL#a%B7zZ#KB|tYD2D&Dk*}Ok0<&KvRa!0`(8FP~Y0j4}V1<5fG&wB~uNg)C zbCZD6nuY44?vCFRNW*d8-zLsM>;@DLHtw4Ygg>j^>>#RQ+|4MG={C^S=Pnt@L9 zvEMm*lzWnmN(u!BF5(ONm}7$I^guB{#K~C?gsQ0e0MbH;9;5aY`>IwfF%gEHiLP)d zz4^J%$!KJxngo*ZMiU86nQ!G-dO00Ev_v62lTiocQ$WG_IR^VCpxg5V_}9z8p+cMz z`qcnm)nU89kyWb9Dfb5w9g(HNf91IDVftl}Q~uAzZ~T0-(CcGJPnALcL{b=PDosef z7fNvfG?7AZg(gr2yLV}(dcQXHPbaD5v&R_dvK!ECrdYFMyg%e#a61NTM(vvbA;!be zx_6)19(1m1LQ82>X{7drG!Q)FD(d_)KZR)S9HYQ0Tb)kl0-R3Q5<2G^YV5-OiAWs; z(iyR0cd1>jM)v#c5_1)WhR}HHFzqh)q@t$do^LTqYKy0v3>dUs*eXd^4~;>bU(MFK30N(4W%RVPF|G%+7L!$CQtiOaA`H!V^Ds!FUvp@`BgnZ!=llZ?2{`--iQ0=jxn5Y=% z|4gGGRIyw}Z}T-z2_K(#ALbK=U~!F9g7`bIDMMo@GUd*AcAAAIR{jWKY+TKg65MOom{7Rg|ELAb5wZJ$_9J;=d9)Ih0d%nR+AtK4j* zHtwRP`!7p&i}idQ|Kq@ZrFc|%us>Y1OVHf?8T)pvosE2`;+LAY8%Q+6StQUd`rqj* zWPp;-5t!t#-k7NF;z88zdY9pFzu-#i9a0eNy*p@=+A1-H1(peT!PXZHM-wm^6x@H} zJUK*+JlCE(=$PL8=1O*cxx=zNTX-%cgvi#vTA`X04gpwicV+3?4Pt#6Tg4~=P~5Ma zjKa*xA^-PW{qN%i=eL8l((aTIStvTXHzyZufJU0lrQu2I`2YVSASx;40q}-=`@cmS z2ohRvW>{IO5*&x_!Ft!AdlynS9sP!bx+pZB#L!RdbwKtQx4TvER^h1z0k`P=+XXZmGd=tTmO z_MI=a!nNHt`#8hk+K;n40znIt7yDr!!eQC7vn%eMC$!9f>&8gciM=(1%D^t%}97grFNy4o4r75(o%{+s<+XEcr5MY??` zLxG$juFb809QPs*)6r#!&{^XlJVD;AFVnoX#4WD3jl&96x^GD50}6u7 z%3-|LrY^~}Cf>5o|2O2nbp@moRLWa1dPAbL*ZgTSCI?x)rG^f!T(QW``;B% z!uLZ|;sM7L{BJv$;rY>nu%4YSM>J|x_JyjF2bvm8O849EgQlyw;9ji|%UEZ|{aNhi zP2yaWIX1sFeu5-j@BF6N+9Klt(2>4VEQ_ks5K}DB3UDjrV2GW%9nMCKeA{eeD6hJP zQR)DYXcu}0%c-0Uy+`d##AgRp%Zi6ZT;E=TqeGQ)2{r*wD@g!EgmljgUoh50PEP0F zEljmrYYUT0ZEM<|;``?tQz{3IP#fS3_{EE94zov*$Ny~e8QBo~b3G7G*^t7)u!nQdS1@o}vbfJvv}`*=*S z$3#L({{LeCe=`IJ3!Z7M23V;I{_;5MK0D;pCnfe88RWY6pm~*O@qbq*g+j;j`yvsY z!{spxee4*=xU<}V^UDASzl@){mY=$1vIn~LxE@Rx1c;N}a=`KFC9wq|)>&=)6YeHj z^927JXpR|z*ZJaC1P-I2w$Ij-^VP;=?nW}dhZ@L5^<`z!EkR>9KS*;VHX0WwIoECkvhIgoXRW)`C;WZyXEE)H-|WLOyx+=9Ih;;O!P*zO z%Qd?{%E7IC_Y22n=o>3$Ikzm4&oTnJKp9wce?;fSaD!f!#g|MwbI;)Ezs$oX9ph2Q^l^$}##I5|??@twCqqYi@J*p8;eXs|4i#mofi;{j>h{ z1JUz%fTf+(_lxuX*RB0eYyF=r$A9ldDpM4h=X|DZ@A?0yE?7JzLSx_?#{n_`STqApYhoL$GfNgYh9?HDvaU%4_&a3{IQCd!Xd599^HR^9{=WT zi%9|NB94~!S4jSEUgAH0PDKDXfNAq`(c_B$45t3|IQ<_s+h4)^|I=Ik|FAm10jy4> z%FF!U_tn4k5YS0{)d~YV&u7^$m#+3__a^eigBZ7R6K*K=_a);3pVF&BiDI(z@L6@eAn^0)PFd-*uU zRl7qB=Re+SfR0Ofj46DRgv*ATR)Nt`wz+49X`R6p8R?+awe{%EDn)R1Ik32uefV-^X| zXsi>t|AxQpJJL2RYz|yoTHhnPHa{yz~3a4t(u1^8)P7d2!j3z|L z`?zupCY`F3wbKo`a+-Vh)jTvU$tZTBMOBd64KYt7Xq+)|%0xN?v(RGmXHW2Q!;v}i zA`hMu-qqD9Lx69W`OVF@==|gw9X?>UtB-ZPiukjAi>nhVn$ApdwuY}sn){R{^iQfWB ziBGRQo)1j%G>jiIa71L(*xV)$r*SQypI)waYerbAe+W_##e4FV^zqV}0=W5bFF(_C zW~YwD=BZ5me;i0AT=dkaTA3$8Z%}lp+02J{S3(oDI4sOroBn+6$%j^fiaaS9_2AeD z7K&%pxsX4ye60;T_%3{7v}L@`*KGTXd5LjV1*ZVU{(9Iz?PFhh5$?%5H|OMT%4s{p zGa}FR@!IBEX-Y2{2I|oaPDOX*;i_nj`^8L&ad+cZ)g(-_@lvP8acV{ie%x{kMW@~T zonn!07T9h;n~hs0OyfF0a{^$cQs>XjX-$jv-y28?xE}m4LowH@eF<;zx;4A@cGM}b z7cC4()7Xzt)%rOl_~4Cn)e^zj9;K{%S;_D6r*17@a=aEWw$WeEk#$D72Z~ed6LS0$ zu%r#tu*u8eP(sGJ?NXfx(;28 zUwo8!jS3Abv6Xj8W1ZTN3XQ(^snS`d_I|j*i{0Dv;I_2-GqYa?n?a8_%m&^b2a4N} zx_EU0vzgxz_54!IBrJGYnd%&NPB(thX7`L1$NRc(>?6?I?D!PT#Vk?gT1gxIF&)a{ zkibUa)%FFqikOR7<}xkE6U*lO7U3AV&{Qkc>B7R2myIRks<4jjjS2i3(Jij#OWH8u zyEM_OK^#5rxh*`|zHP8enQULkWTZ-wcfn~+_)CX0C(g_h)z+?B{!PNRGX$}=+*}Jf z>5LdEX7rOv4D@WG|08$N!J@ub11Nnozd~P{Y5oQ_0dEj<-P0x zI(76fTq=@}p533CSWVO{){8ke1-z(MYwToX8$ygkK}r=1p%`>}s_2hl6DsJCP;R!r zo&#-8Ri!*VVa1PmeWlLtc=eL#xA0_sy2Pnm z&~Tls*>2;%H%J}HGwh8_$HVBGD$+3ae|BlK(GzKWxKJY-XR5-F{#X$m#qxRmSS*%x z=^M|7PIqp{$yYREb5&+0Pj4=M54E8pcV`#to%&sIfVtm|@PW_Pz0jo+u|P*A5Ht<0 zrw#tuE0{l3`O}k+<|BBCB=h%4&F5ql>-D;^1TDmVS?io!>HMIp__M1GjT6p6kEs{| zS6jDKihX(ap(-Z(e*!51p^qZ?vODBs{?&&A;}}ebl46=qZ`f)~`&AMUFs2fhQrPoE zDOp^=tpBt{`LdkcFc_us4<8tv1lZ}!q%E<+P$|Qc)s}`A*i z;b(*PofipIYcd?7#CpznjG8Az4*L*5C0a!zUx8U#I{I9VW)fgVV z(yDn7CEnlMmnhZ8vk@w#JhuPvNaiOeUA?OEGR`RQok6SAu98q_8`q5Pp?292_eUJo zFTw|pe@Baa0&WYy;pChRA@SdFW#rIxqZ2sr8Cf6hZw;7Odv1LYEU7>*YXjVBXYYJ( z;zeuR+s!pV^=2#qWpk(XVbN%pXB;RQAh6yTwc_CSLOxyt3hck9iGTCd+OT9eYa^z{ z%<-TjF2%*z`(HZIJMA*f13k1MK^#C0=JQa=ZUL#qNE%kDJg=DyXi0*sp_e4zS)f_& zxwYyW1-ci;%@bNj73<>&in~Va@#F`#TdYkz=?8!NKQnu;5|yu_C?A%%GK;Okr6`=E zSp;KP4YU0_psF%e*!Las%isw7hJj)El%?yjew}Q+n^L*9XVN}FpBe@vEOf-YoHz{v zMf5hppfxChOFxA&IHu!!f!rAent4TNhirgVq(Z=>QQ%8)+i@I`hJjDgjnAtNP=vov z3@<8QU%5*fe5*tLU#4Do-5(LVX;r;p{^>ryff=L^ok!qFCvvbDafZ>Quky#AKb{#)@x=uy z2pjYw@g#rdwlpwX>Y03t6lOeVYV4-};$t**rHQZ~T`6a*bxzBHT!yNzh81?Q@MdBzDMvBHOrIM&b=S${>o@&UM;f}#G)}K~n ze`1IlJ&Q)cHCX9jad{KLqmRtgy|K8p-mV9;{q9#3Um&d)(;X$igkro*;fVuDm&

)Ggg>*HmE*_}*Qi{cjj&gr}I3^O2FSptK!G%iQROFZiZwrWN0>wKFZ?w>8L z@BqN!=<}Js0H~s=f+5(VL71MsDB9l42*6^Dvfh5?Gz<8Q*|OV9l4bagyfMPAe-tJJ z7^1C&CoY-%!cp-S7aL20tpMX-aJmGMV6##^2mvF^5~~2dWMv9haRo#Ck;yEov9vi7 zn}UDH++G)eeBa*!&Ud4#iD#(`gQz8t%NzDQfpZ7TMYQ{Z%q>mWglM5*%c90@Ujt#& zjznlp!Q!>z2d*lt0If=@8>u^HXm*smfRE8I$o3*tmq4lV9x&RSDjn$&Xk_K zy?^Rn!IaD??YX~=CjD$Eg)6o6) zR0RaT!Ui>Bmp=5P0*LF=NmZ=5twaL~{3qd}uZUapZqpB9m9b~pwF*@v^(n5pUUUwK zmk1WGT$iSrBcUTdlD&8>C{iEBdN~wxL_E%88cHNW)-BI{>zj=iawG*z@a|l@;g>T_ zEFZqY{XXxTLx6!bc5%X?u9W@S++!dW1Z-?F= zbQ9~yl`-qIwAr@aal6@VC5iY@-=1_vg@X{7nx829VnDz3#f%m0J#WyQ z?!y7FOXk`|xFJYokj9bO+t*|og6=>BQVBHiRsEnnG6W`DhLd0hTn#3cvGv^8EO;k) zVnc#nc866o;E1%Px$K9zyp&3>92^4FPB^wD_aO#B^`Wb*Y|4#55JE|OmwPe4awDE?F)odq! z%XL{6Yi8unThZlrbJ=t%kJ0mzRC@bo0mQd2$unX)6tP zm&P?5G=?;N7&JV0zvrQ2wF&Rl{Qz0(&%z^~RK4#v8;KLy3E!*8NLc9J4NyxOdhdVw zvt_m&;UC9SyoINhd5~v^i)0!Y5|mb(2%DqdA?GC9Zdz&aP*s-&hsBg*o%oRWQ#J?s~*l0xhY;L-A z$JFL~G30as$QxZNUr!aGmqDTWHy{zO*Dv#mTgRwL$G9w{TZS(1M%7gIp<3of-Nh#4 zrm#uZISrQBM@Gw&@VuQIg`M9;KC8W9PRV`Do?ef@Pv|d zp{ns(s29$%td{L@k5$c^tu!MADozD!TODDn=DGT$){J&e7}8CooaSUYgEROFnUNnb z@&?N6m^I?6zfS3TzI3=)=#@et>WxspL-lF!8=V4`A?H`0mFsKPSbufFNj$|EEZOY@ z#Ic;XJ&puT$SIX`yp84WLg-*s0=%qbVNK!1+icAx0yoTzA~q8kcC{u+e8(~nZ=7u&es9Z70h?Rs}8wRQKb8Y_BvamqwdhvX93pS85a($ zyi_<0ZiNQ0D|?Tvc8O&?DW;b9c)e^t7ebm0i&ZHlRvBSLH)W6+r9_rHzq8C^k~soT z3|sdLiZ4mj#9$u^D#3nuz<|O zo9xSM20I(VC>Usp6+RgJu3U2vS9Z?xlDY0n)v&2P9)o-s8`(4 zdXTk1bJiXq7wz-isZk|!PLFTp7_CtVKe6Uu3d7+PF7xCOPE7Mwm#YeR_%Yk3R6zte zx9xgdfg#&BvB#vX6(+q^YvRua`qSsCLMh)Bu{xMBXRp3TirI%#!r!tH9IrQbqznK9 zUuScGzIr5qS;Wfqsp_nbi2)};bAa>5djH0!0_mrPn{>ET zl^8*W2qGv5Wpg=R>V(!IF&y?`q2yq%n-`{X30`T!Gc)p}7U*JgjK3y5K^pO4)= z>hS9rQ-hxP8H^sK=S73MVztWv&%Y&FdeusP9TBl(=3B#ve(l|J>xL|ETP&56Hpy<9 zs~XOQ1<{X6>e65K?5@>peG_)WFeryuExyHzXv!fw(dmhw6K1IYR&6yCx|GD2?|IyV z$2j`t1vyx?`}ibV-1?lrah(Y>#ajt4iiHoF3dNb>`XcRCb_dey{&o>a=% zk+ht4d~O)@dhmT3DcfgB4s<(YZg1ALNb}k(xQ46?{E-4`^Yho)K4DWndm}!7?tS~2$`YcF6vKJ0MNdR5Cza#^rQ_)qE39}tg04c$Zw5^XM+;w|8bq)+ z=Opaz8QDc|cI9F&Ltfi0U|nzL5$k_3AKdr9`ZAMkrM4t7k2=a0%s4W$LCRiE zZ^dPywD9QL(-hl|N56;Y_Ucmzu zgH@9QmJ-;c!r1LckD9G9C})P9499wzS5sX8eJFy)-5g9U05k2wl6ZpM9?QH*`sf+X z0e;0Nt!s9JyWg~U36Xp`=yJN*rV)b1O={0QL)&su4C)SN%IE+Hf>E6{NT(Y-6RD?s zJoT(-MJ4Y@$)MixmLwP1_b3fkanvF?gVcNk%cq2Q+`iEl*?K!3!3fJ-;e%#Yo@rbB z`E}zU`I4SH<Z&ha(p_DMWN+$zN4gv zak*)1juVQ-hp)Z%6Ll3(yA=Rn0NnY5h41b9iH>3iJ!?D*k!YM1#7M`DUSZC3yr53lhKN(0i!ty(p~N%_Ci7wZb>h$bUJU!I=sE zvNACBtFz!++_T$yrb6}oNaeG~U4h?Csh)_e(jC&JACT z>7rRKaSbvJHQlUt%V~}--_iKBHSHP1zRA+NdnytM#zq2wTlc=3-2(VkE1Wr|kLtE< zQCI&x#E!|Gr#6|VY;B|YB-puBx4B2X&a;Pv3yo@`Y}Q`T&CuI^0GW)5*i_n!WT93SIs;&)xXEwTOewL9@74?H$5~gd18eA71~GAn!y$a{-mj z!X}?7pI$JKirn`eC)~AA`;-p~`W#7*qP2JIPM725{`_prw1P6xd^@PjE@ouA`zOXx zSk2dtUp@k(?+*gD%;^>z&{wdkOk}^5-~QA?=e3y1;9Lvj&LuLi|v?v_ma( z4sp>LysxRsIY`nHPF-9%7@PtEyyEL$Iy~Ds46Jl5Pe=VTvqbKBsndE0!E(VAR8O2< z&#cE&!lFTLTT|-a{&0hbM4W$0$|t7lNG~Ye(v)pP>fJaC;<#)XNMm>fjOAIe&KXu< zl4}U4`LQ{}e(wPg;cWY}FmndciZ9q8so!sySh(!QxMlkZhAR2Un9xn|XwYBtd#X*Y zGs1O#+8deFwtUAYpPd*L9Obs2eM>Q?F91GbNq)ZhEY^bavACLJ*$3;{K6+GB`mRN- zUur1cxSy-POl64fGVXHN1`>Sr^NEkv5X5hVyhD~(7EH(H5y@6t>Si))G1wh%5Xn!W z>b-CtPL-a)nq+rM87t(mxm3}WZtDLo#Lo{t!prW%EXK}iz?n2BHaPJ1c@inVd+m4y ze48e1k0NedwR#x(x|<+~UQ}qfG~W0}@k@e-@&f3~xG*Es*~myT{+D^*!f$>ih_nRy z^_sHaR?r+UaoZVxBoCkkp9?Ttz&P8=zn2Q*A9d^UF8x{>R6!5hp~q)~TY8C-+RhdE z=Q#?+X$)cX?FN5~dX3f*^pRXF@?5GjxRr%4+Lv`cR~9!doZ>9Ox5DuHTQ-RZ6GM}* zCD3gcK&l~BLJ&QCDoWB|HhB306RqJBXi05?3t7z$FxjrNhqGFWQMSB3Z~DDyo$bhB z8BjfUdy@`%=RKpFE-Avae2z`t1w0f)1FZ#3OcFLtnK&KSo;(SD6pc zr_ClmVKAMu9R2#I7C?0Yfkb`r+OsXGmJCZ|)24ug;4A4NB*6{9Is1jdiZ??Ar_^Zm z4c~p0O2yXos?7F>m{)I|TG1vso(&OrZ;Pd@OHi!gDX2~T)9>4PU23UlJ(3(`fX|xi z?)Moit4Hg?-;2qkA}i(=^IHW>h^&@sVz+*3Q@1G`9PMp2W~` z+I_3s9V>1q#8^-8+6{hsd4;Kw$M2~Sz+sN@Lpys^4LlV!)@a#GgD^$q+!mRB4 zfRQk|6j028_3l*filoa(>tI+$@|yPb0bgC*aB&Ef5an2_!JC|E@Uo5c750JR7j00A zXJfT#V}c@=3pj3TUUvzx1&sXLb>4#`a_Q~L9)McR8`;MsaIU_h$y2BCP1jk$*h*-h zPs#qM$gyF1!+Er$+_iK%Q+qr|du`$AP_jU#eEFQUb+B^N-EWy=los|+>K}>rKHg7F zC_DF4-%ZDs56G?hTfKstbG1+{>ffN%?zQcq6g}a9MQgb{;yaep9l;Dc)&D}0IHUcZ z%D?O-m}t#-jH0rJS*OM=q~{uq=qBUqjo73vp=U6|mAC-8MFpN-#H`%|EKgA!*>FQj zUKvBReZbJ;y*N8$rty*JqR?{d*7T3d1RewCU=)FeFF%R@!g6^1DTyZ^H zBL8v%SUIhew8Z067Kk-=21XkS8@Gvf`wdaDj@v^dm#4j9re5_A_bKCtQ!&AeqPZFC z`9B~*#qr9q5-<~GAL>j36cSd5UObguz#3EbHzo*LHEW=cby07KiaA^W8hR3NFgnyT{0<{#ZlI ziaMvzJRJo9sh7v`IK(!pJ1HqTTJd~1ux1ttRV+>lp7TBl4~^E&Yle&s_bK%lGzlP| zIq2akgNt+F=r4Lhz<8NZL~!Kq?;rT|{J)Uu_mby3-+1llPyDg_{Qg8Jj+F|zHr+(_b~do5j>TIHLIr)Kp^QRtMn zSi2cx(8eLuSlJkyeBE%~;=p7$JcyBK$ z-vkPlFCs@4HppE!#n_2Dz5^PDa&o#!O0A=Gn7BWlzwSJn*_k?8pS~b$9Bdy#FVf5w ztYtV==^ATaISm|-ByS|$>oMkEC+hXqOB6~KbTLL=_gk;WxrS%K&S=;(tu+l$NM{H& z%wUs+{XK9&Um_oPVJV^RXM19YeRMy|)7%pElznyu#J1WU~sQEoIDo=$@xTFX511q#YZG<#>#`IJy;-I%m1BsMWhsI$pO&paJE@1LG{&<|b}Ya59MR~0pf{Blx|mj*xg zdrN<4$H-u!kP3OY7@4^>;w4~G|Jhw}jkbPJdRMB{qTA(1+5yyascoyj)V-j{>S*S8D-Aqf!C)#e&0qJh1>^)t(ZXNQY{ns*^A2C{%9BGwJR>gMuGU!ycc@{ zN(}jJ4Db2`y;spUW6GMTc@zxku3VtFnKM88!fC!5?y2Gu^pkQ~_C?_gjxwL>nbOyb zCL8`)#S0=v=UCYU4;@{9z*7(e>47K6=z7#wuN-^1k?2#Q<4;hC)Nbr)J0t3kZ%RB47RM!9js=&2anbU8XxU|`KF>QKni*G7Im{$DT=zz&N?T)A z_V-BIkxbq6t;KgwPXx=uS#PXX%Y$m0D?=|hG{1_i{F;{E1T^^uepq~LChhE1btrlU z@nRBQ+jSPes8XQD%F#FK)JTMq({A(T?Bb8?Uy?#>W8cF0zO=D%r|8^7B~lW&T?i<= z?O2rEq(xuGFcB_zlZjblbM|u3{jmPhVZG})w_m1`->?$Z?={3?=&?W2`EfiIy($kM zi4&LpFH~TfWs*cPbeq(;{8TZ#A9kg`7_ykq^~9(byAbFcOtfHpj+<8XLuE znQ=)#PVRg8=C}H-FSct>QJRQ=Mk6WtBvRJVhrKUyqQiKS^M={`$vuh#d~}g6gL zxe-U(h0`%>0QCOX?~w_1eS0jvDRlsl^9|LD)P8vG*O#R|jDf&=MDL4tZ()p{*x*EV z>F$|mx|W_^v zn-QR_&me3cOl`;ATX?%Hx3bEOwH`;=mv?iq*KYRC?Zw>V?H7zK+JDus=n?xMM4{!x zN;(p+o(_7rsu}cs&e@JfxOQTH|SE1hhV(PKV{Yv7f_`A=qO!`bWgIUM{#!AF$ zu|A~beespOUh;OQbYvx-r>+0Q8j77U@$Z%UDY?vFe?vf@TaMTU*Us$BHr>7yS$k)o zLXoQ&bm3$K>C%0mqS+se%3;yUsY|0-|DsdUjK1tcW&q+CGywP2Mz?0&ejK_pf=H&l zIKfKH6D2Bp2}}BNwa&MFm$Z?jh!WT&hua}}UC}4k%oF^4?$JPzd@->WmM!|nA=g@) z+qonGqq8@=hhHbO$Xn)ag7%$~{J*bV{278juPB+@b^rRIELhq_Zk?6HeVZ(*MiBAi0dI(CRJZ z*Nd-3=!Bde|ckVZ7jgTgW)@M%{HhQBH?%1b&r6LrjG5yGhYy_)g zl8TKYh`nkxSv%(+*lf47(k`)DPR~XYD+c0^!Rg&u3x$a{Yy79!6wN1VqNRl)-V2{J zwxS9B^T%m}okDx}^uCVhBnXcV)=$|?(E5lsI1l2a!(Z>G8|ag-?Wg$c%E*-<*S(Z% zI```~-VN*D{roD|hwFk3s8TafJ^lGc5~Bhr14*o+N>;J3y0XQwb%*`@DX2?-6I#a= zkjsXEz9g6lSZB=GkVyh$>4IpNoO9KN{7$N{K=3XBQU9QDw#b;5SKiR1-&m9}B~9p} zPu>}eJti>{FK|3=c6HjCR^VWuj~z<3vRTrCJmGw}+3)=M1YTdxVt9dwnTn_vOV64r zp24utol(udk0E+XO@B01tV1yI#7qG_7zG#|59%P9t#-^a{q^L)&)IK4 zdLZ~rSf~yjNHuAPK0ZMjLBZ8UPe=Xd3H}|!vCp?u*{6t@kRr*)^w8#^eR5a=6(goU z?++>5IGx)QNuF>arH^RYP$A77Z*I#j!?j_h7Y>z+%t8&$yG5xQV_4+#qe-5H(vMBp zQA36NlrpbQ9i({jP-=?eQ4c=Y-gi`~_~IbMg)9Myk-~_#Zf6Rm^D(lKq6v+9?#_Y+4d<9a8<8jxuY|t~X&h767liEq2-sAWm4v`u z0ApAof$6>f5znM&+acJxqwdAB>bb@2qp2ju+(Hup7*pJVrG0xD6+JUQUfk8YNS{un zKZIccN*M&0u5yXe3Dj{nR?{U!?Kp-n+`Tsce2>Lkes%Xt^>@a~+U5(geR_21JlEs- zPYhHWd=Lt2YyWCdQK!$+RUJi*MSU+Glfv`hFO-J%#se9B9Vuk~*tZy=5*4P=AMgjZ ze0{ZprIu$GE_bzJ(8;R;`blVWy3e%?@xTk3ad?Bbt?>q@4y{|qm*<;Uq|!$z-6R_4 zEm_-g&-Y)JqWbT0Am-cB?PVCKrq`m$er1xBIsPi*IK z4X;P#!~uK~;>*%SUeqW(6@7|2819kZ<>^YVJ4*R?y3(?_R%TV9)+EVXnzna$S0bBU znvq#O1)6&}fNv8L!7ie7?D!1g+e_LA(sE&Vm&$FOP#f)KbO4yjRcd~)rIltQ$|%@k zPsKs!Rqq?nJrZFm2#~GVH(iV)Ly1@S=Fb8>!1oA|7G(oky}RG9-!0D8p=!OmCd2I^ z&PJA~{=<2pp${1Rft%A7sqJ@36`tBfaB!bt0!|D2N{xQhE#s2IKuI{|;gk-(9PzX_ z8bgb0`+Zr|Ys(?kKjt65|ZHflX82p+Me~e>~(5jAlXypMNcPT+qXG(64pAkZ%N}rAZzycZ!?cA?q8Yv z6w0yuEFK+iHz}Z-Vb(q`+}hJBAd(~W$BVCf0_2b&zR84DeOhBmOn*s$!4?PS4Ikqw z2ARp%m8j76vF@K?RWq=@2xJ7yJM3Jh!|0^kc7OPyRUEyF(VUQ1vf-S5WiA`ERXW0_ zna*GRW>eRsCu0F6^1Fx@vM{dR&%mlXqN|>|jKit8Jbk(syuMoNy|>z40%y&jg}r(= zzT0oJus_toG{1Fjmp zs0Z9lY%t)#B*p#pN68l^gEZFz&A|2qne+?z)O8?Q)K+ zl7I7xbZQ`PiHAQ!q>uTt82dO*d!;{a(;KpbkLvM$Q{_fxAI(-LU2T_uj{5h_6r45~ zxU5;{jrRA!*3-ADb7zbEA^1k8ZPwiy*Q3d2Xw$07MFD2wnqVT7{jZr`HJ=w>4`3^i z)x4Q3q*(e9ILdgO_tM zHT-kN+JnNEk=F!7GVDhCE4BGHso#wGToN(nad&=7d0MoaDWW0s9;-!aM*9#a#5 z7I;fCU_awJE-7st#Qu!sN@Eq3EpNF>k^dg*)KM z$$-{}La7K~6dRVi6- zEzHVd%i>}IvN%XcL5{pq^_)l~G&;>y4d$*?XvcAB#!%URhk_^{v5_P;@WgwH^A^1+ zraXZrqj08tpJ3fP;VjifaDL-rUy|NrLq?`-(;`hKpgun3I19q)P!#r>c(EV~>-A)8 z)G$WHs(5=8#*<78@2SwXl^oVnxsc_AHY=el>vcRtps}xe&ZC>hQv>xU!B)wYd0VAZ z+Z+gZQzu}r9V5}1>|gp5X4`_dNyWO2pCD(+V{9&(p%$VM$`#|p<|{cK-ehVbn*qsC z$8q*vtf~XG&-cP$mF150C_>RWA6Q)N^`4ef_(aLNI(Pdos#myeNN<3sI=&vm#}d9o zEB9`&3p<$`Zy%OF1<5|weHfFTl*Y47ca$N&cpDB6ee`Vwg&D{!5?>!z;HjuDgU%j_ zlfd3B(#j`376nK$~!=&C2Ak&b|X3jmCJK{x3kKEPnhOs~Swxwv)|MDtt z@U0zgmsd1O_aA{ctUgQK=~Me zSZlfAT0Y#N`W30lPwC-Ei9-{kI&pO-qB)lQG_fEHoY^!PH8HJV-)=|ECj6gHx>Lps18S?!!+p>I-w|i^=tPJG_Rsi&i%K;bxd-qe|WVp z6#rT41)vvcKGKK~26zchuMdyzjElu7yVAHtDjl3OD~`ahIYXf)@F1~i9F0_@5wD)j zMvpvvQ@H71u`oSPAs)%*Oa5oZZ9U{B;eA)q_%|IHqTd#y`fJW$tcLUkSqVP~hNV1n zLJ5P$CHOR{VtovupO0ilM`UL)g_zyv_K>HF7<7dTBc!*lDm8rVYdzP%{D$fC zxZkhW)kXdEL}?;KTEeT?Z2E&5Z!vR?}O*j3V7Uj9M&ZFccZ!5#m*@wv3N3$qJ+-Goagb@2+IYh#=$YQNbg5#Xm*s8TLsP zs(b16+T|oPw|sR)b_{QHf?@7?TFlD9TvfmIN+0w5f--iCA=56aBs;}ui*~hk)4KFt z!p^h<$AAZ;ba&(N4`7PhJk63f8UOw-K5|JDYh9&MHzQEGg6w;1r=1bnD&Gh;)nA`C z@<}A3#9!^GTgkv_5+fIE8@c>=wCdse1+40Wua%4g;7wUngL++fU4*?D&}+xM7dIhv z6p6Nsy+T)NhPicljK~x&E2d_YeKp{{+eW>OF(#2PtI*Q`NxI*_1$mB$PJTwCkJ7u-V*59iYWX;KSHM_rTyR;E_vs_=VT-vg1 zkpF8#6LWBF>NDJ^m=}3jreW0Jwq5&AQ}^z{7MZ0m_r7}LmXhb~px+uX8c$lm9H-)7 zy}2Y5g;6HolQCQvx024`h5~-FRQrIh#SUfEcsuCK_CWMo*Dcaw#VZy`-qCrZqN!H* z{fuAc2Z!`R?Zd~#evH4{wyM?_Vl11rf5nn*vN;Sph)Ls#A)b{x#Yj0#R%TTO?RpAn zgD5hD)X)ltnYdR|ypk(rG0kvW=g6Z!Q!~2wG2LV{v}LsgtX+j<>&a7vCj33>OZ$;; znl)y!=FLmkhZvYOMx9670Scx>8i9~?pVfmm_(2010vGP%s@AMzsC{+4#lF;& z+nK3=(7}a^i@2Q+7VoF|T+4@%lKEMa8btvn&Lf6Yv2bb>i)Yh5-r1q#cf17|-xuix z*Q29h2Yv%`lH9t5aW>Bxc^422B6mRrdRKWmFXbu5@WG^=1-6dL^{qc7x&@3VKe zlf!U3;br+PK>*Dba$MAQ%#02PClpf7(vbPU?I<@|)bVqLchTGDO0OT|gA#vd%-5oe zNy1P^w8&RoV|omQ34`#>3eX4Kl>$GOu3++Jmr(I_($<+FT}@abHU%%eKbr}a0X;Sy z>Z9(|QhXxx*1IE*4Iz8W*@8lcv{60Rc&@lo+qKX$g~K^Ad#G;zK;X7(oiqu-d)=hJ z8p9x7GRpHSW%SD%=q}c_-z5$0169WFpY}hIN0+78#AI{Y9^vu(#xWCm3*w+BNm!3P zF|H*tasx7`Vg_vv1( zM~Rt-i}hj6cOxF~<$=?|WrIzV>lx9%44x35$!cOCV;%Z9JInWSd-?a)n8Ylmnh>Im zrMeK++22>@l|}K#TqOmI1H=kYRf5^654{^wKB_zSudM}%JA8%joS%c(8bN5j4n}J^ zqnlpCDN{d5BdG?3-n<#+36`JU`tid!Dp}(bI>&?P73ntenk03|NObO%AYqSxI`WEi zg{(X{>bVFqx(Q-=-vbj4dpc^rYyb8E(+p9?oscUr3k#|g(#?w9(s&RIK_>;pOFy$) z4IBcW{YrK0eeup*H0u z!6zE!Svy@D7Rr$}>O76qdJL2p_ml6*uA`s8C3LU3kw*!dl;TS)HCI zP>h4D$)no&j<`mP(u@Ppe|N-`^FXX8UXD1>pTXE~DTLi%_uSpPB$qNYFcHx_^N)CL z(i2qZ%<2K~ybuNA`L;c1MFUr-sz$c05u$Zrl9=fzfuVYf<0DY=#@VB0kGaRtN7bn- z;(QY!YT-?n6Wb?MDRE*$$KU~K@MLTpeOcDlu=$Ycg3xAug{kRw_kJgGGMf=vCupv5 z^}g~qfP$H+=F7Vx(Y%tVhW4oQzsGa0QO?|jav1->M6j6Vmcw^~nl8(1J6zx!)&DeY zaVwBzy+md=r<5sIORtYYR~!anb^Kd8Mi;(Ui>jiLz!YhHnk{vuSwgxF^}6CTcHwo5 zIqqp^`|-XA&kfdHpjz=7grsg_dk<2ua66e=bZnqf*Qd_tZb0kaxlI-cnlnIqPYj>8 z*jr^+I^rr)k0GKWX1!0V{(7Mzu>dMX%&euVm)r!BaEe4@Br1US%3|q~Ez7(5%Mj^D z!Wz;kW0y;|vsJNnb$1kyYZ4H+Odw@Yx*4a)rss9%H+n z8>Hr1^cbacaV)h>`s{lcI?;^M``#YF_(!{njw=Fi~vIl^=ei1Ks)@?O1 zp@9M7GcljOu?ztmdZuI5Tyb@R8rfFMRTh13wp|y?_+<%CqRkX-CN1?Q2xN{2|QLETgYzTs}}%?m=Svb}Q;%FMEiKQ`eyE*p`JuM-!nY+9d16Ictn z5%q4#VvUQQy3DC*PCb)m$Sz(fwzVd}1=1!@|pJn3-%%=$zE`>5Q0r zbPXiPb`uj=9{iYBr&BZ-{q#;VpzSpFCrXuIguEv{s<-W@YFXGNDIm1C|Lb)xDs?!f zrDu^qUODO+(Bw=!T_i6(S1ZnLJ<^2QgY$K0nCHXdXep*}UsU8-ZuFx(lk9*dKOJ3Q zx~9miIw)P$ezx2wcQMXHb9$AOKnR<`}vwiO7r zjzQj&`_fI3eyu8QFHiM%E@sC}@Y*BXtc<(7N>ZC!?+0wRQf-`Ll5qy1nq^UR*wwbi zFM2BWE9j#-Fz;#%%DApI9R!*|%y$b2f5|WLkrV>vjmpXw7A_v-bT7?p%|@bZml-mK z9k+iMc+y`_Xrc%cdtq=NxlvonjTIoi%9#s-NAap0_QNXZKUEyLpRBHFE>Tv_x(_ zPRt0hP7e|z3Juk`@2;W={=xInSYP;Z`1yK#F{6TYX!S>$Cw?83{D~?&htEZ}_rWZi z8T>aOrzYE@yK^4&l`?CILjmVL<)uxnT1qaQZG@_z!(N3#~!Rh{;+Z2(YSpzg` zV)%kZ_5o1qLC=Mp8u#oayux8S@;p0qEjd8kV1}7fGUgXFRBwmcgJb7K@}`BS8Q%fX zPWpai1sv}kD?TIh_Lb;x`=3Pc(PTpNY>tgYoXx`TRmWnP&aZeBain@2PP8&Q`L<-p zY1UT3BpWG27{HcG8!u@&3uEqp=i=o2lC1OJ?9qAo$2wr=#{2hp|PpEWEsRVUg_w9SRT1vB{UNZ*?u?RWm5?D6ZuDT8|4 zuhB7Az(cM?Ya+^f$$1c1&{{CQ2g9Y)jq|zk0WcD9voQ7)QhVX?<2aJg*{vtMV-KPp zPk)aXH4rAF2|ax|fORlRrep3q75bLT$^7Xi?m1Feq`wP2DS?)&O$RA{ zK4#Jh@@gZD2^1@XxsF+6aw1>zSoUSOZNE3b^g|~O&&_(c7hq01X!W^|KN@6d{oIgF zmdJR2f5(IH@O;|cJtK{6MmfBL8SO+YQH_b-VBYlLd%C}pFCEv7j_&jfi{fZjgH5?L zUdQH%utYmm)@A=`&m%@*ei_%L$(VQKMnB)yl$)O)3B=CcRtcLrZ4ZTMewSD-52FlC zblPDy1yE`8PoLbbC$694dxC54FgktQVDE`{?C0~v~&8@ATn_wpIOhK!$G;s!(`>}IWM@+Fu2 zyl0XYjSD&=7ov^q9^y72V-6X&EZh&_yeO+>F6^pQZu6*f4o`*MT`(9fIbX&-*G}?TPNZ%r^-1F_DpC|}9?5`LfaUOj4IExj( z&N3|9E4i?Ukmnb-aQArr$V8{W^hMVjYVKm zs||{Oml|r)cu`e}; z0$onc64$d$vHQ$cdE%ACo;**uYu)u5TJ&EYsTRY%Ip|T$h+w?#l;Sl|f;*nhyHezv zFYW$NH&V{)Im1~Q^5YcWbj2BFV#_4XiDho9EsU=$mXEocMNiEmjZT{V-l=6FIxyyL zHx%A!+zLEzHtEm!`>YggE64^P5-?r&;|jckWhW_AsiFYEnmBkHE~0e8!Isk7p}IR3 z-u(T01~Eb2WH9x3$6mdX*z#+2h!fV-h(_A_7OGC`Q$gfDdV{JNGaFZ zr%rOdVNCMV4_87^ghM;-vHdl#vWkg|m&wc?Ni5)R|m0#T-5-sH_`Jw zOGarC`@ydX`iAoRRU%P??L&7gaVuB9F&NL6qeVuO&8v*m@8P!St=uo$hNqKX18>&} z$@|Ge6B%{;e}iw{29P}bu~?k9TkM@bCzn|$zvapo5@m4)I2qy=OLQzvpv^|R4O-!e z{G&nscT$E5!OU`<0W>I$%k(*I zc;B?hH^{cHkn?R@!nw_bX`>lqwk)njXO7eQqfsPZXiz=*UklQ^-($DExJwR+POnX4 z|K8GAY207oT4AZe>dd;q@`BQsCU=r4Mc}sYdFz&Q4rk*>4U$Tt)7G49k6$~W+)^|&1D z4Cr*P90wZ9T}Jk-|B$rMj<~CVgzLMl*>{;DvlmOa)_1Lm+N9)B&H5gFp(U^Z8tPx4V2`vV>8RBGx&zEm#<&z&B$uMD`bg~ z@-^tO$0v$#wVHhGu}nu`Z=dgukW;RzHa;n{?mk|#*hBriI%mYDJz+T(oIp%P3A+Km zu3qyh13K;{)wodkm=ddg+njL5ODRW#i%h@Wj1+95ArS)IecP9d-2GA3_>|uH{8qOH zsjidbdee7DtmU48SU@V7?)oF8ac1Uno;abc`+>^$>=aMGlffC4IY;{L=x!K!%jZI) z3c4tc`#y>=2ep9~qjK-yB`%|HeGfv#y!c$MZ}2%riHHdWE;vB}RXyTo)VR0FX#+@l zKBR#0|It@<61lOArL1B=)0R~O}>F8=v-yp{e^=*TNXz53O zGa2_Vx|i>*r2B$naP5_jHU?4WevaKRmwoWg!iIZd#dd^$E-bRJ37{ArR08a# zL6}f5r&&sr#P+^5L-M^BKbRwUsp%k_ zv`9i2+nBeH|4;QO6U>|>_eZ$By>JjdKoH~YYXx+(#G)hbwkxRjjNz4a_jm$2&|h|RA$=-(&e!?$g2)stONR2JW&IpS5*q(({mfC z+hOWl`Cj8BDWhUzP3fUIZWQNgrKH@aWV>3TSN?7(^yJBL>Xq6(1AT@nAhkTPA7SO{ zG=9`xZv70~1Ur|%nTv_OZWnQ?3>d9>cc_o zLI1`%?^LyTHw7P_{5^La{+rqPT`_AyCzcJ4N7v9SOZuka+4t9X2y?)|A;aH_Z;A zI1Ka3L4d1e+|ML>_0KJvgQW{DwWzec~!>ne%ZCoDiyNb`h4m)RCb z?5kh1818BhOIBm?^2xTn;X~53cqkhC@h>hcDv{*V_E5oVZLC|%rHHB><+I{*9wZPt z_T33~SByQZF(>gBVGCIF7niNaXLJUQ0dTB+QvXomlnGP!Z^t+Jww@nDPwfJFL4t5S zbZZAadDi-p>e>#xUYW55*9+xLdSwI3!vGZ$APrNN_2R_CGVT+ir!alQ1^gdWRofz( z!Ax!l%P=K`CcW$qYl9Wtx9^To`s0HG0F!*`%#?*SZ=$DPfxP{8XIne+qAllk1RfvI z9;4)i9g%$kPIu;GPq5=QrL&wP?b@^rGzo^!0%o^q`qPevXtvs-lbT5VA;$L97r)EBE`7QVZbo`dUi^v5Aw_gjQNTlHSRm zECXnhPY_uQ^{^R8 z0cP#u+_sH27b`guJR8B3a&0*CO(l=JU2W8TijCkl%zpIa4{pz;{oAuehhRJO9MYw* zQ(i9(He{Ur?g%2HO99ZvGx66sq+3{p_n3uR9XKFTjiiz88j@GtcY|iy7?Mhd)0Dw8 z%_)1-_(*p_S}`~o3ul4~KW9Z1E_J1E&Vuq{23l?(+^6&I-qdx@(&9}onY~2o6bR}1 zlzh+hWKF9z1k4iAC)|l)t~g8u84fj@bM!A>1b08F$e1)lQaV~6T( z_b0<}?iR_R5>6|wz9r;m)osbsaAYdF)aKqS^L5?^h&i{LKrKb{AGMSrb8N>%4BxJYQ1oV_*XZ|Lc%^zHJCyOVS^ z(tcl6a=6EOGAyz01Y{cj(~Jj|LOOO5WOv%ZU1VH-Phywx4fg>k&>xAlNf$fQ z@yvRdBRSkdzu$NRatwyfa@}^e){AM`-F9%ZqB2=v-#*&DcVS12J+saoY!9nKz-a6D zDo)MtOx~H#X?ygQ`mf5;3{=wC;xFxf{laLRvRiE)Qos9RRJZ@RmTvB-8pOCF3#;uE zv_Ko-{8drIM$;3v$o1Kz%P==3jLhaTbYvQ-b<+p!YuGcFDm#PT?&o# zaN0j7?w8&5F(Djz+cNU#X&bIHi6V5W!MJLuI=V9iL9olNs=i?|$3%ln#*=SxZAD0) zWmjDoh)cKGKFpsxNXDH$MB1xvfz7Okz30@}h7^i)UTjOQ=65i?Qlv2d<9QwwcxnBc z{(8Y9NbqKI+xo_;;Kv5mma5Hy7o>!&r+bSA#@zK{UJGlfdb1#k@A9df7el~8jZ)93 zxf76YEy4CMy0!Ij(^HTRX>C?Q8+}!``n+b$mZc)u{3YE)>3p{|@fQGm6Yd={rWNj< zRrzns8L}_ZdRt#-TSROQiPC+S6UKS-e^}=s)ENdpnua&^D@O2KJyo_2OTst^3J*!6 zCrQj}TEm2}_zWjmbZf1upBN>{5{RVwM2_FqocazjLdwcAAI2S&f7XA^isTE74o%Hi zbJBAGU2i&pVk_wQhpB04JrvMjAKekU%|yZBvRi4*V(~K;SOACnbMO9MsVeGWQ+AM= zuC4vlA$63HX5oU(2H8VvyTa~#H><72RHKb>9jnp6i2B?O>$NSSj4ma%Rd3JjYEO9A zk$RQdS3$r;ipyphg}N#Qa#|TTIwQ`+JMgo)J2Q4q8lQ~?zPQXUd9&qU=9jv<-}c`S z==-RcKB~zrrrRo$?NTA4-3nb=o}Xulnip;7O_r7ycA;zsjw>kwIl=W>MwqlLn=z%h!u(u&h*OJ=n zWP_)LIBT9<8b^dY=FMR#bHDf`C}ptCVuf`T-{y*Hk#Iua91a|RaR?e)HIGkZ6+Gv* z*cCc(E#2Dr?%UPr`uP5A33TrI+Kh3eCHS>Iw=-EV>F3!Kk@r5Cr$JLQ#- zjQW8iY7gwlYgwor%Wz)=Zt{nE$YP($(96g!oz@Eud>fR>$mZRSsIMkT8@CR>!YWMV zvlB!aG_PPYSkHTCL?LI}opsq&RP>*=URO!?jSPD8*zOE}?zTjU(XOeDLxye77QBBe zEzlcLI>`uI_!Wm9M1UK)`#L8E;K>f51D0UAEoHQzgx#KVR1Fc8;4MIuU0V-=Gr8z^ z3>}=v%lv#g{^7`p;O1DZ!pvwu-k5YWo1Rg}KP^M>o_sz}m7738BStQbt;Q2gkgT8w z$pRYoYl@d4mm8m|__Br&UlIx={sJ|o14V#|E;MVNnYC9D+7 zX+4|NU^&BDT6Koy`uT{#lqedfI825YdAwpeqekCss_w!_Dr;2$gZh;Z%x;UZ=iZ zF^#XH8}GK5dl*NGGv19FfEljaZlS}!F#L)X*1mC?Gf?%k+{-eq5Ok9O^1%YGrc(xJ zBw0F_4N1e)O9zE?C~9B>y(o}+!dBQWWq-za8S4GItvyD*FBx_!7LUnP7%*j^yQ~(O zYV*+2{hEj;S|HGOn|t-hX-x2bmFt9$y-eO}$ zV;6*{e(GD#EiNK+87s>hvD!0qYBM75&3;*o$YBn!@F9p1s>ph^q=^hcKJE{X_>*^BR8_ z1ee=t7ye@0xxfi!m=FKsNM^eBBE(KLBz5)Idm9bLa7`EHXx^n z{8zgg=t;@q*-TskQ z-obtE(Bh^A$?8Vf(wX$`Sl|f#H))aSsDVvIel4qHx#~~7+uA9YwTJcvuX;)Y3Pb~a z;yK&I*m0qGE6<(>g@xu)t2Nf_TBJIgel04#ef>B^5i?OGc;ECWd}dwuytE`r@eWRl z>6Pw`leyT@RW79rycYXONHS{E= z+#RJT=3KnZfgY2#2e!sjKjCV-Okft#EQI8BW zK8xj9jiuY^FlTR6YW(cVSwCd|rx$?4&eT8-8$ z(@vZJg~qSL-?*-hU8~OPT6f$d+lxDK$T-2xR7Fu?Hn@ALQimQ;rnDD|lz4z=(}F7Y zoy&O4<@8^0q(Cob7%k?~U1ZV_Er6C*oPrPb%Jc-SZV=^YdHb0Pn2-bo`;o8Q+y+}O z*mP*98PQizx3h+5u^rE{nLpQRb0%QGAx-0xIbw3;pH+(FReYQQT?~@<(JEFFU4&K- zHaqTqu5z#b2BI8;{)mFSVvSayU_DJeUV%N-+&%}fXF zL{S*2z4EM~6o4iHy*Bu$7;5b9Jww&`%D=pO3dEVVm@zFa)A#TyQW{-o3RI%5G8#}- znoxLS2k@>K`lX$o&r!*q=GXfb z9n)eh=<1v9LZfF(qFN3%qi&E2MQ6C{=`tfY&@Rf1@iEKIQ&8MnT|UR$Mt;(GBwijR zNhjAvtI30LQ1m^YtM~E%5+<(A0kSEHcQMPF-?PuVZv-dRLO!0wTzpIr`FcvWjWalbm+y)?Wr-=BTI2c>2vwg%PXB6rDH zYQ2I_?9`~Q2>2LE0(UaihsI3Kpc|mioeY>iDJ9e49Dr(geuw%9YYsmaSCP4s?!Ktq z#n=*lN@??#ykkr|B?p)Eym}QSec|C6r{-5sVsoLnp_Yqt_k6zxyN2A1DrD_{J)rlbq(uIpU z(< z>5oRfjesIN&G7)>7j)XbPjV+ulRD_2PoTK3a3b+cSto!3#`C#sF%&JWuZ*av<}_T$ zcQlcmYVSt>8Q&w_%d^9k!=;4G3c@O-!1Dp>;$EsNsM#%b@~z{abQzXMzEb05VMqzP z9xs;k(_MC?KI(oSRwuAyF?rjaPG=_<6`guqH{dub#@6H>QG@XKC@wfvs3}XQTux&$ zk(Q;8U|OPtE2v1ASxr<+d31-lxSooPn&RwSQwkYhR1?@4d+VL651rKa!Kvv*v>?3 zyz&YvKr@W(>2*M44T*-5yxMkG0{3YzRy2M8=CCbQs+Brj=YMJFAuO@}O_rbeHN9j6 z_V>4QW$1TqaZ_8ZK6dNcGKo|TE>V8;LB2s8jUf()O}(iRPh(|YKF(sCKt2uN9^d<0 z$${};S5RXYcsW&V!32_iRNmJ&asMG}t-i1#Kd=H#;%ZN-PaTF8|* zY3;N>33pO{jiVkZM;UcekF%_Yr~6?@!gV=;Dnp<1tt}ahG0qr}?kZ1u^Law;w#-sP` zVo${Ep3NFQ*HP&(ZeC{SXNhBPBm32?7QDLd)U!Mr5I}NWm@+}Gl49B@l1-c9YZY?W z2lGQJbYCG%_=`C3ChzHx`r`NDE|NpRcu4M5a@is}L34bxPaT^W?*(1InLAGsM!M;& zuP`cVP&nK|{e&i@*B3UJ*KafIIzIk}1_g9eMRNON)2blQ4@^Xcm*z#V^Xb*T-Xs3( zoD$r9i;UGDHtx%IUlJB0-z zqY#X$Sk}>B{Gy;D8i*lz3#BNH&~OqVQ1P9ZZjB1;Bk)joO7}dyS@*g)5CcHrwMuGJ z=Kymj$9Sz$IX(4IeGpWu!ICndA(u71flOnfJ4c5u*)ItW)w!|Kj_&!&s~@~5vBqIK z%5rvmSIoCmA!PAz^X$D|^8soh*yG1EgH45J6F#}C3g7#au&5MAgNv~uxU2Tf z_I#7n-J}^lTXW|`K3(QH_2QcGO`Jc6`yvev$|JHD>FW&}z)S;yU%NTH#BrI?m)cKt zJC15Sk;^9kxh)f4Vucykq;^!i+9VK#^q|T2aoHK%`_U>-=q@~m>7stI!7 zXyAslyw+;QZG|Ekleop-x5YsH(~aYHcfap_ca%cW>pL8pxLB!Jd}~I_B>#nq4UwA} zSRem!on@`XY?T#WW5l z12s>_4gD?I&nj2?W^X_lTs4fZ0c&|1M*M{V%jypsACI3j%wvwo>F+VZsbnJW! zigHe+Gb+fURz1roRhJ**4}q2&-r9r=uSk$u-yPM>X}s#lsMO)RqbTsaEUmZSRN(~i zOC8&u-5sg=;GX^x!!p_vLPYpw5b)X-)GefTiH4w*xvNa!Pg969kSwz z9C^|fyX|E5=NRsT@HPBXC+qyrSiQYe^xbo9Ptu`EkFKY)y7(J+-KDRmuCj!Ds00fL zct50ddx^%>dse>xuoa`>U4&^+4T0~@m}N%#MobdxWchtL70TNSUYNZhoVK!jnCx{= zE@^BDe+n(BhdEd1-EP8=YY~5A1lp#ZZ4JdBdClF*61XuSCK2eGQ^tA4I#CWk4X~byNpl}^bn#9Q8Xh+U`c7MN7L5>XG>C=3~1Vn;cK4W^lk{hMinfxi`NK8ghS~ZjPa5y)z&4J+KwgItWgXG)rD4@%fCtLl)T={ebgXu>3dR3WC-58l(HxgCw60}d>= zY(GKktwE_YKi!J#J_b4oAKxp()%a#`TghQ%liFzFUhp}byqLg@j53|@P8M5>SfUlW z$$OgIAnuK2F$~)^p1F3d@g;m>9crlYb)x-Pa2*C=Zu?SnH zqVOu%hb9P(kZW*mIIQFW{(c?)e4KB$FGsJ?1q;+yaPki4@Z?%7i^FPf_RIXj8d%fI z`_3WjGv`5c+Dvgs#adyg|1L7abm>X$33Q5FTFrjeOk?bA<<3M-?7FWNmFVX3$KTO; z#8>I&T3rDV8MEb@(WaeGbOx;PiDX&CL9i~p+onT|?>0&}nhG1he%$mY8ur1ETfaA8 zUK3{hB_iwfkJoiQ2O zGPogcrtyr|j#b>GJ}ba$HG&U0I8g}>y)eu6O_=dqa9gyP@m?o~-?_Lpg|iVjz$KpQ zkAcymXMMWzDyMS%c5sTFN4rwSHbl)n(!;hXt;R_8e zH=tS6AiJiBWdI%2`zu4_0OZ?OiZXkCZJwqAM!zfs4Awm`pF9Oi^{9IeI)4g908mX_ME)5os*a1E{ zHs^cJpYtScYAbD0EO%r-e>ZHv57-)QEAbJroAMZ#3EwY5fX3YU`D}S+bz%&TQ_&a~ zM>A`(3li%nkI$z%{Db12&jpGH0IRFm==eqS6*G)cm?C0UmV2CiKVO_}yB_m7#sRPN zUDohD%-x%-$GEf9N#+Cx01r#MV>wyo33ZBG=9h4N*J{;rMA}nVEIV~=nFk{HR*drl zxGVX6g3aXB1k==N$x2s^{rr(=)8}@hC!c`QVral-*QR)%}kkW|b zH=sIOg2^vKrL0>WJ zyc_OscyFxA%flr6-+wY)?0;*)<9f{Vc)OqndOLXwn5wl6`#tOA>7kK+_YpfoMv_ad zZ>4uKUHEw*a?9g(nyGIeHI4KQ+4^hrxEw{T`IO3A!P8O`VUBz%WXWiy-R|JX_wv#Q z#qLbch*pRM!LTt5Vw;qJc~hR0-7xDoq?!1!?qFpUkPQ5;vW|-@o{%o03YXrLU-=*u`HoR5vw-H|WZoS7h)8|5q4j^GOdK8FXMP5v&oEFeWAeN+-( zD<-I1v~DzP*j3iO^$>_Agzi}XJ)2*nVEtuL)Ye*G3jI`)@RNw3Z%|C+6?R9O{Sl_> zZLFzofhKoe<-XkzNZQ`}2>7#JFWc1%dpfM#mOC7T@OwrzNoX zCckV3)tfcSb;+V&`JcTw*7#2;l?iN@jE4f`C*;FsVUA$_Dagln%TFaL-zYTd9cnL_ zdRiZ|1$@%SBU~p=^4Gh(aAf@Y85PzxoQZLU@kN?VBD0_L*Qo9Xs7CViS316DCx#0# zrDk}${%m76e@%*I1JHDyA<)hwI(f@s*Jqy?ER~-fSPGkyws&U(IptSZiqd$%rsuG#^-IwUQ*CpqRSiE$(VWL9+#+0R_CZ&iWvYaQhbU%i zc>NsUoS4#$_I|Ezko3dA6G&4)zLs#M3i{nSw9OlMzCE$Uvc@Pv^g;JpelIAcb&ke5 z@79W+;gqo=%0F3{E#GV*FeMlPYHR0aIgu78P>c#>IMTxwMqkYU*THZt; zwEGK$CfJnw%13v;YxmS79lFU2KciE%alv{-Qw4VUSz!afF5ej*sYhneAK}b{iVUIN zVkNw~7XMXbBOphsS$$x3!1%pjA+OE5Im`BvDsC3h`-cbpC3tOPmso56l>!?~Zp8Eqb+9UvfakOj6x^zz`WcX?wrem=={O-bQ9Qvns^Bau$8;#T# zSo*Kzz96!^r0Rmn7w?is@h z_w`X+*Qwyf45Oj!_G@_5>1qu1CKz})YuZ#P>&~HWn7>coMe)+Q%16rD!?!1T$o%O6 z&3vFzhwiTB(vqH=KUGA9`u9oGhNk9dvLK53 zr~i4de;%tpf_^0U5wMrJ?c%uD{m#g7G}bgr$(U{Zef9VsgYA|5aw&=lsoPFs|MOl_ zMZ7Wffu`x+Oqr!H6!v?^nwBe-k%~yRos7hs7I&$!!d`#9Kj2znNnQMq4(aoa`$_6_ zATK?Y<+ggdJwYNzMvKV<^nri8yw(HF)2Ua+Vb=|ML}2)5@w;ic(diz)Yk6#3F?3e% zc=K-);@<`zhmBypc87CG$kIzqFG=bdN8-`k{2vz<*?Qk~M;3nM;b8gq)FE>~2S(g` zmdTUMN>P1Mb|T~^n?=VdpLrud&w3MQfcEFMUSP3^>i2|13r%qp>xE_;j=UApUL-%n zyg7RCC)iRD`XDiV>YX42vpKw z>plH&kDvZ7FMA8!%>z1KDFaTbMyW_0Y8(iwE^ellb5KNj@P*qdMzofF=AYB}$00u4 zLpndT7$fpstQg3ou~C`~C&kmLGbq9$?I80qb&#E5{Aw9GAFVZ;kP;6;`R!gEi5MhG z2B@PSNP>SxGaLMCdW$r}L#bPMe+Uptn^(*uKPm_tkK+yxcN?^5}5I}Fw+m^ub&3~u_FEv zB>rtq{Pha|6+ZrlBO>|KU9wzQkK{Wj|D37+tKa>5bo!6e`!D`k4U5pdR@T2($A9@x z|H~u(5{h4v{n%u}&y^ z2lH6|GdTbKHTky(@@IA=(D?66jW7Ix8$~$`NVi-iGlhATSu3iw#w3D=w-7&xd%tD7 zzPUC{qZUYqmv{{KI@68eHWhdV!b`77z;2xD0cjJZRb3~t8``T zGIVd;M8JxwW4HG+^;ovxS3pTF#ZA>3zuaUeemK2Wdea}#+47EmE8$Bxgq(>z%vN&=)49DkUg`Xt;;R%0|nJcE@(DC7R3k$5O=6l=Mh%112^t zZncsJv9Ln`K$?`>9T6^lSj5nS!8J#^tk7!8t+$w=GJnOa-B#F9HCv)GkcH`3y&)PP zCig1?APNvN>NHNv^ch9JMYoU{?0oPR5!9neJCYgndw2@v`^v3eNl_5gW;yry+ZPm? zRDtLa%-V1}Ue>vfcUBz+JyLhR8$u&x3R&s8GJ`c+RYjp|HSf@6Jgm3w!=x(3hQv8e zNfk0j*@!H|_tSenqxF&-RJo3==V&1El8~xI&Fnz#Wg>hIdNl_6Zj!@}R*3n1#V*Gb zvV^eID2*R=USj)g%R9V@#==v3#qV|kf*4b9dp?|n$RP64rnKujwa;8HCXy7`T!jZ;@d$xns9U+eAzj*^=$qwsQM zHJE?EKbY`fsnySL46ca3ABKeHQ`b=p0IAOS_5u$u^`EA8GvaFCSC~Eya@@6E105LE zvI4GfWN%T~FWPo981&XK~i&I~D@(Ha+9g*X(n{|{dOW3soPP>B~`)o`I6n(Ya z=!?Kw^iTbLyNLOVO}Me`*7m<#i+`==O{}mMN@GEbYttdIo)DO-s8qls_z_BR__Xm1 zo?&b%{FZ}8R9I^wtDM4cO)=!{`2DY+{Y0lxA|s6^O2&RVjBkN>r5B+pOnQ{DgqmAm^e(1$SY8 z{MQain;B*}$usEpKmrR)s$aMLek-tF{6|#!iSbLw**=p88vun1%>J#AVYwTp1l6Jm z8pzI2BD|o2mtac!f>HL|$WPRN{^p+-{#Pvgb3_CICLtJ|YYML2`4Cg*ha+YF#WR3^ zFM!^>lGve#k?~a@`Xq<|J(psycYN%~S7t08X*wV|lJ<17tvxwK_DHqU`CJ)S(kxd9 z@9-;&^XKd*&n@2UNId3#C#YdMR~tJX6NL~7)o@*EKn!%u@Rmq^_O<%R|mzms727zJIDxJNk=sP~c|1l;Cml030} z%9OgL)1_2LF-zsRTsHK1(i!yR9i&^TQanu87xa0WgIUkk`(<^HJ)%qq2aRvBj-b8c zjI%~qkhr#@k1=fH`o8i}?WuRDTQ%8eE^w03w;da^z;vpb`?~#i7rZw}u;lZx?3@)8_TWuuT5AZ5O zj>cyl=VSUrBP@6>r|vR-`o*!U2>I(|dc)CSm%m(I?0|i(ph`Z^T&Y?X ziFY*%rL1e9qBdU>n~99d(LAI1TxmnVGk?8eA!2~H%hB}uz;wOV9jSM9oO`23iP(?Y zmm6qlWNlW!CRl0JiiH#cyD=@)w_QN7?_39%jvl)FeQ2d)tVM%Q*4wdga3Svstrm2hpC0rs26FsL zt+?%OWdsUhz|A!uqyg{0xfS6`oZ2O?wJwh z=pullaI-4zIatl(yPJ%d1hBq6=xlw_NCYI#H=e^f?kxFxddS9+S_ByD7p{^$S%%X*}ES;f%UWp*!5G z&Nwe$5=k}id5(NmQGw0z!hQL9dycOFXfFzC$?E>t+3w|6SYt#zC_VsLs)#{sj7fU1 zYu)DZJPT$8JS@>TjP?lYEzUtM8+`e`$IsSwF2{QaMLJv9U&C9NRvVXQOW4iJ+=ZVW z7rdr*s#KA1m_AH6LynW2Nrl^5v-mERo&ei`-22m3b>gF#k5zI7b{!p`WB2IezTRDc zD|0}$-frTdF^w_Gw(V>duYR;QeM~cHvL%*mJ$c#JH&g>u0PYS76f0DJIPTkf$4R1BOT7H6b}S6aq@JyPvG@#D%@+8P6?c1+Cx1B<5PUH+0sm|A|i`6a!O9v$1H zgOPCxrM9yEm;zVah(8t;@n;HgOvh)`5W=zdoo;0-{o=j=8QqlJf$KB}#b9 zozLz>=XK)p0vc+!KQg9eJ}|D6zdla3OiNj^Lrz&--*}F(UUuEvy!@^k+NYV)tEn2#3U57_*zbOfU=UO|zlA`7|w|dXL zJ+fPGLo)|(b;_%9MUhSap-TUWH|l|RY$#NL*9gG~55Pu*Yb;f$&t*jlCFtr{P=r?S zz~OkYA@Vo;w^d!i7NtNq7aeLtZtI(X{un=HTI@mh-^hIj-^7&P`d#+@VoUP11;D&u zn8`Oa$5!%3VlfXx&NsxY{q!i%%UF4fA-y|pBv|-|&BwEA-@%NB%WGKA#tpKZed>*P z7ctt?A=Bs*qk%?fLh-XoLX}8*jbpUse)r*JJkYV^JU+U8{yp>_$8BXaElG>- z?;N}n2qhSk|H*XJGciQqy8Nj9cl!r_%o1S$n_9PNCX14+Si(375FN5v@ugn zfe&%Ez?*Lv0y7>fK2flG~wQaP2z{*@3vrwm#J zuY~X(VVRY_Y=o^?7t4*Gxi&pv#b>`B=Ke{00@0 zs|z;!vT)H9n(sn_k*B80Cq%RPQFn8QqPr2zdPdE~Crb^IF@+;?0Ukjitr-W#PJ^!I z)a}{J-3-s%knM|h6*zzG!q40Fff;nFGl*aybMP1_?DS));X-tHBTMCrgvH6*8op zLWt+PH{KJUmg1=t6!R1i?*Q^F!hdARe!8mBtuaY1&=oOmaSHl|L83$wa-L`O$vezt zulCzjiT$#66?!FL?*1y8_=8wyyN{ul%H;T<@tR?)_4y7egf9BzD}5*V%hjLik8;cn zV#IEIw=hci1pa7fVVH>fd4V-khvik!<*7B(2G*UeYB%Q9@#2^xUzss%!e0~;c*O6f zvz~*&l$sku#O24X^%h-ml_q!i6Yh=sNW!W}{5ih!zP}oza2*|S8SIaAdpY?j^S)M9 z{Dk=)Ti0%%#)k|Ey4UrD^w3ei2dl*O7kkvgL4V2etuj`X|9Ss(=>~iDXg2T#tOV9a z2hj=Cve#DkH*vZwaJD4Up_!hN2Hr~;zLx~_AewEg`B*X`=7J7MbrqQGoe-2as$6yrXgc4#|MxP<@>y%hmsh;V5 zpA9Y@0taO^I-WL%w+SIeMw9LQtjz0o^0cvnhAVYdOx39@NU4N2Xg2Srikpwky9uXW zi9AwfsamYIO_1XM$bE&VK&8%}vtFl!Jm^>XHez_<(r3<=ih_V|7!5}4S>bbAw%ZHPKg>A(d|N$)VrZ=xAK@+2t^x(e8Qh!7A$b2mJOfZ3ottxKtapOyN(g`xy?9!ZhvBQj z8#W&MvsP|m@{|>?>%|^0kR;P|-7%K_^1AbMtH7G3CjytC(AoG7V<&op{^hu3RWDcd z+iW1mreS58RnO1!#PX|Y;o}J&FNohMI1%)>atAGP(F5^QNMCz#pvrfzh2OQ8L8`sc zMLVN$efOAWEJgCK(1#qqhav-iq-)&!z>Elm!&6uOE_dto7S|%L+s_2YxmO{f1Mdei zT6z6*g#hfVCy$>fIAq3RR3DovE2FAGvdQrRhq&I==*HzKzwNN?VKR(cCN z(V*$O>E7cSQc4@8KSD z1@1-#_VpEdp^eqHS7BLJ`(f*<_#cKv^!240hYDl9HR_jsVTLykdriLxB50DG+)fHO z=V7P|ff_NC&-+O~H_;C8FP7Ch+Bn z2hg$nQb@%G8cNoFDFKoqMC&y-8>tnRccUlk@7Ga`P{ zn>)Da@65?Tv&fZ2yuu?$`R(}j=z|~3;~lRTZ>FI8@UcA^y=E$D^aH=8s+Y8W*V49- z|9L|!9OqK7Pdd_k&gyp$nfLElJ>cV$AlL-{tdIM3`VDdS!UD2(PXSUl+*=;DY`tks ze(TQEphv(Z-t#0j=EgsucSIQN_iexk+Q=Y335W~UPRlE8d4bWK1%L{5wEb7?#88zM zX!sESAXnc~ctWv?MtZTpeN`|xMk-h3Ghr!`B zzU=)KMZqw+-|qcwR0jb@E`%aRlJlBu{ON0_B}``-IF*@88P*gY`)lc41Sj7_IA*KD zr5Eu_vMH2PDXJ%C)<0~y{vSo;|HEqJBEOtqxKfQ#R18N=(j9X+3As51Rqu0PFL77wBeX6p~H!4N!}bi=XEus zfI%!L(`W_HdfqoGmLNQx+>l8r-L}yaBH$K6L!lh)U#k=vD80Mc10eVTksAx!sa;7VCo2lL z1K;ps$yI2!{P)YPEMN)`{2T_y*>oF9l?eGqtj_y#)agYt z>>+DYd{siw{;2N@H59QhTukC#qv_$K{!taohC5ntMcv^^fesa1EfcJmi6Q0FE<_~E zQw9t+>hAxZb*kWB33{M^`I$xp`F>@U%3zLUn~O7rpx0bl!ieoyxOZz+A6`YZsO!TfLZkHj0i zjd9%(J;=V~WazU!1GH0HvXMYlhe<-i2Ky&GE^PZS%~EweF;$0v`+YNFwk4mp4L978 zl@qI3h`ql(Y$mMQaF+BwPZv>My2jJCzb^Ji7%tcg6I{M|_fNKHGjFCwKWx4z?X?fp zskjti;Czrg*a~XctkxU~le(K%x}wd|6}ma{>?Ft>$B9IGxIW&**APz}nry4q`CCPn z0x~{28Ta>LC(l&~)>R?B}+EssLL^{=LU z*2)LTuflluO6qBVbb*+=qe&tGfC3d!B^ObzhX4Nr#8k|xP-$KHm7 zNl;)fi;ChbpZ@hDf3ad#(J(hc$2}{L>Naw*a&~Tbp5MU2kFJtFhACOTyfJ>)fpYDc z>h5PG(oRkUH2MBlUNLy` z-K{R4ZqzwJ`VA;o9o(fs;c!9|EtW_36DY$U)N@qPxB)k>=Z%Nq0#xuEJ4a6idJ}Xk zktyulCtyX^mIV4~NU)lU?wjw;!LbE{#RHGP3>N?$u9!p)l;5=xCucP^+ICKhoE4tU z+}3^r2hV!0C#HUTL$+s8`YE;Ok4-mQ)=NVvZYSOkY^32%fHkGw!_k6KxTrgXcZOl3 zS)PaY!`ax5D|WZapd$VHAWD~(Ve0|Fc-LY6w|0HIG0s~?>qVVRiRC`bpzW`E^}8h} zsDtJM7#HfI-zez3q+^KTisMT)aIu&Y_ui9!K*Tc2VP?etv57?+#ksYdCVW(;o zy8;yD<^~B$L|h*VzZOx%{pDih*(xImGGy2vmczWNpt>Ikb~6<hKUEfq zh97ND7q)95e$bLBL#gIdwVd#I(qd$2x=o6dpIY}W)_Jn;9=LR-anCGmO5GQWu>IJiS~7Fkl_jR#(A zhq3@(S-VXSi6=?{9tXrm$MpfmlNw#buiPge#8HWM3!(x|^J>f5CPCYonW z-9BKZ5Ks-8%og4zy}w1OMR872 zrOvuVY~iNBNlWIpH@-1BqWda&LzC!wvXx{eF9)t z!SY3P(V*MGK27k<8y~a1t>uV4AFe+YUcP`$iKrOwN1Wh}>&DOW0jy6h9M8NPi^63r za4&X?b!ZmTJx=;xIn*9f(n>v&I%Ige=ivT^lLuq%y@*rlGQOu)WVtSiIC|~o6Ca7kpr}!-Sb(+W8@cv&?kq?3fJXKE6uycwszP7eqyO1gez)Z{ z9{Z(+k2hoc4Q7jQ96uf_lBwd`7QVpGbtSPGSDM+ZH#N=|6!TM(rbyZYWIct~LIz)6A9{^t@oh_G&0HA@ffOZP-`Z&Lz&sY5Lu2pPdb6Z^x4H}DFAb@O{SCpx-x!_rHN<*0g{uN>tys?Pj$@bLZJ02kd8Af6U4h-9`q>r!Bqo z3J;dc+qqsJ60Bv5tWiQJ)ob4N%4t_$f(~b^jSZB91w!4=Bd=T^FD5P+-&q+E=!nJz z?&rly`U@uWqrk%29&1iyY?od4=aqD;!^FcAL?`n*YLL)k?m{eT%+2D0@H!R4dS6v6 z383Q5nT)BSEm5}3>fa_aXsBm35gh*9sx>-2W&yXUd+XFQq^Fco&%UYRYm4j`YhLq- zToou9jGJ*UTC$w{?F5a0YBm_y52t}nOgrDGx0r~*upEl}Z4E-8#tc3gQz|b?Wz42h zI>TkNFw$m>_4XSXHo%>#-{FmVyv`R5 zVoQc`PbKGRmqv;FCHwqasI@NA3~lc4j`ga}M7os%0%i+$%fjBHN&&T1eMFU`}Crlg#p%ce{RYlVgOKiw(v?SL?=H0_ZNbal7 z&IaF`*``tCr2o2#ghq_5V{Bn1fOnDF?q&;dR%2Y8|}Nu1R`ri>hAp zrjGT-co~yC0G*JH+OBe!hUjg7h{i|g@@ji0GjFTX*6_y$`{{T(bS9PCU@kC&C#o%J zn_`+^Vg_Cu$K=V!KfY=p4#!)+{0O+<-DetLtvhVPg4dOC9QyE^1u=80SLg=Sf{OtV z0phI}WIu-1RWJYI>@^`#7kW|=oYVv#+!`o@I^|;Qmz!KL;8gPAwo9fR(FRrX|KpF7t_Q&GvYZ}U zQt&S5fhG5~I?ao`U3wbiQ}ITwf<K-Ka^R(5}@<~UrvZ=3+ZeognQ+C$W?VERDQDq_yi|9NB)Tnmqzd^8~c&h1yT%wXREnQhv^{%R zlI79Y$|XowoiO$01`LQ(F{C&9uz?ewbDxiwt}@H&Csjt1*{at;@`;yzz7K(qi%f@| zH$L}DHHLS8(;d+jpvj%R8?V-Dmh%|1e`0&3IKU&O<84D#5TF3Ur(EOx?3Z6`uiEaQ z)ICAi?x=~LN9LGjUgI6^c1SyQ@}6VnB52^>jO+@qmEq@dimemAq`-zKe*cZ1 zlu%`i7-Td8Cq+8QIkcAvq2&gAb7t_AVKh1CCNRQL`&y9ab33tVk6uo{(Lb?(S%})J z!yPD{ZU~Hy9q={1r5-(FA0XNOd}uI1-_>82SG}P^Y;EpOMAFbra^D!&V4J7sA(fvE zKu?;1}hV1RdDg?!y zOzO(Jhzg8=eHe@pwBu0H8JB~gZioRPWYzpq2PC!e%lVx{nj5V_@rKwFzq5bBB|;>S z0}GeY3KPP>-N~#*dGO+sTR$g|_i}1Jc_{AOScepaDNj{HjLhe~;y*=gBFTaIr5~|Iw$*%o z*3;)k)X%(;iQ0^fEo_1LK6z;Lw}XNjXk zr%Jj#rT?BC($UFaD8tSG(P-{&m5z0N4o z9{(LPb6eRPgK{d9D|iT)Wp(K7dFIvKn{o<*U+@Kfcvc? z(8Z>Q40~=PiA-_hqxE2v1^i}?3s?S^J1&Ir|HCDu@rFC5Zd3csUqR$?vc!SLVH}Mk zk7+v}C>!iA#H>Sh47_xbZ`ghX)5xXk^CVx6YvPc-C_L7PFDO8 zYFtW$YpFR?>rXObR#>%yj-D}vMo)KM9wFG17ve8^bC_BWZqDTQPnvhm2?nIH*J`6d zQsGjO$&7{7qRx^o&kdGjZ?wNC3Dxh2foi4WkDaRelX`<_!fG@-r9tr$a16f?BADiO zZRe_rAU|}N4WNY~9olxNEQNNd>TbnF81R8lzQYW7wZYhmG(g%yyNewA{Ge;fbQ-57 z>zOhFj^gb)OGR0}pdx58+qA$UFALcSz$t z67S!gbZY*P0z<_`h1Q=}bbneU_sPUe6{8bQ_l7ETY&C^N&N#*Q11Kb_ zv+*>PX~`S342QZDt&Xba7`9NYkWE?Ra{Q$KWLIYFa$jKen&rT)_4}_Z;bwE)^CbDY z5~gpMWTLCt`{i8%zgk88B5#9p0`=N0wQP~2t=Y6=q)C292Om4OJ%%?3h8K)aUO@kT z6VC>JgU!*dRt@3(dT>a~H_$(Pj{DE66zT(>kf3?`gG(T zXVvnybwhn`P-!=zUa+oLaP4n^M^L_dT#Xssu>KY#0(792#j{lvv z%HcSX-sh6y%bIK+13niTtNdJK!M$iZCADm-CtdJBFYg*-s^|sox{QsW`(YM|wzu^& zWREFPL8LE)4;ynCU54r!M#!QseYq=HEU}j3f)qxv6+09i{YU9jZ_r>Xo$UrzI1g8_}1Vxq@i!-M>020r^ zT0UD(Z-ax;TT?c}mK;{pn|B8%rb`XYCAW`!myUNp?2RKK$Y^%@;882>YfG1qV1?`7 zu_L3fB^a;oN>B`Sr?BcHs`uI_;MCuNXqmkLmEFi#lIzQ}F=R`vA1ziN&D%?4F?-mE|_q_TCbUlyQ$pDG-eNKr=1Gp)kXJ< zj|YNUDprs4W?pf{FALx6M^Tn68yVNXUFB;kzHSRF;(|1r|0f^I^W3eyq9R z>>n0i*BoY+DLL8Bd5A*)raN3Vh?y47hDZ`mh%~wV>^%~294pdh$*y5`TAuz+W?3WK ztd*`jmuLLooiI3Q4UZ^qESMw`H^Ucn9(hsM$=XM!5|Hoq?I~TA6o7Xm&&g>1<2<+c z6Lkps7=vb#QIl5ns&Lp>$I+6@p9KN9ID;lN z$1k3XvTSdKAAz09X`v~PMX!>T2T)&6)3*V%XsX`dS3TAtb01(-=VZ2fOapB7OLeDj zjnLv{_d@TJ(IOLw$kW=N&4RAVGc|j3->@7pZ&L*UUH*Y}N2;#X_O5)g-aIIwv7I`> z!CSSL-EWg6o57{MT%jZn+|G{O_-V8|?VJ|s`@#5GliPG9=Dfr+)e`^cf*E}E8h=Mq zLGB0T%X?!!=B%B<7fRJNo1}aD>&-8_PI9MfPRlca&hAv%Dm}=5{kM8zAyh0P0niFMun!^$jfo_1>AT99@0Gor z>p%%Ex)uo-gyW7tHrq_nneO4)(ebKwMt0zJXhfA=sSF6PR4m(8B}Kg=HKipAv(#N8CWq0McTi*8Si({;%g+ zWt2d&noBIxY-rMx5!J0ep5A>Y51_GAEZXxfHM*6>$n(IEADYPTii zOx1`Dw5__B5=yM9jzi8G_txF^mqwTluRMMLy;;QxNi-+r!Yb>fNB;BE(t6``@i>Cr z`lH{*mo`O5YS08bsn2rBDLi6n_1-ix6Hi3Hwz5HUv4SU4BQUftHP}!RxMdaW}o z36lV;mPn2F8}mRjeEIy?Ivii;-n$|4B=lhs$wk3TFj-`Cj?ck+_Gz+eX5=*3EEytd ze^qbQ=@~nTmNCq_|`gmB#GtTd_6ZRe19%%^*p9ux&*#( z&prRL&#~Z$_^CbCeX($tTGO-1ZZfbaw)&9%PD|XMF%}z%U~(Y!1QaY<*%x5)Qoo++A2<+08w* zjp4bLn|Hf!HGxoh9`!Sb#qtc<;zyQH+n=@x;o_l$Vg`#HK-I(qv_g3{NV$@Kfegm@ zCdV64U?1nzFTz3n|JFP+DnZ6%)~#3^K?zy>j46aKw$b= z`XR;5bIJI&-T|DHJHzgaAX}zzcMTeIv*|V8I}0q`q(u4Okx3ObkRR?$kpMH9ve>@k z>g4l8R;O6uc^HKtTH^jw$A?`6rq#S?@>cS&*VSG>T(wK2gX@vo0!$-57_daD70u~l7Kfh334jk@dClcNk9n6%8xvphd zL2a)N+>>z5&!Od7!sR+QjVqPPNKPpMF|QqVUGJOR_DiBv^9GE=FjdeCGlVXO%d00b zb5r2;n3*A-u(|M0i}92aKKNl(L=}R;P75QK|2$mmZq|2iOJTo41+lqF_A&d#;{_EC> zs6Cenz+J04wGGt4e7Yuqj%Q9EAGue|PrQ3-XzXM~b8>2*3+uYQ>96S)Dqh|&kj^@t z&k-{MOm^As-8OOl`Fo%}0|o>$C8k2|c2n4u+&>J6w_6`ko5!6;%2$oq`miEGOR z7s!9XZhxq1dL)Ew5mnYEt9HXrUv(VneDSOpV7?TToWh!Y5SI;Xv4=PG?TmbmmYy1q z2r-wQoJ%;rnCO-*hOrTxnwi!?1gO~2-fy#Ck?b!tmvV5dzWrjb7BK4}DUsq90BNQE zJioWzxi1`Hu%>t~bFZjW6uNEp-#&0H!YE!1131nBrWW?g^Xny~f@hMrI<$+^;;;4e z6}1Q#NNdWx4sTJ@PiFi637tB9J&U8>2?mcDR54WZg5L`sEl;+G)<5jBZ7j|a503{O zUo@JWZib;(i0F#fj|^!PGcyHx1S)Q6mZ`=7QpZZ=%H>l;Ia~aiDx`jFhWok8sflOw zapm)|amPeYfR=2C{{!0^_P1JdL6)>;A>rxyK?@IESg&M7IVRXl)WF5Cwl^QNhsVA4 zNWj`y{eJN%{s+1H4W4f*b) zh5PB3Lgv6ayM33yVg_@cSeJbjk*6(U0&QDvN7R#LZX;l+IXq;d%S$5Q({kBFhk}en zOv!vC-E?K2$Vfhttq`&$*dmEUeINOyWk9`os{6Ql77juB$i~cMhI>e$#A(Bj2XjJa%{^{YY0}w>ZU^ z)@UoD0o4e4yhA-n!)w_@?r|WtovWx{xh)>d6@0^wgFa&5*cr-*3j8xze{-uxqfB_W z!)n?&WZqG|GCPvMUlr;)ot#xC>Age>3`^s6r1lp@j-f6ccn}E(wBIQCOc_JARn6=F zE|~YabrLFo8(Omsha!44UwV9hGJ3e2?)PA;Hb2~``m8M2KH9E zW}NTu6gLyjN7iC@AUk|*;viUSmHWtdZ;O>m>Knczz-}}lV>{Y=bl0=4DRTL`RwEtn zQ1w9DR^-!yeniGWRi%VRjr@NltRB(YpKllbwZY}UN^XHsIc9eJTPXm*jd zRW<=HP}}(vQL!;b0fGPT{GaT;e@W-%&=jNoQRC! zu4ea@o9iBrr}3gUb0_Mxs*lwU0egA5%VG+qR%5#r$wnA=-u;{ODFrqaY||Ibn;Cqc zN4@dhocgL)WmG8BxsESF57EtgJNwfy9AbJNdmC{P+f^smyx$^qCSnPh-L!HBO|ELN zw>78E#&$-w?YZt)P00*~A8$lFG9>Q+DdYZ|9`+yKSECXUY`G+jHU{GaySS3N(LbX_$TdUtbg}ZKt z7YFp)wo$Sp@~%m4;IH4#WrAIL%U@f{wCR;Hg(I(zuXMcz8`~5!`Hd2>PuUCx^4-e9 zg4+#SIfrdm@84WLKcLSzR}zyWT0p(WOv_>#25rw5B-?2qmnk;sL%s*@Xpbg$>md-o zf{+Ny9{NZ~yWPGFpoDM}@t=$(55urM=c%oc%qpKf)%7q2d5NbQ%R}Y6l72a}md;J! z|AG@?&~>Y|ihY2qqLztO>ysWs>_*BHCa3n$yVC>9?>k(9`X1_2!kUg;Y78!M z1s{HW`}c{j$FNTT?!0?Ul2G@!Orw;%H9XsCzGnBvv=sQHPRMMVG{KvH>6rjCo!B@0 z^53;iC#|m$VQMzlc={7hD|DnB<=M#=h0=lwLCyC5t5>F5NMM?A?y3|tdz1znTGtd{ z!m-4%^*6Y@$nI{U{;rX+*B-ZchH$RuKD^TF>X4O2Zfu#?O8s% zIJ^52EJCx95kGNx2wSdwz-B@Qh3c64d(kMVaB02>BZF3Ow1o=I+NKGDrS>HG(9&(#`MC*K-Q{Sc-C z0gP|70suHs4dn2Rx-!d0+z82{Wz8QMr$T!F>+4?UZDUPvO@&^Y8-qJWKbdaA7g5x$ zbVrXe*Qp?0;|yLsa(y&co>hn;*?g&ygkE<4bINc;Tzl??01s?*Fu+6$XX! ziSqp#c_CIVcbUz91sGeY{K*8aROeHiX0YdO3a$))-CRy*4s{t(A+=g{-x2hfB?0ou zjLPewi@3)uKHntE(Ui*P-prb&;#~hQhfmF;=!l;bYb5wIhZ9sj7JgbX;eM>&{mlvx zJWHSM->4^b|3sb(YIlP{ub#`%?P6B=Tp1}8f2U-8EZ1NBFj-^1%j%xJ)L4!?4A0|z zFl2dvw>Clei^rjvIb^6y2b}uXf}>5VoPO4QDo$e=Oe{~ZEoFEvfb6Kt>bTfOy(xUg zsFe1oLVI)?NBz;Xm!^)b>p}o!P+i|`0gt_$&moiJ3 zs6ADBcHp}^v8+9XCxEXa{&qbGMer@)G}yz6XYTkMC-UdP>H8YfEYNyWtT?St}iX_AHrb+`cADvjX zz8BFDB$>Rjz*t-p=c8mP5@ucse1_mBm_0oL(F3JUJzo!I_f|b$`R|)h;-h85BV#n` z2F<&uITR`;svGG@8vJPaw2yYb8P<7_;g<6VTWKwxCs;pUxw=jNH>@7pwkiHu$L*Q@*Vz(r~UBZbN8Nv&r&ns@zjKj zdcgai#iCep!1oTCIEd zy^NfZVP62=5Bm1zB zHofw_0&%waf7_;;z=072^^3r3lYC!Xtnvr_6Yo}zuK^$A{jT@T#Y}1)AQt_)(FmLU z2(1RNUFY+^$PnM_3O7Yv!sY8L%xXD}Vqfu|Lbbj&ghCJs^O|NQcs-){`+_CbTsF7E zN**2DTO?c!+WxuU9t@PsFu)iBeuMPZ5sK+Rl0w=-PJ(TJY zP`2xu{wSgw(^n5SlVb24Kb+IPRtSy%fEQfY;FX8EkM;{#$rs6qm#WJbR|zpVRv9AL zYIs`8IxJ&H3HUI-&LQ zoIN-q9c8|Ddm20^M9z5rzJnzQN~oLp)qUwJ;)Q{;A9Yqj6#_Hh{t?L%e|0Ir(cm3f zTnaFROTW})Je(xHSa0v9cN|BD%Lvw64^@W+T&Vx{Q`h+M<|a$^QEV;kqa$sFe^OqD zx9c=*t^aPCI|+n}f9o67Jm5ldyHeyeNtFa;x8uSJ+7e(6?CCwt4$RUxd3WrZUQl-=S9+k_GZfW`O(`HY8R~2bsD2H1;MfC0Jsmb7rTK4fVG4eZlDQzKNEwhDBPeI zM7~#kdn+s%n~sYTB+zWXE(WL(asU&8LW=9BPb@S)h6%lnr|c)N@MLlf`OW9j=NKSz znW4S>%nrpk^ZO@g%)3K3z2qu6=C~GSIldcyCt0hXUt&edIZX>{z)|-!j%$KFhR3)? zhM_VnkzMzwc4QHCZ0e|2e3qj>D4C&NJ3`qYjhq7bR8|5tAWByjv@0ym*Y6v6F!Nar zi|rB=FgQF7MsqEkF*mYHWh#N9EKU^U_mf1?7&oQ5?vAa0{*y{ z*6+gHP&%K(FHYy`p1bf+0ucWv)gvk` zW$EP)76+OQ<`2s8_N+`lZs&IZT5ZIUs*8+2C2Ue##j|edOe&Hv7jMWh4*+^21IBsI zU7qm~09T9{sJ~J&s+aSpyKh~(2}P9^!cJL+e0x~6B*&wcaR(t-|QMeV@Nl_z!8Np3NznTmt1-Ac_ zJ=k0PktORKguK<#wZ|hG{_ZQcQzd_NMVBqdWMC(Qx64waZ)`FrS8r}Lb_{~Szgg*% zif6}vzUfaaMSt()GKytBqVUU4VuWDLKL6Dabo#&73(a%< zBTWU@XNY2bySsA@M8X|K(+~rBaS<$s$`vAGr1iALJD8%r<~R!kf-u0i+4oAo!tyf% zv}*Y@6naE}rEKQn`g`LUEZ;OIwM79*8cFi`Wjm$LNcGIX%vh+DE{*i&b{PmYXrp4z zl`Uijafo`ypIRl1i}#f2)em<1<-WQe-a(y_(rt|YDyGY0v5qZ~?V6!krQe8S^tc;8 zPw;hvMsKJEdh#Wpv*a<~Vkh?soyn^&45Of@Pnsc6H?BXMm57vO>DA7wP#>z4S5vqmzk9d-LSB`Cv@>ZO#r%rAGu-moXI{jF3qZ0qYW1Ee4^9l+}oK?xj#8!IIn3qD$_RH};g3~(SB09?^ zbcgQUM^UK>%K2R5)e3CI^wl}U7>86>;2VWf`Gb( z#+9FlO6kJKT(6NuPW!VV4o3Va&pL#hvfZkI)GWBctrT5@YWZPP2`o!xj<1K!9mg{F z^EF8n{q|2<`pT7ma$Wrrh;kec2{|Y2zTHxwC`>n*X1Ba_I+(e8rInUb3-# zvwv6N#{NTP+>NI#;K1n2&y^b01U*~j-NNhyHhHVqveMC{ityPa4*j8_4Y&2^ct462 z113xGKY3#{5UM#S6w>aXq911XPmlliWUoNQy8Bde4tQQeqPdGM>I}xWxrcW#nRaA>Z z>LJ{@%#-I#w3QI5M4BT;TKPB}`AIP2lYyo_L|#fV1ZD9i^Edcq*SBhS^n$Zc4&i8n&?KU z7ey;WhJT;EMs7 z2WLYpxhJcpZq#31!J)kW-#*?l{t)h^a*OKQ^A}Di54g=4~2h0Y;x#S_QF1I|EIop)|||?--evT?61a7dBFZ^ z`Z6d5Qxsq>rqlH5PCRZ{d8StTg~13@epd1vovU3zUThu3(-!+@lFeE#7X1urHjF^J zy|W?*BjQ(rmZMDSwY{hTCxUYKR1KL!jFmm_(|SOLlN4T;VV0{%y@-hA8dOm0geRVc z3d7E&lfs^}R2J`ZXxs7k zX3J+cij#|sYd+FX*c7c9x^7$v_W2yroEdt|q(9N=xk^dK+C4*I zEb!4>!5TG_+s%tJCcO4NY%TZtaq;;CFVN#|Elyo zTDWa!*vNEBZ0U1LJJ2fsMlyDCV_ZLjIA5`U?EW2T?qGY+Jdt|;5#a1*U3{?=3V=f6 zT*eZ~sE!SM{0rx4eLAZjl&mM|U9HLD95$w4Nt5}~zeeMURD4&xt=#+s?ALz4JeEb4 zY%Qy7UBX(&=e)_v%w0JDl8niR(LUVT>=w`a`mFAf;~ude74O=2Iz;V$TT0_9^WJs# zj}ULk)9W_&wY=l4ichYyZxVNwVKkU6{R8#BLHmrgu zBA^?EO?QieN>i%TfC`8-8z3D8LJhsQh^VM^kzRtJ6e$4$2`v;0p?3%nLQpy(1V};) z3E%R3?-|b-&)LuOy}!S4{xHJI8d+=I^Pcyb_q?uoO@U78qF~{tP}&BDBB^G(9qN=Z%&QJ7*Sl>6HLmT0Tm?k3EZeJh-W{< z1eU;4x$LZo?vJCQlXAr^5|Ek^?}i-`)t5D@JGV!$I#8KF!acc`u%S~a)uNXu>aaMn z)Gw6;)~8v@ji)mip2oyc!N)P25%(0tD#QBb`%Mz1(Y>6%zQur~vyL*nuT=N`Lazt3 zvb-^ME?+S22rvT=C^tst$ww_{^m39LXTF|iv;=(jGwDfP>>%B}Y}-1x!gIrLJc!W6 zG?prE&~Gw?p^xWQW+dkRu@K$C!et(-V-6h4M_+GP_9ue8!>pM_6fH!+yhQn{J^!gy2!-L9s?aeOd@PieA1G8@B* z;km?9(I0o32%5b*q{reuG`ko4LS6o0tEU7F|xq9+}`A?j24t%d2EGY_cx`PXKUvDs3RfTAd6yZGW_ z(J_32VquL&-jDLx*^~5bQc5a#&o^t%@G8Qj0aX6O3iDCKi_pR-Xx|JCzv_a_lv_Nz zvCf^Bs}@9&|0_{IMe14AYnz1lY~`NuKC4e}R2E$|_!aAD-$VP>Zrm_qbO|uKB<4OJ z@yB+&!Jr5p=3B{yZZHBb4Na93~k*1;Fu$ZsKIwN%e+P9cGW8( zDEk=ozX0$zwE%v(H<7W)`hC(B@s0S?qm=jw|BA#YM}O<%Jn^$86JyCexq0A`nC;%@ z$N{8DFj;?;QdJHOdxZQ-B2;57*R8> zd(DXYGUD-Q)5<6ffHA#c-fD}Lv24CW1rH7{iYIM3^<)uumX}7wo!LAeGkgzXn9ebM zR>*Gkl#iycbwEv4pX{g4Ja~(rUQxatEgWjo_!Q4Z;SVl^=HBnNrZ~@MMWi%T;_X{R zC(vPuLAk!a-k$H}?8i7(UEYk(OQ!gLsf^;n%$d~mt8A8^$0uMj-1`8o-Mw~)#N@b0 zZil604?UYh0BuWofjOrDb1=|3-D@x&B-=H`{XQViWHE?0Q1}NuD{kQ96tiwItS)|0 zevFqQ42x7Y{c0_^Ow-nFS&BvVO@=f(T01+9V;CMybL3XEyCORIA?$uoeVSv$P6hLA zxWx8$Mzx&(1VtoK(@5V7JYJBtA5k5-D)dN zb@-)i9#*UmS0mGS?GWt@!UXCf+Z~2^{1Z=BF1{$2cGb7FHy)nxy%=zV^VsG|@BX)X zZ+*^a9f|s8e&P3FY2)nxql*xG0aoDP(f|I3S$53zYSLku!GN!r_ZwDf^(KW+hPqgp zNVs%F#X<5J5ebPrQe!;Xc)mS{pT}|SF^3_;>9y$da*8G~ZX?m(IG`y*6o|u;45OfZ zDfex|7K~cEIdFA<9ht=Dv;4l?h0J3)e(y{5ZT@b7{O2*PU&n@E#aY2k;B9|1esPNU-l^wu47=x41I3G9Vc7yYx(aCbQZs^DkEx#NycpH6SUrb1cjZD) zFA}#iByrHNET+qG?k-8JlaVDTH#W* zNGbeD)O2{td}p$l4K(zE_m$&F5BxP7&*sZEJnzoQToSHyfmMPuep^S(bhZLTNCnV3 zkPXFaZCL-^dFl86?{~nc-F^Jr&$z(XFy?P!+<)H9NypqH+MO2827M>*oa+Pv-CBz%XRMKZ*GdP46}|`5Y8waX&7J$GC+q0*x#D1;>lq4z*nX|fb1gq<>vLTKCJg{ zd`kU2FA^R{>8C{A!%|~q-6XKK_#3|;;2)Pt;y>E2k~!pH`QPWxzs{!%?yM(o^$VE0 z>0J1tMe*zBWfXpwsDd6wx{mCt@44dwdFpemu9>N8PvsFTyFbXBw>ut}dM*msKN`&S z6^8_zmo`(l8UV)LOHkxb%+8DmC*)~7tg_cGwMBmc6p60| zFqFBSr(d73_PUEtM*FC+afJ+f|JfY;> z|J9uTeJ}G*JL@%SSyDHXTh7&r{+s*$s|o(@et}~T#kJ1(c9&$H{rBC{Kd89ghW%%9{a<+Rf1UDglWWoZNyz^l!udpP~M@*TjD&*MDA-f3vsvJMa3BJN@Ss`M<58|9Lz8o!9)2 z$Nu9^|8b}PKe|(rq?6w>-G9UtG3d4#beL0r4&k%g*fpRUfcdQjt#IZjE3@gC71A^H zvO&6j?o{0+=l+~So0Dk=Re$X65TFY{k&Qw1uOFZMOW((s;#>^J*`@4SZUvHO#7w{B zd!jLjXKO}D+o|?TrH5^BGy#YL|`?qhIrVz+7`Z4sId42az5)Gm0nJ`+O#c_ zB(RVeuXyd7{DmrK0!Yr4shf#@mfdSdNf*i`UMaQQ|8pg{WAkCH*81tu?L)|ioAAEX{wcc;oq#0%tI1InS|Rhh}^-a`eT1$4D&aO{1Q zt*|S8Yg#PC$3^Yfr16EBh{w@{BIZFXyF!+Pyfah049Jx}TFsTJGp_ud`AJGKsg%|e zP8D<26c|;2?8CQ6%7m_Wre%&l-kH`oV2rQY)V%y4V`XXV6`qyjv$*o`E31Z%WC}D- zoM3#=FSsBj&s-^1-qs@k=!5l8b;<#n=mjS%KM?z5ncB_Va11yd?)FA#qSfxy{D3UJ ziSXfadvvyvS8}qL-f_i-Tdz*}>ckjC@4pJ8EWGq`+?SPq!RFJ<^=o6sFi+03g|Qt5 zZ+g7)aCon=Y$WmA@Dhuk#&v=<--NF-TmRtOP}*W;=kh_p2K_=_n2PwMpbr4E2jW$`LLM78tP~MH z-~V`<&zm}I0PkEjCv2Ry%5s>x&5aNG9s&-Ce&j<+AL}_|!iX6OkwDuX_>pimreBCT_d?6ZM9{0^& zTboJ*v(8+;R24}VX>g^U-h0+Hp0tAP{K47%_RLG6Utg{MHcJEeiG|3^=0K7v|IW%1 z{~zlv$Ko3OS1yHY38}PS+LW1XqzQ&|bG}y_)$SCKdTNj$)Wwle8vw>&zYVQmK{7uCc70JXbp&|%`2+svX#dBXe69`|1d|kKn#2i^B=vcSTlFcs(^f3G7OBn`2I@j*s!t4fV( z@~?a5c9oEmj;Y9VYj9ou~%B=QI=#kfP2om;m`rrKjXW+JvVdzoR?K1byM7EUw={7dRbbxDGw@@ITd94cr+SU8NRSxa;aVkw>%_=6rzXSCKY%kOWt%tNH#5i8 zv=R84fb1Rq1@s~P?$%O|?0^RS)8jHTMVB1MmOY<#@es(kCA>T39^a*tDk=5-*gL-U z5k}{{aLBc3$pJ&#pZYlw;UC3hPVS}fyMJZ7Ks;8b(%>(S-AI-XQ72j@-c~wdk?t{H zJLXF`K4v(+ytb3;dkvd2Ww*OFAm{$A-yZ?-x%Kp_xdL7Mj6SOEAKBr54?vF|OvY&>`q`!$LDi=taXJ3S2rlWeg%(lfAar8V)O7nRvT$>mj~X8~qHX-53iD z8^MZIAM6vQR(wYw+EE`Gg)phIqO~_eDL-yU(0f`U=+XPm)IKYR8A?sWYYr_gbMw}t zCfy?@+=>)DpQra|qy)B-U!ggaR?czmWY&XI1ZvnC`(z6Pey;yU9inl6Rq)034g5f4 z-o8PaLP22PEXgS^<>$@m(?Co6RL|DT8xG+52aHI8S%n{t)<}Ty%Z8*>g$XOJni81t zNm@B~1hRz_(%(u2HIIyz`S}i({06y~86Sh?#~kmYmg?2kn|JOj{B@b4{adnwTa{Rh|PR}#L- zTqL~SuJMRt#4YXQudfcqS00(E2Cc|sNoV@*avbbp#IJhOgURH^WDAPQ#Rso!!nk)K zBTC?l?yr? zBBa)0u^UmZ+=Ez;UkHLcG1hF_e7slc%(D{Y8vp&8)3v`{FwS%$k6GlgPo|ED7K)G$ zt8hIWgI29Rh2=`^`ef+!e(w90^}%n|H8)&WcJ9LRH$$R-Ms4g zP&<`EeKFa&%}Sf5JM!q3?ZrRgZwZD6#;fBR7BURND|W@bRP4-$WZ4!W1qi~gKaFBk zG&k3sE^krl`v&Y}TV{KJY%6(v|FgNkyI5f+CUg8Xq>J94l9y)=YDV)2?6i0ue58@8iW+=;Dh)t4cQx%lYaD)L;EdF~RgO8T8LiJ$@-$ z=izX0aT7*-d!9(|7h4iW>jZfILO3D;t2I$_u4>?8V;>+dalS0ZWn!hC_aCJb^_>lk1Fhc{^qL~ASjX~7az7e`-CdHEtq zv1)=-Yuw}6?bqs8Qzdhk2TareZB|*T zR~EQm0iA3x+}*eOji4c%k^;V9ajwQ^wrXAFKlv@WUsU?ZmvULDwpWgS(;qq%Az|&q zk}e5*vI*J@rh9Wy4P^7RH~6f*BlnL|wP(+8JTCQpzbv}YDt5mhxVl7n^dRWcli|ax zwlH$UtZWUKRdi$GTft;Ir1Vi!+UdwIt+nK&z=#rM!&Od~V%W??!dJ;-CtseOKpl!& zpd>c#d=@v2jp2{At<);L6*8Yj;bNpbm{t;A!Dk1qZ}NSFR6LAS7XH_`?q5Q1t(#G8 zvUh&IE~z#|lZaHlx^Cu@Htcw=LQnK4Z1R2iwj)y5LW2RUcJrbsrI*hy z0GL)mVu^{_5K_XyMxsmuDPq$PW$s~GjJn)wkaT=gP)~oZD}M;$%g?SUl$_w1SfzCYM|el*$oZV9nQ`QIQ|ND6Ef( z`i8FPno8r|S%|AMx*S$-OS#;0C(#{;gqTciYNpcN6tIqvFx5mysYf+%Mxk`rmzWi$ zPfJ;cq56Ik>8@;evxfnU)HTvW;s_Dr_`&g}i*U7O?5cCic}eqqBhLWa*!&}oYFb_y z9y3%ax>;IQv9%+%!0s=S+8Mfha{>y(nkinmHkqCi`hJKP#pT7%J%XGJbOR_DJsv{= zr9IiHpIxGE!!*KoTIR!BG=Rozj$UPrMnC+7?sja~kjRWb;Lc#w&NGZq?oV;i>-AxC zH^n<1Z4$z`I}`Amxe_TVb`UE$B*U@pDuQ@J#JxlN?~t$y528MRZzU8bXK_~7g~XAp z$Z<4Xy9V`*Z)VF>D1(+BuD&i$KAYc@R&lPcys$kKs9Q*TWKt@To~0MC)RiLPU*k_k z0WdN-k#WDs1a_6<(0XmGP%KsYQHNund#%b0TDJULjFIc)vHLAZoh0 z`}m&idTaEyalDUBx=fFc%_!n1Ih9+aiKo-pkC6TXiuwr`_H*vhZsKT{gHvw zVb*(FzW30ozMGf%bUD-fiSLTTGDAl9n;bw%Fep>U3~n)JR6s0xP{`)%gz5Qgxbkp| zD*w%KyIiG!w0`)+?y70cory0r4Bo3X_mXHl{V}hs?XNlwXv=|ZSlL*~HDP$Yp+dHW zOINvtOTWDzjvzql533BsJORI(pj;`qs8!fl6(Txj!pkS~X#nKKE@L!+qD=x7qPNOO)|MgO` zYYHphlxS9It*>eml#0F6cQ;2&Z&xpTu{%}X<;M2fr0|Uq_rW(O2))_Lb_&6hX(!fO z)z$)CV{q8QUNJqd>zOWi%taIV$qq}T$5Xwxd!YciW5JGcazuS^t5e>D`$J(O*P+9s z`hbF{Ntz*e`O8>YD5mMwt3RNR%h@zfhXmI5?n$4?-~Zkg>7(-9`mX$oJlVWIZ$8Nj zFR=Sg`_n{2HG%DEIHX1r%3NSQtS?~DcJ0b^15^fBopOA1=lqw%6xW94WP}w<{2QuM z6g)?-m%v1tLJ5rL9=ICm5-27iUH|jF^9w_IBQM7JWUY7=tO+h{v}}0d=Dso{FwNR; z?EFfHel6y$gxN-#U(a}LU|$}k$wj<*aBJ!PWoCnE3?Qd+Pjhe0&#TtXx%aeMJlkcX zOu0Vz>gXdP9gh@~$5aC?YxX@GBNbvP2gf-UDo`^wuq>_nm>Ph=aX0$WYR{N?(1&Bk zw{R9=@G`TCG|dPRS|b+ngv>1{zo?P9OABJsH6zv&h^n_FI@dOR>D#T%6pAt-TylHr zE^*9o*vRP2{U(m7OVWkZRYms&4g`Jx)~W@l{19P}Om2Q`M&a!SkpZt0BBqQ{%lpAw zT|m9t`)$x%xj3-@tX*4Q-!HRidQDvmDN}QuAimhN3%?A?vfs6X=B}XXd>42YF8a;g zMSz_p4uW^Byhsc9a6|-#tCbU!?Enu;Xgb(3cqS4HJ#c*&7jX!%`RPGWXz8P}GzE{~ zch*lUO@1|Wa0Gc6&reO*ohcSeUZ}-7TlO(_2n)jSoNLjlc%Lw8{Umf)>mnsU(zeAn zHQXi7_LVVd1|1Xt^~2{Zs^O_sjFN1@l}T-J1&pKai$qG|KkB12xnL@#eqwx z_hICQk?e{lp`kPj)Xy8_xYSo1Oe&mS`@$_%vL~d%va>-tOCOLEn%3!hzuqgPcN>0! zrhjUm|7rQ2wIVt3)l6XdIKaQZL4We7p~@z^O8ebM4&*fJ)fURkVV7*{!RiT>RmF}; zXQku>^T0R3xuTXPpLT#o+R5Rn>waF|dviTqV%(rJu8-lZY~Y|)nz4$#CehUgWfDPF zwGN&9FbtsIXKWgnqie=l#8^{XMYSCmw_*kRshpCJ~Y(-P9AJ%@UQx+)mq+7)Y&W5V@J& zVwkZ38C+5es2>(0Qz^IAfsRV~d7&aTFdkaCd4rpit5*w0iDlhA^|9}Y#x8Rr%#+bu&hF5!_{2=axa%S&c#W`$`(mBbM_t!WaWO zmgaLE#SNxx0Zq94ykah$5bEJ#kBNa&7(&GN)gBO*WxVP0#zf2)tPbZtoPBaIR6DkH zuw#IB4MTmAa>ibfnS^4XSAxoO%&On`D_i&*h+5mNi2H}SJYV5M zjCWZ*GVAns1grG3>EB;SOy0-vB@6bK&ccJ7YwA_K1Qc(ldEtcvR17kn&tn^vHi!t^ zo9(-cNPIb%-Al!8?`fu?1+uTFx4dVv{?=cv=BRS(nG$Pj%oWZL5!fg3*$rl3IR59@ zBlKNO70RcJ50~n{`fipwefGYa6mXGM{GLLmfF&zXUnazBGrP{dhr$^B~cY@(l`5 z4mnqgy%f&eV*ydg(cGZqnV{`A`-Qk=bKCTEU36BZ2j$L0N-hD~i{_vyX1SK$e~` z+_0<{Wc9G(31PTy4Q%~pE$6boyH{(Nt$BMLz4H`gKUkrcc$i{%|08q7NFY&TO3zre z^gXEi21ZEiyrgN;CJacHk0d-DK+oo)rZE=K?Mc3w5NVe?lp;@tYRyyp>neJ>uz8|S zpq*M5>#zjE<-+eD!koUs>|>pp7^e1)Eco+K-J_EfuUENa1=s8k6&1WKSX`&yPtIk4 z$51k%2brKl?v?4wjQBH+Cd;syVEN@Prnd6S<#mAcD{q(vjCZ`IzJ@01gI_Xr2^kqew5;7+ZpHrE)5 zE80A-LL8!{Z=Yzu>6VvML&a{xV(72Te%isp-72|Z;lGAT+Sig3`WmId^HVo%#JINa zI;!AlRpZti%SJrO@6^^4a$TeTQ1!e>8Cy{(SwD}k4anw}o~a|W2LN5^WxGbA^WFrv z_zuJx^v3&O2^q|rn*5Am?*ndfu7*r${2T2F)O1Bu(a zt3;dvW*VgLmt{+vGd2$X7z4(;4r=s6y5J~i#HGBZv6xKIX{&^>)?{ONkN zUi6|nkcNAl-eOVZk{q;#V0p(U>#0`QB0eWSL}&^Gbe4D6-HQ81BiA3ql&RUu;2Q(p zPVl0Su6=A_IKAIH{fFh+o-xQAbx3#xwAPZi`s6xE7dPlL7Xj-f`2xiDtqn1jufW^c zk1?_^eBswo2L0a8TkTP1p4o*e6BJyw_!V?vLxY9Jw+JN@Dxzc^v+n!|W#fqgn+C#O zpCuy~$CKmMFJ}jK2lb3p_KkZ?3M-zR6b>q8?+)nc$PHtJ$|!0___a=p2SJg8!a54x z=7%#m%?~x#C-3?$^!{aI=)DpH^*AM95`B#3^^#rupqEunNl_d2@dqT9O_d8)^@J@m z{}!rT{%Ai;YHE$4c)k6t7hzhfJIj6{j#tn{Ks7gDgqfbTz%9MF0e*3j@3Y_F<}}h& zE-Icp?f+%;`q3nQ>9Sr`Kit#eAbP5blJqQ&izC9O*|WGdJhVo%-Zkd1%B^V`*4W~8 z3~hyt563r#&k=lS93xIs`)%>gmWeV;!8{wK&_p9^sR297N0q9K`uZ3C5H%`InP=1^ zS_jWu_cc3ZVH_l=zldavCpIm-4qB@3+emwaa$pG3d+zZ&9kaX5@&?b|0z*Bp)Bvv8 z!!@FX4;eA6s$?&L_Orffjl9jsCtXaYk=C=9$~kO7fh}EAW)e~y>JYa#>@_WG4W%nc zcJ!py;cG_oLtF9_JsFjXa)|D0TRg3-eS|yW<^awXe~&kVd7Q%55;j)eu3-ne3_nEn z3-=L`xF#gg)9;b?fRaR4_1>{eB+%YccCDpIyG`lL6UoMQDU{V{;4T(=kL(jgPFeE~ zD-ZiIUFEYf@M9s_!0q0vKUP=}_<#}&mVL1!;V+O3YAhITY2H%EqHO8-BV4|Tr01SO zOK~G#HEt&1DRjNq84;RIfnucgI<=uQ;^E z%k{D#J-m#+5YF(h=D2nwjQ-`Q&c~yj0#}MGgcK)!NOOZ!wG`^btS9S35Z2J!DF5~f z%NVeHjZUpz7#;}CLxJp0-?^frSfq>n z?ZmvGo_FWVJm6LEtcKMoW1HxyN-?)4#oPH-Y@8v+O!7A$Pg$OWj0}tWm!HnKBrO4b ziLzvlSTF>0$1k{qMNYB~$H`~5LiB5mx~A44YP#`}(pR30u17bXRs!^(9Y{#0;t_M4 ziQVmJY5(AwZJHygaH{Bu6DA>7u78b)bUEXr8w)1ZE=(^jP4w5>iAGSh_gsfr$#4|A zqdxd;t+9Wre`1h;mJgn0BPOCOR;M5B&!)lf7*q;q?UDhU!TwX@uN6?63 zHAk~es5j4*E&EWijFr2lljin~lx<<25BuUuw9Sw%&$~Ee6OdjEtW_i7(vR5J+%r3R z_q6qHr?BIBIj?Y;7iB#+wGzn8_F2VhOt#QoBq2RHSl6bGW{nN-YKSzNDBa!m@fa%j zvB;K9Ut4STi?)4Kufw7ux~g_z*=J>MEBiDIjKex)SW%mQi4cCF_3skzQiDq;Wr5UM zop6>u7Oxy25<%Bkcd{E@ztf#A9{dmvpN7~aGMuxdN-AGv;l~S6UA%c|4cBHu7<)^9 ztc3cRv_@9=y8;O1f1t78Jgn;>Ehz7AU@@uGjqPVe<5P~J6ITu?ZoLY=b1ri;K8zXcS0 z4yCzikMs07_qaHH#qu!P`}$SXJ~|8`1~f#KfHSQNj}D;lfyFNNC01D(b7j&3`Cnjv z-HM(0lSkkKJ+@TV+Gn6=e-dTie(a~N0akWsK-5!*TVrB?TWdVx!9d}swO z`QW)j9^A8Kj7tq2+3rnCkTv2yrG=!sN$_k$`uEqucY?@j7laM(`@0;eK^mb8a-5Bd^-2Ot<}hrZC3?~XRuwT+>BAOxi0XlI}W zt^OCd#$-D@rJ4lV{(0cfJH;GyXl0`)M?8C9uB2@7GOf1~Gq@j|_;-X;t!u0=S``fe z2r>gRYIjWA@N-WZSJtiQ+xs+VH@O&OxYIaiCj01qB+uzjM?G5m_l-nC=6z(7%=N<8 zswEspOU`O17T7fUXP)+sOd1uH5{=xjrPR-UiNu$g!IMvjhK}|u7i++jEgA%}k3-&eFX&;RF0HEY z5FGhoRP-mrl~*s&Ol^H-QO|=hGQ3cPJLt9Lp2n(q6iEr2K&#fAU!+Zoo)N7_q0;q- zz>h7xnb6#!PUcBE0jL5FY=bWQcupEyIBD0p7Ar01sUWb^+cl?gWnivB?ek< zi*H|`O5VOL-yh;-AL)(CG!3xXk;lDdPLw%SS=hNf?r;!gB7$SwJJn~<^d;u971e4kJZ zxYl-NKh{QizZlf4thN)bRvIUw@s-R)x;x%dNfUP$<%Bpaheg!-!`0R~rv`ASL%U^{ z2L$))&zrnpyqCj5N8i=h+b^pQJx|8$Yq*F|tOo|li=qm%GL55?>Y8`IE>~gty!%Gx zP?{Y~mL(t%U0+Wfym85zk-SeMD&K#diAinBj1h}>rxW8j1v)c_d=D8B3-MT6s{Gap zbGXjHIYjePXYhPy`a%w3;5`7Sb%iY^Q`eO~Qbzq?+2@rCNp}}_v*IUt`&vrc72Z#qHGsNkvXYlb%_50k4IBgysHZHEu9D+xc!T18|%owNoe!~h2ZT+ek0h+#=H({ka}~QR^a@jGNi6YUbS%Or7bjda7z{aAI6O2+Mhx5$KGJH=Qi4q0&!ao97^`d$)VFSRzG zRkzK-V-M-sgIG=hAq;II-^8j~$7`Z~F-sC)pLNeHJz`iFYX4+`3H^#MSo*}*8(*do z=8sCrkUDUUYTRxN`%P18nPkKNA(O<6fr%SPAdGMI%!`gB#7-T0AcQ-t{@6P>Yl+IE z(-1q1otdi=*&eOP<-T+KDg>EAa9Jcd7dx!Mzf8jtwowwf+m;A)E_T(r)ce3^re2_p z0ThuoA8{0}gy{!BLAabbdCT``o0fwucV@^FTme4}-m-t{uyIgL7QF+=+hhh(GDZBT zIk@5hjg>6sl)Kk)m0BgX&}hr#udd4I<)zMaL-F7ylB@1k=}6HDji;A^7vzZI6+>=( zC7x_em1lI-xxMD6bgq5om#&LzX+~NHyYZ*w$``N6@!vfGMRxYQF8kKeYXO(FOsV81oTnX=$l<4*e}+Y0P2K zh;X=gWKbna%RZ^Q)l{WPW?=;*$Wc(o`Inb{vCbR^T``fH#p+X&$Yw#D<=f%x^zc`# z$DKxGrk|)Sm9ojsy%OSEe7xT6LSUkDBu_T`6NH|7hqLmP$4iCU8~C_a(gM%-LYMZ3 zOYS}B3V6%~-%;TCK0U^|;(n$k?I>6{#}r+U&7Gu?O#j%DEkm02-Kva2M)x+BMO+WI zhRfUCp#P8-W%cw9+Zs78N1d9b1m5LwXsN>yI7sf@I>jH79Sqs#gvG6z8p=0&HsE}8 zqF&gx2I{@_bbk3`xucz`d2EN8w60r2M;xWIa(BOm5aP(oGSHgwbDju0pmE5nw2O(b2yD-5xj)cleYkzH$he4TEw{i-eAK z`Mz&Rz7^{!C~9aWCXi97lgRMOU@TV#MiDO7Lc!R=aqYiHSjUdJ5-t^oRz6rP2KD2# z?h98$GD5W-hz_YF?vyOja>K{yX3=4VBNnmDl5%b3LZiXzzLHPv!T`>wP?85UP6&q)t-`>?RO5kQ;db$s?3t~L@XvmNbOhxshtsmqc$T^=K_HjE;( z3>VQtw1KG5FOt~Cjk62iG;Q?I3Cw!S(~8Koy>C>D5ul5K3vP?@ct)S7%>vLj8Axy9 z2Ef0fyI#jf>}1*>rOXvbn}FoiJ&I)1)Q5>B58%7e{tST8^cU!e#fjx`n%+jbE*A|G zJ9=ZYiOkSa7S@Y?QA_&$6Dy68>yz5P?|7;d!zVaYuNd?+H@Je%ts1Ik+OtB^fw(IY zP)1E}BDZ|&c~;65FQ9a$FErIfe>_lB70PIDDrR3BhG-d7S~nPK8BcM~ew^!|Yg*9v zzg{92CQpH&?YCAO}V70!x?40EQiLIrrD6Us*$VXAFA?zRm&pP6k zpBpAr@~9Z8zB{YIlp38&1RVpd?z7xd1qL0#ngF0<&^IE^Q%DG@)kHUjZ9j&W^K}S4 zxB4Txum#&TI#@toE=;5*v)hGB5yEM2smlDNkTgTJN;ckzUyjvSX1Yz_TT~*>hdRbF zEp*u6^4ebT%`Yx;NLUb0eh!ZKIq?;g53rvQ{7O=n5*x%iz z_bC+~9YOYY zxLlWIi&&}4mJSt5%~O5|grzNJjX_NhfIz+9j-^W^a+jH3-icUZ=2g0OsoE8l?Vcq4 z#1G0jW)MO(WVYooV8Q3*ED3T)uP^2JrLnIy;Y3Xmn?xfO`k|tgw-Z+Y!JGAn?J8|# z=x?wWK+&AxFyZ zI5!3$4<_}0I(mv%=?o|`dK-#>&U;MGno!|@q2myzhaV)P9=pf=OT>41c!JSsBmI0Zl#QndL9@2URqmMmHt^>I!p2b;X+- zB0S~JJ)N#)PR!NTHJnt4q9|eBR-*GELKNiuLJ9&*4u#^q$jSixu-q{Fo4mTG#m%`| zX|ugD-(Q)&>xxw#)HCQWkc5Xm4T|YCTIA!IAHVL`<>jY`cWK2kwVd`K0E#OI2gvy)p(^noudLy)Y@u zyLS|qrM(jq)=x!3frl4UE_r%$sD4j2+JyHmyK%WFes^qP%Il+#H?|_ovdGju!gs=4Un4Y0{6T zM6m#|rXP>V@H!P@xWjF1|D3I7db%!Ft$|R%ujHjLDdTXy?}d9T+n!6u++d9tA#%_E zz&w(i=EJH?7n7LynE0Sh2N7g5u^vuWS~f)lY94GvM1nXk)nw)}@@}XqQ06bCv;)!% zH&loBhcM$!AOOjo#>(cdIpK|vx{OT_AThS%r98RpkqJN-NckSyAkriWTaiiqdYD4)+0l&}x`YNiio9Ew+POIMhwV>tu3}pi#g{Ld z@dMQjkwr?vJC(K?&Che5j5zu4UKPiM$MlSN!S{EA`U3e(hOz;oT9^wzbK2h3Q)HyF zT^6XFpuKRVs-L&i+}lOu+X{I55-V(?_gAv{jCk)TOMVj8mJeMu`V%?dm4e}D89I{F zEH3Hna@FF?OVBiW@1lQmZ?ji;Xud{kZwCM4F{&L4*(9h#jW*h5qzf|66Hw^;`YQH7 z>oJ}iU|Y>{4*>f?Gm)z!CF{|`YRH`>cvMZyqoMpS>^v>B>`&TD0_TJ(mm8=bPpogA zSZN5vA*oR;%#%-5w_i`6m#KY*;FyP1$)fEpmj*H%3YDP%iDx%1VRx_q7_ z;0q>SD_T`Zb7yC3kvJuhun3LK@9(sgxh9zW5o7LuD&O?`^_~39Y?EdlHJ}BsE5^Bn zxYT?z^7j4t`U>DW(OxIix4pm9DwVwz~*~7$x~?oW#h&4Wu#-zRFZqAKH<>*#9LeL zfOVmh3fm`y)|OprPU8kP_ZvdTzKne=yb}RiBW*R2k3q0bYxpv~?|VV$YQMpd7561J z$J}K#jCT5_B~LwIHpN~%I&2?1ubQAa)RtDhEA>VBJ#8%n)l4&Dl#;s}(_287UJI$M) zgPN`lmr!poKiT!!E(JO3U_5xPe>wUC8F&5YXQe-fw-NBAJnM&{3S5pMkzS!4+j>?e zU|Z3a`bNHU!j%ccfiJT=dC16^^omjPQ&r8Jvo2%=pDBlmB24?AS^%f61Yt((4RRBu zVVAFNjE<*&G3OLo_cwl3g&4UoD3~Qg=C*3QTE*#N(kH{{sBH^jMva@kIM&KwH^R6| zoKI#}TnmfB2{fa9M?8bPhZ_;TRwS=uP8CG45f7@dX9u<0RwLFq}k=IRUM(?sEQ|80ovBi)rWKx9jQc9H!D4d z^rokVw_hk}^Cv-|^e-0AtU6A9A37cE*)b1q$#ap|v4duAmXY&8;HIc4=3V`@LCn`F zy-fEythJxhXxm-R>A>{%T%|m4LuOS#IIsj;{?1igOF^9O`jyqRJ0oBT58iv)ue|0&(eE4 zU4JK0f=yF+ln$u(@o?pj+1pudWisgAR}oA7v_!Sg0|?0x!j0{a!P-gOHYy5bjPwQ$ zbyLLjy0X2{#6;hiF593X9n!&0*Lr=IBg?pl$H#?az5Q&dkfVo#KerhlxB+<_kX(MdT0;X2eJ}#K0Jf(X}a++xT@EWd761+Lx z8^3j>%38tEdVO z+1O6+1z`9P(YK7Eo0;y4cOS_2>q=s8wukLo=pZ8Wt|=PoZuatOwA2C=+-)2Nk3S)kehP>&oggk+mB z9bpNF!(^mz){R}9K4=Oxe63^YCiG769HuMEosJmL#5d`8@#j<`RxF%%8EMiSEh|4F zu06Lks9!QdXFiZubszHRTe{ia3o_wosrIe$6EiJ$S7^NfOt;>HD^jooCFHfAf6xMVQIn2$JQnU537dd+ zN_BWnZkXHKxV#?5Lamm#HBn~&4}0$!*VMYLk1iXE2o^*Z-3m*JC{;Rwg3=Y~O{Ik1 zYk)*VL`AxE2q3+LNG~CYi1ZR_0t5(32@pbr5CRG1W}Usy|J?gK?)~3uf4N`wx5*^T z4Cece@s9dDH&IH~+T%4{Z&{37hrf&tC`m)2RICwYYuM%2Uq4xVx|Wixr^P%OUmu4Z zv^ZE9U0R6I$6%cow=p6;IN`{;gZgs5897Up;Wv(p4VD#Qmw&3&u|Hs2;OON=OgV@S z>Xq5$KOE~(JM@66wR+?%uLE11jitS7ztym};R6_49m_jQv@bq$Ns2``P-XI#E*46k z;|@P0?eA~Be{gkHCXWgj50kDX8TyMeBXXjs<5eL)8NP#`#MNCKDC$B4`GBJX_@QC& z_cy<+Z?qmw1mBEnd?Wt5A^0w0zacA9N@$hIn93HmfdZgaL-q&mJSMC=?G6jM%8JE1 zePlBWT${MbW9W4O{+g2rnd0~Ct_fswzyF_u9$(ksv3Mp-6w&K8TS^0b$dBy+w{M}*;@0lz} z_9|lVYg8OHbTTV{PcXWvoqed>wAuF?k-ss6cgxl5oF&oPs(JqYDkl8!YVyE1OE)oA zHF@gby1u^FB#ZD|tpO?XNxnu@Da3Pz_abH=W6O-)W*2U|PdxKt_;mH@HQI)Dh_1_K zhqlJZ+DN?-3bNiU9d9yJ_l7<8|HSkS3*>&B;$0RjxaN2wh`U6ud(=oSo$u<^6HsnB z96&0@31jCPm%;1aGIe~ZN*0XD(i>c7Pw2_ED{M*f;g@hbDp0^hqc7zqy2(s{9~&18oOVvdI8oNyjQKh#oLwoNX?)j=TnCDyh7>@C;ysxt>U?Jb^a?- zA*9$wO>I^ns<-C?bRPb|%XD01WJ075`)@#t(Cy z^C5K7n`)_<`>>Gg;S=fafvN;a7&rKjSzMIGo^9Yi)vTbWR)Lcu&_Zg4Lteclk&#um z8L1Mw1IcFw>%4vh>u(3Hs6M)vyTn=X)Za61ghXKuB~WSX*nHP<^`XE@Ma^gtMs2Ar zjh#Ej5A z$r>@tat1Fl%sB60)$v6mG;DZI9bYeeS=!PlpqQ6is@myoTp$$2^Fj7lxzp?Mn!_(B z5IbMP$)id21VAlDr&0n)J^=5nq@}C(ed0Qn%h)>-?V}y_BjWPB_kg(NPiGWOwM!?o zYKs4qlM1!TzJNuVk>cQ^ZR%OE`2NHzX3VAaz^|aKr5+p-$&o%E?4(ous=2^G72sj1 z^+Ld9X%kwr0b9O@j^S{+joIMNAjy!Dn~*W6O8>ZHY#34kx3GAe;>HsZ=kT@`nKW_;vS(^{PY=&Aj3uuMucVe_&B`z=<9Oww>Fv%UY% z5r;ajNLzWYGsjC-&z3WJn?#+1E9L)8srWh`iwBJgZ3=^Eh%i^FAp;*NjgImz4s4!N zBgs?viju*y+f7Q-nE3;t#7YCp##;o*QNY7_W-#Bg6|KUTSE=$NFr9JZ?chwpOPXmDO)7+`H(@Pei=-U%p=HmP~5(V|xWQfKXbX=j|Tjt%AQ($O}x z5joe1FK0C%PJ;owuPY}@JyaAuZ2Sz)Nc5=2355G^2`Ok2n8!#EZ6H~+i=$z@!R=Ww zy9NisLImPS3>>A_IP^U6$+ga#)bQvuLYUq~XE)xGYwM-^zjp30u^v zyk#+BDzq_aU5uOY~Pe zwJVZL#j#vDTnkH88Bh-Rf*970cLDaR4qM~JrR1$wLM4EeRqmd)j{LL`TJVKectoZ~q3G9*fHR^Q6vxT`9om38ol>Y9` zm8PBpaXKM4W?!VldEdqhdFN)XUHz^14>L4E?4`2JMb9ahAE{>yfC`Q@SUkoYa&QS91~c3}~*nz(VdX`w`BZ>vKyYm4&Y zDK?Ek0R>Oh{tGNLOLDM@_@xQK$SxfcymH!9Ujx_viT}1d&*WvG$55V7s$;2*Zh^y% zIMd-wQiM8Srjc|Y;K8fp-q}lPkZy-r$m07w7!md_cCWVKL%+daM!TwX;#4~|e>t?4 zsjh>%HGU>MH!f6d#*T@A&+r%%asta+#C}adghomyyyg?JM1>D-@mg$nyGW@Lnazk-E!1eE#)bDu-#Y~)O&eJ>t^My=f$LZY&(5vS`^)+ju#7kc_|&d* ziT}>%y5V7XuoodN4;P?)Xpo)#!f%uNy%(YqAsNxm9zQNwJK9xl7wvX=mkFhRox9GB zGthtFDt%(!uqP*IMv`v6-2c(RotBXSZXFeNvqP7MkJ-fC&^@ZQp6$1tv7Yz3h3(Rr zgZx4EP2JM3*Y)ebWK~qLb;c=~O|f@F`A3?_;B(y{_@CDmZXq{&`yNQ&dXs9-^HUlg zzPh*l;I15(s$7DPe4P!GTWh8XTN}i zJ?mTOQ48haC7{pleTHG#GapY%X!rW`d-$0K!WmAgglRqx$hra$kNkpUu1-+8(=wP@ z#Tj7?;vQfhI}fW@FcD$x6s;#8AsL=emgmx$L*Rrqy1wQaU*%Mto-Y*0$d`tkehGm=EZ~Kz%EE_EdH2-+ zv#Gij5Q-UpXbqfMjSo)u=fC?|%~)a*A>!@+w&at8XWB`QgD10-iv3|>o2cy^O~E; zIb7cPWXeW3>keaNySG`4cRGy0L+zd^aF%(Yk#qZMiHdQBF53!(Eo%j1dWzru;=`{E zt4`#&Q|BGOR2^^h!^-JUpPwX6B<~;tN|*Qo?{RGV<1PZl_kIt0#pJ0=EF_GXe%k3j*V@Fu9^u^i)74nHZiO&|cs$wk9 zGBG21?*Ag4 zkS~fZN}Bcy+_0gUa)zBVRG>{eZEm`G0Sn>|eP3Qe|ERtYR6FCz zJ3#7tQ?KRE@43XfRh&YR`wi=#js&9yGTdJ6fY?qaVEgmrr-Lg#gb*FcKE3$?-zcg) zxNv1k&)Qw)uw<>TP<>x%{O!gf^LIZQq>W+v`nM^KCy&vPjKHL9%+IkiF5+JA(HC)dxU3W*q|KvW(S>*Y9wK8iFp+<<#%mnGfU)7x$dbA5I!Js`XD z`O&oakMrp^ot2;f+CYbJyQ8w>%E;n@bI1GRCqo#=UidE`6lBCvy;2l}`*SGp{!A5Z z(4NoxO8n=xT>9)udhefv29BNEp>O=_P+Koto=FAG1~5@-&Z(5p!nb^Qc6JIL_2iXi zq}X#I-qb#TkzUvkCVb9P-D(EYqJawj2e<~ubuBUYne{us$r`SPpfT(NCeUU}6n{5PZEd`UW-E2V!Ry|=b0^tcyN}0EKfb-QYKzEw z`|?=FyI1ZGJ%Wy!lLa51bRN>IoBM9)kJRbsy+)(W24)u5gM!F#>nC)C$oVr7soiAO zUKnfj`_;Vx2#x;rjzW&dK>sl$u6el{<1#fZ6{Re{T;kGpsy|F|ko2hlho~J#2dHYF>mpjo3uR) zK=%|p=z1=Tl;~lN2d9;Eg#`^h>TvZc&ASMApDdVa@VptXBG>)&9;Hg%mDUU}oSXB0 z#F=LaS8cwq%EGzo@(k&zYK~hz-F!UDP|SQ1{0y_}G?;xOR_`S-UhUBLk{fpYD&TI? zu_(6C=>Qcboy4Q@S%J%^7TtzsaCYDJd}cf;OOh9$n`xtaJ}O3jW}m1zB?)48%g|iX z-`mu?CW9uW?^NCMW7k|ZB=d!)dsF3he^7>{zB7cN1Hisr-}QpRnic* zrD|993*dExi@7=LM<)DO!^%L$mJ(iJgHIHaBq&A z#PO|Y)7<1*y2X1c`m;cyipYmO<^cZ5 zGglhrv2X?p$7diMiq_v8?#i`nAJunUOT30kV2&e`ERE?bn!9U7x!>1{$$S7^HUh)( z`nE;;YM|0`i%S>8NzL`aIujpls(=S5zOD%J@gY7Txsj3KgQ4+*))RzU`*MNTcOyZN z05c4tfDHAWkDb|PA#rjDo~g!e4Wv$16|867Ol__*jM(;!ZoVgDJwRv4tblzyzXU8G z(eNeaSD3{#aFD4_NXbxS`=CY%%lqBwywpUz9SMoEo#+h#kN0-2dp&ZVuB%qbqVnie z46n*7FAp#qyF&2hxG#H1p9WbP0jLuA{pT5nbL*5Ey|N1iC$^YP@VYjB#sQxjKnOy3 z4{ho9AUi&JuTZy%0)_yJ0EV#c*uRNIxS+M{^Y@N;n=8K1iue?>8TwhUG{ zz9{?Kxj)idaK{r!3Du~8@e1^cg)z1wUW{t`$__!R$@{` zDmFm~@9)K^tkO36BvG46HX@fq&4uUV>0u9F> z(rSuyQ$C&);$Nmtd7s>xrcAX*G~CQ4AP`j_RO!f0(!p1%CH7#NVAo_oy{K*FE zR#gMqTfYx=uC+s|(S{>Uu(AHQ85qUZ zgq01L@&`N>D@v7>FS-8-YFXb|fm@$})7dW*_1G@m+Rl{EzLv3}Xj!Wj0N|!7HUw{6 z08Hb*pw;xZYP`Vb1@MuOICqv#VJ3I+4PY@ z;?ntWTR~;d25j1b>2(=WGt;eZjdZFqDr>b41GSnm>=6+HFP$MadN#H94RWsVpW0$* zE5g~D%-i2^-$f6|$X66%wy3$8A$h7_!)@ifXUwT3yPe5nsyM?t_%|=)@m@G@8g&3W zPnz6QT~(kCG;-#k7m?(d?|U{+y$Tz^lCEpz-$+628tF~sp*t&EtNsLS&B}-=Fi!b- z*Xakw2L`4s&jbO(&rCwo+ zn!Mb!*9s*PhWkMkIVTP5WJ&#jo_0pnd4Bho+zk`JrpIZS&904MasiQ4X*a4Mzyf@1 zMP)YQyEU~@?K=choJqjHEfJ?2dVN?ASap*_6bGuYiwc{qU^j9PafzEmmV(GmZCKbZXsJQws zWiYt_CvWz>o%ZWk^WHW#8}P*VZ<9>*)l(QPyNUe%<)t(P_=)s@Td~&JWUSg=ctjLphMC_!JjG-9C2;Jt>D6QNAB6_~$& z)R9>by(>&>s&l8}O>qF8RD5K$abROe z6orpFG|&o@)0ve!@B9{ zXvObpRgrya{gHHFNLK)2gH#YUS!0{5(HwuZ;ts#^&UqLXn{Wl)$HIB4|KX_7{LVYI z<7*mf@Mf>0-YBo**4=2%b^A-MCa!8Tg)UF-;w3e0d@Q$XKb9qUG{QRLXndzIG(#vb z$C51ou}+K?WH8HD63?)7h5N9cK;lq7qNze2H`>1OJ0Fqt_6qq*1aeUmZw0=MB|WU~ z4;C2r3N5wi^Q#>lMI+Ds>^y=fql}`vUZ<42+6@$76bq>UAbj+iQ6@?bN$MiTV|Lol zK4bPbDa>>pSEIiDtC6HbDtNq2cJ=z^_3dYz61x-Y6r;8t9xnZgI8EX4vyKkP9ld#v2c7<$AFmv<-fT( zB1ea$6jK@T1|A9gkZhO?Bt)gJ-Lqwkm5Sj^(U( zRn)e)6ud7ls-+%m_K`Pt%T71LZm|*&ZuCjY}zdjw2e)~jS@EB_bG*( z*kVzms-f~_1F&kRaL|}tpgsG;qWT#O?GoTT`?2Y%pqF9W9nKccqU|mLQtWdGr-O9* z#2g@d_b9t{NE859-?AEhR$27m=nHz+NQvIWBiy!tlEYHJ!l&m(_)Fy(WMAa`YK?PZ z$w(GN>EPgT@a6)(_3LA1s%e9y^EY#PQ||INR!g6Oecr>tn=Tpe>a4!7ktpHssUu8&G%p)+oBK_Aqp~ z0u@SLAojuC|RPLaf9e&yPq1&FlTleZ&UuynIn<_c%hd#vs?^Nv1 zDl+@c!Q|)sLznRd@v7&Z#M3QTafITFl=4SdPk9|Yj+_W5gT72Z8+ydFS=R4&tE5wE z*;+h7JSucIV&**L@iEt#7Tar%dM{y(#Bel(Fm8t5;?sdyk5dF)(G_;>vnBZ7Ry+qy z5LL}MPT_>|QP`?4;=_&%^;}-41-PAi3`X#(k?}UUwUu)ZMTeJ(U3XL?!`=ruH8I0O z0>iu(C<_=FE0eCIi2^hfSw?&jtz~A00CxHT^?iui2DGs3dqX20gx(bmwwX({0xI-H zDds)@4e?kn3yGIBpJV+v5x!jSGePv4EWiY)X~(S%27iu7Pyan+`Z;*_xb|?`goa zyER0u-(^E~zPAky@X`-pWV@gliuyxxZhn;+>}I$Z)w+P%84K$KW&NPMF)b9@>}Ruu zL%Ec%jrXQW5{_$ADWxEmO%J-FfYgG*a8~@)aVcUzT`0{h#|D$dLk%CKbt*x>RFPr8 zTT$?p#?6TV4(jSok#IUBF;ywZv$=@IZouu8nN_hBq=)Bg-U@n&#q+N}eTK>M<;XbQ zaF8k39%C(EF-58KH%V$NS&22KTl6=|dW=j2J<06SWZK<&t5&qrD7+Xg@5cv=*iI`-^}G8gjnFhD&8{QteQn578_R^-xTFaA9g;M z54Uq2t}Ih=Re^Yky2Ba3x%@7N_sy7HId-M^J6JWiO^^-uFh$$yE||NXfqma+W*d+* zJ;adX3C8DL#M*=+jfAL6*Mril50^V?y!UNk9oUT3#7N}kYda!WpNQk$>x7E5&FRvT zh)FB8OfkM7fd={rUy*5-$iw*Weytj&{8Tj>BNZ|8QqR&9Y6$6h72ld@4-#94iK~aL4YLLym9rDnV)muR9BNh72Zwn zb^gghlZ?H=J$om2y=qlL&utEWH&auc1)T%&iU`^)8J$wUaniW*`6A|c^Wx|U%$8#) zN1s?lk#>wp}qpijlH>4bfIcK zTzJp~CZM2yEmoB4qd}ExtNiaYRO-53_4ey)T?-B858vCeQ3;62tkH1Dk}NiYpa_hk z{l+VM* z_ICOpiV(D%MNIp6;e@Y3?Q6>2)y5cW&|<(yBi;rRYk>MmY0+gD$2y<- ziJIkSyU)~&ALm&rI^|DA_E5U)NUe|N-+bzG9o1<8>*w4W$dpZG0;B4*mSxJ2@lm$p zVNjm^J;~7RHQ}c1ye-7MC&7X}bj55MQwf5s-8m8+#m4=PCBNQs5QAIJP|8dLJM7!MDC~oxGYbY90Nugni!4! zmh=WwCBv1WoBGF}vu^)V;Y{ztSwfNCp?CD`@Fw%D(S*Q%Qmi+kqJEtn)5kzO(s>??>Gn z{b7%;0Q-Z1-JDE>7(+`!r2&@Mtr>r&;p=rS(T}or^N^X4L0bbMYCUa)4gH=4@^z9o zJ?qvq)=mWgr?pyS%DDcKQek?D-GAS~(`m@9aR!K=u+d-_n(9*yK2*1WD;m_bc?8o()DrzVtO4?ZT7_W1g&uqwG_2?wE^B98Tq#N&D45ep= zHzRxlE7cy*j}Nq&qZhLv1pSFV$tIJO<;3>Qr7W0E#8JqX*QmvPeKsnvtZP5>Ru1$% zZVK(-=aH!r1aUSovmv)dp42z#D6`E~+Y&AbBu&w+Jce9=>nNA6{eeUH)VyzvMaRrloq=sQ;%`2+LnDbRKQ$2@OHLBp&j0;efwYz z?(v=OzJ~M4+o)Ru%)g;R^QK!*^nAa@aEkS1lG1u*-JNT-TfQUeTovD@dac9}A)iST zWM7!fm7fi!2xRPy!Y}}KsCp|iQGF5H%OJz8dOzM2aBgguLOh5mmiqqGWSv_tYROOw z^xSjIMfd?5_a%fdS`O8|+|0X@$^$E)3+~yE=5|!Qg`si>vQS31nisD22ytE$Glf=r z7FLIE)yB>GpRWphoW-_Slx9a;H2`}l9qw7$j*dwCChw|j!BE8tsEStEJr$y|v$N;W zP0w<5m`pC&37ta@Sfe70y@uGwwyZZ1!;j)Cyhe!`2XRCY3X9L#3W9%VFajTTF9WCh zh$!x5av|_oirjvG*^z0WaJDtviM=OBK3+T<^>EEC4&hECCV8#ZbZLg4A%v9Wl7vDQ zjx<+=dI6}7G@(DB`oY#}^Oo{X-=LfbpRY44XF+#604^lr6$`k(sp?Q{&>I&9#on!JHG}0aHMj2?}iEannv_ap1hI^a-BkI!_-!IQrnc z2tLELyof^h7~^^|8Ls%0wZ?&-E9yD;PQGP4bv;)E40)W@gFci%5K}(#3eSQ5*l5zT zXda!s6{;U^XE8wDbygFK>*^2olvjd%p2pR*wjQ8a+_>vCXeiCY)WG5=?y*mH9m#D4 zQoY$C>!+8_+B|vSOIHB22ehKUHS@;JXQircA-<=q2QZrplknPOjiU^|h4Elp6D4k!%wJxq4mEB0GMEc-FfQtCzp7vT|Rfn zKFsG@UfPF$$<)_;Y?+~Rc-O1(BpKDUS72>Qh~J@~b)`qUg7pt4wlRE?S$Xb0uoBtV z0f=2iDMozbRP=!lX8)w6jrw6;$l3&}h|!Pnp0dQLdbeH*T6M)F#Y|HI*>;INfuo5S zNIY9~K;MwpKUNYL+zGNhrvBZPH*j1n%+R!{c@I|BlTfv1me-cRbnS_6+VSQQ z>Y-CKwFCFFK$TS_a%68r4vrJYAH;vUC#8XKyv z%Kt8~Di=j*#d_!%!uyY7!E)o>Yk7&PtLR~SZG=YmRM1^p;*=q?u+{7b#GlD)+w_)W zf7`mh)VKMnOuUk7daao7F5Es+WdJlrS#aT;L+9d++j>E__~U_k2AQtm+irI4LcGBj z_cvUQ_3NKfVS=b;WYSA#9X6&ZnuTU$4a<+js}~;VfM5lzSED2eyW) zwshoJnYOe{A~Od5kV^EIv<_|x)H{Rk@OWNnpNQCKckdsU&RJx1cF0% z7`~4fF%K&4;w0)XQ$HQ1PSomD@hfCM7Z{@PhIt-G>geb|?MT59o7TYTQL=*MZ9XubjcAw{T!1XdRsR&_*J>2(!MpCKJb z21?4235LpY-9f$&=jps*45-=SE#ufRPhjgz*EFOm9-WzWbE{R)ZPYQ9X8pHH+fz*o zS-tU}d_db=Ox40c=*jN1Vj+aZBUnyERj%eC?IRVGxWv_TX&FazYQ{bV*JTO3%JEXg zu2L1ANc>l9V^_*3%ijnc2%v5&om9m7*+kpu<81MKFod&-eWM!R#AvvXri~YeUw9~q znuhRPU=4(DEaTDBzh7z=?cN4W55wZ!tx?0Q4_$x%0ved2EZd_6XBKq*klN*r7~-<@ z5^!UA-cSK`vOGSV-P=leYYu^t*L*Ggy7CGw&_iLZ*D)^%xVziVH~lPD*FfEbb= zmZHFgjfd)eEBb*9N!2|3qn_*vQRrChu7sW z3|gdW_*V+Nv`W`btl4+*Htv&skG|K}9_P{9^Ipd?d)b9gRUEPQFiqHbnm#deI2R)p za>8K-oiUJn#m2R_9}7_2U#9pqh%^C`H}FoltYfj+X}Q3|T?`yg|>O6^gXftL8|O5AYsW0&2r%K749$m!x-37PL+ z`x~QL+ofUxtEoRJdch)&7(d2}n_DJW{_e{0Te9ciPJ@?fDfIanTe7t#JrfHipxTL%%Bxlg%<+1(XoCMlg;owTOgQ+h|iwlVr<&03#1(#-DhZGo#Od=>Zxat_t zgNi^-2{hb^SVl8sYrZyY*KH|7{%im+ohgQqU9UD~ijHl|DkenDnr}YHWf}Qqf|y!Y zvhI4U7TJYDO)OYu!%LQhs;Th}2U8x6TdDH;FR#eS2s_-7Aa0@Q{v zd&9tmF0#dV0Lf*&D^B>2ZRGB?=WRz1u!|6^O68&YM76yVAnDD-Y9`E%-E1_Wb0{C( z4P6qO3>WyJcS9H-IO!6wBk z2PE-@uw=eOqKNrbhUn2CJV@X3c0OKRV!~|}FBNjs9X?nge~O)N`;~RjfC(m62-!z$ zk!b=GNa10*o4khPUHhO5RYYfC<25tL^mcKuiYpcK9CjuJescOd74i&S$kZr1|K`=x zp-;?(B&oaEQ_{oYr=G4E?-ESN9u+Rl;6~j?m?xrMrZgfra6US1=fG#XLj0DR#>( zyJi((dN8gU)(&s>4bD{x3F{1R><~m}%!De00<{EV(#yN>Ggv*koL=+(6wGunhhe0< zVlFw~hD|MgL3*WasVkD}J)NY_FkaIbp2(J(I(`n{+>kmZ{!yfZqL|Ov?O23`X7+e+ z7wv_2l8@dKPL&X3kFLcj*z98Ai zHtV~hnXGaqBo%l3>FCtv!WNmYGPk9Z(Rk9T_na}0@=(L7tf80rko`xM3UCh{Xuv)e-eR_?4gdK&G_w_W;#ol=+J@2b|0CuXB_=*@pjpl-5EaTH(sRR-x?xq9jh z!;ZFJ<`a{p*sf@j|Z5G+!a~L(xOpVaNCLSrG6sKP8;m@+ewcG~) zU;SFGt6QiXCe2ISjzEnc!JsEaB>tm}iLh>ZZ&$=C-UB)Nu0fj`-$hY{%;2%7cH$z7 zy(zLshPO=CClLUc`^*bbxS)#Y9btE)<`+?C_P`0t#>I(mECB-3#MXIGpqBrK#TsqA=WDrI6_ zdd%ZAA;b%&BoQy7_h2TLPyU_iCFwS{{cGUQm*TK3+d}KuWe6hl28tEtbbaoeJ8A}9 zHf}(X-Q2+aSoD7JiE1ffTUY9Q0wq1XWj%@=u2KoDgjJ)Lsq1=cnoXFH<)JI@@YSP0 z$zF(T7Hig`Joy38Haf82ep5sH47x2cx?fgtSJAA}{4omm2?r$~Hv2KoMm00~KC}bq zikG_Y0A(9<1TG&72y zqN=WzD@tR3|JpRsP)Dc67LV%(jI>9ewSsxoi(6jz{w#vPF}t!hyA$sdGn)po33OE$ zdE9Y;@kEf~#p~j+j@c z6e$dv-U}UHvWZ@NIKq0<;&$2sIvELO_;{IJe^Z~ilzy0`)@La7e4wE|*-J{D#Ok|H{EE><{XkDITV{EIPs?tC+Z$^3$@Ld!Dq;b-A_L*aQy zDPMkS0239`f{E*(J|ivgOE~_|r|v&Er67JGqb?c2*zR#O3l=qr6QE>pZS@sq@nHr= zynAFQ)Vi|pSjM0YypS@ERU#gE{=k;8l;&jc{OKB6mAyCkZ!Ca6DNai{PhHfAYY}ja z{(BIA+4aQHsDy&R=*c_3EMETYV|T?)7=U}GYLiy_J+|cSyOhLWX0$y&;g?M2JzgHE zg%Ark2vJF{Z7V-mg8}Cs89%q*!I71;=q9KrwkI=fN1p$x%k7`ud;9XYD+{OcoC>NV5*_&{@0bNAQ)uOyYB158CW?+?XGSyTOlR5M4u)w z(H=8k6)HD*p9(5$`ejH_g`x`pXyRZu)?A72%l~Bg|HUhBj#K9}1|3d@3}!cP{tslOv5{lXV%wv&am{PN@QJ>w0+7vS+1IhnI%~guu04w|Ia;d#p8oBn=K`pX#xMnU!RLQ`Z}TDXI_o& zKU?vCAo=|#FVFd24_NsnYsarl$N$`m_~YW`*Zff@Q*1Q;slNRxkW{~%#1#5knJ)g{ zkvX5Kz<(&0u3h-c`~J71iGK?H$cC=KMppUyzx&g_&<8Y z)tgMAlUlZ7{|%Who@Of3*T~*mSN=yy{?)5Ae{f`R&BLnrnjrf05_svH@js{Vzi!|E|8%6g1$zenjlf}UjVoQK(X4Y|@+ufQds8=v zKdD{B0D@5R<8Ti_x?2>QCWejBTd$7PKjL8)<|5vb0{)imL}yx`Q>X}0&XA39s5MQy zv3rQoywsDV>?&B>{mAcNV&18{KP^mS#c#?WJy%>YSrzD1*SRb7mmO~PCGOxK#3HG+ zTxtebbMouUqi5^NFQaYE#O5eGA+OH)YHgWc`d8h;|Nh)tjfkw-EHV2u(%Y{pO0>W- zE9eWU&26pc_>F}N-OtIX9Dm(GAJmEvLE38kw(G9!eWYQRSfu3ebE4=7ME}r1qkE;% z{?T99NB^atm&=bYb&yh?AG*IS4}Sr;Z=2I#d#Mt~ZF*Xx`}ty_^k01*bE$t<15hU6 z8}1=S5kAjV8(t?w`ckg{)g|#>Keboyifyi~B}_mL5K^sOspmEo0*_Y1|MB_sYvZhb zIig7E>JLexq={*j>Fd$Cs{w&GG!w$s$) z)V7d8Qa-1dd6r#;J7{IRJggX>5)0?(Q$kfKR5U2m7R2p^A}S|*zfAQrTg_6WqWntS zl4W0p4e&`j_)gop?Z(4k*HkP&>YLe#FW6mXX3%9q*S+2u>Tz5~hkPy?yOoAN?ALqn z&lm9j^V`8I5$9)!5BpXhRI1q4_@MlE7w|Hqebm{;r1a^Y#}jZht2u}7BV(-6C028l zXRmn8hToq}ufF5(@Uk#bK8k&z~qXR{`EzCNlRzKdEpTOpzN3UTy)v)n?C0?PVG zH6?KIG=WROBtd$CWAMv|<~4RXqJjU(ljtuE4*n?suSawK>&>Ru1U7M&E=*VfJu9SG z4#Hu*!#1l`XLE*;Or;zM`DBFJPbzAwi(SBVdCa=BoHLc+xyIYyXhrFbTDvFMetqck zr$!e6&Tl1uDG5?|@%J!&_A=w^hP@)69C{NtOs;mx~YlMS}Kmtd4hUzZ{;a!!Np2m?5`vR2ZbZt zEo!^JMGO>eCWEu}v%&{G-JV7z#B?oP1e<8#Ft?lp=IlibdKuu#lxU>g3jfd90`5nV zIw$@g_TDq932j>&-lC|eAZ|pIDvF>WAksTnKtP)Gt{^oO>4X*$5v3} z48A&q?d}Gd@MG-#tC_$cDPMEA(K774n?F;cfG_^Z&BpxOq>04#*bOdUl6C7j`i1>+ zfM#yh6^lfW1;T`8(*+o{AJ40}VL#j5_ZwH+cc;a>TZC2TSmMp<8U+(=z!fGBz#i5* zQFs)qlP7Rzdf~pJJ7m5q;qfe@2!1)P`;Ltc_I7S&Zu&HnY46zGBz5-WUQuZX_;!Ce zE7L?OLO^Oofe!*|{u<~qGJA92Zd*xvcRRgB_PTW7c(O~8ZPt4I1=pz%Q~ti08`09M ziA#i?o{XapV_Qna$LQ^^NTn?fan36D7IG4!c65vG2p>zQ9s_xp7*heij?VBxg@*pXtLy z*5u1AD{a0^SrNE)c&_4Xj_{eM0Y(m2L zE>yDfH!0xeZo{}M$ZZ1O7n;g|Wa~>j+!&?3b70B3I4;3V9^2C1h>%q$hL)vm)`XS5 z3f2xE9-idnQHDABI_GA}Z3M>4J)4P7S1NHwP}xM!_pRqv+otOLX{FBPtu%uvdsDBB zXnHBhwiqL&D6MwbpmW7_mb4PRGg%ybVrl$KjOAor(q%~_lmP&Ck-z)u=0V0iQ2A5w z5a$u;*z)BosX6_v*z)=Zd{$!h|~FX-1qxSiamwm-=}^@xx`c zFL9y!U$b;U6;lgYXkx!_xzYBGVT6_ahwcy^>t^Abl*r#Vs6%)1u65k!S1&b_KHBej zN$yeJ$mDxhdhjxp{jvR%)Qo2xFS)(#bq8K?iOaTIF=%WYwN!fHn{I`^z%#ixd!=@p zwVzZ^D4b#e^{CcmA$F!;^AESrvo+kxu!R)$?+By^W5FhJPvTt7`r`%cOm5rgOj4(c zbfj?(ZYdT>KD>GMhxFhdS=zO}Zsz8*hjx{BF`k2Rj}o=hB=yb$dlI<3CeL^uaceS4 zFQeKLjk|ww5W0nA?u=S=(wLVD6=CbI;G(Ehy6@dOi zT%fR%ngpM7r0xvLS+>g-<-}!e-``6S1Ei#2nK{PfK9j zMe#XkCDECYH;l^Sq3JCfyMa|^6?O=p$QVgwE4*8Ze{3n@V-p#JX~sW^Vy?ADC?DR` zSv_)xno#9zb8Xl);b3DiAa(p8L0-M_@@B++-k)7!z`4v@8(|Em$$;fTWz=EQGkz>u z!6}WxQ>U2PA};?}IuPzcJ=k2|_MIQpj|Z6$%s*~S95n{OFuU6z>#CbDyBVrK{;I_$ z%Zg-q)kWAXZuwQ#2jl3%5T>O2pBFnEcrxK~Gc-XSRocRDrf1Ig!WoO=80<&>j-P)6 zE{8c?nsDAQ#o^skVDg3yej3rOam`C~OLAVJ@BGA4H6*CPCI-$%1y7*h&HKm z0wa64sM??mOTPPYnp*+Dt+*hA%Ft#)y>rPwSs6OjZKyxi z)3G{^i;mdXuV-A<2#t(P`}&1TWxS`t{HGz=N1Abt;`F8xE)0?V>Hfvw`#~u|P?8%U zSm2^;E<8R{Z6T+?ZU_%`Jsr%J@-TEqSZwJnD<>os_QlvU=-!xm<(?}K$8KLU&(2nys-O?y zej9()&bjLZFF3x~oxFxk5E6l*S$ftIv3IpEsf-f|Mv%9oLMf=F2WKSzG{aLefI`=GAUBAP%n|S#(fpNo#jQ^LNC`aQrSjJs z4WZW+Ay#gJe-b3W&g8-!Y%*JVJd{7{SUSBSDfScE+?%oHyqK9SUq3WHn(xlnY>8Fi zwd17zXvl;t0RGrS?C!Alg*DuBl{TrCRwUmi{4@?d*#&=Wbv~n~-Db<<#@PA5$S`bX ztJ#(2bNYS&Yn^3UV*^`*S!gL-oTxYFx#WBfG3Dm}AV0a%$MM>>Y`?{nvc>KJs(mu# zB~o4YhN!r^)munuu@I)@o08&Z4DXB^`Ok$_u^hdk(;_w`YxN9c;d$3|V__}{zYhl8 zTYlo0zNBF#R1$${l)sbM@IBfiUE*+ITT6Cn2cfO!^EEX(>npB+zXJ2wnxWg7Zp3e- z{U{P5S*@PknXp($U8O9J?^WlTbh9W|HoiMkU&-fRUq0WLIv&QtA3>dXYd>IXPTUz1 zD(?jr+45zM%S*ci&#`B=mRjpJI0Xtn0lF@BiaG5d8gwDOuIb!54zc{a7G^p;g$_SGFvGY7iLlS&r1 z#UWhPi`*N%>`OxxmSxFhR#p~l-i+ueVyTv3Z>+GOOs6&~KAvKUf14!v2!qPXE zo)-cFhzy%+Pq_c}M28nWdReiGC`D_avg9t9K#(o0LVp5PrglC}2KdW6<-i>4OE_Db zgD1*!>c#PyIpDw(HVwk6t5>04z4mGIXjHUCSB})~t_7M4`S?rxBvh0L0tg2b=}>5k zm|cNnE_^i*QgQvUop+!x+wyzk2WUUHb=MG9JD6Z&e1(3 zN4VDvcX;tPl;Gb#^8QNLfX6@*J<9U#q|QRUQcLCMLrPawZLjX7q0t@S`#Z)Kuq**o zqc>F_xI{B_>7`8-N31DfPPR64`Ej^wMxk$W5l&h825!1U zEX;r#D$VMrT)!!Nt0S5i3E9$@&QRFv;pKL$z_st^cFN{Gay8oz+W8F9%^yPi$nyts zUX={94$8hYLrdmXdqv#7ErNHIY5gUJqB{J%&wK!xwp#3PZE!kf3(yQ<`Y*?$5#z#& z3wUp^>70JsgMB(QRhiQv%Ot* zcjAF$0u5Sh$-(!Zb^)KD%?BC@ecpZhNuP>Uss8R@(y5OPRfolakem_okV$uMG(D5v z^yb=e0w!5*biKQrpLlT!9R{0=J^a|&Nj@u>*sl$j0WbCgx2>(*jj1h0ojhRt9qVc0 z2>nK1Q_(=M`Pd;D{%=~$Y4 z=5_aKsdm%mw%S!7+0u0A+L%j~xifl(zsWl7fDR4^n(dAZRKLr>im|>T7QfiI2G*}_BQa39VwQcZAI=KuPP3Lm8k#6OZ;ETza7>$atrtLY;}qzK`%BWT_j5+ zSxz3=WMpLi0h_5`ZuB6#!|{^kVLMvOS9Y^I*yAOuj#RS;Hpy9v`VTie(g#~}&~@BS zKMgAyb0Ivw7NTBmCWj|bzU?^z!twF`I`G~O|7(nTSfIYWC{uNy_U|6WVXOztBcqZ~*5L*$t_eRC9CHFM+l zQ7n60gYYP$$?^1Wj(N}4gRR-Jv8jQAR|pj*<67|Zs*xoJhB7&g81KXS12+?cBJ<4C z1=6G)P8P0lXFu=Amqh1Jp{^f$_I<1w;&+jX&gUCU1XIwH!Hh>tRNq)m#nsZ=Zp!Hb zj#5Lpv`4R#%Upcl25w?C2QxA6RET5r zV%^G)7fSA#m{f^k#7~R#4@KC{5)pv9H3Dw*{aS_lA+ts z+)f;uVZb~2{O8Y&#|o+sKvq|xyNOSg{BGF)7y)ibTyT2)^NhLCN0X9D$oLKv_-RR( z6nLvhJJxo%`kCs`;LE%oBs}wrQBK|I8be1$@9EBkG@+~THs6YRY|pJX^2-X6nn5C` zGIs(@PQag(U(q!$s_TCHczQk^+>oWW`N*K(Jkz)bZ1VZFrDb_jaNS+mv{gmo;_MM=tEmu?X zjLhX;Mj_UOXAuf`!0nKC_jM29kId`@kHBIlNU_E2d+%loa2PoTo2j#RGPU9PW~~*m z0gNj$-Yq^(L~uwj&nWs#XtUldqB5)@+I(y;5|-J$kD_u7i=_J5Pe&ma6R@Wx7@IBk z^KVX~MHEifIxGfb^cqdtFuXUu56JkVj4NP#a8r;) zq|#Urc`j}0+votE4MO)zxSZ9~cpV+ZrE_*4wJ@E%#5J&MXza(I^DgX3jxPHHo>^Fq zkGQ|b#J5+B2)I;8_;vvd-4qbx<5AX$2p$wfmg@7RNym74H+Frw#$i9TcvRY-Gq-QW zki+cNYP5(ls9l*~Dq@GyyI$pJ7L;)`;n8OcZBf-o zOx^7B{+^`1y0gj|l;XW8cJyKJ_H}cQvh-$)3Zc;qpFV@{^0}q&I5cU(lPq>6p4d`$Utl4uqqu9LG8J`^UDWin0T>0)KZ>LUHQb94| z(`I7$gd8eD@*zTH>CjQD+*xGGfX7)FWfPdgI<+&iDqC#6eiB>tQ7ckAHQ9nCIG4#e z*yKTirF3v3X1_n-^@(|7`;FeOi{1Y5h2zfLEICX?T&V`W>nHmTxBL2s54NwJIN4?V z2lmt$(fg)~^wZ-wZp=?gRM7E@-IO+sf#GoQ7kWd!xcN03WF9GKH z44gdo9!t*%FYReeh7Q)nuHy576NwqIi>()`J#H2Qd#rZ>mQw&Qt^e|~sous2<7D54 z(n0{lR!o-o?MuL@3rz88k=@Z`6QQ~)sSDVjyNoymBqr*wc7yq}I>C!UHNKMpT>4kZ=3amgK z&ad~8cjSjaCyORrp5@wiL$mdl7I#eA4N{bnLJ*+Q2m63FC0YwWn7`PG^}xlN2Q@9v zFoy5}mw|75-hC&H_(a$V!2W)TWLUqi_0s_br|G6%vf8QLKJyd%i$l?v#Q88|)JYaQ96aJJkknElD>F znA^?E=8*}0YOBkdYE|uCb%6{t8r+}JUDc6U=H6!KrggSX5?;yv)SIkW9x|H!Ki+Ms>)N=MnolzhMJ&f&+MPgPrCstao?eoUl`RCOE08klc80sU7Epr(%j9&?DvR$+0vTr{&RWuv zbc7PeUat*hZ|P1Gap~?ET&gTgvEyx1P=g>TrbOyvn$LGa!(I>T*g~9Na>ZZ`srF3V zDe%2jCSHP9uM`Q=I0CsCWchH#+p5YesQE|+uZ&0R`fDdwP_p?|9K5qM>|Ozl$8 zXkbg8t*WD?P%8!IS4B&lJogQL_Ab zCJ{2d)?H3i{adRI(=)Un$w~|r?gKmA%EiB-bxks4a+LS{p0wW2r!902unhnSBQdvz zI}PLEC1x8DR(Ma7gdIo>sop+Qv5F%^hdfeUhmi7*6}Y-W4tCAq^ok%{ZKbMbk?vaK zSn#gNl8Y@&ql;;pC_jQ79oqbptR8vBNKt-J;a_)K{)a5-e+gDTLA(yF3prHMT_hmK z7ZwaDXpfQ+W1?3vTB1Yx{6g1a44LB#XQGzGOU{ZAwr@wFe+Lkm8d8$0jl)}>1zKaQov9l>=?-OuQ^ar%g4qj08oX{Ob3tc3&ejM~ zwz$qvyj+e*aT1){q56E@Oge3k61vv%pi12P)ahENwGm+MqJtA7kFJ@3TTZ4R>lrGq zXei|VbDQL+MW+7IhHrNckVV;J3TsE_%$mEsIkN?H7+bcEG|igY>ZrtitJ9RJTMddv zF*bWa+2XwsV=dtw>`kpxh7ZT3CbQIcWDV=|xJ#{jSmONTp5R`~2XH`edhDrjeJi{1 z=6uOK6r(a_@yDU&)xtkC1=)5vL7*4gug_-)oSWai{Ibfn%nIN0lUnQ3cdD+lZ|ZV| z5VY~dHT?cXyxS)aM-M;b%t;{#f0wv2_?51vnC0zUe1BmzV8UOmRrOoQ$v33Um}3=Y zzg7P+1#$Rb%rm|irFlRMo|u;$*s`3g>%l`t{gEMO>eGlVCDT1+Y$Bib*hD{>RBai` zH{x3>UpSZAlzvncqy=UYu30d3W#3$sAKA#X&B(>-p|9<7$pBrZeVYe@8l|buh`Nv} z%W2To9>a&}P`yxbBk$bI>Idcsr8c27xjbhxXnV;!`A5Bz!inDT>q zgc3|b*ex5h<1L-Ryp6LF{zPlrmgKwWnlP(v-zSPy+E0?806+OnKU%sow7IqBvP9TRf3mXt zE?0@V(dvoA$r(P_olNZ~y4UFw{$R)+%)DIm{zhv4S;2fZ`j$MpaRMtn>*dROQS>5D zF5S7&Q*<`Ur|`q`+q@r{hY9caEQWUmT6%T-q%&V8wq&~Q58yW!6}=bx(!JrE{D+&k zrJQ*#9$66L$@%2s&MS(|kIV{QzY0XzZ-4J_)}J=;2$7Yh44@a01}w&kc;$pF9PjqV zYp5!T>gkcNR3Sgi>}&7>-%N1(8Dx}ECtTsj1qk-(`96Wq?_`fDvtfXIi!XKD*=LZE z{v1jDHL~nMv6ve{uI$%mDEaERwM(tG-NVVAWV0Z(s?~m76py(3li;OQbnU*p8nu5aUD()<%!=5u1B5$*ezrYU)xo}M!E>u*Q#C63v5akMfrOxQW zs@0!DiFoB5B&G>rZ7Rpu6nb>CpiWW3z0jK*s!ck*%c&mLKBHS+XK8;SMa?;c4B1)Q>@U z28_;P{SC2vPS(uSU;&10xJ<#fVVy~kQ~2g$7N=w*sAcC75nG3%P?Go7ZTQuu&fLcLKo|e+eXJu3+$6^{0o!g z&V+1!#?1P2jLQp_nY80P`lGk7oM%qZojS{WUFG#3|H}`qa$!|iXP|VH zK#U}31uePxDcKj4C7D>dM}D9#OX4;ACb z3ZZ6yYU*H@7^zw5^ifp&U}c>cz$He9Qm{5Eeerz(A!3~)UK@Qd2qm{01Iz&IwFt$1 zMYQs8D~J##jmw|MzHa`*i`_v-s7(I1ScJw#&qvM%^WFK<9Q@e4(TCW%#TVqi7oXcl z4CkmMzXno?2kozG-<_E6DH57{xU?7OU1C;$)6XoK8072)#Ow|CH7|K#Nyc}h zwJ2L^<1}v9u-xXctKB?^?d714)skadpc{xJ4f?p(P+BW1XI39{#fFW%e$FnZ#9L}i zjy)OKiL;p%pinAL&UIO_ztiEsn)v4!x3#Xl74zJ6hAosaptsS~S|07$Z?W9uDa4&mEc3#j;}9UIp7Y8UEvZ9!M&F8Miqyr zl&%XT@POosO9cmgsb{_&C`of+i}WWqn`Pss0k0H-X5pVsBQoWN^VW*gJvcxIJ+uAi zI*MORA9RLxD~o7zEm1$O)npqV`RQQoUOl@cqYR3DR$`OW2sr%pMZcUrTcFQ!__-{{ zL6D%cZ6zUtpnUP#Cm~fEWj;%gm~+um{h!+>ZDyn!d7hb5pVdv<&&YK!+FWI`(WS%{ zBTA6!Q>mvhDEYvC)=C0a{B~(n2pL37CdVG`eHrrHnYHL}OvGwV!AV=5>udXDWY-Bs zs{1Gc0S@u;(mn7{V|Vaaeu59)L0pU)+NQ*3%ng)Nxih8=W`a2mcJ17}$NPzy|C`46 z53NGfe?Iqpd2iee$KgtBEh~-=QA)r3iffaI=%BXB*u{QZVAU|fkrUpe!)V$vATY2k zYk@V_+(<%_Yj?e{*~_4l{vv|Q0B_=uss!p<`!)9H^u`-R3u`WU?0ij=3s6eR?E(qg z`VD9yb0-b)%2T`K`_!Q2iw!FSQ|5*mG@n~Kr}MA-`{F{9Rv&#v`Dhh2WI)wpKCY!N zyYeHhKvlUf);6n!T!&)f`#*KGLiskY7^#z1t!!WY`IR&46t@Ym9!B@u;nPVm2`PI6kyX0k^yW9*GwwW@oSx^!-wH4wzSwfI2xAYi) zERFjqe#Nlk`#kmguaN?ogYA{!7gO+Ot@ zudiZy0^F8q!78eh##jHfD;&EptC0hEU~jJ{v2MgGwMsVBHF)v$X8?Ofx!TdxR)?7Q zBy}xx#+Ja>o@LDC|2rz3_L;oavxP&bRU0^>)zz^f#7F0TZKTJH{GFyr@kY&!+>ze$ zIjjL2l10N8x3NF~SF}vM<(RB7N+2k>!r;*0sgcAUJM)6)8)`a;DPs4I-THz$cpUMW z>p>TXAYO^?lzHV>8|xfavfH#kv$Vbul#+k(;2Ulov(fQsew_c@gPlFyO`Mmi2 z_g(-C!>jB#jVJL) z^GhRnj&Z2XQ-%-Ra}xDWovl9+_U6rdp4=9@!>xkp%El?kY`L}Y>%$Jk$o7YLB1ggL z9aFa!rr(4Lw39sVrxWC@nnbeFotny1(NB0pnfrWmZjbMIFluuIS9E7VEc9URi)GFI z178BCJk!#(X~sLT#M8-0?&&S}aQXU|zr9rTKKi2bFDwQ>h(1D5N^Rc&$M^5*8aDNOyflZx-+rM zBZd&T-}P5Ne*Nt`{MHJp>5uarN~hvx?4BqUi>V7;mJvabjL$+@;V-pr9D^XPOkp$X zTTxZ3(mvh_Q{onSKQKp;9U^VL8waO&=UcooVt&&s{Us-Zjr1aNo~~KdA&ACShH}&? z9nKL^5rr2|{c@__F?+%J`XB!NzJFtjP6Bk&p`Mn{E&)yDC$&3g)M&xUccL+XORwMT zpJzk+2v+ppVB^P1M$qdg1sSRmbD>plZhukKhM&(b=C9o>Opei#OSsvZ!Ywr7CwKb@ z3={KTym$=q{t?!AV-2OT;EDDg!3}-z#*N9c>O*U#c&3cUu|wmNtzWJqx0bli#4NLP zl4SY(u33-Uo_f$FtOl?>&MGJ9hz5C$r@Y9ROe>n|JqCfU57NYo~|JxS#n>YVy&;OUj z|M>?F;d|bz`L}HhYlb${UVqIvHLMr3UAq89y_tuM!|E+A{IX~+{>d>W`nE+s*!?$g z_TSj3!s5qF`a(@%t(rO$s@_Yy zZ*kp^n(%sFrJ(p?OyWUT`Q7^CoCC=AMCf|SiTQ!-Xxk^$+F#}vSrY0VZ{U8W;Um#LRmuTJ!+%71oiUb}0R2GxK2&|!>h zU#uGy{Jk|&2RM{I$TPUURnbV*fx=QnY-%pmRfLvnc9m!T;ys2J)zMqr)8<*Vlx&t8^t{CHfcV*bLy`~aM|rhOb-PIK?-PRU6El2nf+!)|JMwYB%T zgV(Co7cD$G>zzk#8iQj(j}DMIL8NPERv@}bNtde{Q=yxSot2P7B{b;QXP);pb`Tr4 zr&H_giKzBy(L-^6Vnv-!e13j@nv|Ub#JH4y%0l2LR`T7)+yKGV{ml@lr(@RoJ}ncD+`2Z| z>gz3X+a_(>moQb?&Fs}Y&ST?eKO@Wt_h{a4+>5u1i`yKK7dUtB9J}Q-MnK%5FDkvx zp(EW!P83Y(DB|FHq;s-s$uc_iZrt$djMVN<#`fWNhuHh?|2y{kN2&P7d(9g=uW;~- z1*+$9^vA}8nB81;_{Av7(ZRxa?z?b=&knHW`Oohy#1a!TGtO!%9I8v3LpcEjlipwC zdWOypQKsxAGSYS3gj~B6$r=27r5-oo+Q+jBl?EdykVzoG`EYNJ)baJiNw3d8B^0vW zy_eql!lT07+CRQt5RE{5HgFpz8$OsV#Bi$}gG-&Rg-v=dB6md(Jf-&8lt3=QD--c* zRkb-#c#&2rGG1igSz+x*n^@35)*k-6Xa{d3XHqOS4cS%bwGofKh+3_qzJQkcVSQ7Z z*1nS@WQlw0v=L-la zgo(L~b~P;_ZIEV;A(H$p+dHRC9=UU>z?aK%)#AAo|8^I_$saR2UNRp?_1HMUSiKVl%v?M2i{^Llp|I+ZS0a&FhSzEp_@AL z?KPd8GxM|pz8NJQ*`@ZCDdn6XUH~Ko`R??m>A*i^w@LM-*57OGh4S-V%DK0-^J*@>i`;KH%+65ZTO;*R|vu8ov*Ch96@x^LW+DUwG+q2QBO1U2^-brMF9K!_mEp$lq51PCRr%CgYE2 zo`Swrs{#XWNv?g3?LyB)euV{W;)j+03`;6y1+TqY?^R<8q&30Pv{T}%&f$fm4~t~O*97An+gU@*0MsW@_97a z82tV-HZL)jn_Z^QgKmLzbOo(H3e2d8@i}&MaH02;mEx2e=cv9=)eovYU(OY^l9f%X&eAnYH!o5AzufZEfwA!wm#MNBS4cgBm&+lE|+;KqGtc z)0_m~T_Rc<09jPSUElaikGVqs;uH5T_oj_E$nko@Tnr>l=b zc;YdwzLTAdIZoo(rlZD!I@YJ@_ay;n$sRU1Tk7Gwqi;!h$nKaVYpwCoXWwIE$<&^r{wh#EYJ9e`XgV9CNmkxwmCF< zhS`Jf^U~IYb7zehO(~Bd>lfoB-XA7=4@5vDOoT>*h5)bpXaGE09mXN~)QV`;6LgiT z*ZcKFN=?}%B_%b+rsi5ioZa^mFu_NGkl?*~t<(WeRPJi8q9`M?s73SLsHiAg_h-&~ zL-U8Vz2NsBG;ZOV3v94To_*@dmi`&NK_Zq-_pC#Rv6k3}prfFtnNo_g8GFVUe{8tt zell7O=%rX`OLPBgF=?orK+V-_lYAO>2ldz1r#M)=>?qqCh=Q`(`?N6O! zVZ=X05%-lG`qHkA6r}c#O1B@r0#~Vl9C9s)ThHCf_j4c#p zGanU9(s{FuQkck#>;9(qKtJa)bRrsRaNp-)#nsoNytK*~nb3=o9Pd6RBJ5%xbTuq( zHdn9r%u~$ju)Y2F15{8B9)l{suYg{EU1UxZ3({Y$IY~}l++MHJ%}CDlAXlE5_nj@~ zw}5)tAO2ELMYirzi%NT;@D~>D*Sr_|SR%P+4Dc%rZa-p+o0}&TyPcVH36HECH>rq)7mK zTRr}2t`TTcWzsfDVNiw7rnupXqQ#j@OU*U{?EkKK|#S`778 zU;cf{Ki@oCAF0{3z2M^FVmq~UP0Vd->$diHxbv-_?la9}JhcNmQLI9?$e8q@JEcCD zDv#XLMlopMCi$eGprGyIitG@~#B5`!fi?_QNXYJBD_!5nh&3WR%69N;*id-|p1l)R z9ZDyx&j1}c5dP-$`x|@xN7%TCo}M1F1=F=GvgZ0i0AgbiLf_4ecRcZ*uJy%LlBCj6pSLI83e@Men-dWO5n#=0?d%m@($5kRoqy4A6s?EzBU z%})KG{otSO`T0YJ<9c{@U@RuTsKts6dbtq z>k`#>oGm{u?|CdP@*)qrG|gGWZ0i@OAxm>9^X#3?|HB&p;!n@5=pqR0v=OM6ns9M2 z?-TP|&W@m^tzTy5&Esbfn**?Qd=Srj?2I4YoaQp}sdEDZVlWPm+~GEq<%2ZIpaFBd z->2Wlj5H1Nb&AH9=;FE$U}4jyd*J3BX=q82(Z`F*hvDUlz`1sa9nG?vfiyHc$HCY% z1)wGkDUOk%zJGrsvtP(k2Pc3LVgSJLgu&E?R(i3`3J6=LE%QW*;MvK|6?+nSzNZ&= z-Z5BKX>)P}mrV0OkbX30X*c^_%1A+3nH*T>O`kxvmpLYI(+vtg0C5Jdh3QL6RpuSe z=0DyR1+W}TUph6?8gSQ@n!D4W@u65|FsXI7Z^}28Mp{QhL*w?s!k)kMH%sc#3ce)DikLRK?jJNs%KANAyrxWP2yk2;b%oR7 zEhyS%b#r`dgBOz$mvwLhu+yru9vN(q$ItLkdOC@~o`zoug^&EIXQV05Y-D zEoUgnMJOKxtZbK1qrFjz0*zBHT`sucIG>zMk5)x6d=Xu4Wuphb$M!_$VRsNwRzzff zXgA{mTZwcr?_zU7Xwh6V`~ch9(_`EI{^vHVcIW-2HoJ-H&wvZpOHM{!U{5=5jyBQ` z-EKffd^EWF+x5N7PP}0`MYr_fUvAKRl}FCIf2z)3@se^Ip-Ud?wVnMQh3UvqY?e}V zIvIqv%=bSj;7WuX9pcea*HpNn{qIj}Q9Cz9k*NbpqJn}hKRGO)>WH*%MUByQwKZby zGd&T!RKl7}hyy8*gAdo{dY5%Lf~!nxZVcl`xnRUvZ>zd*yR;GExX+Q4D?G|eb)M_D zl-*ucuFiYJD_r5B&O0VLT4kInbsYDt+G!=hgB(Jt;0J-@X2VE$oUE4!i9Itk_ks2D*=@GiW8E{Ct z*sd*2k;@6#`nHGMw;2GVXu<=QJPUTQE=d zhT;oA4yh#7DqYy4O0l!!qUeFU&niZiAS5UlWfvza_s&(8k3z`W^gi;(0R4lve%-X2 z@2afx^k`Xk80VIEc$x)VT$%(<-M)J_MmPI#{jb3JUqOWqco6ZDkO|o79=~F`yoYr- ze02su)r~xz-Q6w5BP-|*U)UY01VHwBWF6b})wwS1&g`m4t>6SG>YM>TLOq>p5hXbk z_2BtmH}h$T)vq{0{oeCM>?NadD1)jyyq%{wSh7>PZSD_BqAu&V$Xw~n)M zqeb8=zyt3@O{=dnT&?P(kFOip<-j6-Ohb)nwh^ZV-Mkf@`tm6J3}eq!EQbaE=U-Z( zd#zW+{b0YQOLSMge7A=&yKgq8qB_G*GrjK(-3Sj@sS!x@oR-eHA&<3~DGPrB_%^KqJ!go*)x=1aX?%}*`jZ^pKbCvAW4oR_)_7Yv$I}DQ2^OgpCO{o8L$9>%bDFJkA-D&}d;k6|U00@? zNzijT@MLx(&@md+xrImr%&7I(#OumEbVCK)o0t42fd;YuCEC5sBkSAoVs?%3m)atc zh1~{TGYIG^vT1uEhDf0mN;FPoWt> zPt(>M!aqBA;7B%WL>Y3g&0k)kH(F3oXf8+j$YwRs@4~cKugpdpPn4bV&ZojGU&=#x zBu}VmA}WtM;m=nO-lC2@y#0p;!erp=v9+pZs~jEi?FO?YX;sep{&hSBafYP|FHWp&}l1G5Kb zebP?3AVNbpnlA7t)qmSZW?jB=1xW)S-nn-1M^1Omo?Y5K+=uV&i-P-$Ll&1DaWtUa zJusrS%RN)KDN)gKCvJa}?PdHDw#w#MrieznLCdi3i%hNroFC1bZj2Df4VE*mF#VJ* zJ@(~GSyWlsa!Ci)v$qM=_7E77R+!b z2Dn+Let~mB`MB`f39JG;$7^C@(pg>w=cZ|5OE+o|vCeT^+Ib_X2{)kZfRE+qO%aZ- z3SJ<1uD#%i^F|#xDD1QwFut=~JL2hh!6U~Xr~ET1VE$7lyJb1(zRxe?N$2K9q&m)} zPkfx&#XT5{%+k$NQiO$+WczhZu^%IZPGg-6p+WZtT~#gjmEzC<2HEHpH-4$>3r;6kCH+L*xU>~bSoeyq>L($lCVt1p#X_Xr350e0fhfr0lu=cYZ|7$Gl@rak24Xko#>LSa>&u(51pwCIr#0Ah$MEur;1 zntjo?BfNce^B5Jyw3=$WFdd@32V^GHY0N0aU6gB%PhXdtTKi`j8g_H&tmzDu$O+g;#{k*Y zl$L+tykE?DYUDM2@h%D2##VK-#VcgQ>T+~aI@LL{(Ag^=4R2Cth-^`Zy1rHCIk(<9 zZq-BHtzQ!V3+zv}OuHf6{vUYOkLAJYaFJHHqQAROj`h<{OJGOQdaQ>vGtMSNQkp`u zjyI1ad|l-OUmkANMi*39zxehmWOr74KyFi+7FY*m&!n9GK=|Hn<~V#+!AZ|@qu_i3 zDQp{7x1&S@0%$AhGzJJ>_VV?;%*N)3-kjXSM~m8z6#ZO2p|Lh~46H-b&d)>W*^2?_ z-Bn`=$~>(LHht*GtynH`{y2r@huUB;4JOPj+gP&WLlzLV>#=8cNN7>`L9%Gan28Oy z#n$TBp4aMOl5VJi2y82|W*RIn4OGm=-BjnfL=8F`6Z4vv(vH)R|0~y}c7Z3uiihTJ zRb-Qp%9QnBDSPw&$zyKz;i+?rqL!8;OGlar=MHSf_cynD`VIBSj;rO@&$;L(lHPnN z{jj3od<&NlH~*xnsIzBY9Iz7v-T84s(HomN7oRKyuvG;Dw$p?na>W3~eKd1( z<*q5S#nv+GQNr?9=ZGKq`Q{OePbEAkZ_>nr{0xnZ@E6ov6%_(gQl#+Xm^50JL_p+d z66H-a(2)}xkRxn4V5c!*V;T_)1#wEeG~46_Q3#;U5E_t+N}V#lZMg@p&^z>5Ct2*! z=ES3@4ILro;$guIK0WA1l`nF>^Qp{W{_tv^^*Q{gdeS>L)(mvew+(d1IdTO~d^0<{ ze-YFotwe_EszVYIkZn@ShaR9HiSyTaHa``d`Y5eA(tiw%5*8<{H&Fw@%K2ewZf+J3 z30l08Xe>zSJ$VuD`@*>cZ{Y#EnYmd%qLh6culH{@uIe@O#z9oWAnnE5E7uF$61Szv zsHy`a8s=)O2vXwq$A(;NZ-?+N6d%m7=|t1=?TdEi-p9fbK6+s~Tt3)J_i3wUpAS{p zARP=4&EpLS0?bX<5Ww6=WL(mu6lm`qU3p)^UyZ+r#;{*bbW??lT8Htf7tu( zc&hvN{}NFWkr7$Rh^*{+PIZR}71=A25GQ*cr&DR!3E3($D|;UrcF5l6#Ie`OJdWcy zzqh*YJAG0&zrVl#dEosT*XvrZ>v~?-Yf@X!kfuZgmv!p&<5vUaWCgG>#KBhyE8;kz z$5A6#6SuhhXAT9hy=}IWIcIR6q6j8g3P4bPpa`@ZS0eM8Sa)1A#X3#?>Tb+H}l0S4;^cCm+8fhEP2(~|{Wa@X&Xyv1v z!<2A5B*cn>vxp-7;%;&<1tdf$ezh1~AR|q2n*rW$8cT;NL3fse3@KzVi99E_3F!Uq zD%WwaTqI3C?XEl-IlPHKSm!Sv>xK8_S!XF^vSWC5gNe_eEykBvr)%U>+*X2@Evy?J zJ%{ucZhyV=eZf}*zfMFi_F?zWW;IdBOLA6LUf>*&T$~bozH{g6mMuwkbLK5uwL+vT z|JSMV^$iB!;QmSK>cX9K0=!A!vKHNyk~6puXA|ftw6lyNyRQKN&an0yJLmSzCHGYV zu{}Jj)>Y+qZvL&7+$ReE=m(+%gLh9)UpEGb zKTYcxyK^Z7Jfu(x|K41y0ne_u`OlGFHH!Dur0T^KZhQcu{8FEqjCaK~f+xSia|pvB z5H^}h!bqTKX-1-NoOxdWfY(JbDPVWS@A;3xTTh@`Iq)fP0tO>8JcA-YHh{{>X*cl7 zyHz|in@7;B;OShxG8F3eMgG-(ix!D*uUnV?DPaRugH6vD>PnB5?6}(1K03Nw9dSEd&A^XhRM5dH%jK(gb=puKd7ie~gqW-HsK{ zrXd`;=Qa$Np+grf@?5YRD4rxBq925yGL4vtsYXm!6eXlm)fUE6@cxgv)&l$qp47H$ zN)@D%R}*Y{pBB$SLeaXKh`bQ766mgF*ZB^-vKcC1|6*QMzTACozgptUQPjzy(IqFn zAcVtI0xSA6qW|_+Z~K#%O%sxNhUctOs<9jEO68>qxf|TG4731-o>Q-V$1({o6cR~u z^f8ja^%jp3Y-(_Qn#?zSR-2TEM`R#1`X8|VM~sW=x;w@u?~-V$zhGw^AQ;G>Nh;qr z=d)<1PvNoH>vd+wM&TCVIY~_~OE1pyp2##CxT?%-k3c7-IV^YKYafx{?!Fo%3X!9K zA?@U_{w1y(Jr-eA(9T*oXLo?JXbx-PvSZ;h3#DAQX>gh!v?lhQY*9bo9IyGl8I^8w zG=+N5B2>Qpd|zQz`Gro0UIHC@p%(STQoy!v z`EHyJCejB>Deoz@Ypd6$eyY5wHWqVQi!&73XOWmeuxyrCjO`;C<0{~&9O^l?u z=HfvzaoGm>CcyJiIIors(O1(9(=PGvW|hBWM*5*&d6@)7o5pqeNOm^6o_H|OY?3;= z>79}2(_8%03t&f@2EI&RY_pJ;2 z=0kurn&eue&PT|GqKuG-nfcWVULGtc^;$gyjbp8Qi|fVh+|q5&D(YzQ^%?>76{)%7 zeQ9b&qEq`yrfQb66=Wce>mDl)_)HPva|Y51Z4O>1uLT$JPacU!*%%#CK}-j>Kb&K` z@27^=f^1Y|*=C|9`vBB{YR8yx*U9QYjE}2`!AG_gn32`#Rry@rAo8tzs4|aa`+}h~sJhV(+d8(n2NU zUKia_q=j)y?NFrVb zmaM-IEU_!w1?G_Lg;K@}?zKnhe{JzPgwaVklUi%PJY)tUw; zciuHa&Uo6*sk^xAqS5VZBvOit_Q&0D?G9h)H7PlY-bm&7_#HWC0utW&-3(ktlWI~T z?;{6klf|CNN)!)dFF!9SM8#n$JsUPtE)$S1>&R^2Ba-HClmfgYuE=IO_(8%~{iOyPZNLz_kqSK12C>eTVM(DYHHgP)$FU4cQ}8CSx75 zFor_UaxXd>Lj)rYiEYgNlg#Y}vOp6JW0F{dZpVy=I}*iji~(e7(Tq(d;}&iFb#f6@ z%{9i)wa+4ZEV5xp`dV%$WWgQJycE^$Qd7+JCN>DiUJ^m!1X{;N7B7+=^VKaE5;|nI zN_n9#Yp<2NEAE{>-7xOWge8*Tk|EzXQ zfQR{ze?~V*Ir*X``tzq;R#P?N)TI6fDMROSq=H+LPp zdm6su;b`=Vs_woLnm)eN^{k}#g#&kzzL%C%R9=^QMe>*;z8cQ_Ii{enBTvc|d0%O{x98M=CWkNyd0;aJ zlA~p!V@bPX`w31^Kj42_C;+A{WHcRR>JCww>9%sW|5O}zpX;W&-t=k>V|K46im4Oo zS2IY}EF8CV32^JKRgdmxM1d}L_vr*#V3}w^P)AimV}wf)7aaWzWv)ogIpS>-<+o!3 z<{yE#4u-x-9o6bC?Zc0&2j(fygt9oT-fb0~8)V$%blZxQxnT#(`{>noaviZ*^JN*S zjm+7d#&wwmbBO^^jN&U@Zr#Z;{+(gy2-)ROvA!tI1M1zMZMjv*L@P5Zu-m+%5I;xyiO9Q{wDj;8rr zEhlMs11A|7<3xBcv_KSwS7PTOhg$>^bi>1srM5K6MseDpEV(wDI#UhBCYj`uaP$Y0 z5~($X`Sh8^8&~x`ph3<7lLq~34rs<&Zu*c%1z6^2YTwx5cBoQ@Q;4<1hybrbYyf^Gm0Dcxam?UzaeIw9wez2*y%GVX+{YH^r*WK4 z)5jy;h{*%Hcks3C^|M|*;R^XD;Byzqa+HZ|C8!=P)83*B{2bkOMbP!kjQ#+~E?Bac zM0ttjSY@P?bu3yqW<~XOf2JnG361-8%2;+*l>1_<%J~Lcxj+Gyr|Jl!hAW+LwvEB4J) zjNQ;SmO#gb-kB$$HJ(0E8>@llA^mkjF{Q7qQigk8k0(fTq?yaVz0$KvUN3+CsaH+f zdAD>HL=9%soCBpf`HDbvpbM*!vGZ!U+h^cfn0urP zXOi)B$I=e$EAJuZm|MBH#72CD96UQcgRYiPVI4K6W>ES$Hy`}+wml!;dkP_nGeZ7> z0;vhbflmVi#bjS^)I{RS&<~6EG!*a2dY$l?f{!16;_*4d3Dt62gbb>rN$L7_&7HYWb~5b>R1!<{L`{W`DYHC_8D(8Jn^jCFuBFgx8A-E z9~8-ySF7=fKf|k>yUX78$s+@H0cLma!J1Krnol3lLy7CW(Ool=EzUus&X<60Qw_Qt zMGjhOx_0W=hjkM5CFwkjuXE?eN-J-s7>$$)hdK$BmcF_ZoA}K0qLO2xpMUmn2y55C$PjO=u|@f@(t#TwIUsR>ojkc&v9SQB)J!y?lRi6 z^U;=Q-TTkBJcY$VowEmCmR-VY)P4cNyz6A7oDoFkV>{P^OlRQOCRp>^na446cVkv& zfkDoYl5*S01{eo(%!90&E@LLrJnukLb;oc-9b^Bz@9 zr%0@t4VWsu`amC9lG!fjo=UPyfhIy_C}>ho!}}VTvs!l?tk_F(o?8SqkiR+*l2Ust zNP!lmkB?ZjYqYrEwoJ)8#|S|Zd)(joJUXoE#mosdn*fMMT~WfebJy#_fy8(3C#N;l z1%|t)*#n7#Z%_A;OW!X|++ay*32L`G&d`zxa=+`Au5lM!a$rQ#-e&SmW?FsCwa}O{ z8%I(8vIZAelSWCMiz&~zk+aK%A=!)E%g_8rR2th}i+M&~CLNX%Bj-Pz zaB|UI6L(zk*p5lE2M(oEx&Nen&|knq8SPfF z$l5zn={nzyrFv&f`o<{1i*kftSp>Rs4VmCcy0EvdQ_Mn)TV$2Q^&FeGmf$WJz>+_h z8mx$)$wMcGY6dnpXPse9yMBZZvR95X0=vejS5K$qi*cVKmrr$)9s=D`V-L;Y# zo}Cwszfnuj+mmY?oIb5!R(M~4gTmvELcuQlr00=$_l%q|r1@~{2%syJKc0yq-TBfl zUjpxO6s7kdjVlMlkr$G>i&kw3hsahK?#2iUe|X743(sYwd0@1ncH{1j?fcy-FxkT1 z8lYmxHO6_NzIQe@*4X#v!YIz^CHUSRxX*!(mGp4coe#GMe(*>gIRi#;kBlH_zJ&K$ zUB;nMu*ZSt-n=8mFx!OkWP9j4r6Oxc%0 z@qsU2JW||+`QT?{y0yo#A#6X#xCQHCPSCaHTWh3i+?R7XMoL>>=kC2d*w>m3PyK7h zu@?%O9$h$;3ao**wY6<2ZK_qAn`RnNPKY8^Wq2U(Gc)mNe%`MCbp_N*A~I^{krNJ) z2PC*XBl(S?8j3R0GJ`|KScjEfD~t|8@QKqv7lJE2DhN6QjkhHsb!Ft!r&*Y|!8_uh zNqRyGg5;s`aP!(lsdg0yh4<`mwpC{0xcF+Z-X2GTp^xKn&pR6#>ikLPz`>VO&eoB&m9i2y%T-i1T~KF$E(<3#j7Wuo4>7Tv_p{@><))rJ3e za=%_B{*Ntx703URxnFh7|0$Ghti=DfLV@>P4Zys#q|$FMG0HMEJ{ZyR7f{NEI3rI3@URzNi{ZK?8w?KDoAZsj?9ur>q zCE=K;jrP3zdRA7JUVgblk=I&-3JRnADY{qJ!P$A{u`=5%(aYo0#1&EET?DEz)3D#7 zvvi{}g4aLOZyz=rhkydc0qUfWK7Vk%& zWjcID;arYjYk5-U=5q3|(MPp-mkB05&c;spw}Dx3cYC!ghKofj%1#*x!<^5{BXcS? zKj(BxQ8qS4fgUnu-|`3UQ56zee4zC&kyo^|)~)ROH2O?nLHV)y6^OuBsc8k}KEB4L6EQTOGa* zAV74tt-a)Rq?U+c?-J)N%;z$I$>L^Upl)>dasLWxEul@4mRdpd~mufbp+%hX4wG=5N zc_U^gbEZ2JUrdjw}JiR$#C%4G6;XUcsNB_cJ`@kQ~wf%m6_8Q^5+`;|DX-VmY$#M)O zJTh*bBj(y&H{3|C3dxPW!XK}fVKlxdqQ3!zTMEivH@4+2sSp!pUL{TEIx9kk*7bV} zgtyU4fa`M^NkT1XJ0S{gar3%U{Hxvn<^lgzrBR36zx@Ee1(zLC0k(X%SbG;a=1o@& zOp}ZK)2VDnt$nmK59B$7!ge0i`8Ep8gBgY2F8^ox|1)dVUBJzzeyp~e_VSy%A?5U< z-hRa2?p1^XK2W1BXj~vMnDcLdn8$I@G*3&&aWG=@#Eq{MYh1lpags|0IPi%}?bb<4 zF_ofa3%(PUWKRe zr8sHM!*b3($Dtkfr01+_8D@*}^288#T9fLVn+MAz88e^XKn#CsH-GnXag9G*^HgfJLp6bEe(k2tsz7z_fV=l}*Xpb~ z?5U-IPIVKkTr625?zpi0@(3Gc`E?7Yp|vC{d5}^k!?^SfB;41Nc6Y+_#yG*f!;UO% zz_EX@_ZIIZCU$n*XHa$GNDL@Y!SlM&YNuKrc%&aw3d3@YP_g8_0h%GrzZxeRZ%A70 zW{Uu4u5et=dzAZ>&vU7@^Gd{wnfKI1-X#ifGxf&ExT1iXqXU{00ybZ(hc zEPN>=5PcP78Dz(|Z5;tv;=o8eW^CN(&3GAZC3bs}Pgo%JR2n@zyb9R%PX>(&M|{ig zY-F6hT>(?KLm?FGizkEhN4Xf;*d!zrqpA}D6NoR+ z$oCNJ1PBBIYt7SnKOb0Bk@M^};j8{w+IMkKz^BQq;ak*e?Yse`~ zB^?LCe3?)odBG^?Af&3vTPD^w`-_Z|(Xg&bFwuNyNi}szV${gMwNSq+z1Onvwyq5qvhZhQ#!vMARs3^OjX}^jB5Bcsa=fJ> z>(OxI%4~nAv48Y%9ME27+J5!Cv#YC;v7Mdwf(5(31G;9#i-OT-xlOOo{Mx5D1u?~i z7R(eD%Jp*i8Mm6!d+|@dVm=ZskpgvUmwC8E{WmD&^D|y57rgXF^uMgF}P`?fcOd}z+iq^$K$qFYSQF0C!}h6cmbMaVE?HrI)D@4{Wq_l7ZbA~u+p zw~Ue9`|IAE6TL@pQc}p{>d}(b?eUJ<$9;M@b6%&5&EXqS!zn~JyXzrAGM?8t6?l3F z-G}a-N5A9_`Y4=TCK@FrQJWX&<@sq4rgPf3^hDO`WM^w%Uw9{I@&WoF_Tuh5hE&&o z9R`*Y-6zMhqKy0-wEyHVnD~WfHMZf(eHX1PyYCZ5bEsI*uOLR7qQBhh46uDUVcp66 z9Va<9HFUoq4EL&W#T_$ky13xJA{LKCD{jxiO!ePg%8IKBsM*#hl-nDmR6h7KGEUI? z$MaL(Gz<4U#MJh;BcNXEGvk#{E9KwvNfzZZtR0JN=17 z#)k1LCEPe$SK?eYGEzs*NgbxbtUXYC{rsg!5m6q^Nbv-FDM%l!VV{8oQD2OU>Mz%A zCi;^!zAdYIOnD9oed@T~694ce)1|%rgu}_nyC@^ulp$?6kRRjMyP>tME&W9^{3FpK zFMymJxt5mUwv_zsGT#8+yCePS+*7;AX96<-dplcqKP^pgdrtY?bk{g88@`co1rkP4 z&7+RJ9!q@l%}KdkLfh(&{aPGEZz)vrc$vq6-?&J1lz@@Og@jG#DK4C?+cXH+$xHuG zOT4TaI}l7`ntOG`n#SrnZJ9! z_Ci}%cS!8afB3UA#=sQ}8PM@R6udx|rH>Fd@xssg=90Ns3_nVVVWym#ru6s^1JCq? zM1srV>e&C}`cwr!M>>CP^}+g_>_b8I?3vDqp-+_uSU0Tbrqb@t*-UQ}nITZw{O7&>%yfV>#{m>; zFcjn3-JMz_gQOs73c8d!w>oAdr29rFU+o|2{X7FVO&tg&c(y%idu;(fa$+;>d!9Nf z*?b{JG!G?69#V!5jdmh#8r`g9afy{ERDk}NaTiX7Ezoi9kLl0!)G6f*W z--*xm$Fy<<5Cg^cB>~(2`8S#vTmW!HR#%wRE|7ejbl}Qx{9lI1}T6lFi z3q>?GTPQ_jq+eA(TlO>M5;WmiifSiTvex2`Sf0<~ba7^Z1j`aV71a^y0d}>G4a*$jg9Bj_M_vODW&ZN{ z_P;s5$#oPt=`Yit=o*Wr0*}8oP46$LfJ+wUq{$%e4C$J;B|e!SqOO1?6s4Pvk+=aj z(3HJ(vlTTS%ej{Gg%*L6VbjlcI2o|jI?9d_x@J;}8KJkpowj&B8CAR7jmr0W8FQVn z7@g%ctO+ZXU=TFO)wIwzJh?~4ZsOfoGSsF;eaB=RK()ZNx&v`kAhjDbTC&e(i1X;Z$78CLYlxOr+pD>Z8I7Ut#U+ zF%?pdtu|-=)wKX>E9v#?2C_?kggL-%7*aFG>Z9f0ND>(I&J}MwtTNs*e&yA8Ee@g} zr53~v5(>{YIu^gN#E3@VF)a&mZf#GlfHDzobX#p!Dha&#Mj*^~fl>U8S(^GEyOP2c zNoO7mko(Ux&;e4&HmOmqIrc)#_GbB1m~czfYSXe*O*C?S<#dH-Q>iwZ6{QyaTxhV$*-y)tpg3SE+6nfIZ^#CwU z%u~C|LnxwunnRo8Z8iy(Fq-W!8U}ib#}L)TB_L1d(KWSs@q`R%q9DZoqE_-pFXSRT zW0DfNIOpCqUrS$l@&0WLZjs>7^YYQh{IxXSb!RIywb9o&_oj4H`UsPi%K7Q(EaB%# zPn=AMQSO7&CahX18j~TFMSjG!_?8+qlZ9dTn)bNdqBojvygR2l=U=lE#O*7VS5)?; zXa!jWDe%WRerlb6qZ>;P^p2m&BXposKpXl4UMNDOrNR8;57d5QE%IE=zy57ePAcJ2Q~K>7FGvH5fp)b71VcTCf7u>~Z2;Gm*SQDOY; znpfOvz)K;>-q(>G=oPuS29wIQWtaI$A|}+Kj&sqg>fAtgGwjm7j2DAO;N9JYcdu|NzSC{{nCsg!G>(p z&0whd_^)99Y%a4&xPhydZ3{n*J1vQI)oj+@I$p)`2kvuD@pQ(5XbF+P?;&K`#8bQuhXRk0(RnnVPK6wF}i+4~=zmRn#<=$Zh*j*8_%IZsj!5YYn&EnH-07tqOkIvx52 zU9&tb7PKi5A7MVjuYvreR0IbW%>1c#`t8#y)=#7AIUQg;*I) z#287gXcD@4bF)B%63RT|Xley#pBUI&bZ)tRo|WaUFyw6qD9#DRW`?Vs{M?#TpT4 zLR@n;!bYQR%3WfYg_*>7&B@?~&nmz$3y|fWB%HsPhM!vn{@(4_jkRua;4Sm`_$AZm zj8>EaCK2d%>^(c(Th4ggRgV*LnLJ5!=Wa`9grT7Pb81f=pKyV})VNgKZ!6!h_d1A5KIr)d2cUOmXIa?x%+Jsn01QNQQj zeiya0`a!VhqX)#pYQ0|>6f&bz?p%al3w1z2VfC)E8q>*g2QbWcV=9U25Lr15>5WMJ zugh=f(-(Rj2riX^iJ0bee5=v^LYJdctk9*9`3!WBfD!dcQJ1ObC&6p#^Lg>> z9Br}Ti|^_xD{(;%&Cw_Zc6<-71#W?UpY<903PRvHLU;KJJLRM?okgf|wD9_R%5WRR z_^TG{nV;VZ)b%p zzkd)n-6h4)c0a6VAjiqr&2I4x?NWg)zU|M3c#B7y&<1#ox@!k@hE~~)@>4~o#oY_D z(O>Sn?SH#+%?g5}{9~FcQ7 zS`Z#5L9oxhZg*a%Nb$fOAqMS=l!skelL+i%GRhTg!NUqSd|rB=N3Wgpd`lZT&C6(K zGyLFy?>eiTEal`oRp99^?fkU4&x@}v{BWs$(!ASwsPMlM!b#w&biflo9+D$mhe4+u zON`<_#LGLF$6FEvnWXG*mjliACLqguyVd$()r}_1ua!G%tQ3h!?+F3ZrT6bs9`jPU zecQfS)d~ahqAqY1p4#+~nrkKDaeh=mb~9K7>+06mZa(;I)Z1|{ zDf^kj&KejNkdL?L6t=auw-Zy!|7*zX`6KWK&K_uth#BLK+1|!+2)`9OC>k%OGCrDK zcAt6itY31q`9Hk?HbYp*M0Fh{|S?NOqXFp+Bo!G78%g zD<-Ftt$nqLpXbr_rJ+(Eo|EHX16bw%-)hQoR-e`JkkU!G;DzVWv z+fO%cIrqJbVryq7J*ap=Ij5jNaHSvOSw2iJ-1IaK_X%yjEbMcvF+AJ(K#w{B9;ZMk?Rx6#7x{0Doj;xXOs>I{D-LFk&VbbF++d9Jq+dp&Lyrifip#aJlbf zgIJ}6Y;ER0>_gdkIMr6|iy*fh==-qv8F-ud+?s#z$OddX7L8h=aagdi*Lq zugfo|0YEjF$Uy|GI_O}N{PGKn;YA2fK`#}#)9#Pks7praKAXW^1oZ8Asc06Vg zZMrdfPkJqt>$Rnt+JNV@-F%apu&}cOa1Sw3VaG0|)EFYYU5(aaF_vYVrgz>wLRVXr z^Re_#DR+Nle`f3tTY>3XEmOhiN`nx~9R0k1-7v1Uwqc8T#X+g!jY z@o{tFbT7GV9Zc7vIHW&c$JJ;)`lfTfMA-XO9Dc^CHZe_W_{D36!;YF!KU(04h`^N% z4fng=@B6bdOBDe^lJtdU5Bml0tXT{D(*qqdMp0!aHpSJnVuGdDRyV#IF&5@9dJWVo zA)p4iZ6id=k#fwB-6wJ6Y@Ia-cueE3a&+c+bzUGysN#4Bm)+ud_HquOOQrBlIYHPk zk)YYS(*9*uU(9NSPYzQq#a+gm9b{_kWjuhb+Si+|>^ow(ysxl`a0f<1JS5E?5&D6&I03p&eL-8;@s!Xu2NN*muKCVJbBC4iOI`a+!FJ z9V@%Z*e13T&6e$6t(G_K?1o~DS#a~sy~?eKjU)!DA?7=uk#daJdUrJv6&2S)sH=f% z-=e;+6Y~rFvR~zK>#wdDu879!N1&w*_vw=HnVXSaP~=748mY>Sq!)R_jS5Ip7I8kz z$`UDN^@;C!iiOJkDiE=k_~g{`vhR9p!Rv#7Pw`rbkqCVp6*auPh!rw&cQD`SmyIt1@DVe8j3oC3KO>QBfN=;2V2L(w9*`0B(!pv}ZgxqQ zDxc5PcOx#=2i2ZRi5Yl34J1*`hd&MR&-99VEF>a3*UFLQ9%}jac76maDgxF^P0eS zS-r8VpyjOMm9I@F^>FbUYY~d+gPv21=;Fxppddx^#P3`8zXKN@@Pc^XozHN(T|}1PyBS^vN!&UI4QqMg3tl&NGZ&h8HwQQfN$l%(J7E@ufE_%YEAPM zK}r&IOhNXr>_pW}fiRuMzHoBd{BmLFl8Ywu}Q_EFRyK{+`8kqIP8i7Jn6)E0?&9$!TjlocqxM+TNSDZtEZ zeo;$HvGF&?^oK#B;S<}eG%4hGc>Z5j0*bI?L+kA|TtPyv8P>L^fK&f5`!6w!?|ivPiif}(I-e(R^%m; z4}y0f79Z|VpZ(qgFCmcx7{{b-MMC3W^8NHfnDAvSoR-MGE!Li2|4ZLkvML)Q=RZ&S z%~2rL5!PrATo7i|&Fl=Pk#G3^?)b6)VnT(AoHa7Gsp*31jU%at;A4uet6Bc7EdNp8 zydng|h%rhwG#nx%WOIG_;|a+Uf_7YYx{|+V^!U}jgshkk)rU!tzs}TvFU8`gdE~rx z$ETtt{)g0C!_x4nBfwG>Z0(YPrJnejkdSOFe)5~j0^<&5*e!P-XmE4!_x}$*dZQ1d zjwP}YB|j*`=L9dX6SP!3_u+>T+&b}=HFciipeT{;9?bZmDzzVgbuak0as2qrZv=e# z0Fd@AnVnzhS-u9%zj+BLY(99~8Y0~N^4RxIjH$A4FBX;+>G3j_E=-Qmzm@1Sunk3Qvgh`A7j_*Io{(&1{sN#`jwYy+_%G;9@eADyCj({7u&JyDF>Vpac@IH!e3F;kdj(LO8&LGiXKv~*1r#T^~Bc14YTimOnGS1;a?f$OlqcC=S7^6sB1oCNLUr&!+z@%*=f=^A%KPvW2fFQmTfN z)d?AC%d5W80QX z+m;1y+0R|D2L%um3~~`UxMlBaGruDq`=?8_SWQ93vr1 zuA+=TR&t;BbEJ4dNd+{UO47}FrXcX(zk}Qt0013w#hEt0$q_3(12?He`ETA?6F?-< z_#<`Booh84;z@_Uv)yHLxcFbVZgq9;xeJT`j{3VFfC_Tp5VbD>0118*z$8?VpP7Yf z);zTm`IU)(_nWsZKv)bL*&G1C0^Z!+gH|<`L2tqWfV5Sy74*D>CTgJZQi9mA7S@0b zN2N$Xzo9K;`c;jJd<2Gj#AM{QWzC0-5^TQ|74JYgUIP3?J8ToRMDe7&jwpeCj2E}NaV$vJvqSuXfj+}BCKBJ(BG4*kZpAIRdS4U3JO;J_dsW8 zQw2Nq4EhQ!)yEx6X5<~#UtD!b+DsNN8JamMdsR-q`P)Hx9#j<`7`SlEKZIr?1zdO^ z>+hqZ^PLBtM}7;x=>0MLvKcH=W{LU@VhFzXfP7E6197T@%^A$&Ww< zJix~5gg=iRsww?n8vK8`17J?>{sSeTSn8Xx50|IWK}E=8Y7rpjblq&fdOF^Z*B>

eZNp0;+L==0gul3k##G$394?{t&S(+_QzPiuz9-gsjy22gSz)QfIj z10FaVuD~ct9hNn-cZH4&J*v5)%*J54+K|+HxZb*=yK>DEcXKOBo@qZ^u%8fi@48v{ zf4GZ)W5It}OT6gb8Fr|%OJW&Qyl2}1Ae6tTC5U!^_>3uUO zJSwW}elV|kTnASr_JRR&WfdKgjVc@1>ZId&KDQwi6Id{MC>n^L#eV0Y{|||ba3SXfAh0>g1SF%i2aq4A>&6(*ZPocu zI=!Wj!u#hu-HaXQqmGH8%cfb}n!^7Zt=4cUAz2$8DQ$mgW{v+E$jjEvNzK*>7n*KC zcu1x2#$MA^T_Xs1Om?{r0}T;w`93c^MBr^9cSK{+o9 z`W7au&mKN!ujZX0phi4Sp3i_Xt^I@~bqrj)g zWbwVLh>AvhZ?Vk}Y2QlHfBX%moA76|59B{B@;k#;UoM(=eLB|qxmZyr!$_+xI~#*c zEAdzi?`i8}2<7n?em+X~w@~47LwpLwnp8}O_~TFtZp&T^d7*=yP~oL$wF}?$i-;Lq z-x@q$8XMobNcAaBQLwo;M*&fW5RJbkt*N5eFZ@C#{f^*SGig%5UVF_UZM(H<0v0_S zvsL-G2>U;){MXy$xSU2pUqQE!3+Q>NO6Y}^zVb9Vz2cs89RbH;ExS8L4pvh>`!cfb zfK|YbhAK3>p}b&2p51G{mkw-Idpc(0%4;uYbs>Ky4lpg48vgX~xj4lNMYh%cS2He) zf^I7>^ft`x&Rb*{bXJu0X$2~riD$)gm!-3w!6eMAm9lIE&ptHbyF{B=FI3k}SQ$Gl zkQvbhbZ@=fOJdm9FW^O@^u4@JDHvQDI>Q=JhH;M3m@keLL#M8-y~?X7yAEyjj{MJ+ zRee6F?M$<{2r>^_x;n-dpZCKh9*!DS?wHI&>Pqc;@kF6D+kutCUa>m3s7Wa~Y=5q++_Ov#X}R z1;opv&V+hBF~LP06cOWUvpyvybpdU`f>tvv%TV_43<*zJ2I6!6d*E3|M98(i&vWgB zh}-**uf(8r!u0emAu{O-Hf=)Efs%XfNTN@B zN_8cn(F;gV5wER}!Y|~MBo%ya0jga@|EX;V=@M{_*?2Wx{rptuuv8@h%1{@REmq;9 z8ng0#yxJ)cru0)p56(&3Q`s#{GgdY@fQ-|WrDKwW3$h{~eR!B{vB`Nr`#QkC^nR4& ziHL@veiMA-*W4_10J;NMGW&9j;F1oU(~!I9ChOBAU>aV2qR`GZsD_HgTs7CJZ{%cg zF-V#DRt%!hzMmmTp^$SkTjtLqmJBL-bN+4>1w&6;tLQx|tMB5UP)^1ZkR>2nHJT|0 zn|ynV><4?@Kd}j%hun5N02IyP?`&@w;0?5!*rz+9{ufLI8UDKf!tt*G)bH`!PMfoX1b-yzq zKX}wkdh@E6fW$hfW>C2CyQ&VTcB39=8&Z$XCT+4|{`!81?z5qlsjM%2lj&2dw zCE6FVp3d1ZbB$TAO3oa39sy>)0kd*)@}O$CwVeX~Ax0vPfeRn`5iPAPqa6waud(wx z@oMn(^#Bot3yYStd{S`bK71dhY(U9Ie#^gZqc)j}fm@O;FO)tXDuuw`z4WA*Z8+L%-jy`C_ZGi13A_$UN6+ zJ}Sbx3ws$KMn``?oc6$J8+)NEjZuF_4TDE1I>K#ILwWt1HtS}Rrp|4G!ucqG)P#rk z60(d4TbTn%H!mt4T33tR(@zQ}$vyCtWAw3XX#TD4H1+tAbeFK${3l+8o}p?RZ^xCS zx^1I0qOHgJkVaOXFeAv=SXM=Ier#c+q(=LIao>~PG)PopnsZY}ftEnnjVm_H(MQj! zy*f=ov)4~=4`to{+Y2jX1taEI4+gv!3W{oxJ3j=C$Kr4vrh;$FP~#q}T zaFpz8mlsy&$>(A;-QxIt+3_av*#>oMuGbEL{*^8pGW$-p9^T-+aMSq8n03`rR9R#~pO-S}>eu@$z;}uHMr$TSFajyuAEd+cbvv^Ea;ObI$ zWt>oMpslrW-W;Vh{Y>!P7b>T*Oam z!blI$(sUTdXGR^hdNt6pDP!A*ghyOosVkS82KS6i;pa?CT?J*d4}dpJ`Qdeit>2bg z%Jum-Zw^lsfoIzT@q^)O0IfbV!YRWz5~mnrt@lm(tYL~wyaW~U{}vCf(_cTodt!#k z{EOvAh{|2?Ub2l*+ib~l_R?GeVWdbv(=X=;(}SueRW4Jb;;uXF8-A)Bxxa~<0YLF0 zKr48gn!e_`OaZT6(76-SB8c)ibo*=KU*CNsvs4l_!+>;_6joVL(cY_-4gCdL!3O*% z=m1%9sfQ;1+xDh`p=pUoD76Wt)?6&4(%nW zIO<-(Q#{!)W%G8b_C&hCelfMbYg;^d-d;XT&e_trZm)sLkUt~Ga(i)M%0R^U1TgPY zp074d__$XAgYLhXWK$L&Zg#ya-Z0<=Cj^nS*dwXz4NwO%8=s%#<$WLIjNPobvX}%n0;xO#~f0DbrCy$(%|5sJpeyhR?VM#y8i!-my0&0GPz+ za96_5RN5M<+l(aMkp>>kI!e}6^dbFtibc-C0H4Vf=y&_tUiMcwd)D&V& z(o0_)HkdW3e;8fMNXSbaWCX3!~%mr3(K4 z7<=ouD7Wr?SjQPD=~7xLB@H?UP)bU=K|o4MKsp>z5tSC{P(Zr72Sw=?>5^_ldWd)5 z>Z#{@IKS7w=7TWzzV}{vt!u44n&_W4)|-{t2a1}gH;9BRk%Zm3FhW+!H(HPHb##oB z#rim!T-w|JYA%)VFgU{YYUr<}dtA)VCr`M{!z(tXx|JFq|7N2Zn0J&2p1w87ljVok zJGI6Ju+K>+?eE!@@FuQlG9UbH#eee-s7&OzrerSP1Qbc^b2|9k6C7$-LZQD6wW*n! zmiTY~k|)$@?2+u^0u?SSJt0wVH|2d9i{Mp3CBjnn|h z!%N9a?dPLrRejH8$okU9^}IOv@_#>0}yU>K3eR;$kXrR&8)u|L0r13e!|LCv_XaC zY0c(YB?fvJHD|VDS-FN11ta?n#lYa1GaoMh{AOejA|WaPCusFk#8SO;0OYqGqkGKV z$M15vUvI0GzWy&^$sg|A8B{+joP?Qih?*Xu4~C9{>1(Si-&Efr@RjiO@DMta-1U2i zY*I9OQ`@blE64n494LVyI}luv@|YlpjO!PBrH!LtISMp%=Euc<>h}N2zB339Dul&T zafr^BBJsLqz#n6=5qh2<`c-ASMXEhMcx5Og5W*@&$;-b;5;@}8M|upgMi8e{miK&U znB2b}bduRYbwePzP`|t~4$-{IL|{%k!ELtRW$Vq`6B$iRZ=Ga%KnYWj?iR<~ zV~K{NzRc57Q&aWdIdO~${!rRc+~s5H13SEMQ&U&MW#aSKP=&~D;wqEm-q9cItr(Z> z_V%)!cE&R(I|M~(X=RS2`w1d|1oI+*RLwu_1>IJ5c>0D0!;zQp9X;;mkhSsiU#o~c zT6cDP`sq_4x0;^=$)7uCsfT4m8PVm27Ot-OEF!(s2jb#_0kDO6?DM=0FzJ+3LCgw z9T;9daJk9fLv=7S7h+7NBwpmGS*M>{SmDc!{n` z^wXJ{uQyu3kSP=a;yvql?_If1|Ng~Emto#`lC{U){;v37w8o6)qD|cG2$?2B9lcRb zuf=r*6OEw`nwR?45AGK=edOQ1h;5^;+2^xRRpuu)2SbSEw^E$Qn~G4z=`bh#aU4|Js<X5;`L*iz&=ON|VTM{HLE<7BPz(NxnWh1M6{P;jR<4Xt^3e5oT z$kTr6Lew#YjW?3b#9h2AW?3_P=u*y?anf->zD|g;JnhFjd6Idh3Cg;?_G#4_yl$RH zDf?@_J`0kr5p0S{_$b!kCuib^(j~t>#yRM1{Xtt}cj)&rFwfQZP|sK8s^~`$SR?0P zJIV@hynZEfJo6CQBxRUu+MVr;(|sfZGDwC4F{Bcqy0N!~Mbe7ZiIj(?AP^EQ>%aW4 zH7#j8Q^|9A5GXJz8~32G$6Bgi*L_qM<1=+%PnXN!BJ@AMwK9no#m~?0%DPdiCT$2i zBy(e17t2Uo$vAPu{$Gzti9pwUczfPq7?x*mTWTPE8WxW$qKC7KZA+<{>mRnGs5fqP zPHC(x6!1XzGh>8RGR>vTs{i6e4_Om$uR)PF$4UZ)~`%w775i8{PxE2F^Dtxl`*1`Sb6~RT| znU=RE-ujW&+fa)?uNA`j0mW$ObiB4QV(o($JN?N%6V;SV#}QpC@@aYGV95F! zmfaUx9A{D&XG^aGrPw+1;E}<+(TZ}9(SnnUR5x!T3f~mHAAn>*WP%Vwc<#q&<`c+p|J}6w76%pb`C<8{{_!DM>thY-&2S`Je!0e3 ziKP1|_E7F|`j;ZPHA`nTkV%cO0)}cj{$wHW#%4;!roz?I2VVxXi}M;8>&8tV-ePxz zN-&IE>mPKl2t2+K+TTT~mHYbyd|)MsEAKIUCzv@E?yfS1>HTLkqyvn`B~zj_1VX^I z;b2{jk4w*fZOM2Q2BRJpX6(9c0FD#6hB&w~;Hk!It~D{koAuRvXYrL`XG??}O(cv| z@H4xVJJUuAWnM+HYrITGBR40WBYo;pYTm!UJTj>tL^+Hzqo#L8gEy@S&3Cz z6)hjj=sxHia|%U+qY#*O(Is&B+gEebcVw^&B-(`VSLW%SmDf#RTJnJsD+^gu${xoz zOte&8|1g68_i1|obBPOHvILmR7o6(4r+p!vZ8W*;Ga*QQ<1w~p4`?jF>0CYa(?@9L z+P?8yfc#R33~EpHia@scnr}~Exb6S_+P{9Xe-U_D`pm@ie(=1V)`_;vrR1UMZ)Ag<@*Ye$EGCuW-D6P&`alFvlHP@t=%!fAS`ISof~A>L%yj;1Dki^m?DuH_^w`tN#WSj$`gG} zOr@rzW5?5L)^nyesYA#2_Rh!O`8VzPX{{cIjGh61r#hhyaQ;E0va&zDftSy{3Y}|n z*vstswWI{a!(~a3N&KyUi|~X1g=&G(>BG*?L9E1m*MyeeBGZ(gF5IP5zxB^I`}1$G z&q2cnh`zrZDdv`V>9ys_zdiRR4~t#+hLaorVSudhgOaX_!Q{SCGi$Gd4xg2v^=@5! z%+F^Um%}VRe|}7>{Q^FN_?fq&pW{}OxgY-saMcVw-d(nFFpHGue+)!!QxYxTSfiqT zQd`w|17IVQJy)bF=P0$jafEs(uTI4$(p1r^92~I(J9q99IsYblVq=StL>mLD6v6Zx z$RB&*aM;@NoxAKkH|4E-=H-*qxFb}?dNKdrvc`Sx24LCm_n#_K5D!t8+ik11$Cvh>R}EosN2=_D z2yTqH&Wlzt6VeED-NkZAr^nQm@?>Qi!u?enWNMYE^nH-nGve!EYEsh)PoHMVX zX)1dpZoK(17D68?{K9GRi>qr!?+88x2X&PV#?Mac?c**uFuI6I$Z$=-R!dx1G#7BI z5KDyM^e=eo;^R5Wt|!g-$b^Ej1n;%CqkN!6E8`Fpfcs&}5t@D)39&UbBm)J&wf(UA zW~$h63r|o2m}JRWk8_#8B1=n8M9U&a3IcZ5RyT>cg4;S+>NKO#cj^ob4Q|tkA0fR9 zq32J_Gw`93_lNdS(b3PozxTBlqjqn%ZTfk^+(TGjr|VMKNq4TJgkcM=dwj4nly0Jh z`vyay8$tQiD5DT!TZcN~RH|1rRAbF75=w6mdj67F9#VlDd=w(K<~GYG<-w?h zg}rl(X5ibT=kv_m%sf~s^vhJsG%R<*ooY2ukwBS>d_GLKB)x2?2RSuQk>MVu_phkw zf7VH+1rXK;d50=8tL&L?H|E}b=P}NW;57KIP2|X~y5Y>YE?q&xS<8eJw4S=ThVWT5 z60eyHUGn`=q7@$L^X*1+26}4nzTUB#(V_gt=Hg;}O7Td)&vK(Ku5qne69Gu;y}Vrb z9=rKi`BdxorwX3a%fq;`{je0@88irJWgc!>iQx_GxW{F`Dn^aev2m|Fcra z=z#kURxhYlL4Yn&3*eO+Vp7B5GHms7yu-;>`KmAVDyMj09E9NF;Kq`1 zbxFjbua_jjDZcDbp^iIy&=8vJ+0#p2AvN5i>D8luxsKi6MyIXR=RTQ#1 zWR-BWD?U5(va@5PUqu31qu#jO$L}`qea4BS#o+rF@8?u=Ju}SV%H=b<$XA0UH4~Gw zZXj#qw;GMK!O8_QFi!?AJR6QZoLZ$2UT z{JER+(%_i+Jz89tLUO-=NaQlAaZZV8fiYmIjFrwSU#$5W>OCw{ezLDDmcsGp)C($j zF5FPLk-dV>_AdFL8j4)3mto(T*B+|(ZLm2MUC)0R+F#*RB(ou8Gj*c%1C_Va5ZYCz z!Nyv0ERB|=#9}tac`qS1R~et0(>}3F5SVsX!L=--<-5`0I(;SS^SHB2$2ElB0)nHG zNxh@G%fzx_TPt0<1!mZ0GR9&XQQJzMyB~CS3)bSlrqQ4bu@$}o(%7x|MMyei@o372 zF`H)+rb1ck+wyWp+bx5Ugb2gHYW}smq?uIj{{LZT5q-m_A7c@W97!+N^oG}D>WTuP zm8EFalX&WXhMmc0ax;3mh%iB+CxWtl@6d9a?v` zU-gh@R~!x|Zszad*Y*2xkyKH-nconRD96O~g&JExm;%FplT%Oq8sKAjO|AUMm_WwpM67S5D_tznB0M>)Js z@OUsI#Q3k@_~%!H55|umaO`?27O z9W@@GH+vM@e-7*TC25f$m-A`PT?s)}y!0$YDm(*Il0ae-q^xkZwWfO3)q_YHf}sCpbD&oN zcHnVH)i*UzD!7YNeTNGxR!mfs7DC1ofy? zal%4Qp(KFL(>*EV14563f>0qJu3MT01m#8XMeFoxq97KBFxoD}b zg3b_BH%WQVbimbQUXq#&?sk{+;POsIKyy{}GV%Od zq|H`^UF>?yKu*$z1}ZQ=nr@GE zi^#323{KMsqcjmp2o}xvzKuRs?iGD()Bi=b?;I>6J{F=#(#2>j2+&EIlsoCN7vOHP3%JV9^! z@``5M^sg4s9Ng@+6haew-{FBltGW;pcno$*R+Cs=HBH+CyKUL4HDccf8qB;^!^S4Z zFGo=IFawciAcTz*D6q))3m>($Dd>G1elDW;K1bf{-?;<7RseD+`*t5?*KuKQ%(Z4L z0-AZN8jxi?LO+dgNZKduUGc_I{%Q7O@bvX-x<&ko;2u}Hz70Rau(CYPsl8OrHGe4- z$O+}Za|M5ST-U9)CyJOzv}$E z;+{{3YK6gV3M&L)bTu+>PL{_-Z2jK6tg}9A5u*e9NW?(o`s9czj+xZNR!+N(^G)tQ z)y|QV$elW3=^C}ZFM`VxR{{W%DxOq7%Y z0wBj%V_*yZA|T2>E9~q3kTZ(wzsx%_4al%?gjy~m3dCwbEmv+Pk)tvS3N#Cwq0*8* zZgsxqi=g|pWa5;Z>Vn-I$O;|7Icy%%=c8F^gq=L>E_3?(XJ@;1cjKpq;@wZXl+b|E zPg4MLd1p5upgHbU*VTV};oo~9tpT6P_EJz1d`9+w1T_JGRa?s*T^?u#(B$QnHWkvq)gHgGN)s@O; zvIzDp>M9EY8i9PwkES+trZh9K#$r|nV9@fx@Et~|*mIq`%g#)07AwWiokTX##KGng zje2C-1FBX_9PE7RoTZ4evD$o1TmmaQlk0+XI?;TkVYc~~0^pTo0;D>eM?>#fNgv8( z37|gUKt6&?uP6TZ_eo^aCz6bAfxhDc2S=%b>o(phu%bR?Sa zxkx}vVT+25Sml1*S}zfoAV#CGLv_I{RDcN;Cf6Vp*3a>OMd{~H&c6aOTrY6{=_wQ) zF3&UWt@j(fy@96{t=i|b-gx#t(#2)Xr^7DAyZ8haCAF7A48^egzW4OU=e)8F7vN`^ zCls5LQc9#AA#>pb)7Cs^Z#;%^XGg?r3mxKZEl{wU^W`+j{k!@APgMk~UF%#@~P&*3;<&Nt(oCYT}n<@r}|^sjg4 zh+eHYVXKh@;GpN$-mV)t&qv=KZSKekeB_7?!3mv=r7y zi6(0C^|(k516DxtJn0FqD#2;pse8PyoMZ{R^zwzvC%kK8Adr%L)yq)C3SdxX&-k8X zeNb?-J=^GNVsbrdOwL4S!i&|W1*8XeQCm&pFZ@?&?W_97lu8ue|8x2OR1;DVG%7m8 z{mR@j(5XGvMi;qq$L8-JvVpQJQWH+mGRZJq(exs|z$eY#gf2QBKLON-DSm4Nxf|O? z*?h(YWxor3_cO=;)qX-diK@mPiH$_5H-5+XI$YTc9`_Ke*l4-myze2n7m5|cN-uJ# zveB&UB_il-nHgi-*~#s_XT)O9!LcfrB`&a&Ot0j#{9Rl%ak*R()z6qUUZNAYjG&0( zj(D6b&NFtzW?cV*i3A%vTTkOg(j}|cpcKZzTGw;e-$)y;Zq-FQ-UO`dycOzDb131( zfnw#ncbBZu&RtiZs&;}DQr;kCB__EE6xNT304k{ZP$WHw!-MPPSyD&JORe|%uinQ0 zIWV(3N%j&=GUj&Ts(YaDafW)w{-AYS?x?*#VX$}XeqLQ@%CXPRPHpJHOx=1>GiJHtYozz&ao_PA3$NDIA>K36=&-f3V?Lf6Kk{!r z-tIq2Gdmco`dI7!V>bTObg=I-V{^dN4pwvUsC{Y@gFU2}Jgil(?2fwp=anry7Bree`ZxPeGZ&U zd>8#)xX}fa`4Z5k5#%3h>9A>PRNcQUXI#kQq+AP{w`%~{=_;E_4Du!HN2=;e!F&Ie znf$5RUDPN~54CoO`-20QSyOxV?O1&_Sn2HN+s-u3g<;V}4J#h|-R52sJpQVeXB?o|V-u@0+2~V5Lm^*KmQ=w;(Hr$$B>FG-dLY zy6y|Df-nT5Ti5cEQDqEgJWFkAN>u9dt)Y3HGi*S$(WekC!||fZ^KH(%KLY0tmFOq> zdQZNoo8cH%p^f7{=P#}xwiBK>R-@Z!9{eP4s9mpWVfdj0j{Rsk^%F14>oi{Hb5*RX zV6dnm@^Epce7Zf7Bkg+#Q)<*5@^Z3@Jeh|g`=UayPR_FP`d*mM^zI8$3FfL3=BZkg z?8+3_wrOdE{$a82<74c+BqgXacbroK-$w{S<^ET=`Zx+76w++Hd|XPcf;|N*lC7ka z{=+7d=`v7CH0@|SrttX|%$xg2zosxYRAGqa<$v4(0JqS$HhJ zJY}Gr>xCrAJ13F-Pd4!BmNZ- zOyF2{V9E&1q}IbE{Hw081yY<2TEU_2@)qHEQQX?(&t$*hw|y3s>lL~7rMI%&-fjrS zoJ0{LVsKC%!%1*omAv{rYWLg@uV4|dbU236+k4nHU}_viWY z?@bcgv(WFYW4UUH<(hkZ->Hi}Fgl)2WE~dYmDtFNNc7#}KHgirA}&mn|H1^z@&yle z!()jwk+7P2`45($#AC+-zy#^6UJsD;p)TSn1P3BKyKc34=ZgjW_I0RBxKP*}&f~oXdNxs(f4Qs`W{&%j*uGb*U%KLc^ZWs z;n~t-x(QiZTkV;T7mbdGr`!1>!&g?~&Adct=84$ETdcHl^%vZC>PpK89ODly>t;UR zqme@yj^0=ruR0vk2zGdQ_o862i>KqQL%~M4DoE5ERekAe_rB_JP92OL%uF+et8van zh9Yy2>^r*i4>`7DwDepn6Tcey`u5K~PyiX-X36zpgPemEpY$(BYl8!#BUavTYvmYK z*w=O4legD9j)sQq*J_nkU5}Jb3&VBE<_{8HC^xPP*WB_NjKS6SU0MzQ6l0zpmt8Zb z6faa_Tz$MfQpTV5sJ$j!b zW!5#Hohl)!Z!*X0gTgb0o`*y6-oR3l-DWr<_bH%x#mBW?rKg9_%5Q&^f06Ue1l`MK zS^HZ_5uTjR!L~>FC7#6*`+5s$BA+PAqetW=^CB`@WLQ{*(HSFsZ>g*NV#qFb#UMRC z@>VTu3yP_hN~6HWcmA$Sl<4%9fx*!J1#?^ zYh#st4!&i5645y7@SaEIE0o-DPH7Z#SfPmePF!_ktT@ zkJwv%qW2gNZ4q@9(osG(j8C+;T++PfXmdD@gCEUAgpExTSRL#$?_H$0ma)mZ(ab+4 z>tlPb;_cViwVY~Sp>Jy)XV2qs;-&2L-<)xEP<6+Qw9Ibhku$shLm2+@^Jq)lX=~=` zvhgEB=2Lt0%)qi&oo=dIpF2`_JQz6aW)IJOeZYRavp4;+ZhxscLM!*|5AQi)Jl7t2 zp}iwvjLSZIemS|1x~s3A1|}UBDDhVI5}_6>Mrzok;z7i)ikKA?9x|hN+{UDh)e$}X z*TX~WPV<$HjwX8;6pgJ7)bP5lZ^K)H&$5uEx=!_0k?IzS2_1p}0J#LC9CkDCe84R7 zwtVaB^ocM+AzKI-(&0QaRriC?hu8i7L)-rS&ZC867WesjteDDir%uu44L$xad&BCu zgY8};IXex_y{yq5hM6?qxvVO=HJ^Sr$IT{;weqmN+Jx#A1G&miwri=D1tB(I?ejJ0 zo>}uXb`3_)r!siTRc=S_*uq@5~r&jx+e+iN1~=%M2=J(2e<1E zl*3X}huO0Z0>qEpuHW#!>|R7-qjtQu-{QI>Anvg$;~H#KvmZZA>AP?&=W|TR#XKAl z(F^oZcjJ@q!BX=Kd){ioaYHiws9J{v1|&l%_vsY_L}4?uSyZd1A6z9uN#wL~A)Of_ z)fj1Ut81Ch*GUQeV)mg`;5~$%1cAX=!#++wR*Wluli~johQB8>E4U-Wb|{Y7<3oEx z`P^!cEv5d1{rEiQg}Q-l*W+2EDyPL@pN-Jz;k??~DyoeGcIdzMSElGOvKwlN7=@o@ zDMI^1MJqc5b_0iEE0oH#)mi%+q&M7ibvS0K)AUuA{blBg%9Sx2*>LPOuOR+8dBc2um^xWnt8{(;PiBe42oq z&2hD^bVw8Lc5JNeOyutlz4N(fbtV<}2d!(HlZMe=#YgHHHFeBCu30Dlub=(Xf-C}5 zp#P=7YV4ye3XHT~)C=z1G3=nNk>yZGru-<%^BrrZSh)8{>P&?Z;nPn`){}=~haiYx za{8NQ#YIKfFC-3lHydqA`CC(XTczc4gtLB-6F6U~vl{D*AoAXGJ(Rsg#+rTh|~N8R|>`3etG9P#PAGtQmm z_4TE|9~FdRZs=i$Ve)_ESby&B&kx8u@YO3V$UvuZ7&xtuE04Z9U0mPS+!Yhz;Y)b= z{lZN?1jtPa2d~v!0)5DKunnvcjrM!$3@(JCfc7WtnGMxh&ex)|LU)i(SRdKz`?q(s zjZ1c&!$$Zkqs+AQ>i+Yh9EhfLhFE)qjWC5aa9VF-Q1&V&BRblPaAY1VFXZ&;(|Z@n zu^Gpn2Cl5{uLBMjquBLP?iYaSjZ8E$Bp}#nYny~*VH8({)Sb}T#>8Yib1its!7utZZLB&l-=Jh`@l23{^j?4IsuBt%9}H(KNd5jak+#+zLU$ zGoAG`M*32>SsK^GqNl<`(VgsBSt-yO@gSPUoC(d@6WcJIxdGPXDaHHq1OO(z!oxe#X!gs`xm&5kxx zQ}TrVGx5i;4`I^l?`Dcy3;O%!vfUzk+3mD}=*pw5C;Y;`D&-(;?yXX4Wt-_OnVrl! zMJ7Sh^WrP6^u0%WWqi>L0OkGCjn+6{)KK^LMf^Ycr5u?A0 z?|$bzu9uaM*dG7O{xH&r2n%sBPoBMHKf+RxD1fWH`SJb&WvkwA^P)o}%c>ujRV_Az zeNNTb$F?MORu@mhE`u!^+nH(I(M)v+7*^W8G$ND|{3|;te}_>;n23=MV!LZVdjsHB z(IP$vH(52VNF}WS+TkRdMGX?KNPwY8ah{w^~=ynQzc?RS^ zZbch=b}O?#M*pC+{U7%hg1gCy?VfY6otqE3#6~QQ4rcko>o#-5%Y~!*4HbPnm&G%@ z?jEB@c|5^ZHoZkVwdROtR=Rxn6w&8kJP$&|X8VW_bB;|GvVKJQuO}H^mvpCs*0epI z-5bSB=;)y5M5N5 zmr4=_sv&^r`G=(vKL?f4Cw?pM+1dM3QB7|-DavVD*aN}!V4#PIGJ9yrIONv15QG>J zcEf!Neg5fHYo8`qRThI5Ead)pZ;HWwU{)S}g+&Z&7d>k8OkxqLzqz<%=$O!YC(p)L zd~fvArz2KqZO?%%ADd5kn=jp|QHD4ve_L}ItYEy|iFC4GBhPR21-tSi zbUq?iJ>e#i2PZ~pqNXDslj#ksA&Gi*Fgloh^we<*x2=6cSW5&I*wl+}Lh>W)et}xg zN&X&13<}jE-zXhaMhU%j5=#&5DRuQOE__=IG}cNKxlRo+BMccRI3k&_7K?-+i;tp! zo7BZBD=U|&=u!YzGcCp7o%myO(OT@RDH$9Fvp6s$OqX5MoY0IVFQzUYG2bfucP9k) zObSeC6uEgI!gIJav*dpM*|k@XkQ~~pz~U0m*Kh$Ghk+V4diIgCo)|T*$1mgef^l6& zStR6O&7yceJqm*O;RZbp1Y*$n`+sjPSRERzkK8bO;LNf4r zreJ>fIZiQVd3k^GpUE%KOuM74xeQ_E#KZE@N<-?Cjv~%-ez%j zdtF-}l%tB7ogJqAnyGyUp^G2Hof-UqP#F-U$HAQtM_z7}w_5+MLVxNK@JX_urtA+F zS8ZSY(LPrc(TC2>UiHqtf4JKt0#y7tWea;wIjo?syz^BcIpwD&ES7ckQPZqg-sq@`hmf|-+Yv8Ei~JBM$1qa>xTN?Js=w{K{Js>HB1y-J7z&xcLUnBa@j@<|4$-6btkMf)#sO3qubu$)ul^DOrS zUx z)uV_DI;JjzTvbw=0Ncds!|PZzD+V>HBzIwlEBqg?hrGgW&>VY}^JUPsOj${R$%ru9 zq^i~wztPS%LK$&j=uCf3IZ6MA&@8#FTfaoBA8~p$c>(bNMD%y>EI9LP_W_ByU`Io2 zyyS0F3jQ#|&|*+5FmFAaz4d9&u#al4$Gi)EYJxuDlnVAU<1 zM18tGZgl>Num}q1%;P}uGMl~*hF1*71K;C_N+c1l|RdSb5sJCKU1nBgk_KCAK0NNqeRlxg;8ej3+Et#YdRq_?I@iAG z0r0TiOalT2#KOgj!B5Y`NxG+!>oHJ73G%z=4_t*N(xAj};t~=Fz8(O+?avw;WMj^$ zB*{2kV{L528n9BFkpqPOhGMDJ3=so!)05J9PS9#(7mzU!J$pO#&8Y-K1I0Id{CX`_ zM(;r#@vu-pnL*IS;qmVz2inC1Z2gSt!~$rO(MPb(n_`$fW3x-cN4za32B)twp)zHS z$yz}l(RKL9d-6!d4p9#@`|+G+kcYfHfWaLiKOC}CQk$;#uKW?y?!*R~VYah45- z7-hkj#Q~f^!0Ql&Bz{0OoEcM3p@4al&6|Bw;y@p@4Gh>R6W(HRZ(w=4`M@m`_&YQj z{)TUyPFs)aKf~omNIDQN&rPzKTb@(aqPwe4Ki~{FG6Ns|(-0wmud_-#FfgX{;qJ0$ zp&$bYD)c6;vrsWx7X7ZedV)T7CWW>0tKR{G5;C1N6weU@;u{@nvja@Q11TYfJIda` zBA$N+SZI6G$siZtcV_qIYP3*zb>HE4|MdyFkGuv}ML8uzX!F`Ce_o4{;_TOiXB*rg zcc!A54wo^9`fbihCQ+s9jDJ;2t=d_VW@2!+_TmuayLQLOd1qIZd45b9P$OMeTV)>| z`q)-U?T|W(v8V)9*T#EUY^`VuF2JQFjEB5Ma3iglFm8YgIk492@5%pmC!lG1f;|G~ z^M9Tf1_z2?AGmX79F`f$#B~OvBlBuw66?=5uOo!cytcZI49qz4ci+!}6u zh6kkR>4HwKJDZ!Eqh~zfXE}(fxUoj?+sRcXGeKoa8WwtydKfU{_IZJkna}0Fr7ClQQYT}!1FYAb{0-s+^^@p z$=c{meAtlBZv*{Ej~8lWy#xxW229+uDEqRY>70xg*9Yp?UyN!>(*(3?r7I~(YrY+Q zo?WYdnZ}Ry1-jAVqw;dOI`gs!A=30i z8~)Lqptug5N zYsyG;q@h>Zw=>P+`}2)qopnDhAlLNNra%v{PzX~aD~q3jK{jUOa+KVOyxyx}kZpHo z;&m3fyguT%ThL%(PQaQdN^FR~=SneFuGa5iMqX(eN=~sxRxFiti3ramk&1pw$~Xnl zaTB(XGa}d%sWGQVmVTBYO~QAfj+;yWcI|GCeTlX%B)*$66A?|AH%G;9n0^jC@hQ80 zA$ebScd0**)i*25oH67fisz9SJ~DT#YPdOP+QO(Z#7$T7Yo7iw#?|JM$l$?{dBt(y z{S)tNJrBiOZ}aDpyPFHXPX}NrpT+vo`3B6SaF(D7u*Ge7JOIVpI^oOkA{q^>tzBm5bs!`*xCoonB%eUEHs0%ZR~b5SPH zjb>lBR`)EGJKLCo5t=+oegUF@qW|3L9V0vA42qjmKdZ;fK0i;tnB}pa;mRYfaMqI6@$j zE$@!sz*u(dtI*QuT7P*~s{!m3*m!O>pMG7S7KxaeJKqQ`$rt~k1(7}3Al+#F84L8gMsekdigrXb~agw^8vOvA{y2Q8=^TABR0FW_p=WM97xTUk3ld=aAY_~GX2578*(J8eJNN{6V->uWm; zbjr_!>7vx*whMH+YK>-c3_p3zvX^}?vk*hPdT~;|m=4|0n{~I25k;REi}wce?L)~Z zd02-QT_4pDJoK4*N*~^nI*+{0nJDNRbcvrUE?cJB)ctTSeCJe$N$~-#xU3HD4|Cl7 z_)K7;ByK)49>LbCif_OOh7Zb94Sg@<&y-O)CG zT)Z+yT&}aXci`yu?plfowl+@H`ToJnCnTfDED+x7MTF&Lpp~^?p;E(IxtvcxE^n#G zu(4vEM=vp=YY}EF#`hxsTdEt3q#P*7OIC9?H+coGU;rX>vKMIgjTYe|DS<6rb4SQ-g zTb7o(@#V z<>etN5NE~Ow9zvo^#Q1zTYm5u9R1OASXBJ%y-QA^{;18$3tRW}lM=)Et^LKwb()2@ z%Oq`eFejvLKanedIeU3+JE&p^x8`vhU;#@qo4papY0Wa3_x4y<6Mg0^yeq)Si!Hez zyvsz#-!RD2yyx7{gM=>6H0vH=a_|sSR{)xNW*xVnQ5PFKQ1s&4aG%Q%o0tP9Wz938 z9SH9mh0S|zFu$1U2j(6^0!>Pq;hmC1z7AIbsdrwR;n2o4ch;zp{L1g~)&G0S737dJ z|I$zuKIB_L&XX?;OH7EZDjHu@vgu3JJd>zrD^uGIqWxx^Q?%_%8K6ad(-2s=1L_;z z-;m20XKr(z9f*$=rCN4a#=)s?Lp5wDm3N}D!yq(*3^j27epWn)tOi4Py=O4e8P2SS zGckw40WR3Do&%na>)MQUWUr?_k*@}0ow&W`vu&U@J-Yx_+@p0v$-MC?^-P~NLR~p` z0uSpFlsyC$vkErCg0(aygAgJ!ZUfIiD<9~N0py^wt)H|`5t>J8JD~PT`oPsL4X8ym zti>A~c2Bh=ayu!7SNWdog2v};>jiLzO;6AfP0)I)d;!IEE5el}C`H0+DO8TB{xJy- z$b!Q#{H9t=)T7Zf)Sc2Yn^LKwynN?M5`7EC ztBbHkf@f!5o3K9$-gn!o16a9GdRh2&TApNVppnuV#sl2p_f97ydo0cK|A&eKS~BoR zBg|`Sk9-drzQ3Uo5Oy-Uy=TT&inJ+d&v?MjL5}IT>H(%sapqq{+6_b^fv7q&dtWGeLq zBJF`8+-(yT((6EmR{C9gZl-z=L$J=jdoYw2Na;IvwpKixK~1Gz$OM(NK>1GGx4Hy5 zZTyJ@r1aQI*`3EBnX7>fkbX!>{ z0h?MO@M&U5m({6JhW+foN$e-bl{U+*-!ykcRZKfN)O1&F&v9NBYyrK#@kW;;{iFm$ zy#=DitiFNCOMGOCYn^F~;gYQw5&X#)0rL0>fPwt)D?bf$2L>u`E^FAYfYa`2-L4G< z_Wl%W&`#1l4Kf4cDfRERKC1;c=)E%@G!4&^`k6W?;*T^Vc#kXtrc)U zQ;1HLJ=J}URP>qGJ)ZFZG?qCPs~Znq(ozcky%)?5wl@yw(zS7=V|7qxKCTQ#cx#gJ zD_fQKTM*?mvJ}O?s1ByPnOJ;c#tPsDK-lab<6tg1e#U>3)0Mfap8t7prw&d9yVFxw z1V!s)BcZs+BW^y^V1ZH-gYR}7AhWDb#D!OvWI1u=FY4?18}GO<&jjO$T)kk}C&1Ut zsIF}DO-A_Plf?)~B{}f4Zwa?*$&7=%4oK*Az2&vfcXzZfqc~rDN@G`tPuMgNbIFDRdD;^U}uWQF9+Hi>Mjz6|rA+ zT{q5mDv+al+g1=jzw(7RlmCqi^Tzy+w$DN`sZc?5Y>Fx({}z9R3^_3611R|mzfu1_Xi(Qo!H@w1ESj}sUTH@8gl0*)Y&r3*cM zY}EV$QGyY1%7~gu1Th1+%#9G9aK6{Zu@Now{^AMv8#2irL=>Q`yZnMa@qR6dW5L5$ zwbZEQrWX0pFBwqf8kiR_(!&~z^cYAdkgJ12JscDz0%q||h^&HiDU|giO(p+uI6puy zUw93^I>GXS!%`6dP~X$4X}=5W>i0CNScBUL-e1cB!x2Em*mQV~g~dtG&<`L8ND9RJ z&mZgCUh2itx|YQj((-3AfOQO!mG_w+xfDh+vip^(`B(2zx@8uF6g>kiUsV6fmg)0Y zmH*@K+#KBeIqn}1N53?lNTPp)9D{&}l^5ogBEHKvy?D(~DHkeLF08bqHbwT=_>4T1 z_RrHp5W6iK?|xs=()=jFinx2NO$>Awz}Br72UIynRsVNc3q~uTUc2>tldBRg|q!c z6Yv}Nzhmhkwt?6KdGYqjQCd)=UkD;>wN-2WoRx#LSkj~7O z*>vmvRy@a(c(_07H7pqLMsx+3Ydq8aRoXa$>WNT?wV7hlaGySXbOH{6)q|oq>~H6K zKx2t99L@(@Q~S(*=;J%>-Hv@uj`AcU4@Po;$sRaSJKsP*Nc}~nTbkRM?Qv(R{OOkV z!Jw4Ap~CH#oPZ`|c=rZH+Z`LujGf=&!=TobKQdR&_~5BYq|E_PLg1t zxO{9qePolK6y_kbAq-fFW}ySej8Gg1@a!*eK9>(`e$uuy`w($Z0(;lt0Z|LMZ|DCM z`hNaokZfI4f-mp3oyV4z*nWYishn2f;Zs6yOJ!Z&Bzt9(8Ki?+jqHP<)=&*0tSb|> zG$}58!!L5AM_Q~404zU|G)wSIOBr;S$|l`LX(t`r2<@AdY6k=2Sl>2FE$EKcxo=sg zKj(o-5o0TQ-4@>X*0S|>6O>7~9WtDg?fowE<2Wc88PyTHQz?!MrGNy3j0in0rJ!*F z>Hz5%66$r+Pr0-DZ6P{(I#&F9^z@qd{6|1&sY^T{Z3bz^z>O4bq!Gs{2j#n16=db0 zXMm3dtwSL3gTo!dhVTcLtOesgW+C9 zj>RfmYjRE}95>|sRcwG=`BZx(t;`S(>%66zxpYs(fCVd8?J237n-I-9u^xW41M+Nj z9-2B7nPiIP$-gkCeGhhrLv{_+kw(jcA%X%!E3DVlRA)7zmiYX0bjmT|*>7?F(r+%2 zPMCzV|F~*ydXm7wWAFezx7TpkE4NZNJL&*k{)EBXyq<1%{1v)81X=L2o=Usk87Fc< zWarBVYN*j{5z&$NL@Pqnb=uNfvk`ulYrVOtS9ej%(`bBfL2leI5dM8D#W4ab49xum za}Cu5#M}f#Dhh)Q?rc4RTZ<1X?wmC9C&>_U%;9V9TB?}5+PjU(7xTN5xrby-i#?*r zLB|K`g8%0pf1;o66U;hQQ`D3=`0|~!o+WW~L}Afy^YH~{3PaGGTYxS-i7yYlr`6714v9G_(_U+Azzn zM$Gnq2(IwiXj(ycE`!MmKe!!?U7r_3RP@S}*e@@`FTDTUxSf(1Em%EQ?y)|yu?3A; zyw13uF~$1W+uh?Kug;5XV|q3)IC8K7ikaTwa@ami+`Y5*AWN+N!CN?}*^v6U?bp@{ z&;*N!PR^h`Z`6IlIO3?ETogX919pqibHOTIzOXfuDGTyVJBYvRtXc@qlG z9J$vANhkY4>b$o4MuJCA6>(m@fYUZigp6Fliwqr8yv36EaHwWeahtJdGR>`lh3((9zn}0l1Q6BcrgcM;W$QE#TR5Xo;KI58kFl=~ zi?VI{mUWQ@l#~!D=?(z_sYSX$x)BiR?p{GcX;=Yi0g>)brMslNJEWWMTJPui-sAYb z8;|#&J#>NH^EzkdH#5JPb4~~hNZWtdB?GB1&=KrvVsbklNefh(^A3-s$ z;;HUDa6DavU|4mwQHg;oLk4hxK1e>e+cq(^#BkM>yR6<9%8nS7c$Jj-6u=?F10vw6 zmYqKXebv4Y?e(VzPVJ;zA;3HeN<=l5Yh`bF+iseY94|%6$1^x!JQ-fd!o-RAHiWee zakrc*a5fZVUVCS@Gn!=;!uus|M&+h*XJ)58YY|iKWFek>C1}=OYo9B+04@TUL#hPZ zW6HnqbP+8~vi{d*1_MPz@;!SoEC2e^M)CfTybZG699p5d>-P`P%-IuBD=}=1aIgnZ zvSUGm+2KnXuoN8_zPuW@uz{IAESCVK`7T)J-fRcs{$OYT#b7uOfGRYNd8rp0W65425I54DDD*dmdk^iSqzNNCLu>62KB8?A>L*A@}P3i(@2lv z*j#&{Ok79kv6H`(;swfwB!)~I<;R4sxGnyO{-La(t|qbVRHRq*3~|(99cqw9oUFrp z+PAqIE*m&Er!iQ5-%_jw-xZjOGiqnDYRgtX)nXJGY^P3{g5o%pe9-zBD^ag!%lg;9 zBT9r1V6nhaVcpQ8a;LBw^H*;`9^mAU{9iAow+98ziLurzn*e_M2hD?GhRU&7^7@t# zNMeDkC|Z6|;%p^Bo^5PoZcM&)UDOMZB9{Wm@^y4y`t1L|$a-R&rWUVJ;VT$W-5j=nh8 z-t2Ul@1^bF!sdGsJ?0;&6!Gg)rn*UzI6Yf37N+$a@88v|aS6;2nMLW?xIynB;U}~- z22duBg}o6}jK`T0#81lCh$H@j0XV^mTDa)u{nkw-ATMD-1>pwhmdKs(>LxZsS&o>HyPI3kg&aQ%LemMFJ2$(QM5PbHACk_y&ErR zJTp!Y;+rfS-1mH}err9Zc`-qy)r1OSMk7vv2x%GtgIHUMj2Ua7+obMp%yl69kz9S7 z@7KMWcqbe(pjd%?I+<7z{X4Q{0L0?4*2i4F#SM z|HIH`0W4z-vV}8)R-(O3!oqx4JBGZYKO0wa!N$bJ$*>KZ#qkTb5?;4gpb zY5yAU{g=|=dI_SW23j8V-n#A@@D!P5Jjf~q^20cN=5ozfCtpzkzRr(PL4NwttKBuK zFophJTh&jpJ-6I5fQvEI z*G?ng#L0%3-S)35K{yk{7&@2OGMD=`B}Cpwwpol!Ck5}!8Iqe|i;pIP&?#+!3e>y? z;A_eeSmgrN(g-U`iRPi1(&0UqZ%o+cuk@_%)XW0D0ytKR+0z4N^vQf)Y}mZ~F*UU1 z1{G+fo%~V!C0HC75gWO&e|ujhQc9uTTHkAe07xM@zA7C3Zs=+FNP6c{K15fq63{EU zpB`wTt`UOo{2q#em`K%hS}n!+%%v$?G8R z4WhC8r#brrzAFWeKW`)c&C~KHqrXXS>j(0f*C0pAsULV19`!a(|G4FN1eXL_NX6$l zzB)cS2MnWcx_s!_9q|vFB!E_azee$qKyt{Vl({`5fCnl|j0Rsk+u!z8OXbtmbYn03 z>G|@}^3RW|Z!YbuMkb!ZM2yVFrIzr~=WTlE5eHc(uqEdR+d&%u>oB>yUW^*OJ}ItD zJ`7NA^&Z}C)tQ2Avt#8d8s8#u_kS#Q=sqX;ZzuNuD^OrOc4b!ih|0;0Q6<@m+q^H{ znYqUHpCqMtzUDY73Hu4m+L;kc54~YZt9j+m6%NPe-H&J+?X8}jPy1mad^9jeN*R9d zVgOhl=AY02NWKt#QBwE?T#jbN&)GMQjurxrylG;tdM6b0oDdEYIQ$CC)zj`_xub0U zSTWTG{WG!WsVfl2`&I-1w+1KtX?LSu4cO<|(y*OT&O9M&Cn1gz1#y8=UV7Id26_@O z!W5rI;{DtM#t@}?z-YfUBef>|;_tY3BY%(?A*^*B27X6~bFT*HAHDMPVc&jtY#>h{Krn z(N)Xl0R{@j$}C8Ulkrd2&Y$vyPCUcHs?wCIB}Cm6;PzOS4<2u+%mrrLS^={Z_Dz<( zFIysJaa(Dk9(IZF0rPY5Ho9UODJh>v-9cacx8LKRtE`WNQaUF|%?k@kVy7(oPH3w0qD$bROU6kWIm=Yq_A!b$^b;RN zgM8_tC?1eMzyQ(ya~f|SX`GcOkV!B-WS%WF}p@TCOdGl|N{_|-3kBi8{!qrrw z3%9>4cS}FAru4lB;sy^TC2{ZCqTliSh>gLa9UzT;ay!4*-iyv!Z%Nay&xVdpeJFAn z(DP&P{%V8A9=m|R%qHiY`}UgHk0^H|3biW=-B^0e67GA-COMLfO^8cHk-(y|Bjp(%!o3YLAie z8(-6!A0r*nKVk|>Yf@w&`JySXmU!mua+^HRB0>%!2cG3`FVJ#d8>tQg2b;X`k@e?teBD@vMQ(pDQ zU%G2alWiM3_Lh1>dzXSjF?-=4@M zpmvgS>T$yGXzyRNZFy)UWc?W3Ngk*HQcXRPqrC^#9q;!=C^0{w24 z7y&g8ncHUngbTT@{xO%nx zf%%!|?Os2T_VGANWUe99xS)~D$E|zG=lE5r?&akbSPSYgFvo9fFm9dtT#e5p?7+D(!id=_ zr|TlC4!0eIzI)QKR}wJxFwn}qodiIxU2{I-wXkDN8S$DKN96_u*UiPhnc1`~nIejqES{N^ymFG~v$xFlEM# zW5U-lnuw+oocS63LI-K!ZwQ-)737F>;QZd_D$B=gbaeC&U_@fp`8XUK+SwgCySSXL z?rc7-j}Og(f1vQW%CA@u1nHqCYH8ur5-UYLZ-JYMHc`SHq=)*8NvyXwbOk}6~(f@ucJprxU=I>9{%=u!3&|MLnI`Ir=L_v@pMf? z0-E5N-09eKN`L<3PS3C{NnRn?-1(#IXlX2(C8sR5q<4fi?Zj-& z9!`FxG{|iiijKuyy}r?9COJKEJ3QX{EvurVltZeNkLE2fRRV+&cRmfdFVqoi81K(7 zXgAA$MLVZ8hc0v^;?XPNebB({VeI7ObnRUm?XP2DW-}+L=-r^tc&<(0+e%I9E z@fg;v==u{RBf%0EN#ipUYiR(1VZeoYEby;bH0%_<(4WXdeVtGvX{SZ=FN3l+PRcW< zd`VoGj+vW!DR{Un^M}>8Csl>zqB|Vg`PKUxOCXM}U}J$PV(!rJ7W}`g8jA~d@*TNO zx2{lbr6<<=G<;OO+t|HlP0(X#{9`*@X6{(%abewIShe%c7c-0K+b@+>MP&_|3c$1# z!sNt6PIQ~jScUqy?)c>M57I*Y&@&!Q13Fe%VlM3O!WmK8hR)8-vfPZ z8r{~hgRgV0>if)GjoREcXgV+uxKvao%$-fMCTLq%PjJCx_d?B8WimrWjmD(qo39qd z?JdKjdwT3eptr-zp-x2AD^5P4A-y#VSc>6D=U2YAV7bQ-9?)j-7EJ!)TSACjOYG;U zs8ptW8SMjbPI&jxF(covsPD7iMr+{VB#KcB`dSeRY&p}Pr=+lL!wO6=ivohQxa38I zi|r-BM2!W#Tv@Mv_sO4_dCDT?QumX*(fI;;4B0KuJ7J${`7z!?gY=WbQ4Y!LU5!x5 z)>g&pHMBQ)pZqWCe@2d#Al-p3U(#)JQ#;2|QB$1nc{S&CQ)*IaZ#Lb~0NC>ytKJK; zs|68?oe$`R`IU{_(b#0+4(a)_!wwVix5uK}UDX(vkK!Y@le@l=%;wym{%u8`FNT-Gm9VvWCWKYRcxRL#yu2R>f(9OZQfkbBLs$iVb7F@=V3e zOC}Yxz5bJg$TY8!TnC{ypyQk5(b3#x^AnfL%USPk!b^`j^TDuFcf$o2A3T$my~&J< z3~RZ4eU20ABn`KT_ryPx)Q&)MTd-1=#1Y3V6IZ>|cjzdj+Vk|Rm) z&-R~o>So>wznvNG58mqSS?%3YN8bt$4I{-G3-(ybd|NGjWWYdjn$6LOkDkcb^NEtQ z+XQg8*pN?91&OS}G}C^h9o{7iHpehuy7>Yh+5&M(P!u#5BSkHgvNy7#11*pC!5Ho} zMtI>aaBV_FR4$7GGki1H*C~pksM*LWOEz;vRh{4@X@4!?q-N5p+4XnMxV#Z3vK|Y5 zYZJ=w!B%Y5^U%o0->5XWb zLEp>Uj1>b=Au%;?OLebWr=Er;c2>u!2!%`@5o6<2d8OvRKQUq}zT@vRqgK0<3+)!> z=f|^ptzh={^t8Qg@>$IaPiT-0uZ~J_xK2p&@REU?UXO=c&)znAU!L}y>hoC4dV92v zqjmV~OU$t?;TGlz-QWs&hi_Qg%;|7TaW4z8Q%m_)S4bNuea{)mDYghrSG^V#U{#0Z zj1Yv2$;{hJ74Y-a_)&dIveeEe7+sTfN}N7bZ|a^Kree9QEnJ`RLAp#^EwVT4@V9S8 zzD+mur$f)+yRM%Ujk1y zb{yxMt#XADHy5Zzw`Sco*JQVbhiNemom2Xk@aR>U#!HDd8jjmp^;_4&;)BrQ$os2g zo{Q-#wO2q|o&xT}UzRy0?L4{UH1wJ=S50bzGbkP(cWFU>u@>DByLQ$$oFv*6N+D7Y ztU6!kgFe&3O1Q}|iM>;Un70jz50)tB`{--UL)FYpPXXnecbCNtv+gy9BzNfL|0pbZ z3@Ea||EeIGUuUnxBGw}(P<-y4_fq5eTMo9OmD7emEFbs?If-iaTV+!@rh73-hML}R@L;Ig`9Pi(ZwvfOS=V!Awi6z_BM zL7!s}h~xoP;+W}Mk??S@bs3_bdO??}3%ZFkO#6|nLGmA?%t5Y!Zx)SgeOS3^@%%x& zG3WkXL&J~~1BkOfH$@yy6yeEKMg@7=nPuZOb36d?;ShEk>r55$F!$qsDsU$H%9xs@ zn4v2`SHnSV|Cd#osx;}6Rt=IGmfXm3&lm?hu%<-f6}=q3S%{*30>WgBttRbt^@u+) zHhtdBgZc-baI>m8VqMX6v&kzir22Eb}*Ondxi>#@iiSDUo{54YuO1UT1@p~$(2LkIrHT6lxXns4{ z9)tGv)0L8deY@u4`=iPCCmm=$I#8{eqCfmr+kzUxsLny2Ccpd@NS8hF<1`tn#n&CR ztmkM@-N@n2R_ZfslUwrS1$tSdUJQ+6LsGLwg^#Dz@0YZ1`n~#EGxqYNJ1wm&F-~YH zQ8c6eR@P+_qKQ@Yj4h+iS$@pn`DCbd)rY?r6*ji%DPtdctp413O)ven<droU}@G$R+n5FQ>clQe9YU{51 zYTItKt8WT7!p7MMkyc)>=U*(nV~aNVMGmG&*e~Fhc+X}myN4{_PtYnaai0fUgzsF$ zV>bvkOvnd|r{;aK?oI9X9lxpb#xg(9?IEDdl4bV_BZFtJWl531=8*ks#Yc&R0xCD& zl~)|%%0>)#hQp+&XP^DIl{_8&?t$zG6rCTw zZ-e_7VH+z^<0G~ts(h`F%>Gb@wy5Kn-6Ceyi?tSSiLfM#n&Mt(Yx0>f{7{kouZ{hy zF9=Ek6t8$HQx<}-MDh@jM2W{wLVR{H)l?YO5s=7y?~AI!HkCA>gX52-=zV4k{KPmM z1cf&#;^M95)?n>9zsyhRoBb|YNNvZ$Kr0@cG!*2k0IFVjTfDZg)!8lq&;8ItM=KYc zG>Bk-?ve~T zssF=fRn-4F&ch+Sa#GLy5~G&S%KZ1}+t%vK9GtOHu4)2x zq#dWAetNr^rJlPPS6CZZ@|AVZr*dp4`5VyH8?HBei5q`%S>VD%Pw&x@6gj&~#}`}X zSx7K8wCQ5G%(0}FX-X>3-3+0M&<1Eh8I`aB^bubA7iB zY7Wf^h0%S601-K=F?jp#hOK_ZjG%LHcSUS4g89TIC?boqQ5cb@8U4o7a;X^_a6*VW zzSi+3)9@^QqMERmGhSKK;hUG58>>6jREq3llfR`_+Th8`=_L%%6k3^8?E^-H9xLJV zaBwpQ_>>4S0@S828L07KroDFzI4bptwZVYYG0Nj+IUVzY{a4rpz;lGjqsCgD^2NJL z;Jz^ewj?#6>4$7v+_Xw4mn#Hjj7GdOS1S11Q9|N5Qk0-Y1F7@{cGK0}fw~4kD$a8h z5C{Thuyt>s3loZy{CO)TpYEF!PGqU;zfwp4E0`|AIStrs#b>YCtdxz!STE3m1O zdim)S0e3B5bSxvfv^o<{)Qlw7cLvcZdhY97zPKlP`ZIK8(O_@$Rzb3+&e%GJZQ4-wPF|g6sO_HPqPaLfnNpqdmymV3<@@^li71(N(G3br& z(^pt)k%HrnwxR$;(>s_t9Jj@Na*Hprd2N3kKm5_406Ges5&eTw=)0b$J&sjU9o;#l*mw^R5 zq})HBp~*7%7&q!?3li(2n&7*@WJ!X%${&`k`JWK~iOSXIqh5btso|io2iM^h1%Dm+ zluuDWeXLs8?FHrp!trzTz1sz5%(*Qp>f7kSL1wFIVFOx_!tysA^;bpL6GqJ2oyj8E zWjx1bv$a7ioD^8pu&zDl9V`61w>JmbGuK~70P7U{J9R3}`c9dpX1=f+lP&CnY68)+ zUOkB}}C&z?RD7V*HC8IRJo!{Jd?g$?IcJGnT!j^JG*46zuGhn?S&#iVpq zn?R3CWFzMM?B>2n*1IDN=g#1SVliXGoTe{_9k<+EEAG>yF1PV%UIiyboIn^gD)L0q z>MAeH!aQ4Lrp4>-#R5tKivwH&aVg2>h-2ADF)9W(YFQyA0*(2hU8T7XE#c5*@V430 zPe8@0cK92WTV;sJ^I0cx1wdBN5ab6*(eJ&F`||N3U7pV%$=6Mx>gQE3^ES?rC3k;v zcvfL*7tEWM{3qYI9(1@jLS-^iphaWTki;ec z_X!;$+B08NoDk#CLXG&r1zg;r(bp5JFQ$K}RhV<2gVsKZVJ{fiocWA>f&oCQ0Mb*h zKBbqfIhL9)&Q8pIm$2^EX#Xk$5%~POH~+7ZLnM8vmVM`+;Q#jxQx$_n_g8CWucf@% zW=2e7`SkQWwhM5@+3P-yg7RT{LL!r1uotc=g#Z;E0bS~dJ4E3qoD=*fO5fVL~ zy0-k~UC7O0V&_yI-#h-`zaRUrs~~@caI>cGuo*yhxC2q^HGF)FFH~3k0DS#phm(T_ zmc-_;R(Pm!a(8AF;Tlw3+7dG(a(fs${^T(d_$Q@eZjIeHzth@<3FRN+2g^q>kp(1d z+r*UZfhWjMr(dL>mQBUD8|~sSyqMw@(4xx|>hl@Iqf5D`F5p+6?dUYT>b2u~<}TP+ zjlunwjUpEW?Rd+rTv<45=~kAP=ihqH?Oc055(A(QO9_cN*qSpscs&Hd7Yxe(&Yvql zTehZ%b1L$Bm3XBEsAGqo21re)_aF-Egi8X)upF21#f84R#=(vGOK?b$0|H%W{G?y$-lQT{@svJo0I0Bsu@%g89x!+ zU%33OWt|iuL!cZ72kDG|g-{~2z>n`*Q%!Bb4{**48S}ko|{Cr%6%L=2-$_hCOHmpi-CMHAk zp7uN{|1FgzU#NEHxws-T~VBz?P>y*7IQs8j-1AdQ)6%p{EfN8A85T@nK5ndoI=*! zHS(r;{hI(vGa(~8z)qAQ4|!GupJ0Tz9=#C0`OV8Kd;?4S0X2EoNd9tqY&y7|HU{@I zEqWppucPnCK+z+Fg>LTABRX1nS2iZyyOR-LXbS*aVdEH-I^ac$qVHGi94v=Mq=R@> zIt;--fYL|HN$OKK7UX&qEuowE>Is?$Gn!nxG!HD@ad&vf9Rn@@$#tL*|!9c75Z+uZ{7mjjTiXa{>ynEV+C z_t0J}FZy~RcXT3MrIRuL0Oi=9xF9X=+sX7mvP>G}3;7jx)v7|}(Z@fk@Dfpv8hz9z znfCZh-g*)*R&MutW1CdngYaot#?q#S+th33pMUjzuG_wvFr>ZSQ zKJP+FkDpza^_RppjcoGDj^P>V8HxgEW5++DYExgHTWv=<6?ZWdCFMgpr{fBU4mPaJ zjmNrMICAI_{?nW!Pu=OEcw($v>4ULqVrLpJo`#}gQG>>i-Cu5hD81G%14wF}10f1= z2tbTxGfm0zOTeY~dXHLPKsc$Oc;f+88ob^hft}q`Oq7}!s^yi}SNCuP(}4=LF6bo4 z)zs96Dw=PHKt@3N!zH7PP0gzG{kxY0Y#r1SJh{YyXM*ztF@~y;U|_p{DK$!m^NWQ0s?1BV6mOU+AmkbY(V-cJnu*o`tnb2 z9WF8BFdt!vKj-b^CVwezfC4(M^PzL`$@lb2DaI;NT|{&?tQ{=Wix_$^J`H@mQ4=tw zT|NtBID~KXs&S-_oM0t5e_Jo$S{R;5IJTcZIf<{UOgIqSn(ltK~v)@Z*`kzS5TRMyr`!f_qJ8Ia5LzDx1x^R#kyzMd2EzS!$g*K_Z@ zgz;|=dKdBLB@#YYiaWKXs(A%?mM;Wndb=f0^fj^hcm%7|Ep6T|L345o79PO6W}K{g zq$9Ch1@~^OJJhzl70-2_21{X6{bl8@Ec4pb%aK!;V}4c^>GtVs9=&@Q^yMp+Y}b4s zt>=@G+ieySaS?47?ya`T&NpU7hmTFipyQ^T_=h$)AIsthiVKw+^O0LIpa6tV}7@ z#P4#lk}dqfCl6(#5_Z!jym}97+i?Tj4sHRmq98*5DQgS@h{7_jS`g z^>W=)3^D0a0XQcX5PWWDa*FA0dsji<-?1x)oc`CD0HOG}^sLdVk(%@g%N~<1$2zPc zDSIu|v*A()y@$eN5GwKch8%w*59#6S34wz1Da_T$;AiTeXC3nuM6SROa>C$ey%A5u zX20`O_{1jRUvEES&-lhV6qC(<4YCBYtan_(`oo z29|op-Q*R}w)boxIY{%l6wpYO)btT2@?RFc{{ru^Q1z|vdDY<_{MC=?!LfIBFLABd zW~hh42+$4rLI?2)S@l9sz(InMAO+@5sSY6A;e3cm6?fV+$23w1c?MYkjPCnYtdyU8b7zqaqdWKh2 zSnoHLNQW~tfXWC1RgQS%RZwFE(*GrS0+v(-ru(@}0kGfs`p*zDt4C60}GFDJ5qBt;_lH9YZ^G0ubO;Hk8wAH}uVWqFV?pTOJ@FpFzeT{dF z2{exdX=U6oUwvdChwAMy?~w7d>hL@ZC=H9SF!J8hkN0q~T8xXG-w$Ni{|pd4jIsY2 z=KMbV7m5|aT_l1@mGq1x_#0jeC-%h2Y$1;(K6A*7;@LO-rfyki`Ae{psi8S*U7Ge! z@94kF6AK0A+(^Uj#@;yVq&?Nf^-|&_F#ThO{$Zy6Kk+;#5Q+#)ij*M)6Ny_yn>RB< z);Ct37NhgVO)I;DnAZ~|pV9R7H7|E0A$y#ojxrlc%-Gzgu1-4kad>Ca&$cm7x!x29 z+5|&%$MgfB$C3QZyOQaL!oOz=fc2Ijplq(*xmV?e5wipFd-Jm1@}dCGgrJs@fUA7V z)`CtFe?Ee-q3Teea>~{kNfgTl@}yakk5KnnnM)O{(jh_?B-H6>xWY6EtKK6ziU2Vv z0pa$f`%t@8c8tZ_1Y0kLmPQU8q+#HxSpGM>hs>)2(x6LV51X7pGbAKa`8YN01nP@g z-AsD-y-!j|F(~7SBcgg$-E+dSAs42ScG@cIx`NeEoqF*4(&948w7E|qEW0Pnx z-GgjZa(wk~*svr>OH~zNmgV+xlj%+chxAZn=+E8uckr>UQSnaGKi}YuO5A&NKEib^ zE;&!1`SDnitX;z2nKJF}zN`6KK#Lo2IRML3K@TBVX_@&^=81Z|xg+8v)Q0MpW^b*; z_K7ifQSwbTG*3XHY%PZ836T+_EfZr36ZRA;2m2h@J~Q)+SIQd0JuWX-tUDq5e|`YV zfB-Chi~z}jTa*UD0m-tRE4uW-5LCTuDRLbH<_Z)Ruy=Uz3MV)cc9174^jibD++Qxs z*z4yg$&CfFt(UZd`g?mTTtx#!0B8A?b>DOLdeY42llRM2S{!DEl-sY367dMK`_K0N z`-@Zu@qHGg{IB0W(`|3220y^r`T{k={YPP6k*DfLUB=j>?qT`MLP#M!O!XVWtd1}Q zUSf&C7Q!&tx1+BQRG-kStuQVGB@Gaw!PLj?+W=xp9J>y@Zq&gr=EZ49j=#6c(s#vuZtqZ6et`Te0nO-!xajc3shv@dWkYnR&E z=CFCakGWS3&bb3XgB_#_c{^5AqEz$rK0u=*WP0ZdIiROZsRRCqt~^=%>5=tq(^Hqs ztEa!Blc)GMKFCMWMr22(PKN*~#9*>^Z^(}qz=uJZkvw20%1%_zWMb_ruidX}G@fjc zyn0_6daAT?EwNHD{htsI_6TX`qmYO40p5FCgd*P|9oRA&U@g;L{XN(aQG+)l-$2!| z3o7H$5i{(=@1aa$hC>aQv;7RAL;vf+>NeuDjoa%R-1RV zqXrLli#VrJ93~5!xV5x_o!HH^AmK%HV8R!cr+>+Ff#&5&mm;fPIf)Y+orco<(9JZi zwEr>mDi&KBp|P@74Sk#8sf+qI>F}DJ3rcB<=(*ydMs~oxI~FxIAN{>^Y{@tarQAZ7;fxg|~7=NIZg2kCXefai?Hh=@7wvLgMmLmk(*1 ztU6$pZ(#8&)a)0@ee%TuOrbMLB!+aKoM_C0p8{1;+<*3niyfRGszN@4Jv%li&gjHl z<1OlDAf(%oMgpHJqS7Q4z=2j*$vq# zD5tgJ-@MX$_s_$mGNmR}^<4fc!9uW#ciYGrB3^Cu>I%Vvg z03AWptC6Fa@k7>!n4fllIt(5RXp{=yesSZq;i&RWIPn=i&t_uYkM~eUFur=`@Q0&F zU|X1mom|1dGgmz;TAkL>h}1VqcYbB^Yq1_EPpK9*H9NT3jSK?E>!UH~Q^M^NdFX3~ z?k?s-V}Qkk9n4ZXgDI%kO3O0zDz0e*PXfGY(xpMEC+!mh3PJaDL0Vk>mvEuf+Lww% z4{Gc3qo#)k>BAh&+@$`*Wmx;l^Ez*4`*#yIFO7ZFrgy6WQULH-KPeP*-Pc7SDHd<+ z5ZyuhdQkaT?r*iqH%yCO;G?@&1(a(MEh_`Dtd>`ijrsXjUO|4%9#=#ky@4_|2sGEb z5^@ySgDY=u^O(WR%*PVG`WQAN9Q3~F{p)K7o=kOK{2J^pFT63)FgZs!hiKKw_*SSc zN?X+DHC|XW8&Q zd2y%$f4Z}E=*n3mLVg1RsDa5~s^0{`w-1L&l1zB;W~i2f4cTw_=xI29&7xuOHkP)> zbQPZ%Q~pWPU^~cqx}Wt~QEG>#Y>2;dg&jF?C1CAfyt*3|0XzZWk)!e|dOwgLe*&7T zI?Lf1RM?(jtOzVu%6%n$psI1IVPpqa%TzgUyMTCFF?+D>H$i|CLCG|^IPUBx&R)d3 zQ_KbSG(x~F@l_=Zf&gC$o=j8>H(ACFH2Ewu7!Qd=MBYef{F#Ym>{tu9p`c}B)4M$V zA9#ad0YL}x`y?m?IFr>xvu+-1E>t|{Wp>J@ZK^7nCDnj-Xr0Sf;qbxDZpH|^X4{qt zC%d&CnvTblLFF4DoTZ%|@ibsO=m#GxtxPBM@@QMUq}qjY5Es;mM=0HiXO{)&cqiO& z6^IXFn?erUaaVB{uS!z?lL`JSkdNyDBHIboxQ_&OCf}dY>61KuYo)p{C|Lb<5hDQI zL^-GbL2D!y_`kCNmS#(otgibfWfUad?cniytH^|m;$#buChubH>!#`mPn^OCo2VnS z^_D;?Ww%CrW6Tn(hRN+H~7PIY`z)D&sy z(}d0DISnM$sH@WUUzbd2jCPe6nxl!IoKpIo1BDD6(?DjBqj|87&&PdUkJ}XLU!W~v_qoGx0J>~NmAXUZj&lwB-c|DZF z*-a-ZAEJaez_6IitP{E!6I6=<8w~MA-Nxl2%}uvZ6HaA;O_@_Af5`s%wnn4?YNHVL z$4|b;p`$MpZtk*BQ?wf;svLIPKOt&FH@EW0ANAwMXMjx~ln^SoWC?&Y{#C2~gJ!UN z0KIIEC9mo?qORJ%{U|7CnYuSn)wHC{YnOg`x{W>6JnJf3{qUNXfib{qYy@x4wV1qs z8&UWIHZ>R7oZ8!%BBtq=Id|Kk+C1QtwiR=1HDBkHj=lWc+V`gm&ybvrzHY3HKB=9; z*`7w9qIKRNkNpGJTCt8)ftJ9R1qY=^FG&&E$-l3YycpDQecj=_t-TgJqbn>wUHyO? z9rOq?ZtjN=u(qeMt)eBS4`sjK{$BbjrH*3GFwm%bHd4o+?as_5UQ#@kaimTSv;%33 zl-RixG1lMAdebH0kO>L!Rc6l6uqQEh(7HsllzsTf2eHInSDSSK5}87c(ziyt2wn3= z+qWB6(7m`@=Hw+nX;@6~Wu4MSS$=5a>$A7AjSzp$`QQzDO5LMrngNozTGpO4+^3*4 z0>a*-V0Jq9?)dn@EJa_#rBmYWI zC5QCW(&2BYaoQjmY`VlgGuDx(@W?(;5pS#^OHd4_L6s*ZClmVLjgj7(+^$Gg zWagLrXF=Q)geps(bWF&)zD&6~$)Y5o)!WEoTwnu&#q ztym2h?boEK?ON>(>(30pL_6#j;kuXoq}@yqS9*g+x*>+SQ@TBooipd!^sc>N08neu zWWZo^UA$+Y1zd`|Rt_LQnFiu826Hk>Gk_35U`vXYSO;Z8QOt)JKv4gOX|ZIr?UC9( zH-|7j!=xLrBPgJ46G%$Iqjf0}N<75&%e2!?t!?(g@t5=Qtk4LFi4b_2DK<=g8P-otjGbKfV}IdnD!EswxNj|Uj$ z$hP5y9fJm^d8CH0oq~^8ivy_tJz@TD8V$lq#j(G){xBFijSQrVT(1Qxio-A*_t&7q`$;@Lg|!PGDthGYg0bjf=XtTrc^INR{CTIGUVxl z-yN&rmEq}TwiZ&YhD85jWf^NxBQm0312Cd5V>ENH^^vJ46bo^9GQVQ?cUBVGH2jk@ zPRnwg$7R>fPshu6PrZk07Pz{>9I)@T&sytb&A3L}r@ zZJDC6)gK+yBC(Sb2>?*)au4`&$^IU5&gG1ayjLWMyX#(R9C83?57lG0a_5P*aVcnGSji zDU*a=>KNz3g4d8U7QgzLbz5-`@)B6;(r^Ib)opl=*#MX`?nPA`HA=0C>*zY_l$kn-tRCCON zlK?2F&}1`vi@Un^jU^#A zsk>$_y7xxaj3{`@wK;CNX3?B2TGt+1bzA;&FTqk0v5e$jLLd~BGj;}Wgo>x*5?*1y8qf5Y)g z*RPC($IlogE1Ma1MUVuCn|nNXi%i9x#UcMUlpw+e;!$koQ8C~RFw&3!a?E!wv7?I>08{fh<%B6qD#&p#nedsJ=#vhO$8kGNPYUj!ocxheW+&b~)=^;75 zBv_s%AHMazy`*Y9v>r=jN$#v=yq!u8H@%{5@iC>5%S_ZlqgUhK`}<`Hc7OcXxj;@%e8=hAYmwPP|WPX{YdlwI8V}OXz9p5qIwF z!0={(z*@5=Bi)_TzS)9Fs>+V1tKRYg%AT`6GhY=&B?-I}=tsmVCel(*22=-neIR0q z{k+6F&)f^G^SF5>Zb79mlV2$R5SVUailkB`zsc4E2vtc+gW>L(Ayv4)m+TUvdA%5u zdmGvf+z>q&nJvIS_#3->fEUwD_x&yZQEpTpOOawmG00MRcW`AD4jn6gGMBQXIA1_& zZc)=n_@ptZcWj1XD^L>v`-WMngWXu3NS1dWh6{EdA{n+>8CEI~x1=JZZgB#U@qf7m z|F`IWt_7&P06vXX1kfZ)v zW0L8*KB?;jyb19|%V&#yztmxQXa3{k&R+PxR0f0}9QL|=Ennj0Ab>*igXl4VVCF|8 zf8VoACLlMkS5}OPL)wT%EEqG4*gi8_zV@%bN6<5W9bSuX*6cWgO|2M(Yanr$bTa4@ zvkbF?gE3H;i9lT`*^A1X0T>{m8R+@4@T1ZmtvuqUgFo!pLw2fm3KCW71L_Q&h)N-MAemDMvsoJ z5njM|vEvKz%^`+$nXaCFK79hFO$^EWc&l(89K2E%fRVKgmsuOt!+YFl@qnCIinprh zzcI1@@aKO%(PSde6%HFLQW1DZzan-vD$~~+y}tE;;}M%p5&ZK-c*5015brM2c2FF> z32R#^jcT!9+{YQh=w57GAmBx$mO`xcVAQSB?&ZfPn8ZzYYFFr26zDrXT=4XT5`O=3 zZ+@w9&d76;T;-(qWewBXYEL<`@l`!>^#l6DY5X0f?qaR^up)SNgG#B67XX1A{-|** z3Z?GVW5k%sl8}r5wGFJ7`}$1it?4Yd&k}dIJ@Zjn){eaM&-43*JfKczUcrrUM}#U= z&pz4Jz@Wp#cFx*o<@PRL8sgZ1>uXFhkNNs_2L&I2v5U|QgZpq)fYs}2n)oQy(nnox z_v$KvV|p?#F6X-Z2o;vc$d&%4IpGVX)2exnc*uYUZh)(JWt;Dpnol31## ze_RPb7km!VW;g?+Smv5|$v)9gm?XQqXe#D#%1bpdwq%&A!K*gLD$AFZy%;IfRFn?e zY;|+-IoW+bF*o-gQIdP%-;>Sy?z0_&lIFnT5+8pN6CJ@AYjSbma)})dQ8O^EB8<`Z z-{z%En(0PGoNk_dxz}!Pn>JbWWFCmcdvslsWNFuZ2>jPO`qMcda12qMk-_Xh#Rd(v zQ*G>gu8F0Q@Ps7WO-{mMU7qhh-)iaTa5o*#G}$(uQs5>)MRrVr`a_MqjF$@e`d3ym zce(2iIw*eLt85@%{@_14S<<|qq!KbSJMv{&mU6bOV@@JVcIN79LUMv)F9sdeT@?)= z_GG=(vHP}%)Ti=g_pOPcvKX~Jcf<8+SW z&H04O=Wom|qKNEEQPr6R(v)bpM>2dU^n~edqrWt}D0`^e8-*|? zysPvBzx7eFI{sEMVHno0z8fOlS!dc2OK4N1TWeCp^CRV2a9owI;O0`6TL7vh>qT%N zcGWkSG&MERU$>+;J3h8@_DvJ!LXoO>ynp6%s?_a9n$AxH6+W!21U2 zc5jqbh>sp>dkfJ-9boOW7JSgTy{)&4|Hf>==buz0yh#>A!a#C4l3G(A{xR!oui=zx zFPB%tUWQkh$*s&m(9n7yjJq-Ku-Uff^9V+KLB$g3K;0{* z>7R`Com%~^rl61z>DrCS{i;yV(V00P3`<&JQQE@2b82uht`mC2#O~_5ryM=l^r{gU zjq_NeXr;fWCvOu5i%<`B)p`)W~9NgzkVsm{x{bay;*V|U1!xcwS@&!mF-hf+L zR-T-SoQtlNK`V)zzB!cSpu9sd+41R6-g=0oA$dK%+s?O16;}O=b|{6_tTAgGM(1jD zZ*RR1uQ}PuuV)C6+=lC!h2@c5c>hHIJ2AvtVbglbi+xgrK5SBQN?bP)3953T|#|M5# z_3UB;gX36I$C_5sdE=IQ*Ppx?tvVPmXC}SPQibS(rZ+6*3me-}%&`lRX$TH}udV?9 zn)+tXQ=4N^$8_&(Vhw0hGOp5}guiYK?ThjJsSwT%D_JkdL!Sq@~-T&#VobU~FpE>yms0WTVPwhOb_Vh9R4Q z-9i}zhnb%D)x3WnvKp2XuV5MguH!-z^Cse-U9UGI2y4l)Ms@!u78eATPFa`>_dYOF z>aLjJFLVZdBMGUL_`1Smh74^fO zmm1+Fa9F`|gq6rIdJp;DP4}9p>Ti#%mk2&-MMXK!bsOi8sAM}?ZYbM z34CU#>wZPKwS{9`UG(Xv{^N-!O96aNLUNHKT!m^EG2=K2GsD+~yU&7RdNMf%dw1jPWeCmg9FX4eP9o&6P-6O~6s(J|ClTf0S7a}JI(xpCf-?fd|zp%kWKUY+%MW?Ch1iV{IeLn6m5ldY&$Y;@Z7a~06OEQcolX2L}%LZtw2M9&A-g*E}d%qKPAZo0}snEUL(mrcLR zfokpE^mv`Y8%+n48f&jl8#;Hi5#7GOO|r*?lOES{CQN*Jx=~jS;QT0Q7bZM@5I(V{ zy@W zim2vX-@i(8BjDRJ5ECAd+Fb?Faa=-m_X$>t6P#UFD^Kg4AingA>e8C% zCryxl^2ZAz}R)r6(M)z*s7}B7i1`|9R%0#xo zt35e!IUM5f>F~PD!2P6{ZPx2iH5c~;Xqp$?->rhEe`9IMb=z1W8~|D8LA+Dq+B+K8 z=9$65?-LrwIUs0T34|2S1p5r{u6kVV_ z`J>YaF9hQH-*3ON`N7hgnh?8wZ>;Zq!Jc8fZmD3Q znt_;*)}QQgC*R#eEHNs5Zz%HW>^x*-s?F`5Fb{uxq4&qPZN zoAdbYhZm$Q`)^{j>Yl`0VejNB%GLqk4~Go5h=5p)F4F zyT+WzZx6lmi&N#BjJ3#2QY{wBq*rU|BNmisSU|t~2W03!o;NUL8y)D_GHXBj2q?CH zWZ2gxhQjjb!fYllbr2|e`;07q14>J8q1d9{iIvI>UO$+>D`kt04!ZqV{ug1k%!}I~ zEcutKcWTY2@`AYzJYybb)x!FsbQ#KCqj2MaULu1P;0R_B-2CizJtW6K@i5eUsw{1R zn)p8)`uERN*@yJ!7RRpObMsB}FLiW|9+~aNqFe#cUl61!s>>f2gzm=584<-QRK(vl z*)FhcZ<~=`W%|3jjgkzvE=VWf^DsB`d9+*`(*=Oiw94I${{Ggi^lUEjglaYSuwIC% z&)T%6-SX>#P~bHM(D8MHXrf8BwSI#@ZMpTAg{ma?Bj83$=%7GqzR<6L&>L|sBX$VJ z2hCl5Mj-Xp2dF7ZsgNJ?X@{iE18t4E9sJ+al%>1UU5rL6VaCM0VX_Znm<27%KQMRA zNj4aGo=%xYyBH9gYkxd1nO}Ua~XiN}jbwzK)g zU{tgEylfU1|A2dm?rH~K<6;whvC{r9uSdpof*_a94hI$Bav84Z`(}Q}BY~cjfF&qfu=dQ-7vU)QG=6@rAl|dniPZB{0cR1Ev(KL!)_kkCY=Gv0 z(QEY-0+XqC>PC!i<*a`|hG4-AK;)L<$IwR|hI9rTxRZ-|Va@T5YW$^#px%3Bf`f6g zx$1azf*hNI7ItteZHc=?bFvUs5)TK%blt@7eqI2Az$E)^ATjc0k!~J%D>g#sbKgB6 zcbF9llstsMH_>1Ed>p&`jPX#&%s^KKQpuz_=?i3dBycnweX-mIio`W^Vko3zex)q4 zvYHN`bplQ!c;tQsp>7+28Ntu4hjMLbo~stk_MD|M3;sP@uPN6$DWe$DQ}80#P)+|< zZS`Ah0&@<5B6{cJx#P2M71p{{r5VfFG;5uofci4nVC{ILUBlblEtKC)r2L+r?K^yp zF^t_)x+?YZ5jm@-Oi*gN%8q__$MpxxN_fzr?jMMftV>H6&3gk<4~a*`#QMB4%WSXSY8Byh2W(P)Qb7msb?Z# zPIO=};+2g6cH;uO!rqPT`P11JbqEg5zD`VZG6QOXGR%fcgN$`Ytm$AWyxseK-=G|=Lu(^U|_Sw6X zd(jU|szTsQA0FqYruB(XH)#PqhJR*e$MK6R|85s01+CVjl}@G)#lb>0TDR?j*8w@1 zHx|9bpt{7`0>|*=ltn~{r|Y9U+#I#hN!Zh}H7E%7GXRbD?yGc7#m5mM0Htwh1e8e$ zlQI`}>=U63CV;k86}-Hrze-UDzE-U%gN9yFWl3zh?OPCKOMjd|m6so>Ru|y6v3vUZ z+CGWt5F@SG&mpSwY0)>L#*~-%ksg7ceBNWKasGA2K^`FEia<+9sqF_jLL~`g=~~r_ zwGdX+3m;w{bJ$Z=+`lUWYa6?jBy= z{+2=WTdaJc1J3SrLLB)3&jN)#;n2jF_lG?n;jG{DgqU6|zKp4J>(l`adMeiLo`kTl zakRCicejB6RaGGIqcXPEAs{DO3B!CW$QpD&*CU5ZcTA7QN366=5qk0~q~~@khRg}^ z(Uei?K6DZUB|$ge)r+YTWPkULwg+T(aCXqoE{6Ns#kOYf{>{YsXP3;tE{WjUipJx4 zy{V~8Q*;D%$=GO;9%l4mYHxpc^vER`$|KPzT&rb$Nm1E^Wesv5@?mmu{q-`z_JuOP z;9xgp(XwCAA}TESoNCoAmAMa%+OU;wNR-i8<}$M?U{^i+?|nY)epdhl4xyWmz3!Ad zLGKrRfCv8afU~?lGbk~Dkb?iKx^kL6D~68KrbQ)HV47{<@v z?6s!|%z`L5iT%H&@g4y6k81?Fl01Qv0R(}WuQ*DrpO0gwUxI|Tq* z_!ViFYN-&c?%nCliUnO4SgY9;1%(C=7p3r^z~#+`TVJA<)XQ{T;)rG5JkN;gHWs@w zF^ch_cUVw%P=a#O`@Xk8TL7S{qPS`Kd;Wd`J@?Havwuuo=n%5rp;k`6t5G|Tri z7IULM@igcjxEgxEr56+V<^pO+x9J)HD!eZGZ<@@jOh(WSpA9DZrfjGlL)lo-ZYoK~#?a^wOaz0Ex(R zjr1Kn*OXLt(nZ!;UZT}SX)!!&PcO{^*`G!LoRXgyS@Lyc4-$a7^CC){Dfaz3ek#jn zIzPWopa-mdFjt)jRmjet*Za*aG&UgnE{=CIqOU~JrJftsYvL_ukEC}=7&n8a_sQ)v zQ}6o9RXt^#p3bN1=!cw>FY9`$uOc#2`s`nC_M3cpYB!EMxcWU; z#`B{6B$tnBLq6n%rk6}nJ1ert37!5q&_iQ#Zf0_0t9h-xG>PZIk|X*>+KDg;rPM-sHJ>hHu-4 zpZK>A7wB78dsKVIvJ{SORs6h$+%H863RQ93mKw@qsU6R8{`HGGV_o|RFcjQatW5t*REB#Tq9p2W4}be=6vlk z*S+tZkRG8#`Jvi~Q_!HymI_ayMZ{c6ik>NlX}*YJdaRcaW)`EoqI{|{lN(*z&trqI zyWR-zrcO~5?9Lp`<_<~fGnwssC-*YTK{rp%M62vx^pE?o)A%Z`GS6h@P!>@L_AOE5 z(9Vi3e!inCxe#uCR3bJ{o#wjsZq6(Xezxx(SNGvN{H$?i2JP-{C;^xc6DGX(aIpm& zqfZ(nVvBwR>t@l@#x#4seY83;$}SiF4exa3gIt<`k$R{8MnId_AL}&nU~H~ ze;kMT?_qesz?3Rc#ja&wY85&#Ak4(4zO0NSw=j1CG+10jIl1~FDG5zfKL8EYh2#}+ zKNJE7LaDgn9%sk?(#e4a!Xt(oSj)?3IHShEAK1uk-iqwE9c_yZJIQ!_!^k*@A29Ll z3a?9o4I;Kyr~(2Dve{{_P2F{khpye>;=CjI4udi-{Jf;oc$Yx^`Zk-7q z=$4v^ik1h~F_$rX6s2{&x~j9ylVKB#s{hW)C#gr)<@7F)lwNc6Av>W*wq%o!uZfgR zLl(K*zeaNXKOZ7gpoDYeCvaQaT^+6k0rU zl4`XPzhu4#Q>Tf6F?i+%>0_{(^?a`3%HpJcZt38W+14|`0hMnjQzoYL$yrAfmS|=( zgYiMbByu$22r-iG1>F;@KI~xsh;_?~E8@A{fMz~*4gcj&Mc8P)#Bnl)@Qb-QvI`$q zjaJ}3{!N+x{xC_rp^bNNd{*UhK8YjY15>p0g)Q9wlm-mjRDhUHc@@SFkE8A|c7Lzv zqMo6Hnz=iCu)gK?I4YDw#gSVbxML>HrV3)Kf-%Dm&9yPZ3<1_;att*6!iAHsOlAsN ziA&0;qD`5Dw;gu2^18b*xKF|IbDK zCMg&lhMB3+?eu#lAG8%+SLY48RZf>Jn>MLLP=rzB&ruj|jX8J+=AOc`8ZM<=cBX@62 zOUt4r>FXWrT4s7kx|X4LT?OY%=*&z%Q+%e0B}##VubVHFRx$r{@&7Y15_*CPrmeDF`}hbmxi}0>$6zuKwU^jbl7@u-dc}^P zLWft{yZ%{nQZhR4-pELyVNELxgU!m?)K>LA)o?jsbPGvwQQ&QT|5)M^DH;z97^o@i z1gy@KMRIyPRb#Syr|NTUhp)heCKq{kgsuf!G!rD96=W;TJDN@LfbzfD;eU1o5aT_K z-52y|&R_!cS@sr6N8#_95vK`V44)l^UrKUBG>2-3@bS4Ru@7-isi7ZfELxe|*7B8c zE{2zSlb5_=B+?}h-U-BjM zXV_-P*mqC;TCt*|TV#q03IJ*n(5Q++d#l=#2(qWU?#<>+e~lamCFxkJh=9;A>dDaC zm9~6yu?DyOJBGJ9=Y@m`U=GW{ONa@8sK8eRp+jqdL@jH9BO=6#pKg#m-`IiCvDREn z$Sp(g!9Dozxm5$QxPmD$6g7ezd9)?BE1I3?`O7AjhYSS3Bz%@igi43*qR;neRHjiKM;|kem3{~pTC*SBVq>7^&Z=1y0VxJ6Yp}rU$SD*Z zqj{-qt*m)TSvGSa+b(7ftztrtr-toce=R+XgkO9wTw|-#BCjgNqlv(QDmM(68uLnv z|3x6AYXRfB%R>kNAxg=@DM)lTaZ8bZ;`3a-onQ0Y=ImyLkxsNG5ah_P zF#O6Xd+NT`}v^;HZ<0 ziWI1%sHot+^s+rjgp_|nz;kolVX!kp5(MsH$Ggy@uMDY~)izbRf#wISz}Vg>)GPJ7$`YF-@)Ijh~#LRQ7$p;YlC9IsJ zQ!!rdPwGS5;lg4!y`z5(^YkENM*)!$xN#9UIa|MGkj!9PP<>QX7-u_z)_0ol%WZF1 zp||SoDkcUVb9l2CJ7vJ-WcS{dw7W@P43Y)HSUI0O$KbX1=DwUKEGUS$K|TO-f#wkO zHiElJ>W-`*L>+bDV*s~Uk?q33uLy<5MZKMU$^wEsn#?&C^dHO|s#HgL5RN{iNr#cK zXC0^GV|=8<;T#GUb(W)fpenS+I3Qd8{>E#K0_J%?>XumdPJEK^n!6#Ow6FXH6sD1o z`mTjod(o>Rxg|1(bxGlsfwuOeBab9X6i@@DSD@31wpZ0%QU8_2=p(y03so zBkpW0;6-IBGbRhX*e}0d?6-mcpBFpHihMnVy9>%E*E2I;XTU}v(g#o~4fS!O9A;ny zdb2kaN2`8E2R8qSifX=L6KVSFV9kDA@Nj>#d41KuH{Gu(%#!QKkv2ny{|TKN7Nv~Eb9Q_^?O*47g+e_i$h=`6 zu~|~e*jLxP_8E8lWb-7~@dbm&wp|w{=jRO;|8W7##eW-`d5sHmv3t>fW6)A9c0X z4u0wAZ74IZhf#TzAQFUaw2T86zQQb8=(9N|b_Wo6qyfAy( z9oOM)Q>K}4Vce3sRi!6imBl25%c7@)ffgY4P_+u}ymlj?d1FzPDY4sx;sxCjj?4s~ zHGj{_TQVZ(M+{-o8q7{u_x{JwA9nw9-T#j)p;Ut49SqMVKlN)aYKA75xv~-;n+b4l ztvNqoMZFu`!6g`w(pg1(8k3exR)&^sa~Lr&hl_cf}oZgIjz zyB1SKgnK{3b1+K{(56+jgYF4=MSZ+m0Tu7mX!ofTra-;Wu~tL5ETP3aQ$2a6b`|tnyzu)=i zg8(UBK=L6fj~D2QZ2r*CH_eaBb1|%}J4LU1oRC z!bg%F|3%9!n3gQEKPcTM;btSp_FDRV1IDiXT)$~wLbbvhI$ES=Q+ z1Wy8TJZLgzeN~_m^Tf9`LdbL`o(>?MfXSl>i zho*LAfFk*SuJb?d3X=m^d{4pZE$|~i+bAe36~s6$Gr8iW-t#RHzE{|%2G(Ph2NJ%4 z_HG4Nfw~&e5BBV6nvY#lR-cM@iTFBLS>+sDg!3$4(m|h08}y3&S;zmg{uw?%#k2~p zkSAfN|Lz6w9Qg(QFOb)qIA^j^!?L`+bi7GPqa8sz{Z01GZ}BLe&N8V|LC>avgRDCy z7V`6x1tM8J-H+oHS2Z&O^$5V#>CM0sHLQ`iaq(t-D52-B)4|DJ-7cyy4mP$^nU*zR za6E( z`F}3_|Huw}7(#^>q0)+RIdfD?;W?110|JkWzJ%(`f7NDf3L9rk^|xR|V`&HV-xcom z2ZuehdqTkMTKinUw0BBGPgMaikzLs^S1O(ftzBngieAvt|D~CvWwB9e@uWI(xu-|_ z;78vk8_t;KJW2Hn1liR`mfV5E0Eh~B1Rj(ie^m~5aCEh`@!^nTOze#X%wrLxomkGt zMfc#3?+{vmUQJ-GuHMQIFw4hg5478LnEoRfA?>ivJG-yf#jNfLk@@51$Fz0I1mE$` z(4U;fj$?%tHg{~>ac&&h32?i@)tizVvQQF>ivo&G>};N^X$qtfn*!cBbO5VQiucyQ zghk4(;)evn)8-XPC1d$w+P%#zBO7gt!~)O_#8o9g5$|Hq+Nf7?lvFjFk1vT>79%~) zun-(x*Jy+41xj^IW*VKCbpjgT8e%6@_s+5l4dC{_(Gnjs_JyG|Jne9Q&{W72UNU>VpO2}a$o<|O0; zY@YvSj{l|r^f`d9JsNXJVgv385L0namaWzUD<G7S*NNGoOe~vlbdM>A0@#|s5Li|3R6wt9u3(H5#Ef{P}}Md zG4wv5?)S1bi;Ic~enmlY7Mj-c#vX-!L-Z?$Vxysz`qYiSZ?PdFFxR0u(K1^OPA#`K z7KB1tPK3zZqKcL#3L#!zhB61F+C-l1}0 zf2U!$R$wI^ZahQ>RWtP9r(CJA_oPrI1zUKdr;5C2#i7yD6jUPMk87SYPT4jATm<^X z-d3){%9{TurvDL_&}EEd{`t-Qa?6E_mI43Uw{HuHvF^HS)R)QprdRW0)bZO|^&^af zJSO|^QH8RdS^eM47dzaiI5un_{(R71r<Ij!d@BI7TA)3EUEE(^=!embDHQoJu8qp017onr*ThO2AY&JG`m_|Rj z^J;#j2^>^bykq9@<_u}pB2atC?I=8p^z|(7O2ZH=WGG1RG`B~67T3ia031}IXN84} zeLd$|Jnue7+=BLD!LDrh8n*xE9{#;M;Nn9;dRP)Rur6-^G-4_#d5NW*_xRANSYZGg~x=P%gP5gb~!$evXkRBmk z{p1sE9KwxQh_w(-mgCV2!&j`yFMVpcW(Qw67w&4R?-V)bE-^wCA{VDR^Kp5{tSi#F zcz#&CJO;?9iVi)Vsfunov2BbJcHNpMR=w`)l0D$#(3SOZ`QpCZ+K7RRG&P`&m~7Ib z!C~$OyIZvz$v3F>6*&mwig00EDRScwwZ)MUhrLoP9I{DM+^%r}Ud>sWTIpcD0#;Vb zI=(AdbaSX|cKg?*NYPN)s;8vywrR=lQ?i}^=r5K6pefK+b}%c$bIvgv%***>+ifsS z&P>gSFCse?|Ex;iSqm09d*zy1AR^NV%mzo7#!#;nt<6JMmjiz0Zh3D z;PDV(JkUVHg5!v<05}!HMAGN^_>==%qn3*vD!_b{9SrTrkKs3Q|2$Fd#E9DNJSCoBD7HxLAA05wwq(#w-`7Qhv_L9c6*J^wL+ z$zBywYAnW^nkFWm_BuK$y?)B_4wba=n^V5*C=V&%Zqup?(7fkRY(Ki8))41fcb1F=8Gr z3T}NUFClJ(oo@^ojt+?(U#BVVj4O;iOdD5Cv54F5|bttLY&TGQf*MC2_NHf5=~lL{oKve}mC^u-f$%MiULH1=2FLBJYFC z9;tpXfl-O9jp3Jx+AiPdnE)2w@xM0Z_mLJWqC|USF}YsSJ+W+r~LBA}6l5l9pIM z9ogq*!OoSv#{q+a+hq`t93$y4OvRRG0;3a2(_Cd4WfR~UrBa27#W@E6Ak)WSJ_lVrt={v!(C}MOQFPtLZ9?^) zYdb?n1(w4vG%KRQtTQl&^#1car2F+p2FOANU>sIOcI8j5Sqn=-su*ZqnCa-U{Qd$| z0=+LZxO}?-U_HFU-Vu8J4<^Ewsx+zvbM}KP{6nWDHR^ZTG~6fg%-!y#bY9Tl&A5Fl zVYslOj+2Z>n#2{&^SdsiGk0&WBZipmzLciFfUAh;&b_fPgq+7HC&YbDnWXMpjbv&2 zweA=O7{80n9K}H#mJ|gAC3GOt33dPNc3wU(D{1{608Aa!LD$!^R&}~-LV__xFJQ{M zp|YxzPAdd!Qz>$mbQBci7I~UvR*x+6GSlfm6f^y4dC#w81n~l9BT*~@Zb6N)`d;o{ zJ(`~!>hIS!j=Yc|%ANAFlM={@Ra$I29wg-ea~W`q_hx&YbbTLv1%$J7vBzotOwDu- zkX~=VZ2Z&)5)%_4`SjkzTbK0H&~mJ7)a2`8<0J|X(PnHX%}|pA#T`>aI|eEVSk#I; zPTxHt`t;L%56*fzPms^UuKC1!_$Z($;%bt~AI_8Jqd3%Q$;rY6iJcfk@{0|T3-P2? zR_~dANF-tZm-_oJ(Hf%-sTcnmzp#QqsRBr|%G@cT@SIgEfCK@kiH9RWTdP?|uxgrR zw&Jm|F}v~87pVR9bK4aFw7TO$It@TW!0z=3HFrlZK8Zx=={(1|fp?&(Sm+Wv0yTFr zh-83uc#EfmK9qBrO3<*`)jr1%#lw=vR#yjLz9LlK2MOmnbP1R<2{7G?Y2{;dbU)BspD@25j~e9hi=K?;3W%!SIjo-Mg(p?~ z=qC)kjW3YlqORemEJ`<=5e0+~C5$|nC0(d-WIF3atZ;X`0)ZNX^GObRKq_{=bv(a@ z`$l*z;WkF;dT)CibcCLn6mUgdwuh(5`RvT9FoX|YN$pW0{X?1vc4)pOYYU2q&|@+- z4%;P&dydT-5M4y~GIoB#OzX$r^#v&;#ZfdO(aV5f-=7~W@RyiBLumaYMsKYkmTP=d zy|%-f8p|`Q;+hC`r>CXa&t?$4woD6pT6KuiU+2;e`fG7RR05v$-=ZD#mOHr#i_^-OwiC0M(2)fk+gp0AE7 zF*xCL(V{_@Fr;Ix(clUWt3_<@|MK7Ed48ZH^Mp+xX_IiHrg;ZmS9c%&69{fMUjCU* zP%m^Rc69ewoBA$G7vf!JwbTKZzSjnWObgW~{c$UZ?X-Fiv0G;xm(#uxm#x8r3u3!w zzH3a;O~+M;s+3OO-NPmh^s~l~6yOu|)BJs^k84Rw!qNT5{{$wX`k3`p-9N-!ex9PV zi#-;lO6i$(Yvg7Zqnvb#X`GmGBGPlfJ$goSyV#kdu#n$?;I*t(9*jT$iaU6NsP1+ro{twT;nw?(1O)Bnv%z(eHn#ej7w|#d)2T&) z@Dy*`gB@2Kh6O~+_DX*7rEmA_6nBfqZ%is3@f#+j$qrsldiIuysNRkxqMJMA;B^B2 zMdiVVNWUSbV3~7X#{2&g81_)1<6wP#ZHv5!JGR&1)co;YKUYbUs9r#5R6s9Vj@-2$ z88h7QlD$cp)fiXQpDbv5Gc7NxG}=CLn{IA~9GuQhrF5##d*t{4vC32|UG2u$%ae(w z#zPL0=CMQZ*n&17-1#`+uEL38*SQl~nJ8qLwWhgMot@c^k${t`Ai1R#fYLKE5{o7& z@xE^!+_sf|J3old`>U*et&U;O6DYAi^In7(8L04DoS+4wz zVh6DC7C>3p68d^`)lC)|85wX}zIlGFLKsnDLD3V@6(4HUky|S{J_tDAwCrBHtuIXZ z?$@js{J4!v*+2|nq~7%bzE0tKE?RzGwrSBGmP*Zs6;ENY6N?Z?X)5Zn9TUhp679WW+~-Iw%3K|5_$OZeOO)NYGVlRX(9dTrNl4jh23 ze3g>EYQFkb#BO`KqOafFRS~gO)tE4Ab8l|pvZ|Qgab^Z5YsclqV*joW-=vpzW1V^n zCMug3Y;IS%2%PGRSo;;bk~8mf|KZ{{?k5a`o#XLshZWBG`akORv3xr;5!Y~sEA7NE zF&EvmG?k9=ak$83bK3Q0<3*ios*b+A537HgoJ(hXRocRP;f3+WiJJA9@G&ui;IJ*e zt*ypd-#N+SGToDAT;F??^HskbDf-W5-xBuPElFQJS*Gq=n1u_qRLqFUUhjPHjq!4@ z5ZwIkDAFc;{Q0|Ub2^ut8Y z>DSBBWR}ho(ESBo^Qi@RBQy){vV$ZnxD6{@` z3vQIHPjOBC*Dr6wFs$Y=&^|gB_=9+ea1qSSD_p#RVpG^?4x-vk^pzP;PzEQ)lLhti zKkj@M(0Gv4O3ruRdAdn=drqnHnuk(qMj-h7R}e|HNP zX1DUFQwVypsU7RtaCuUD@o{5(u&(=Zdr#TM436`&(}zt!r%CtpyT+p(*7*kR{k^vC zsqSEx-Ser}(B0Wnmy+NdpUZ~ssTVo^;lveoY!#E{ci)O|b1w@_WjqZpY`LIvZzty| z5bx_btU$?=ah-^_VUQEC^jLm;vID2T^5U?eRH=g-50-yR*>Ge(xK1?-cA2ZyLwrE& zsJzv?oRXp1?mA@0@w!wM>0L+McT+~xz#GKK?)TX4=?PYqQt(C5M<|^?+l9BRzvRQ( zZE(?_n|Mk-aO!n+I4LG1loUXv!kXr#(rBOqS330*+B`f?m@rWBadpo6I)2_=x{|z* zkf=NTP}ZBH(cz(6h(sL*PYy%FcxRlI>!-l2kkFS}KuDi-Q)vF$zO#*38fL|iqN z`|i7MEHuS?L8P~LCpNpO6Y~&MGtk|DyB@n%?h!0E;wuTH%&!?&esz0_cWwT%8V9u$ z*>cQG&xi*akCpaum_*)jGo`0IYH0KpntErF%rbI$$Q2Ky;Iw>J4p;jf!R`ub-t=ge z*{H51zxEYW(;!0uoe^!gaJ3$helSQ&QCPc!wtGA4Rj2Q|w^+i~traJ(&Do9z;y)_R z&D3OUQ7zCel}oB?658iS2UKFr+KikB5y2PgO!WvC17g=Oj=gIOC1E9!}cn$q5mi3m7cdYsVBoN$kq9_=K%@e(Kye zpG)%!axdLiyQoD)Ps|Rd?>{BCqRF2ql6LjY_ARKV#JH9%e<=hwT}91KD+h}dRaNCe z=5%xr!0)Np-a+_^>Mbaqv=(1l9LS6G!hepdJJ=X;C9rpy`FD;iV655l7JiS7tyuY* z;Gl>41>a<({_+y7a{JQGt!YQXEJ zAKLDh(@M+-5?XFhc5{TxW_S)Fga>LFOh9h}Sboc%7=LacOJE-*o1C3Rl ztm&&K;Jc@+3Abubn8RNPkzhCS%}m%&bM(}3(Vf^ZOwd7{js4%;Rqpgbd58!1td>cq z1Z^@58|Y!!t_ku93_lCtG2W9=#^~8*&g(eApxk2>cX;zgKwx9v8>dDx{R8L?jRUzC z?51rZO;=SD=+Ul`oPW9{aM;G{G|5;jHJ4WoT>MEq++Q;Ifc(>-+gm1U zJE2Yb0JUoT8ZZP5AZ-h*B_+hy$+cBsGvF|~J#9ltncD5`&9^4rVqu|<7%*blCObtw z#=tP`l^*%ewLRyoCGfhrqe>*=@+X6v2NP+4dK{RP!3~T%uNo0cX^5H&$DG|%k=v1_I@xkm=x*6aJeh(Rw-GQnp(0mE?b1BYb?di2K}%Y&o*q!v0Y zOC4|R{bR9SGJE7N^t#tA+#V8x(gE1x+f^eJ3K>}TdXC8BYs0~dA4^N1(t`cqw6Axd zm*`%e<#A~(7eMQgZMP1>ua$~rtTCW*C^j3A;h;~#sr~@`ISN6%RvCX-AHQ|hjwgnZ5~;@ z($}sfhFR8f5g;?0ASb~3Rpnw`pfJwLugm+t+=|SE1o=O0?UOq10lNi)mn^?xganHd zBIQdOYzqR*_t98cVegtR)!ig@$;r=E;^U&Q2$%BJoH89lfsLlqfEG0Ma0X0jxhVgZ zI)#qm#7^jtTdp6EbKMmVBpxr9i=|#_Ain!XDJpH_*5C7i*F_tg?hP{du8LhLbYo~m z;PSwZ{XwCg>{L4doUu0W^_6(ntH)X3GCDgOhX?$hkQqtH^s_h6sbn-w*XfM-?LbG@ z69@3wj%8kB$YZBdFY@P``co+$qlXp#<@Y<^#?wI|413ssZ zXpHNaZ_1Xw)L+PXJq)A({fUwAy0RdjxoHuhh?6E!r)N|mBGH$}3zw|jfZ3A9X#0qr zDdU)?r!+bvI5kJY7ksz&qZ=D%r5GK%OECu${dco*@P+u6L`i_|lT=p{3_#8@(@*az zScXCVKgQlVs>-hG9+u;wB_yRm6qJ^3j-Y@@DN2{Lba!~*22{GcM7p~}LAtv`y1VP! z$LIOpZ;baR_wW11!4L*q*V${Yz1CcF&TR-4_x0f)3|0gSk9(h&Ns`Z6HRUT{uWs~D z@Wd_K>gzK*886!^RC$gdL#->!BStRg^n^IhM&o*&oX!;Yvlg$qah}{Zpa<{L76D7~ z3Z7K?LX~AGlNjS%nV>MVPgtQPrah7F6s0Y^%TzH zbnPT0wd{4~C=#Dw7RdGGwmDf%oaC2ldwc2D$k2VJV0VVf%JSHirw?3Okn?kWlC)On zP20Lo2S{$45g~dYV(0*489&;hI5oMkqs1wzP-GnXvUai`AP4AUp9=Eu-B+)Qf*@&u zG5a5c36=!S_VRLDSE+zj(_5aE&)%!f$XTjEyJegFCl6GD>G_$kH<=1?WofDFDy}Y4 zv2S9gXeXkr(VoU!)3^T*TPL{*LgtAsz?5B;is7nV%-8vmbp3oSEiILMt(F!;u%heo zv#so{E!Lk$fJq=D+WGRmI=!8Sz(7@9=tBsmT3H+ISAoZ12qvIGvi6R6f(8bXZprYT z_6DTdlL^D+$?oP0M~=?nvIxq+ZcbpU89SO1QAUOFF)^C$T62F zH4b9>E_iS70S60P17SV8|B6xzanEinRCDYeDoqjvj)khJG3@zM=%0Q%7ZAxG-v$V1 z!1MJ*XSN#UAPIQN7W3Adej(Dr38Y^3p^ImdY>rGd3>=Uv{K^XSbdRfz7?=|>R42k= zt2-Xh9Mi>3V>|cH7eAOftb4^5co)fLvaUj)JO2K)xL!5bC`PZfY4&Hh`NMZMON$pOjyPAHmpF~K zm(tR-MF980YYC$XvSygrSM;ErjwCy0(-Bfe#7#$8;Hwia#PJqg_R(?uzw`bOO{Fj3 z#0f*&n(Bxjkdb28pMRSROn%LZNnHL@rJ+Zu)2(VmnP_z-vI$A6PMyOIP$A6VWFe+s z0so{N)!f$me&!2d2SNi+ibTmxj$WNbj<>!wqv{%Ss*Bm=mdBXV0rz%T9WQ3OyLVU4 zwDrBA{M2lO=${+5PcE=mjXiHUB>@uV0cJ2)T6bxUa2*Bl`baw(CoPSOi|VG87u`|8 z=FUY{bJ4l{q3xuCp{tUt=F}7UD>LrEU;nVvg>KwDwtaD2M#BuBT3#GpqaR<&2XKL8 zWVo+{c&u?+1O2$(RP(pn8|vWK;BQx{b9)7%*H-TX=7GIjM`r>nR zkAM5WP8Lfh@ZPPzZLCM2BcM#>{w^A@a=^&=0MhM^!ax&w9e%2eN-jvxtSpcnT;)!JVozuY{=DmK8JudU`HZh3@c$ADQGQ4!<2K z=utHZ06*wN98HGCBxaSCrL>K0t$tK^-w{WSwd(pa^&-m`lkzx-L(O<)IXd}6c|TKLUi|T7 zOGz6_x?9R?#1jU)Afic26yJy-m?H1Zca9U_=Y~qguMx7v?#+jfzW5c{0`(ao<*PaC zM-N{3Z1b+*FW{h1`CoZZ0?uwD4diCf8}kAZ;<3>cvlv!l;~T#;uZeN`GC6AE{9&IO zyaXQLxfc1eAm4|_;>h0iY->w(u0vogJrD?`&Jw~yZpF~S!}0nwe$kD0nadjPaIvSP zdhmd^FcB5qR&{QDLdx3wcZw{J+W9e2Iky)I0>HNhc)6aE_Pg@>O%_?WxV`y)%A%IY zLC%Tcqq!sDm%SG10Z@uW(xQ;e6~7cQh!9@py|k2~?p7Y!xQbX42AV!Tc-6UKFXQB7 zf{Fa=R>03Y61H!`!g6J+!)O^L!`N`p(yWhgWpMI1xGTj@kDx>?qZq*czRbZSe<)Fc z&&oMoJ#ULq+1S6=%oSTxJi=pKrd_i#Ai}_p*jaOu5Q`Vwj{aCaUaf&cuc+kKU(8vV z33N}d@dm;+8SW1@(YAgZse(GQ01ER0pfF2pJ8Zsqrl}TmZ|()e4Ubo=x64hx>g;A( zX&s&^Vsh6?OL0j`&uhSGqd)4X%{rrIcE`ZUzXi-l|JQE%6B1X1t1nC?Jq(i_z~T9D zSA8z1QZrbk+@bn&PY_z{ff!VlkuzicK5L z^05AAed@9O{UL5}_WE)IkN5tCU67fi^NRD$3&R4#TTUB!P7ro4)!rPuVqs=hSS@VS z5t3wy^tCpALG%mT#v~u>&(ve0SGKK>;-5FseDE>ggoZK^hJk5_|p z3!gtgj7dJDsR!r<3F+$^ypVqOw>SOID#7}JWQo|#yE_Pm3MDEx{-FqUu5Yrge(SW- zlc?sWHqVsdl3nRUj`XxP@H>wN33j4`6Bqdq1%jOpS4W%53bL*za;HklOYHhZelN7~ z1LPy`702*iQ?^q)f+MapA5B^Q>|m^t^ndpG|M^8*8rb>jEOF2ASMwUv)aEw_iW(

`F_=%0@H^assl)VXmug!q>q{LlKbEa6BzN_XtBvdZScK$$UYm}C(c7{i@ z`=r@lm>6>0u%r`nFZ8bq{O7fkeZi#M<#S%n3|cLi$?{M{WJY;Q7D_PfmcQV1NoNQ( z!SRVh{A4f&wofE?! z8;hF=d8hR{6C|l!pBHCI(ft`LV>=_ zZ{Q$nAqMy~;ayne$1X3(x`~R{r$u|RFT(hrSRPC*zBoZmMuiCBN@~5PfF5J~|KJzZ zA58~eX+E`Ss-QWj*Qi zX@qh6gp|C=wXj$*ZT5Nn3B;NOXpC~=@8^=(^5x1~j(iZka=WZGZM)L=#D21!YG`{j z$eNJ&S#PGHx|m3)_b$kWV%j?nHEU)-1@oWy|6d=W5dmV1uPd>Qzgi0Vo0NIWaoH2i z#N&K%meEUp>L52cPi2%H?>x)h(fY7ynm%2)O&AWci>v$a(zq8J2Ku71wpGap=Q(HV zytgDwSwSBe@IH4Zqz*3Lox8eMU%LuF>3b%oz(xQ`BglNgUH_d-^ETE$B0rrG0b1?O z5#!NnhL41l(2b_d^?HYKVUC3O>5lgo{oVRECfL^#E{T%>I-W93;S`AY3(RPW#DUG zf898YelyD$JE|7aBnv1BK z>jJ?{tm^CY^O`I#SR#}q-&=&LEAddhXON$i@s<#1^90F=DcAEEZd)O2GbjvHh4+Fc z`u_$f^G! z>6*$U10u2N%Q96W#~n*vG^YjM>l+J_q7WEAC*NInrJ1V0Fz6zn#HKxC=H~jC zjNy!=Bt*N4%yTL5va3=-*4K|0Y!&uL|_2<7kU3#tK{?`uw-=|OYV`_Zs3ca$)_Xr`mYt0or|5)L; zMR$Dl+Yi6TC;~iZ@|MQ{YV>OGj36v$#yyD0sxgzICx0`iD%8k<1(Q8UO1~M{+-o>H z5_zQ;F8nZa(3yUY_T5hI5doocL4(2daFka44QXtBV0uATgTs~cVSE#1^cTHs;Z4CH zd|v6fvc~j4+sVnng$3UP)$>+~jkr?LRv)Z58Y2C_<|xD)z|{e5xM$d!WHY~Ub&^C7 zM2d7<6tesFTZ)YpQ8PxzYwz}Upf5H+A~vw#UeiOLl{Gfrcmg4gigNH=IZlidX7xBx z8$BVa`lFvlg0r$tO^w&~pY{>2kB0;~yY{UNr4I1z;KBp8cIoBFIC0=PB0w=S@dL0; zutih?0x|!AtP9M1LHRq02Rz{bLb}!cme}N5s+gAme(YC0{?{eheAQ2>-E?^D%BEvs zObQMrhB+?*XOAr8B(Aq-c2gQvmBvyUz7iSb$=sC~Ud4fyT9^R=tTd`k)?*cScgEW1 z<~uFTCBwTm7klg55$`-T7yxkq_7Td0EKK&jDqCb62q;oU7Y`=^5j{V$W%9)>&j;!r z0J>bxjk$#GRotWj?G^u1HnR5bL+!$)5sz4zr!m;O0+Im9{Si2}z4KHHYYgf2*0Fzb z5(K_v@vEyW8~C~_77BNvRIt904aq#ypA^bdY@B)#3@6& zHxFcjij~ATU-a+rmIjLP!lLTBY1{Jz=XO`-%NY@_{hrwGI~EOg%hH2qy@KaP3NZ*u ze7Fp?8}n7ykp*(bl^;ij=Ths_+!w+Yt{lZ7JG^du6#|g@*{#4F#lOCx{3GC95ZkpF z6u1Sv3#fICEBwpi9u3k)P&bizu6nX0Fy!7#cM2tko--{HO?a_%EGlKTxjGPbHIW@fPSaj zxxAu`c*8^4280WRo(|COxXJ+N7OqvG*!417EE(4^e{o^NK}x~ zl#S;JhHuK2?NnMo_={`P($$K)kK;yczO zH+3=1d73N=A;CX=dv);9=x&?uIvJPFY=NFBhL70a+X_&5NGErBgmsU-eIQGZEb8%Y zL+@hZAugVyy$<`kc)(2{WKwbzL_B#_`z}9u0goZRk=C5GknZoOWs6deZ-CfH4fJ9H zM`vkdT-f~F{K0nRn+=pJ-HKRaLufSpfV#B9tO$67ciq-qJz zty9R*BlP*VWWvq+PcCNlPvk3Oh~b9oQHnDzU0B%LbuKr@-%Q(1m;;>`0`e@y*NT1| z_J#*WBEMiNl^&M;h1jFR8MG=lAT8pp7B>>F5LZumEu%LhYpS6e3dodD@S`0n%;9X1 zaSjBKqEd`P#+`L{u1e@nZrm;9YbXIG3R6Lz$@P%fKLfKfLrS;OT&Cq)-5kgjfC}#! zQo@WAsJKwIddeqoZC&eWo;W$Y09fgCoIB;4xnGjhC*xLdN{L5ys=m+x8I+>F$5HpU zaf=O9@jjc4j0v4FzGhF^Q9T`Z0cmYnsl%46pBD514G)~B==(ZQ0{STPmkkf=3?zI_ zgC|ipf%*&zfoNqLCgaovrpJXDTm@3$D!jPub1Z!bYA3?ScI=MlX=`WPnc=g4`A}3@<5ZN<<9`3Ckon)qM_qm)JfP4wD z6x>s8+z?&Fz-!&eb2OaIl3Ob|f>kyJPSC`J;t0$xK>3;fSaw+dnVXyjHjX#8%pW>* zgS1z#(4Lo%@x7ofsp>i}U3h?*yg|^W`rjyJ$?uV#q2)!Dg5+=)dlgihRT63uxT_6?=0aej=7eIe5RT-53N>Z_QAnYh<$<~ zreqaf3+7YbadW>1!-9Zo80r)sqK2DGM1*SKi~F7at_GI7l3RQTy@@`aqyCv9-h|*u zN=S&Fy=$#B!SY1ZlzL_Iw!0I8#fN@h~S$_iTsJY}Ki|=`P04;v|euCf20}oz`+% zkbl_7uprDy`kw51#~lQ`e05HG-pP>>*FlIo#yEE|T}NvE_f!g#Og4GmmeLb`f7PdP zRi5`kg-HQirYhgeJz62=6dJlHEu;`i%f!Zjuk|1uGYvr+&XdJaLX7`y#i)<@$H$b; zjnAt#M#=o9EpU0s&>u;ARZ>XcR~D1H=Lw4J_4Sk562WybE$YAe%wl37{>=)Q61N_Z(>jb zvg>GJH7rBn0DUQ;?@l=27g@mr&Z+u!k)(^LTm0p+SexP~(NRrXA+;CmZ4kS2SE1ef zJ>}1OrvYa99|aqjPSh}!nEb?D4r(Vg?aI(?HRitMh}lj%TA)UxSo)mR*-e>i%vCK} z?j8dn;t1KBFc=lIzSfch-7S${VfKXp**J8>_rvw)`QmcHQjCK zgVi-m>d9R?_NALpkl&$VO1~_Q1rEh!qEQV8j~&O1y+ zq|vV|g_;dtyAaFkYHLuvI>;k(TOSIr1dx+I<@)uY$D>0@5;38k--U!5szny`R>a=~ zMzXwQiE{g3T}*z*AVvl5-JLf#Mj3_9xB9Kn1wvNQq$0Pn9#xJ_;Q<<>ci`?2BuE2#yGKPUc534Wei`BWzAfOp^;H}_MY9wqQL7Eqm}Ae|eF6N7iZc9wvBV_09#O3eAn zaE5`ND9bfRcWF+x=VQ4b@NE$K3Bq6fUE^LQfs050pf zF8*|y-1!C*VQ%8M4n*sS5kno(XN?K|?$GKn9il$XAQg{a1gGMU)G9_hb@Ck|4ec_7 zD_2%5puVSm8M4ToWSBeLM3r&?v?`OtbtP?EGm@Ee)oYq7_Y{Kj|45zU%U+W%vxmG3dlEhwt2InVd@WIbhM<4N+-jp%zzB;?tBB+H3)n0SF9OYv{m%BqSZ zf4#d{!ypXrz-uwTt5hW=HQbMHp{EqWXR=_Do^*8jm{sJsat%6P(9F3&R_?}t3&rxs zbJw1VChtPD)Rm25b*qsU@iUysK3&eA8-(@Eb682f1YE4YwvKH{AQ@fesbopSquBE~ z(^{q~V%l@6{RgG-hHc^u8$R?H+x``O_?-F?n_BNS2}Yn?N&nT4OV?Eb(2W9tK;*0I zh&F>5a+$mZF}J+>v)`Q|-Nb7?0f)o`F;cv+t@VzH`2`Z*+OMSDkYh5gxF+8mr zxET){lKx~vF}UsBwxu?cRRxZ^?tjSR%1^qYrOP``+$-W{>~BFz;No!n0OW*fKrgQz z9BTYD^e%y&SwTQV14rsqN^DM=G`f~7v(I$iX~gu~_fbd@^%)OoVrLztQpmZ>$2CPu z{=txYU;pz`b7#X5+OJpWs3x9zEcbJ?Yc)8hW%aCVJg51nxTB1F5S@D?V}KDzw=4SS zVsrd_g$Wh-^{9V=T3lZ?*Nt{)28f9ON)#^U=cGVrA5{kH3f}5JFw?uh+MBFWpg)8A z>r=!8=b53Q;$MS@x(^*Od*5!JD}AF0N2u2jeZt+-?j+Zn`ipJcHqg;aUjLHBRUTm;yRM_MKA2CWkMiMNbk63FD&_vSddTIR*@Fi~eLX>P7% z5=er(k9`euis`q#jOTkkz`rtcrgTg~iau>mcaLu~>TCyJU4S3QhrT{ABFQ*^)) z>Ci8O{-MfgL4NL%2|FLj){-RA`C3Rwd{-meEk_Q>5&%`{>6D7FjMo(tdqt{zI+Qio z{=wr(PNl6|YZ6V=3Dj-V%(b+h1slkKE5RA~pp>M8b24aetwbGC)LG2K0LrVFmTw6c zH=KCk#JTF~3q=uyEuq#eFXRC% zY90_O208OsQ>YcIz!U*dQ2!-y!_)zeJJmvq_&#ESLN~-w?4)l5Tvx*p%AIzgx2!5~ zEl)gRC3tcpYu@WNJpBcIDnKYX9=3yw-LdKf5Q!bs@I6YcSqwvVDuKP8mh!9+sX?ZJ z(e?syb|>!lins)lNjV%5mLr1*8%IHj4<(JyNr2c%mNO~&9~cTWQ47mM(M~`09#bIA z-yiZ0+!GuBYe`%wV&=m(uL?%Me^t7U#vIs@)1@-*tm{(~oGgjeyz565|XM|eJNQsPK(6S#3$>jzFB zTnegd8}O399Pp=gl8s8VeyP!yUTXzX2~0qn$tV5?)c)q`P&;`6P%n!?AE zQ<_1kQ}y@J{S)#O5xy?m&*QvRINS(xItH~z*R7njNo__I1dANGCZKz zgAsJLx%G+X%fmDn-UpaoGemwH2g{f&1P4AQjG{t-=~U-4L?=)DesP#sEA&}D-l*_p@97=`htMx;OINotTpVi2gM z`IWW)sAQ+`3qv|NXgVPUt=v=zMl-JAOHL2e_@L(I-Xa-+6P0fQ>0!QxRsVNBX;l&J z3A!y1Nu!$ySw0;w4|)mad$x+y)6#veZ|3#rYc`Fj4@?bRMoHldn69?Y=cfTiaPZmi z0W+KhL9VwS-RQWj%goaZM!`sO>R!2$ID)O?Oby23t*(pNbSrf9&TJ5kTY?|7 zyr7FxFDK;D0_(geul*s1h}@3JMCZ>yhrlsA5#1@@d($RwXl;ShHh~uO0XaYV%Ly+@ zOrL*XV8ciM2GTM{vJj-`bbf6B6Na(1Y2yvh9CK&JJr622T1lA=g#|wKo92U@>XbP0#>5Vt^?Zi^D{_` zUADQ-R}T+oYRvIhvtdkk&6EU&dEr73hxLjT+JcCZ;V>6tO83EoGs{%v0Oh%i-05e} zmZ1C0g_Yy3$T2DB;lg};F*{#Kgl@?$)WIs?kc`nFy=$VSoqVMb-=BVGp{bGO#dRfF z=c0?U3uObnC2gpkJ$LAvfXO}RKV4M4toFwWN78LJUS37M5dd6BwuJO|ox_8|Q#RY4 zN-`a|&KFj5rbOrDPUm?wln>OBuwbpbI=j{$i4Q#j?j5he$(RVR%K~yj1d-sj2kY|z zd5^pBU3Yn-?c;cKzR2fXlO@lpFEOCsjQ0g%y8JH>;B!H?mL>0hP{pV`y8H3f99VgT z#UZrgA#P_buu0*=_h8c9sko~m)cM;m5f~PJR`36Atow$WsO`xy`qb1{jbS4_Eg^?n zPBQRl33x!|{Pfk!9W3VvSUw5S{e7~peVVzjjq{#LJ48~`0{?GLQ&lzxos+Gy>VVv^2FJe2BUQF`$K>b~bmSho`#%}p3JK?yc zWnH~hiCgwl>LQ7d|D|J*{RZmv)KEc{&oHw>sA!{~AnPf|W zGaK`U!isq)j2a+={7dJ#{}?>E)`os5Dq1sp3OWkkoo+FxHFY8GxFjy7V%LvwcCKa) zIIPrvv1n#6??otYjh~Y1suw)1o;=g{Fyr>*4D;)WW zty*`FuSy1<&^hH%clJGMJ?hcTyZ!5B)NpbJM0YpB$HPYgc=gF3{+RlE-?gf(pJ%Oc z;_ts^9)6ENKAi~1G7T5+Q3NHJZk1W@ROL(-r|cZ9Hk+mAG0vFPWyhkT#bde3N@+c= zCq>^EPJW8>5~>p?Lit7g?9qU~4zNlCoL!mF!{NS@nhVRRzXt-a4g#ISb^p2~Kuh&k z=q(_1xY2&p^&Q^U?Rzh!n@$Q4(=!^y7Y`PnmpB0@7q2&@-%oE)ie1vTx+rOq&yuhG zPRCH`;!2Lv)04D5_C%{TpT#NILm7^GMN$^xLa;D_`~#av`LpZJo-*~F%ehEFsW}Ry z*`0db`CA%_e-H>X`L^s+_%=p-(500b@S%BCR+HLpvC%655$Xx7NUCCKz(}BQVk)dD zsUs*TW9^=m{OLpxrf018-4UNVbpY-1cUH`tI#p0@5Hdj6z|sQHWiHi|8*py~n84vZ zlM_Ncnvf%2I=JXPo%yar>uLUSfRQ=o{YMIS1!!y`w}{}l!@M1&woCFik(!OtJ< z%-lJo@C$&i#5_heo1y1F#!{N&eVD>nMRmXD;}u@?>;#6r5P-H2nTHiVhVp&wgHrI? zXzc1A8{5Am((vb?9UxJxdSTLeL@b-S;u)D0-)u_nOHsj~h776wV9TyP-F$sZ_5G^y6`? zp3(-tf{zjM5^2D74eNjk6eC}aiOk{LZ|$tj<--<#7Qd|B;TjBMF86exU=u)AnssnEoC4KvcD3K;`&L?Y9)Vl^6 z2IJ);N3RcfzIjN>m9+8mKc;@HpYccn6?M{hJxd`Y%tPZQ3MByW658#3%6?_AgSkoN zoz}XvFH3_v@3^-)%<7j7j?s0s!3wW_YAhR$NLTb(e=IjSH?nwpZdlFzXv_aJo8 zn`5&OF+;#y`Z;273Qdy%t}Ath`~;i>Lm!YZ(|vutO7;cs6~Dj~A!{>ERJ{JBz|n6b z2m=|CY;v-0RUBMNz_hz;aB36ORU|=YrxOPu1C)dB@TMU0eJAUDRkITMVMN76O&DF^ zJ$pfwqm|Zrn~vd+;{A&`m-|M|hJXyty?c+=yl3b=Y;)B#K1Kn@)^W+Xp8={{?i4&| zwrXI6tQYE9S4G_0WDus@jxa$1rzd8W2$vg!eXKP^=)R-fQl7R5sHYKwk3&_!@H#_0 zWu2zC^$Brjo6{J!vJ(Gl&w&9j$F9N~gOw=H7P8q%YCAfJhZiU!Os=sVkH63LPH8)^cnX ze)7(2XSw72By`%tV)&2dOP&b679wStU3AAsdnuIo`bW2Sa-&68JYF(xIG^)8fS%{t z5yXc7oOy6BWaAJSPSm9Lxe~f0e4y%mm-}T|j~mPu671roX zeV~-sVv&1>_xUP?2TNO$qlXWh*wOu3yl{XuF%~_NQLq~LMRo_RBX9+{J#;|pTTg}( zI68shE+p-%>U}U|io{BAVJKc>e5a(MJZE01{1iB-II>VCU3$0e#H^TJ^9tt^{Uru8v$s49M-oG7OJLPk!~Ip*7})80nY$IxhCTb zVZibh)0Np8ISePjF@fm_ziIK7h5;4?E-5%cQ{}lL{H!5b(U97qwsY5s%u=h>1sK2_ zd#ow)wh1U#efLhPaTh|r61k8T63}7lw0)H&T_Xo63Sce@U~?liV5v#?3MI^+#jaym zwEl`BlRO03f|5j$b}Vwx%KO#c#FLPBbv?lPr}4Mq!La=RGX=2YJ6`-NeuF67oDsJ0 zsBP6i<}1F4(>DGf;SGU|wzDHIZ<==_)n_ll*XpO2mjQE|H$P)I5KMDtW@_^C(ckAL zN^@@?VQx7^=~+a*y`sfXS69PIxgN}g#0(V`+6Bqb zGgTX0>-Bw_or^@u+fFzb4pjCqIY`>UYNaP(ap$tmBYLXN<)qQ-dZP74-TJtdN~kap zwS;DOvsrInptC#bQ+;)LX#9ahr76=}ba5+lYxY<5GlKnOWvVtQp%)OuRRP32O&%|9 z+PbnXj;6r;V@#V=YS6WoM!TNmB|1DFjr=l;n?8)KOC3`^(Dd45=_|^65(AsMV-z`r zply4o#)Yr=%%~b~=E3CT{dI&C;;#??q#Cy76|6Ke5@zAya@}XAdEVoIOhc6&zK8M9 zT2(b!Ien&|CW_n~eRoT$sIf=cpwWJU#d^9|qapF1Vqj@`UkzQIp;)G38MI*StVH)_ z@~jrqrhiEWU&bd_)iR}6{qeTsp)CkA9z;OqlML;^bb;`kE$1dW;La+MKkE(#nmtNBj6`CPUY$& z4k`+1j=SbVHv!n*CA|hl7;YpT2M0W!SJ&Pgh9FPY(9aQanAQ{$_87R=Q$E=NEuuQY z0QzVS+{)6P5qc7ZsoQHx%oC?YKPV?e{4h@QI6hWTzJWu5&$|wfGpYSMCect{aWc!t+fZ7o5{&X9wk)+SShNWupY_3i#~eb=F^m z#3;Zy2=1?Xeaby|gN;506*FGuFpnC=N;FA6Dvba?11^UQPYWM5QDyacPx?|Fmt4TR z;~BdeWH=}F^%q+X(K!b@q&?<4;@P!|Hxvwq9@ZHpy%NtGB4OMOrqjERt6ybupFQhEX_m;B9Pw`@`BN`?6f-6h%cd14IqfFQVoNe! zO|-OsEdLlAP(%NAa!{edgwgQ*FKZnJ*%x0zBR=Cjr3-lU`IC$&-8I@LnLEu?ul|wV zzQW?01I`^h(co5rtFsv!$*!rB8MhPnnWi|BuAS?|bL48MjSb^GgVi`W67=okU7!1$ zQ6EiSMcnl=^KX2$a5*_`1-wC< ztFaqgo=X>$NM44FoT(pB^ix9!G1&G}MR~dZ<#t$jEV^m7%4@h!xkklfwZS2Rt=!TQ z!(M|6r-TOPRYs4!Y_hYS=r{p^9rM-MdHdNznuS+>cih&Kut|}YBn;E1SEiY> zPR7yZ#yk_#92(Iwr!(s~Su1*ejjph0I1HHLlV1$&7rS)KN+~mnX-unf*>Mp#wvlKT8Bex8q1Yt!t0AlXu^Zm=bnkm5A1J47a&opK#@9SGHs>#y*is;Ham;sdUurVS zN;lS6Zq5Qc??BpdgI{U>7(HWl|Ay4CLPjq)tRb6|E_dC>9c_(Dws2UqWV z+fdfmLl1qJgv-EtlDl6PvwfFWrc#=GG0*L5a0<^lG){QgFNyl(;V?01Tk|xoz5Q2M zF7hHrqeZ-M#1%1l8}a%1R72Im!Vlv_EuvtP?aHLCtOz*v_HkO3yiz@Ed#7f}qMhj0 z$oqI7jTwy(`x7y%rfp}Z5<96>qt#6hPWABc$y9s)PNl<)(2hG>#oYDQ&L!$e(9JyY z)UZ+pJ(`WJEho0G{MN$Qz&BNo?Su-A_|`P+?7)bzVQe)>om}mnkBQ6dh4H9Sm)dzp z`v*HHm5Is1iDE>SS(-Xk8T+zVQw2->AW>TRb{^FwjG|`9CgI)3j_gv+rm|NU1G|30 zyUR*imkK914x3CSBCoW@FB2$F8U_z8Wk=Ufd9HTrJkuA|uO_M}g2a>b9Jg;Bva5$6WncUeop<>W)T5Jbgbw z<@}ZN$hw%H-}dYNP4+se!bYJT3oE$>H~nHU^UMs_X|0cwp)RrONeVml8;NR9!H}ya zzlM95JAhK~OE6|o*Ur0>H?LEk^DTT6tu&MtE~B+fKY2w&{M_bcsRf`>3x& z@8QeiZvx9&qh=b>>PZ za`K*1twi#a>k@1!`rrxg0j;x$GzI z6{;c?+56b3_O{!MpM;*DDP_NUrbH9vGB`Ck-o8_(9j?4>V&QPJp4aYKHe0((8HmiF z#IUG7<-F`~BSkctP%BXldEY|2q0ThY94EZtnl&1vv-QYoyej77iqGim8}a-Q5$9>U z5cbYv8@)$gd_O&-x#f;NM7k%g#PI$NaWSuZT=P@SqPy~7hj7Na>U4zZCAB7m7V|t$ zooanOa1{1%Xwq%EdU`Q5@r*}Qqd-lGl1dE@QLPoVz#VveeQ>M%vBMzp8wW}>m zFOu)U6&O3$C)DDWy3)fL3v*Hjr~4;Vw+(VF(8!Zw-b8I~&zZ9`+>5w1wSX%szrwOP zXrdlYT){U+6xCE!tw-%`bA?u(+ahD1v+^{gK%bK*CD@B;=pAtekvqKN`pBRW{Bf{B zPh`DB(QQT}c2WN0{MH@&f8 z`o^ka)KJX59d$&nBzt*l^YP7uyLH)aE%{NH(edtiBK{-kDbia^eMiPSxR`Jy; z*xu-Ne@6Ycm##y`}lI6Njt=gk4L(Sj;x4y3mEq#&+IuNaB| z>d9D=LHUmmA!cXX{Wx*OvH?|@9#!^du+Fin*%~a|sW+{6r{A@@{c=$XLiW_PP9@nz zvI(C+ceU5Q1tpI zGnG{m=3&a(@0TYLvlpt#BUL+zqr%JtxslZvPC=aW^c^PpnKiF-(h+x`!v1qH>;L%` z+RM3YdDWwUdM+39>4w5%1(}-BvpW?^S|Tx5CqMmKF=JI#)vbGP#*0j^0;nF+8Y1Bm zqEQ#7G|E>bI$gY^&6)7QqBHewTEJibyuGoZu#xp5xgVnVpo=JJJm{?pl2dBzjfG1b zWg9Phh5SXr;6un`w5fTowNiFty|d8~nYRgCG}OA%9Rn>a4F{pj5uUJA2e(;X7=+lGO z7B!b1DVyIr#0!qc11u(vQcM{=P9=P&b%R9KWCIeccIsVbuyBH^J+3B$DwmdCS5!L-Oyl|#x`lCIX|s%EeEJ*-7`Ne(p~_aZhM zl7IAG9?Dh6Sx}-W9ti$~*ar_7|Kl=!nlHn$2B(cQTyP-|qCC7{g*W6u9Su30(@tfp zBAIIK-IA0p;Uk)N_+;1?W zm|(F@8=1ImQwxWN-2kJM}JrvtJf`7?rbe6||2z&pmu`c&91X`! z-<&rH26G8l6s{7van~i9P0K<;p6(H}m9ABoP$ee$t$bRw%SC24%QLXEMLtx+4& ze^n4}Y7ivtpVL&!81@FS59cA`#tQ6R+?Q>VP@5(xjYTHqv{&U-Nx(r!in zgY^gd>RlY{V06B=pEgk3N+!0UJXCf($=0WyFivRc=rNnKfei0GU9Hj>O(fmzH_p%3 z+4ePQ{dQiL4BCykxY}F&aIn+)_-boc-XTg=?q6=p1t(YJ9pJ6hKEMKbMiAUpt4gwI zI+~ru_(nT9RY7C0gD5jUzOds@BBP|fqhgoBP6~OQbA(ag*W$SLQV==)l0vAo*zUj} zFSeQiy6E+;z^cNlB62qW+mfTXv#1l*Q^V;xDWVx;iLt?KIo{lIjdBTUE$yej@KFvZ z*3T+4-Z!Ma5xT&Qa-&e|bB8`l5*j&OS?ReT=58RjZ;k6w#-b zt@P1^&N3?&U)vAoGW1@~DTBflzXWz#oV&eQ>1@Y#$2H>;m&f_tI*Vfh=BQJ-< zn7o&_1l%IAj=k?dkdUed;fifP^RncLQQ@GmwOTbWJ~z_PeS0^UN8V(h6`NMTVP%(8Gx)kT#Bj8};F; zTC|`5#55+2%P=S2KyzoW`n`W{Hgqg!WyW$|r(1>XQ9dPn zau4tSEGGV^${?i!)3m15ajP+iO91N}of6vH;>|qP35TZ@zse?(HHjaruF4a~tEeb$ zgsD2|{q`s0X4l+Wqf4gEY886A;Ow@Y%O9Sy%>oMFbBrPWJH_>Nh8AeeYIB}D*Bds@ zpR^y0N-}zR)DkvrT~Xxatz$Q_i8!X++|xrt1S2d)#PAO2>G6Q=f}ed@`a1GmarsLH@kZHU0e_>rz0%Uz zLN1jRz4zt656FXrjs!P_EttTiZfqSjaqw8xIjXquq7MhU{P`Q%AkT*>(sBo!w_>Ho zAEkctO$hRO>9k(9>l3MX;u$Jr*CE%p`3w@iG0b!91(Sstw4aopeL5Rg?~X`n%`l`; z$z*jRSBq|dgq=JY9Ed#e_eC2Lr#?BEo+uS(ytV3iMSuoO=q@5pK+*H6Sy#HB2vG!2 z{CMgq`i_{Pi7=Qt?Z@)6XM*J1iP2X`NK*6zR<_`;F6Yj}&I}v$$q7lt4(yLcb{-Vc zLq!RxaXATQo-fFvE_ANd9JJ_`IN!O1xfqTg@6*^>I5>+n>S4$nV1ePu3O++on2R`C&dFmBG2rA~cgQL`TnP@G#H9wtv+O1(H2=okpA zL$)W2F{F=DT%RU9_Jt{G7g)(As>w)TuhZficCmKh=$-SvCS}r2ND31c)5({F?OP=B z&exxAtt625@)D6Wr54mJyDz1sZsWAJbddgxYk3rz*M0sys+iPpDHOT1Yu}piDmDa( zcXZb#Y+-zXrPZS!bypr2mRt@Qv51IZt{$j6VGOHgF!S5OeWH}?bx@#QTs&HlPh!E; z6)~-d$MYb8)s`A2{6!-6U%EeBD!9zv8iUZwJ8(AST+`Z%_80Ftj#>ANAbWJrc5ce^wkgw-DsE_zRJLDT z=2eVTh`irq=0$Nh55L$PdwQ~(;1D&m?$=?qsV`RC6Va?x62VZVc?rki_1Ila$~&4T z*1URs(&{j~bZiTns2Xk~N>EHSI{4S{PtB-K`lsU=RRl?w(onvN6;IxSDEge)NKOoQ6eF{;5&^`cLp%BzBsN!^VscV`|(yIZg4L>?+xe8JPneEt6Ucb0GvF zMEAG`2N1dGBOiUz?(-bgs*D1qoOBi)h!zD&yFqcJbX1i`1LwX^Sl3UhrxLDo>Q!!b z`8WFqIfH|;kaw@277ITng?Ne6NtuXtThyJ4j8L37Ousx?Tq`oV=c7ptY+hb2IiR3)Bhn2rbT=3@ z3_UbRHxfg~cl)d_{=E7<|5%H)Slm~fv(Mi9oQvWGE_xL8G|JP{h&p(IwL1K`q@*hXrm8I-9&ab5kYz?@20`S3 zJa_4htki!I3kK^<9+$qV(brd-;)nz#JELpxo^W+BeGVcmF49}lS;K#N)O3>&`=)i7 z_NUADhiwQRO0=UCLH}>|k3!g|32qMv7MH(Vt2Ndc29|t!VY+qyZ#NORq6s{I23=S= zz<{5%nPO}w?sw1~!`|Li=8&ya$D)6=TgxI~stJmyK^2#@cf=u_*rzRnrP3NRY+$X8 zmKs;WVv>a(TSS@pSGs;NewA(`edjHihNdM2kzb9pSwxk~I4!Fggubew7Rm*F(xfWy;oZa*Z6cPG(0ns*w6_@Nmx3S(x&^*A>`6f zv>M_;$z+BhEZ!dc`yLDry=Q7G4Z1Ey^}o;c5#3es@PRN7q!wJDoiVVabpqD0+@PmwcC3Z=fCi@&4*-h8&kZu=jf zcn>y=@uL5|m~eH>o}X6yoXbd~vXJSd<>T{mCy;cXqmkuCXoT`-_Z_{Lo^SnR2}Y|x ztxrTEdOUZs%bd?>axb7~QEAjFKj?uGw~& zPn8uEbPImK%_fMw_PPDRLi_Q9W=~m$)>bs7Z=@9nTU%&htebIyc{*-pVam~}{wtWu&;uF9gFs(4> z)4)dWxAxfzlj)(mYXq4{+rT7Rqc|Ans<%#0vh$sQDk*PYC2{Ea3*m z3`Rm`G^cjD{M^{GHa)5OpM35tQax0QWQ-jQ*cPgN6im7_9eLBhj3vFte z5RX2eE!QHndEa4Hc>BSpQaL?x)4KG`HqyBRi?;}MYg_J$hCMW2q)ghI&@xhoGB8oh zI^idYxAN>+cN~2Nl`5#^#Zn#`Pu@UcM)o%9@8U|NR78a39)CD+W-{{4L@+5yF>s>s zxrHz*HAgGGv?qRuc#{2pPuAc)T*fys|T9B@kdfYFuNdfmSi2AnQ$W+ zY@~nhrBQ$_M<7XEkwFIz=*o$~CcxFQc-wyj2#t@(8ThT=&?h~42e|;%yYIw*>P{ZJ zX>#%}s9GRT{t#a{v^4Ehjg&fZ<=-!vk5fb~+f1IKKN z&BA*1fu?z=Y@~zhRY^~a;c}UNsVYcEr%q(AEpJ|#O3Jk}62Qs?I;8#!lgbSK8d>8e?O0#j3R_8nX9X{{#o1sH*$e^bxR+dza4SuJBjeqq@n~k#vQ> zI^Qr#ukPc|bKtQ=JT*e=9VjN{bFZTeXFszQLnSJBd=q0(Fl~V2FuioT5-yQt6a?r! zKW3XYm|-SDyOHq8(g70mK0@HmQR=~|sL{M{h807ay=*wMC+5w(c-ji-GlxZpV?#nC z8CD~R;Iy$$V|f2qXL%UF39&!#v86LNOq6oBt*Qpq))BH99FH-Khu!ernH$LRzqP^Q*6ti$@ftoJw*lPQw;({1uO>fPJ#k?+gj3m zoAx&#p%RBa^NM2sASlq#UpxZt;7g+~vcQf!LjzA~fjUbE>Id)u9%0{}{R7I*XI1%HuY3oqJFDm@=BvI$fboZEw;o5XD3> z1OR&(|2#?!!Lk4wNc$xDqnKvtN0L?KU=Ei2M`ED^Fn<@;%~jTxqdCqS|Q z$f_pL*~Pt8SQLJ3u(i&~uETbpdl~M7M;jhI?V$!%*4WPjTpc*;sU#UWDkd6cJ5!Sp zKYK03KXN`#)3quLeg*g;IAL|`>s6C#eSOe%<-S-b%>~HS#89dXnl_khH@EUk)#Z9< zE^UnE2kHt*AGAX4$z5QHxCoq0?0)q3^AZHg#(3=P*xI#r_i+F72G+QA$K?yvD^NMz z&8KaNxX=DVUnd&_Q1#nVJz8Ck9&WRTBrsW=x#?MZ)qSr%Ou3h}X@(Q!mq)%fmL3w% z-dH(4H)2GxJwZYGIe6p@`1F-3Ss+mI^&8Kp2XE%+<68Om<#+>bSoy85qbSA8USt)A zIZoF&z@#jeXMeXybXM-t{;&y_S!><3TDJNcTcOC5e9EObcxjd^u&;TBL_WdgYStP@Yc&d#k8nBuA&PGl;_!%39H8(Xv-Sq4oDzgNDA%4kUE( z+G$;B^wauHO6zF1D-^h!QNfm>Jc461n$Pjl+xxAR$mmU3o|_N8!G=$S!*Jqmu%jKL zOGWOO!zQe4&%XbZYDb?k6e;L1d>`BpSWh3C7CO_g*5dE#u&Wu}C@Z+xYkR7>wY50lVv59fQz>;4><;;$(R4V{Yn4~0g6MvG;b zwTSZ;7d=t@a>jl?&}aD#@^ngf9-up72XiPq7HuS3LE^G5e!#A&QcBSnu*{!i;Ehmv z%f&)Mn)y;{qnw<_s`cnIKUwi^EN^ccEY@OXZXF=M&htdJ#QLi||2^>9T{tn4ykbZn zn==W*jPs}Ta{DKY$jN}S0OIh$MpMpph2ZMGL4 zh|X4{JWo%H``1tmXKIG8cdVTH%Nob4hj2ay+G!Gefm<(5>H47iBs!$?T?+Zh?l&a5 z-M0Qlw4KEH+BtFi-dt^;)LbQc)Zaqy7cv+44>(aVu43-Kxj^jjU3K3hYYk{n|+hD`Yg?_r1}2svL@%MH>`PFH)Gr zH;s&iL5Yro$w41|{R&!xY11vwY&aSG(k9q(H5l&m&EZg&y&_m8~o(1fdrsJzVVXY5w4!zSgcLPpI@g z#9YNFjgLh{5T5&ZUk|iWs!QTcp!Cm#M8yScZ*KIxD+1#V9CZV+_Am4G=u}E|^=7d= zm$K_9U^2P;%B`QPtqg6DWg(D9r$IMe$z2LK0g}S?SxvkAL3$I3#qiX30*6aw%2vko zaJaorQk^@s&{A*Z2XFWCiQ0nT9Vjdj?3z;E#d*@y_J$s zd!^Xt@dxWN8hk(hzq0`TXYi|T0UHhip6vPJd2weq=ln$)a8wlJ>;S#uudT?cKy2ZH zpNl^H+#?nke}LPC^P@KC8};x{LeJht(kD(oRTd}bUsaSsu_Oq4-aA+t$3tq_9`NB& z!#FNh8l0`$tDP>4-?=s}14^cZP*`;WJYofxSKL z82Ag(NDsF|n@&V2^VmyvWkWwUdpR&^x33*_e@%_V9k;y%diC_%-J-;|K>t-*<7vGq z>%SwPdx{_`N`@4uw9B0SzRut6=DC_xHDs=js!j7j|4LNB=S9cms;X1nF6&?)X<1R- zN;LmElNxIdpajnB?+4p=HV~YhHk!^htIhY}K)*yx?Nyd$ZJKo)>SSu1NgmuaRCgst zSG4C(+?=)6H={A~vIH8_$r(a|JWO@?+GU%OC-^WIbnbI2(=RDcsRKRyTpcM>gpq9K z#}JA0v%1=^H{ycgC6k4fn*9&B@qK&Q7GuV;OB)*>Uqz0p3bW?EeKtCseBHj+X8{DV zzf~|&FqKZ6491veFgkk90@B8trnxRu?5A(DN*j}Eqg*p?7R%Oe(c!om8#=nVW4$px zqmwPdc}cc)2C&R__vkCR+sp)W{zPD)pRkZ21>9o}lMhdZO}!f@Y+;9A46|Pyc&lu4 z{?^n5cGU7YvP$IDW9*)%;9B|L=k>Zt4|VR!V%eL`WH<=r8#{zphZ=YmeC&08H4wq) zklUuzY_X)90utmZ9LTO7{3okX`qLfK3tWTLpw=#dHRjBeo8x^lixTK7H&vD$FFvZj zqm?)|2(AioG=~L;{!-6s1K4Bds5{|aa~yT_NEo!laiEh*J%}NnHI&5mCroZgc)fvx*Mlk5QTXO7hyBK=bHz5w!m}?~> z6P4IM<5Co^%#3|)UyK-|__}3ZiHn+~&HOq|Kl=~0<{l^!%i)oQwnC~yFeDEhZYGBv zB_<}JQBzLr@|5)Zy||oU4vWXrcKsb+%_g`~g_@<-$iBNStOfaT*a&K-;!;z}db*QY zWk+gvZw-Wiq-7b#Qu1vu_|gHPw7Uwi+1|vL7)us|+nt|~Dq8ODNdfCoXjl)}aCNa6 zUiPpU=tOy$GVe8O}Aj4+koyh35)K?U-tkRfeu zb-R$22tY46CAanDzYPqhQV%n*i&T=A~? z^9>(0?_G|h*pkK>>XmR-!soWD`;s*QB7R_k`-{?Y`#YhlL&*>nRp(~QZBzPeAouTs z_w8i{2id&?DPv*#YCHZ@k4Si`G56-S?cNg5i5s#K=AWhRi0G`a>V)|0w0cE)s=56& zKmfn!2m$?Ic98#pqd-XE;8f;C5fAPsb*4_nE9IFjRW5u(sY`Roo+4b!*CNFbQ>U`J z9Y-@kF1*|Ib~7uscNPcYtjvRIJ*A+0gQ_i#tm<%D5yL(8?kKm$;B2qG_Hc2}V0`!P z@o)RUfE=?=$`}p0y?O=}Pe}1dV+ihA0b>V!950$GtzJqZAjU2Mq)eZ~rwMyzGmN2V zDiS*T+C{b+Eya*awv%{?zXdtq8z42;991zX9J$&eB=Fj(U{GR)yn<|!PAg`&`du8_XBsqcRuu%4vT7POz02VFrHaz zPjqJfLLK-$ddK;O3CH3m{N8h2UruffC~a7ib)WE`kVj^5u;{;BCww&@o4sF#H(O-I zHyRQt2gLvz<|N(-Kbcom7J@fBDN`b|*zjA%-%0HFuc&nSeqoCe81$!l#$ths$W-Bf zXc1imsob6KE<|BR6Vc+#zxY=#maC9_x)z~!SrW* zR^8aEt1TI@>jDq|Dy6h8vd}gI*uEC{urarbx=UF5Ydh+T`t~VYmmUUGYMoK5wMT0l z(ScIAPvOs>@*5A^dlv>cvm!@8pG9=^rki)BK7{P`0r$3fWhMmmiI(y2&Xaq<%hW+J z!B520^4=wuR*!e8cCo$78-H49@)n(Ld(^qm*GXXESNw+Gy&@f-h}n1cJDTK>2+^cG^?l9 zoxiXA##nYW;`YMXac|aU-Vw+i-_r-Ms}L1h?IP-67J7uAubvg$?DZ&Tyt3;H98AKuFuY%K!#TM58HnJPQ~uwG`Q4I-uTiS0V()ZgwCfQOT8s#^obUD z$Ra^<2^JM~T_^@{FfvPX+g~*eeG-8k@p%Z>=Ya*&`dBTFJVJM$?Eic-uG;YhqP_Ry z(+rBYB?*p;%5OQtF4wI|6NLT$p$dRFXBPr%|2H=K_@yJ--Puj2YqfVRvBZY=4 z@3g*d(t-Y&wh_aaE4#F{OKIZ78)AO(~Fop<6I`W4jgDz6(Q1XRfpkjFn#V@ zQ$}|--BsMDmp>H?P@~XjuEEraiLQv9L?8oVF=;Oiw`7RlM&T`x^f^zocI73!*Zk?D zcZB(lw(F_5a6REp<*V6?6@Gp@l4en_#jJ178eH4@K9S(<--a~vBxMI=<@$f$(?^3D zV6Wae>eBrqO<>^w4H-0ZLw9!~O+oF*E`!KI_>OUlkt)KJ?P4U`?~&$5H`6xBiET zvH~^YrguJ|Po1c)#6X5GAFou8+1110joW?NT`$ZsiC#)Jj-TTmeV5fiaHWP@4@P2$ zrE}^pWpn%I$o1m=Fq7#`I**I(9Q$HM8vL3$CtPWxc6ebEZ|{fluN@EW?}vpFQ|+%q zooCFRbcEnlyfDUi0Fa-*yje^pQIHCLbV0%jzHtKgH`Xb5n|cxd2)OP5r`Q-Zwad{2 z`h(&Bz$atHke6Gi3IYcG2n9lgw~1RR%rX7Llt$dIl{AJ}sCN&VHe@-3!S?%2j^4yz zn6hEX%wn!0B(=%>W8y}{&gnZMKT>mD8xbe~Q+Qi;J$zFoI@zZ3^V){$FV2J#TrgJe zC%WTjq#0s)Zal8%E}xB)x{m6f{!uz_Ib#5q8JAP<_;ODuX<4~PdHv(kr!Pom`zI^l zt{>ekDi$}qbYptvD#{!G*qW>dz}6t|#j@n^@aD~Z6KF@CouJCZYulD+^ySz0OrjA3 zWs%}{u*CUifwXi;)sDV#Z>agV-sGK&yJf=9VtnP+1Uv#16&_VJkLn<5;dJk>*ZW+j zninekkI5#foqBN;hI)9F$5nQA`6ui}Q<8zO%C%n0}wkoL|FQ@n7HwbD(dAqi!qcQoq249k}@DO=+G{0P(E z3m7a0^~#QduzIL8Ix&+AgBx>&c_`E;l?V4ZT}rCwR@0uXR#247NoXA2PyF!R_D;y>7Bhw(H^b*O^E&-mE6##7cmH^M3g_rnlt->H&$Cx%<6M2OYBt zd5@j!C;D;67ddo2OeE@bKI>bx44w3-1Kl>i?(V_n=d00?-B=DxW|km?QHIS?F~MoG zshIbu1B>xNtV)O;SIq7t51UjsU+-%*WSw3lGg80t{x{RRNv)l-`1UquQ-|(&YTcQ@ zzLy_MWp(a|G94uxk@R2&(Y+1q6}i9Ow|lTI>=^9EH>bP8Pe24$W>W<&S9bh+#f>2@SXrXhm z=}}BY5%e%)Lq3Ukdv?oS%yOB=>vl%QePMdu&%P?>T6gEBcRxR|d8V}elsEIsKff~S zO#}aNvCJ1CC-b>QK!CA(ezduGtsbZq`FxM&R=qmikI19wxEd3Ik}6${k1M}5Dxrl@ zhtqJ0#iA-!0G6{$`_d)YoN}9S%DCzMKkg*^ALjhRSIdq2&NM8N(&r^Qe71aX4B1>3 z8l1kjld+M}BH<}`#;YM2ng~aHqB2u{z&|yup`*r(wRhH~npmqMt}9Vpleh2G0h}4# z0zN^|jqJTIP$x(2N>CO76^RPfgxaYgH7w%^tV`T`qp;<0-X1C|u~p43TWj>27BGL? zx3%E=x%Yh|d%@yIiBqc%iQnsPJXE%8 z{L+>5I^qMQ(mvar`=!5`E1l$_K6gzP2b#n9Ge!3AUC@MUWUS`Q>-0-(JrepI zWbp4(D2Cn!-*{-fwSlZzE97?3W9=!%-{S5)SQf-ast0_K2GB7Ht@)1ucB$o67(al&DzdU?@ow0_;PD*snPkA8Fos9YvO|a_W0aog{aCtj;!*O>Q%Em0b6x4uWNzxDO0Ctt5g z%ZBWsRSi!{wcj@P)YN_z1!U#YNo4M5(+AY4pi{94!JW^6^uq9MDYX;Z)ZQWu1zS-y z2N|Q7xA}NOL7(33vo5sY$;yuwt)vX($?sIbUT#@8iiB5@5?SIDQ+H1#(Uxx0eOz2= zqAk8$&W+9F;CpfwWO^?g-Auk%$=lyqp$2+chSuOmQVFxiRa=Wp%+>3}>1@=E)PHFEB7l6gBvI1qENgW2$(oVa*HMjL2zG@+ex(XqF z@6m%9clXC}2PdetlYa<`tqYdAtDT|Wd#01sZOUIe+7mGqzJYR>OCb~ARNRqtKO{b1 zmOFdiD09&-!BC9AjP##W+wEcNw3s#}^iUrnH@I4XGQExS}&pd*;5&OwWWl_O2 zP3oDa?sQN0-RP-zJk+kThWrDT7lI{*Gm)outJL*-rF}n?gb9{K4qd;>%g$*4ZzK2o zXb@FrvOin4`{fLqqqhz{5*cmCO%t(o5U4dbk@3wQK43Avn#f<^rU??ZBc zT1$2O7nGM8TYk8b)GMvsvHgyipW;1d|Jp-UWMaEj3%%s8_6TI3<2*K1o?r(Sa&1VX zHz3iJsbiNq@HaHz)oCSqSj6SM8e<93*V)HHCtAiN9w0J{l8z={BB>5*j~yLS!0a)8`CNzYkn(M)zYcFHP0xw##Q1~;gnQ`X zjwyAcGwK_}LO7_~%6ez2I?~f!wU>$2P{Bo#IRzAl;Z^}yNnBh545YR&z{rN>fzh~` zWx{w)z;2rhW{B4`5n}ON^|?8p+M1INcmi0Xm?_OJ2=xWsn1mWSKQq+X_{n};W#IO- z^ZR+5#&RInwqNZ@4%X?qXq&7vPpyQjf?Nl;9LFS;Xi}plt+NecH#5h9`nlB47W1#6 z5e?mrwd1V2wmL5#9UB_K^Bm|CVYN#5bL1_&rxpu7&)Std!z;fADD|1p?rzm$ROHt` z%Dm#~OGQ_VQx2&kz8Qtg^r#?60=ftL##i)9KgVFsFOf9g*;kr4{Nvgr^U>M+NzbG# zG!q@EQwuBu%~cbKeDy>WGVtYeYXOGVPPnmY%P^*5`9dew!IdZj-F z)s}h`5vXM$pOb|Hv)lJ-q_~pfv)iPMq4ob{WWE4mz5OFG$Wj<2`VeCyRVL_NnFDRK zoEk;F6Hqh=(cPDS&2w;qwrmi)RL#DoGc(hKDyrrSInV*!ZI95OYS6;~R_~SPcoBpJ zfNyD`+iw)LEDdq*gH5NFsGKd8l*is!!V@1Vb8?kXFOHjdVLot|;jjRksfhVmyyo_> zs4_V_#yr|>kigcOZ2a8*B$^R0JB(zX+I!u?4d^%e6#2%xy<1NHWh-6&qm#5m)3*{R zm=*b^&K!kPqoWm5%Tycz@mk1X&gudpOYk;wiB}VupE0RZZ;Bn0yi{$?%JO6-_J;#B zwlmU2j<1xSS}%xAD&xH4ZY@M<_))Ta=7N? zHp6fa;IYc|PP*Qp+HsdOT}r*>k9ozSqcbkk;;gPurI}*u2%ajZIZNKyc(}b{A{BDk zKreL}{a0K90Ui>5p^7}Ts&)m5pX;iRSf_5<<|pwXs|fWkFmAJP-prnM**HUO zNi9c5r_Z>|`jq~@Ov{J_)T|N{V>3xSLJHohv2i)ghhxWQQOj8tCJBwrs(X7JK?6|G)U)n%bX>ns%6c4Y&Bvy2Z>_s z8P<_6Z)Hs$zIRse;(gKrv_v6~?dj?Eo#0{eNbEYiO)C`-g^eO@WlPh?&K}wju6|W=iqF@!r!WgooRMq%BI{yByt}kQf6NTqO6P+5A4`FDGMb$(w zljLdxF&P+dC{}IbR#sSwtLxk#t zSra7WX;N}(?W)lJs=Ub+9n72ssd{I-29ZTnm6R$OTcAJid%(+;TJqiqkgP^Ns{&T! zsa@r)^---ovcByw?JiA7RgpbR+0|)MG^V$Yrg`ElHVBf2&Lp~_#D6JJoABm@y}pdc zQgl)wx#N#2*O8JW2zV-?*t-HOL@H&QDX`q(!*F7&C!`Rd$@`#z6`xO>&NiSf052U&-AGEIt0>3Mb!kkiIGyA^%E;?y z61cYRE_$&6soZ&O6eJRk;qV|jD{YI9QY)1P6-3n2((l!ZRX2Eii8VJqlD%J)26Y+8Ey04x@p^vXzd>@1YhMNdbnntFCdaT1y5B{fW*xz)uR*U?78n|_YwFwF>{jxd ze;I`7d0Haw*Js_B!3Sa+$9qv!b6RfMgZKLE*|ZsK&(UXcV1*xrw`*i%>{x-`9Nh#l zbaNYTZkUt=^X}ubc)%$Svs_{I5odTePcLbU{Z1U%K{^!|)DPV%(W zF0=Cj`G_7c;vvu|TkD2w`NpZuv_m=m|9z%}z^jxla==G8f$qz8DPx~R*vG<6<8G9| zo`wLQ6y(k8m!HvgWRt*j9Cb!d)=nhHqGZ zIGCkalWEv#9oo%GHS-1=Jv&d=tf!|az^a(Hr<6$1aS*x>bl5&Rn=V0rsvw!0bfMK; z(5F9l5FF!t1<`$Et2JLpoq+uURCR9h)|9%|jdKF?>4)IOeC3t|{!@E?{>ovX?IewX z1KI2A&v29O{~?~!(t(ei|L&Nk^Stu;__XSRjdIMnQ; zA!K`EX6am8)k(eF1*`sX+|i|BLE z%dlu`Q1Q4_9vbudnx$L#HrJ)hRxs#;9A(N#w7O`ubC`I|jaWU;70{4Z*wlQ}nqUBK z)!J>FGniSX2j+KrzAq-Fl{&1A%cK3rRuv@!(GV49C0Y6CPvc(gqE1$Rlj}j(XBHK?NSsE&6Ckd@`O1fMWndQ=%I&vuW9AP#J1shtcDM&Ux2$tHWnyGI49 zUNbguuiW2RRk{V-dW}Fi?{mM0gBTL53`X5&IO*0saGYwC@*~pFj zJPYd2B~tD*=2+L1)@XcfWf9t$wt!w&n8q3VJy{a#1Q6dXLF1Yd+O$&O zkC9i-m)Kt#&v2pWx&(nt;5EN_`?=Sa=IobJ$N5>V5=l8fME(Kl2$^9j8r!)3Qo!fl zr=_(^9)fRDewawy(PKBwYhQNex;{CltUq7aZW3=_ZMQ-8SzliL=S;ZhvaGbdy;LNt zH%bOXQO|bQ+m>0))zg_q_snDcc;*hMmz1O=wAGi-->ImifA45I8O-H4m2?>lPAS@{Ln9Q_?k6KQ)Xsa^h|L0B-EZsz#Jf5q6v@wPNmz}nvCDf$%}td`noE6C zuighn@~pWVRdraI_FG%cHyqx+Es>Pl-=E({RF}oEW;~TDJy}V8FW`IQU6{CdJRM|u zdwYpIncqv_A8L#6o*$jTuHH|0v#>Grx^ZFg*IjFt^7c66Q^~=@8L~Mm3)8&7m@ZX=)Ij|2N&F)OVPKM?D;-_ z*WHg}M7h8fwFJcl!P&uCr^=3Lbo6w*P^bLA0!fAG$uJzc-EpaZ$)Mu+GzE_SqagmnZQ}P!p$xTKe7lKFU-o~Vg zGF_ji;^oRLQ}wR>jvV{Oez=5-?rkaf)<2tCxY(qAvJ@DaWZ+V{D z%`igdUN5Tb88katX1r9)>TWO`(fe)GI=3Td;yZXV+C%*+QmQOla(mWm&Q#j1yfg6` zTV{LP`HZQ_%=jI*zvXVt)jI3l_KY+F<{SeR{3l&uDDILH=Gu!jV6mWqFXNQ1bbvI3vR|P-G{9;Yr2X` z)r?Qj>3+j{41{<2{Yk-bA9j#8`ODj(CL zwS4wMu{UteLb;^|Q5wF#aa{`^S$m&3o}D;*A9<$cuik#F8@fhTR=vh?_{7eY(%*WNZyTO3QKO^{{rTU5Ael?3>|#myzrbqXuGvjP&sOB zWn$66kzzQjH@@gy^pw6=pzxRc!hrS%kFs`zJZ6X?^(yMOexTJ?P4Y8XEK%h}>17ha z4{U0aq!pkIG=ik<>DM2EJTGQz?PaQ-C}vf@V$!N2<#lj8{!H+ZgUpYoQ~eP-9FEjU z+BFErLm((s6c@O0K)UEoHY33?h|(G45ZF-nbd!tz-H8!{R_?9}DAnY!J{G~lx`7%v z0xYtFri1>=t~%H5iOHF`=Z39X%i!N956Vk`5c#lpp?q*HIg+&S`cqeTYI1zh=Y|Cc!F; z7dp<|Hw;WqWN7jAA2t@Kk0|$m+s?HidsqxVeP~&iSiV07-zk7j1bk~)(7%coWTtj? zdNESOXDdCFj@e7&OvF-WQpVUmTyFi4TX55wg<6!|&D>UhZ(+}Phkvc_oNiA4_B;f% zS0tKS^%ykyG6zWN$V*0KuQavtx}IU<4@_b|(_UJVJf1*eEWx2YK8j(rkjpe&$$zDL zZXn%vugQ-fLa=G(8npoTGPM z*PjN4Y?2Nv86b#y+>i28DBY7&>XL#k5%Wi}aec$kR{_N3P{)cbkAx6H^XcHlUAaC@VqCh_4WtF(V(75wkS#66G(;nbrKs>7J* zIh?#p{Mh?v^$vF)OCIev)l$gKk52xqDs-pqO&8Uan5T_3nmVHS zW!E~f&15|S7c%WeRp9liPlla}l+3ebEd_T!P46On1Fn_pMC&iJd`&i##QACs)j%tB ztygqsXVwM%b|*QeSM8Az4LsnDm9blaD+$XNX&z^2*lE{WKvU~P z#rbVj;NUI1ox1A{<2yIc&;at7ss}&&DoJ8EchnZ|*jZtz;UznZ?0v$Qxd<9=3N3E1 z!+z7NiWfbkg`iA?Yx5Y3!Fqt?U4HwdDwip?_Ml_@U3Isqb+G=%aq@A)A*d7aq>-*Q zR_K??L$aiuygBxzO#hR~IhJ)bY~0(Q@vIM%`t!1R7Mc!EFQ_G~l@sFKSL;~^~s`;CWzd1>!9JreIllEXk;qCPm#4Ve|sV5eAxflrYV z!_1}!iXu2ELnOd4xIe|9+pSmq>_hOhUMBCaZf}c-UBnqx4L(3zS$Ct9BLS706rHo& zK8E$vqbaVGm_)Ot-ZhsXQH(bunFl%{&e-FH41mPKc*tjyE9(-d55uHqGU zsNnJxt?P?H%k~4yC$XAso)>8`Zl^JKG}^~|W9p*K=ErUi z9{dbLKk4776AYaHNAoFQ|9L|abMT7|nCAuSkYY})aCm~|Ong4s^Q3-!(uZL>wU!}B z_B7Eyl$8PY*kA+{RoannmQ|1_uG24Q@827!W?DYUwN1?Zr{62;H{is#^XKAVehvg1 z#Smu@zy0I17C|^?SiG#&pdC6B#rB)bM33Aj)1>(}`XbDnTT&~h$J3GLJd>cz-z2bA zpL|kmGXxLf>Nqc;H|v}A)=c$)KhGo8)P%lTnIY^4Pq$p!mHoPBBB(P?F7 zvZ&U%j9g@NG~QkYGkBh2lX=sBPE7;HduQ+mjUPN4S~K%SUhQm1SxQ!ABv}eK`0rl` z-<<`?-A5kIRb6KuHAdp1E}r~x@cbp^--9&(eXlghj53nc91NW;24)}qM%ZD_k(>aj zsp-ixoyxvNR1xGKjMg3Zx*x}AW~G{bBiT&d)k&ZCJYXCXCNKL(O>m*J<5no|uc;{p z+6S^QTZ+NS`o$RCN+deG{wagiJ|GNWp{$dV>?91ZL;5ge^&|Uz!;Cy+z*xlyYs)+) zEr>*d|BTnc>A>nG?w1*KMr_Ty76N!b0Yj3Yq!W5szkn8KrG{@fTa9T1SS4|gZ-N{9 zUDGRPZ2PJ%iG7gPf%HhsO|9bsJU}9OsK+{fX%(+Hd1tlt_PS!9jbUe%yfH*^5?Y!- z;>Qy&aZ<9Em}J@L=fo&|LrOyTkKu+8zds|25S2NFcw`lzX?RDy&s)#0^6K%4t&May z=JY6XU~QOzcW9#BWF8vDS;i>{OS&j*Gx<8Ocb)--Y_Ta^X}!WMb(EX=0@NIFk3pFJ zdmkN7=b=Gm&{nN`u{6*Ej2$w=c8|T@xv?Os9KM=Sc9nAIDV)WmyR@(TYySRf%f;n+ z;!Y}b0$-K4@6%lAoPUR%R#^(*+;&SXyPK}LWk(Pa!VD}wlqRk#Fvg$lN7>s0gKa)F zbeJ$I9j^Apd7q(yi>9cy)B9El8@V@F@bqWbkdk|>{t23GJBzG$S0hC3uOzgJIko@6 zr9gm3FJ46Tz_O@E$bp3j(to`p90#!W<5>ka67mXFLRzDY45rFT43#=Z_oGWYn8ER` zz!HQW1*ILI-K7MGyXoDEh^dynbHCb-#ke`$nvj>zY9(7@mpUO-sl(T!R zY@ceNX32*>6Q;uUr6ob(cxu3*(~LRo_PCE04=Qs}ab~;XpDpMuU6;*ZhCTiS44?22 zM)5UT%y~&lRagnf9h%h3VLwma`QmpvQs!KLg(_`!*CU>IuqY{1eD-rDQ(rB_Cq4w@ zAB@JZ*Pk8{&r_3~qdS3sqLX{DZ4CIky6?;j=Czk}Mz*gTFBIxqoy0B8(l*{LD z#FEN$!n%Q}A?c(=?34+mhSy|xZD&%0|G6JWN@PY{ybR)U!Lj>0ll+4!+@<3*tmHQI z4pTTe1ZCZB=tmee9r@R5YZ7&!nEl_K>IPjd)9n+OWhHCd-S++$W**UeFu9@7^5|$$ z>=rR7biAdx97(e~PwA_FD@#1!S5BOk*^VDQ#-;8EoQ7@vlorfuUv@wu^Z_@E%2qC2MY15pORv)*m*(@Gva~VfOwz5)(*EM;M|XALX!gG^3p&P&hcDW! z+^YYNjWPEf>G0`C0<74qC7&clS)KeFu2QFW_u_o$!g_Xiq zhf3`+7M0YGA2U*)SzltmM_lBitbraCTEHT{^(F36|L@j9Uqh8M8H+8VqBZ*_(sys$ z2||3beke#2SDa)KO=V`}#zn;j=G#f;~5`tuq!lbc(ydX~uvyTuw3T9~orgEacN#_F6Q@`r7K9?P0Z zKBccyp1V#pRClUfwuz1Bt4;l}IRJg1|E2R$V?48c&Drt#?&g-h$@C_Yr#bVg@b1Z# zR)&%|1}qIy39l$WSFT2J>YT3K%wjc_Y`pn6(*}RHe8=a}XRF_tclQ&N3~eO!;)sb5moP!@-~NO}-~N5X1`aW9g4U;+x?@LSrX?+B!fNe_X+m zWn8~{opAP^+VX?3eO@1?R=*MkSI@yW2^Mp*2ByXrWy$$Tvp4gY9O*@1R-C-{2;CL*v+CRWB=%Jy)FxrK-=L8-e&lPh(x-Q%>TrKFZl*ZlM!lst zxP@hWqF^oOTTFkQD!MxvN#=Q=1%%8T?9!^qg&l$nBaJC9RiXt+!NNPka55#W=V~FK zm{rf0Rp14UWzJ+*D)3aQYd^7Wp|f6Zhbmu5go^^8?l@7K3o(^tc~Q-vH|B@cU>=N7N#q^C2F zj6iXgjc_?B2znTh`I3i;7>g8~YPqJruy2vZyfeoJan~jg7qL4kR=5_g@!#C!m-YEz zlTVeSS1WXM9a33FNt#1HljwjMB!8{qmdk>a0^(%2`o>m1)Y~F37!qz^lW=#Op%)=z5o^ za{attu(a@2$9xq(u?9EmS4={eoU@a8+19K$raL_6t@0J?q5fouoIWCpAws=C*{mXx_lUj1J5IJ-SZtM^^{&vI<%uTJ(${A$;Js3+AH zN2&u_-qyeeOQ}?uf|cCFFMmknFsiE({#HlU#fg{zi&B=Y8I&km&Q_(x05?UjZfN-H zC|Fs^up(>&o74vU<|rDyW^w2Kielr{yR-vID`*kInx=_{CfT&x0zC*+&yF05tors~ zw&QqU^rjmDk={ZlNDDm_sR={~5NQcL zKp?q`ecp5Ld(VOW-hKc0#`wN*_#=#wWMw_iGuv;LHK$JeRS~Gsq1`P6po8m<|D`Jx za(Jay^F;>^XgO}COec*j6SkHSj+%sR9D4^KLzm~~!jiqQBOfpYb~3bXv;fA!R7<&#_M6TiYIUQIo8A#c?B zd?!Zd#I0K+P945%eyqaq5UlL6isezcHVIUocvl%71icN>c=b}K-ZTB7UW@fsG5%B? zmJk^uAP&?FXK7xt!e0iuUAPULOm}tFyWV4;@%^J0)OZd+oy`LSUjOT42f%kuxkBqbH1_B)8Tbv zed0YHxz zyhMJ3UVjlkUC8=fkj8vmE^y?;XhfZc=%JSBqmpfJ@_x{K!(Xe=R?}7#rw^+ELm03F zm+DvBie#SXznWf^?F9O(zOA=8B=&l8X=mhXnBXt759afaX-j{IHI+dhQ3)et?6`X- zi~ENk?sxe%JB>$t%nM+;Z32pR=L=N2xL9QaXfGR3CXnb&j3xx1&^e8l8jcS!U~Vld zHh5pnavG?2L}|Bmgd8J)Qm6_qNxQ^{BJEm9+_t4asHhF|hNJP<|GAuUm_7H)z$#oH z84vxMEm}p0@9ct{x;b9#uG4GLu@VCxhgGhJ=65zcJ~>s~;AhArT}8nW9N&C1P0+oy z(V>?v`tFRh`f|vKQria;y&q9G+(b9&Uq)v9_yrX-PZY^moE`+XQ4W~QaU1P5jw^XUgKBr+qd;?EnWas77AOe*B6k#P5s97 zVh+cbJL45{Ot9Vn2<$%8&Yb#zs{BDS2b^%k$}#0*{;G$R?54Ka#mlPh9LL3wZkd*~ zd1RH{Gxa|D0v2(+Eacd&HtrS6p&p=%r@5;t*k40lIJIXabD{dbxbO0f`c3{7$=Hp0(%=&;G0AAW*aeH0ID zZ7inub+mQ0Jbw>ZEA1smys%wkExr55^mwnv(P_N81-UQk`OpRz z=;vc&L&yr{s^xyYF>J-o!1xb=D@<@MWd8}N-61cU{Ky1(S9^X4Qt?yKR$sMm`)6kY z#U{88L5o8H6A^p_uuDd zJj0#O5BzjWq-Z(Ro%j1-v&||G)Rof|oyG;pZ7v zLSQ!Q=G&9j_^6kCKEOsL>NKymVD=dlx~1{u24^<(aj zFI_rJbsrFs1tuqqHJ81M&Odx;QQ7b}+1m>5HU3}_x5MnkT&QQf9?>gPQ{5L^J>ax@ zA#LwtKVrs8^FqfF%ogZjZpFElf-JLo;Z9{!DHb%B!j5|dlSq$!N@e*d@^pc&C zQzhaAph|$TkX~N(=^8FK6Xd`R@n_k}N4s{>#@MpJm5pLz?!0eIAS|1!8_ab09~e;P zXZ;^=-%Be%zbuaHjezq_>>F$k<$u`aMV^PrdDh znz+cI?(!$QGbV?SD!4fa<2%G1?zf|PYGY}k9OA~%37-N}83Zy7P;IFQ62kUU>(5|{CPC7CI`OQ&{<@%hwLcY;x5K`hBVk9Nmr`5YH7 zZ=1*3E%lR%VGqeli8NDDc(wGlUQ+M5))cnBB%>5gi_!~cB)of1`WF_Y55~V(r7>tb5ASY+9V?9NCaL-P){$7>YW7g5Z>q>@y#xELxDi2q>-t-&%8qjN- zw|z$i#(t8joQSNO0Y#*^!5st2gV!ZU8~O{RZHW+2hf~&OqWE7v`0&S-O9a^G zs-4X-S_v`kB@szgVSGbS*Qj_ON^RWkmNA4LsrO&*59q(CxPMh^2R+~TP`psI*$R7h zx3T&J9_+g!N$qk{Bihy>2Y0KHjI>jCt@r%Qg9GRXM%E9J9`Xl>i+rmE`PG+|JHZIs z(O1YPT$$}j&F(3SvYlGBY!)E)>w0g2{{U zr(-IVR5&FS{bSsR60A2TX;Klt*!VY2H&{OQCQhm@liJJ96> z#1Mi(13B|=*1MB;^&zI^btP90ILS-b4p*WncQQb0M-JNfCGWkZDJY<&R7MMdk&8&r zZxWJd;`zAo z161=nYkxce9<6$(<-lj_@26<=j|66fCgoRM!?i!5lWwO;Y`SbZqsR|06NTe+o{9g~ z%!#m^*wY0CaM6Be$se1q3Z6&BOp#(ZO0f3pY1WFV#s(gCoRY^_NgD$$UAAcx!*$dbF&}(PO0~s(5Fk+VS~TO>|mi-@wRR{`|8J zwds8f*%G51E@JLty6*oIEHxKvRQt8eVC7mtRE>p0eYL}p<43ew-z~jtyK`7DfT?6j zn90j)b#uIiDim<;q{XF|-x8!XZob4=haGwiJab4mG zT)(VpUOPi_o#G3DkNI?)(y8#TdZuM`_mG2zaQs&#aclwu9 zMvZRilU}(E5^wdUr>FbeWYjxz4IAFQW7eZACBC?La{0l&gKZDK&&Nym6|`Daf;o4Xwg8yxNio&fpJ*hX>Uysx-Ee)n=FDq-IZ>E;66(sO0%@@bA6+_m4Dc znZDmb~OB#ftq}X}hEM`#$UX_m%$FJJLGG z&Kk3>Y?I`(;_y8^@6=OW8lo<+EpUxKNj~HS!#4Dc)S0(nTB~pA+ZjK5=5W#&btdC2 zFc~fUlfA_vvDJrnLqubr8`irWD@Idnar&#&F$Z9f{Jwj2c00v`5}X?Ip=MYbvaaZE zd4!YCN?jaic3d433c`{{G89P z2TtGJZySoIj@sI=t_&`|w(zvRQM$)fKFYRdT*HJ~Zm1TkG;wk4KYjL~o47tO9~2UZ zB#*GkJ8^5%EFVzcrycT|jJ_Ny+EU>|8GqX~xbOb=Bg3Cm=2<^nBFW@s%;;vXP0y1P zk0)H8SH9H3ZWWqQfPN>gHvfwK+`k>xfgA(e#=r4uk1toG8u1ootXj$eCzDJb8mKgH zp$)wV&W|`|VNSX`JP6`B?_L({b+1G+uKFo^_pM7D6^w806aK;cXTZ5g<%MAxEn!F6d!^2XG&PKO^#0`!w9a8Oc-8c7-5%24NlwH=`M5}W3$-p$7bSEidUKn zz1N>l6o;B|T)cSk8d)VeNOcHhLCjn#!BMnT)0m~uHKJ>7?g7zYboZ8t`EkZL;Y+Du z^S0{lI}GZfhSy|UiBpE>cmCbOEnRJhWKx+L4%4Nmx3jQO-IyM!#*qp{1>8E-=$jlC z1KDDYw>eY!&%49H#}n?{<12|%fSv{Ij_^(tiKH?ml{?%cXkrx?KReGh7o5e2n_dqu z0gnrURlPP+c-|&fUNYxN!FPC>X_k2L)Jj|c5xJC~81~_~{YZp5=+}F~Wz&_x9ad_h z@1jCpP_U~eI&HHOtOs!*Ag%F58n+;fAM}})o2*c)l?rr`z>SPxQNc-$mF0_3O*IWg zRO>nP>^P0-*`mfmy*1vS?+v?OZ0vq%^0tp`}4|U!tEy-P)nac-e3cK^|Obx zANA&&n*@Y_!`L7wTjFWWV%|_dSzJw~1Mam}!zw3zBCQ?O+z#@jRyQO94J=*|%AFt; z5Pm8kCi@6-t$nt2HP)T7{BojhOF5RY9N#Mt$@8@*Jrg6~F?pWRQ)HZR}0$t*(5h(b98$y2pU*0GyL}o* zJETtC6M9>_3~FZ(A`!|7_k1<0C>fk7{P~sJ?S{tGv4m2f~jBJr z?q|<=DYQV%M45eKLXI9Yw}R7|BU+Ol$+eZxiC4~jOqi}qUzd}{{iukEG&Brhbb&2` z;M-;2Xv2xV2I$?WPU%{Kbu?}K1h7#_alZ;{Y^vHs?`N>zP6@72A5AZK9=7}oEDTAU zABq5d`)%;+Vz4UeQQ%{!>T*0F>DPpznguUmt}cWbFDP~fCR^PH_S?{zNU($4)yD#E zgJ(Z?{%L!uT4{09nyac?-%Bju*XzdpXtfg|Vv>ARvxG$mS*BnFqrO$?#^dzd@vM{Q z*yvJKj-<}y>=~>uti@*;B1jo4P^EPC)Hz#J_JhB6uz^z%BFFx))H}(gDFSy*9eSV^ zmJX_!&a%*S;pee?hkmhm+hX8CmhQIFe5Y)~GDb2j?9r#pQJ)IcL5`bRIXRUeY=r(| znKjKvP~&C&#jZUP*$Xdbw~or&=FzZEx|6#W7owIrP^$kGykQe<2CbWN(Z zMyY10FB2AwOAzGofKMkq_p&gye|FavI$mjiqiL8V$1xMh2fr+KG{VI{ZS29O(Ufbq z3CH-V3gxQVVzwCgZuCpgMjJLu>)U*qr?M$lzJl^ivtfhx$n0D}?fSim6&?|CQKsFox(SL+zO5ZI!qq^jZ z?@!RqZ_k{>eBVuW4rB$}bi`)L3S#JQhgRBMvD)Qh6<#`G4N?5EkP=-{))w8i_Sy^}ORO$8AfW_q)7t>Gk(>5sC{yxIQLOQ zUl4{?O*%?nmGnLk*)vfYdnO9O6RwXduU+aAB?(iP^iBPitzTXkochy3J&7N{r(uZG zm9g2Ay?6FOmj7fJ^QyyvT9H}R>lS!N&mr>KPiUKNa_}EbzY|aJ8}d8SwFI=cRhjkN#K@p_(*7voCo0^J*mlY+=g z9#VSR5-<#>J2~CM5tsROSmSj%0E7KL->ht7((T3$AIe%M779tK-9DE82O7RqEl z@Zo2|I<9(rIj8yP)PjM%l-IpCyR14M5-=~n>$0x8I}x%ywbSAHf#tR9i3V!Khc8t6 z{aPopXS^PX_NXpTjg&uBor`olM6}(acdd@5b`foBMn#4|Np)n;#VrhL>%wQw-z-mWCEpGykst7r9mZ#}u%cpuSsM7RA z6o%oiMxd`t_|@hq|JP$)TF!1-~3U6{QQzr}*zy ztftaJaZQ2&I#Pa5yt`eoW>0dZOyA&|t}A>0NQUi_eOhdP)3c>Pc~v}evD&#RV$VZ` zaPsy^WUEyBP}0v?vNpI3PN^%-!bitrSfO825NfMo7)9du7#nQ#x=ymYlG!8iTD7qW zDfJc11PHl=n3x+fOBEE-SFl3Za_8Cgv3NNUhioA<76!Ze&U^GJbjAEQY{&#q-#I;RiK8Z;y>NPpdKyj5kh~)h!2?2Z44$ zjO)Hc9N_||Um2COd}+X}qvDs`{XMCFkh)dCc{u7FSjj@`>aLPO*p>9a&(*PBflcGD zp`a%;@-@4YDRc4Dqed-J?=&^rMNY@!GP8PJXcK^He3uGZo-~lvDsF3sD26#WtMo zvrDObf!FOO%B!|&&s;#H+f_asmC6`;?1)Pkv_U1fSMHXe9B>u)p7UfZ$B-ejUaPI? z;D8f+em7EXQ@9B{X>0FOuBh0}E*DSl-7W_^ShA5@w7R&|^+o5u+RePSA$JUBXvw5T;%=}LqDRJD&zy9bU z;!G!jZ4QcGpb!9mCHNKt#XCXQAMkIqdKZh6ERaNYAfBsZGrvrOk6xfHV z0B0Cp79q#w*^#n0MlJhR({@Qn&boJ<l!gG~7|5{$6 zixPMB*9$D=LT%V0H{L0PAPU2>ZjHkrBz*_GEFMH%Ra3tHa6=9C)$?q>+HYa{2|j>z zOn2oOGrG>^!egfgva$K8MP5wxq6ZdQEEwz8rS5QFqE|Cst#&K@WCL;EA_iqpJ=x&m z&?HZWewQaFD0!FEhVa|*h>){OzG!4*6q1$urz6J>cJ%)XW2&L&Zx|g=<3ymZJ-isr zNbWGMs#dJ*;xiD4@ z&zkSD(%KCZ2hh&RfjW`zxQdaU`2 z-w8Q4zPVkNF~AWANTg2)|8~xfz(>!?%pw*h8=T#@WWRQ;5zA$nJs>P`+}vN|vN?~M zH>S6&tvo5YW+gycTAFK6kpH@alkt7uZgjG*!DInwxl%e2KhGfQqdB_GO6EQitoMYI z63+p;@7bFJF$@D4fBBPW)})QQ2WZc|py8#0`dqD>-97?9xb#OWvnnuWUO;%Er4Mjc z)t6EUx^~|s!gI5#mj)VT49$^I_560n#PpAQoX!|XS!C{zJDQ&|Dy0KJyKAl!ZCPn~T;mb`DO#*9 zpOm~E!4Yv=u{hBUorN@ms_L`DF*pxlcQ1f8&`QPCrf55YOVO94Y9PktOJQ1jS z_JX*FXyISuOS>cv5r6ioMYK3QHZ--^*x1Yy;@^Bt&{F>lhXM)Wxe-$1Tt7Hr<=8tC zAK5wFa9})*R2eJ!{>EQMwEXud5K(dpGxClImTz1-olkt@kk~bje=P8J<;~IQ&qpKP z)n`f=H)PR`E#xQTd1(CVOFkC#ok6W$H#i5YkY(fjr~nQ&=Jpu6zkg|!td?#5<2#!0 zV88{hDn$59%uf@jILb*(o`L%F)s3j%XZ(wZdZSmfuR_JfNJD<>_blvK?JN7F<*#@< zbhtuaw=FoL0nEC_9%t(N+vYk1p|k8J!?Y06A$h7J>i1Br84c6`n6QadAO6#vb#pat zNkCDvVzS?yR`a5Wq`2XC)7+3$Aj+~TA^$_S_f+e$L~S zrZBQqY=v3xbG2O@vD$lc!=S5f1g6F+?btmAlNC;O7k=xqhoN`6kTgrrjSrcI%s3F*_s z(xXOi+I}r8K&lK@F|m3Iz)7!sq1Dy@Sw2$Zd>2<+>(nfquH&9r5x+xzO`-n5GC-FZ zG)PPmL6&WNQVu4b`*Olx@exHteK%tb#Ng)U2DtZ!Ps1NY7a~Pk2>q^?vORZYvB3cN zQ-ejjsdbaNb)2aFM@LI77xa@8HYw2o_&CV;hrt@aNo5_(RjPH1hIK$!Nx>=A9)as% zH8x2_N-_*O(!O0Z5q_F2tiVm#6jrq~A9C~3a};0-7O!5psO^-2+Q zy!e_|>d;27v}23Yk%}32`$mEY;qp1ckUVtc;!~ayhjz~2`ASk#8+=|UU-4Tp>w905 zr7M0!3*itcg!7w}&zRquRJuVunz3wzZ*bliG zT;MCKsuX);XAn|V75`4U=boX^@`pf8&_*0<}7$>>D3@zOs}z1 z^=|#`IPqo{XKQ|K)#)iV9iwYfPkmV8FjX!$1g0uM1sg`0A)4HOkz?^sIJpPbL{dlC zwUKAfKi07q_|QA%a~3t5`<$OwqG`0xh+kF#dr{G!NAB>leI#gWWd5e^v+!vul0pcI z1}pou&xbNS)z7QFIyUnjlX?;if}0=zVQ?YZAH7?kkhv(6z4e5YmLwTR577eRpi9n1 z?(0wDf^#I%6{VF6EA|Cdf_afL1h;u;H0mvrWsyXz15S&Z_w!|JS)P`yQg^!)xk|y9 zhsqTlq~I_dKbV3T{0f8io4!r$m5cq!Q>&x15E;ymxSSWVdm|;FqHmW4l|0g23WT0o z;yoy1NuAPFHV-`qTG&`V*b%h+zr@P|_F~yIg;ZwBLY(>eb9|}iN@O5+osTOQ56?y9 zvXwokb}_#=|3P6aVV*z1OFBY~ zEPav@sM4voBG|eN8G}?~Kpd8LQ%LTQS%^PVr}!iz(g|DSdlsbbBmAQs?0b2pl4j>S z2`p0QxpmI}DIqB-^yzy^B4bF>pHwUMR0T}R5A(wrNL+ZwsRIZYf3;^#gr8m#c_X5$ z>OA9-M4KXW;96;eu0vpEkU>hUTavY?F*r5^(>ZFXjhlhK7EreZh5C$!;$n=4tDTTs zJQtb5&xC)f%`3wTKN(W1qi+@3TbEWa+S&92A~ph>*I#gMp9pFsThGj-cB7=xHfCkP zMg0C%>~BgU5F4wIvsiV8iMk zQB7vXh#RwdS5-I67hMQi9~ zaeB%S4|?q2V9$+MXWZDp1#%_j+c_(*g|}HZU0oj;R8=U1MMMOp0ZFZ;0>YMscdCt! zccT<~)}7d`6dm)TAW!bCT(|lKqA~Snv<0EA_W5-qdwU%&t(F2BpRb|`m4HqSQwscj z7QVAx5HJ`uBAdl+wZ=87#13S~nhSv-$8ZHqM{y=z=#$NO&C*g8rm?IoEX60fE_`|n zy|vNv(89q7*4Q!eEtv0K^an!x+OC^Us^6DEdEwlhElv70{7N)LkZBdys3gRM-$RiU zw^|3d8xxm82i2~uV9}dP!OC)3id>_>t52z;ek+u!l#Os_#+?s{f3vafI&B)RT-a+1PLkhVJf8#7?~qB<%h+@tUn8R+4F`h90t_!S-Sm z-}uCy_txfSR>7Geg7c&8I_G8^&P-}=kvewQE7krj=_vq1ou&N~=m@GgreAM=tg4yz zUunN0!CFO?8G1|5{rI7B7gm>KMOR-|7hSms_dtZ@_NW!ORyE&opxtKHI|BlXZC}Si zwIYjFDvmI*#Gul&cGnfg&!edP@nwr&JGxoKqCQvGOwV$nGE2BpymuyVe3GFoFMvO$ z9wpziyKQfy?hacL9UJ(dg@vv+Fidn zA(-G+H4UQo`ZTn&MTj|$m)C-T6pf$y!WU_78@rW>0LB`Hz@%_4NIo)61?mTYPU;Wy86H3q6M!b$vTjG(M27L?^3TM40x~4W__^Nn|DOh z>Xu@V+aAg}DRa$Jx1GpPAmx378 zNv>egvlQSer9UwOrO*!JdlVrKx4PHenyVZyuq5oC~N ze?p+KQDT{n?;%wj~N4BJXi_j~F1ol>Ea4;yY}(`S0=N9Xi@G@s#a+-1p6dWx4> zcD20TA2lU5uAiqYryAYaYP`*{zK6U*&0Nhk^Wb$7H}2hS34x$fx<0C=ut7YQkA2E1 zNw1iFH8osN_k&|1<4n>`$n`5^`sUk^&rO?8Q#`a2?*k?phPfd5*cH0WE>jn3hVbL! z;?mYVj_LZL4!U5kr?l0yR7XJADHGRD-?~`tRWr`qt)jBPGk!tdi7eKg&!b>e=WFOm zsU}>|)9IFb;^jrmEM*Y6Kt)bjqf)5p+29urL~&d>0R}wpHO8A?u^?x$ejzJ@`A<*s z&!Db=IX)NPHBf^h_Rd-0!>p*HS;_43f|Mj!CVin+q=ny(?7KJ`+OU^lYEGb8?Ye1~ z*)9)f2`{_B;leVtJV8L*8$5*T=NRACaXJY^B_0$>8b8yqb*dwhY5hJlh}Y_TzmrVs z=%m#i6fwT|dKySND;iZs<{)?nniZ>70-W(hm;g@5DA!~#Ye`=Uo`jynmo!j>3F9)+ zN2e-~sXi4ia!Eq6iXg^hP~r2{!NSW4TJ*%BJPCT9U`sSaH{!&NKC=64KA!W3D*zPdz$f z{+KoXrnxYdA$nFeJ<~`Hvua|j7M5g;+7RLo;Zpl-<;Yhu@&0|GO~+uNC(Oy9M|qv= z0_b!pl2X@`=qqje6=+WeWIs5f+)#an&jy- zXU@fKA!`9w7r1&&7Cj6gMx*&GBXZy&6Sn+EH65U~QqB@y)#1!-I6eL!Qo? zZ)TfaF=FXQZo@0B5C)7oISDF0t>+#Z&11;2`U# zlQ+M>JSKN(w_s|9+83h$&5APE5CYMtErb(u7o&+!A8l_3H)Pg*a~m4ZNA(PhJngdh zIxf=vGFj-7l;L+i@9OhU5#lQQ246n%9o<+I+v!pWEgJ=l%%3Fy`x%*Z@W(A@(}x?H zv*I$9qpRWk5Gz`zzkQ!gTw#&!YP-L*C6(^80gscI^R+pkdXKIQNT z0Y1O0+yvgwoE&KH7w&jawC10RFP=(aCUN2<4rGUY3moG+4!ge(;8FRKgZS-P!Vr%BibR3)#uh zL061B8nYXI=98$Y{nZ^k{);znS;%=goCGT4CcTS4IK({`6hbu@OG#qFC#_IcRUXg$ zpkwM>K*8ZPK8J}{u|27Rf>OGEUqx?e^(~vP$lg#j!Xvc6K0g=D3{1-R#R>aryg#K< z{@)WU4fA4+F<}9_xMCklowRhR z*y+>cQvfYW<}RqA%7kS_r5u=mir<@$9$7s7d4adS1qFqmnas?dzR?ez@v2hd$%Lry3F{T#d#@jSbo+@) z_R++w7oGhZKl{1+$GD@K2nJ8{Ok&mfx*@AkQV| z9Ch;U%~T0BfwO;aneLY_F;(g*Ysc@unuC`9zkG8yhOWKatK^%`2FUxg2mu7*CfZ2l zj~&v6d;0L~dg^}5O>>jm-KOaim1l4v^Cyg-*{5*o85Dh)wEeFdcm2KZRyz9`6qVXr zy2EMdXm>@=fmJNDp1ru1 z7KuhO=u5-0Ny3Ydvj6z>Ngx^4*QebDILfsayUhJaNucunlvrfWjtSpIzB5>~>Mm)e zVM}6Sb6SmqIM2^>mRp|k1-Qv4Ky4b-eRc(wj+o#0R_KMh58E|o4z1=4YF1n1Q1J2U z&=^)PEU~0D1zDYk2aqG$vD2Jp<9x@1vlu4o`b8xttA1B#FY$Dz(-+O&>4S4LJ;gOVM-gnh( zKR=fg5uqVtAf)?dS7wZrCa|HI!I~zrymfu-&wmfI9Y*B2P!4HyS1&D~ZXRd4RmlUf zTV9tRW8M4rG+Q;TChLq41==rx;qPZVFZnFHVynN+hkSQsTxHBf`?_A2PD_rqP((UR zHO28Q@fi=eBSx_f1M{mAilD%f3myk)dIZ}+=5qFy^IJ!a^JGyBh3U8l`IMAnGF|OA zO=EjS55sBF3JQSaEqTB}Q{5y_c6f_Lb|le`Hw@BeBhz&_%Ytv4GK(l#b1c(E#!mn{ zrKNfDKh9Q-TWjwA49+yxyF1=L8bw8EPiIe6sw%%Gtz@_DTDiLL8)ow?_<2nF1#i$% zGL`7O9TN|v$^+z16%BWUuY^vQ_X34d?E59iP8gj^G%w{rl}9VZi6lfV$5f)b!Xh_! zp)TNanAh6Vvr~kLD{W{@mNA~d_s#|BQ~wA4;UdLJL4;b~&qx~jREL(Z`xvp0@&okM z3`%3Gv!fC^IrraDs9ZnH1N~3l#_a!F{{W5t zl>*Mz43Li_SM@(tp2oeS?O1-(=ttPTXr6l`Vcz9yT6fYPH~x>RTJbud%p$|8O8_)v z?#RS*&+Db@Cz3U_E6~g%{Qr~2arvha7oWPUARI~K=DzvJyY=SrhqtzS&Yg-B*t6o% z*2NA0Rzpcz$2Fr2COO;Xo5ClF{%88#(fi}z12yXxr$e#=LvY61zbfDQ_rufZIwmME zl#FNk?=(0_b^bp~`d$uLh;1^ccVFXl@FFXL%Mzni1ok&q2Y@pF?ep&fObELo-ha

@l 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

eqhY&x`V**eiB=)(ynIFjasnOY)7Y2Nu*=r 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%0Do5Hp` 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

6+T;J1Xy%$ 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 F`hQDPuZREu literal 0 HcmV?d00001 diff --git a/docs/visualize/images/timelion-create-new-dashboard.png b/docs/visualize/images/timelion-create-new-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..4049b6d77cca674590834142e6841917b8b11a45 GIT binary patch literal 423440 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�*^ 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


BchU@4Tc(gdVaKqd*!8eLureGCzK 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�`I>Wxhm7r~qfRZ?o|jy{!Z4G>5$c%h;wWV*u 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 rA`g;iDy^L%315YTXh}%r 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 Cac*h= literal 0 HcmV?d00001 diff --git a/docs/visualize/images/timelion-vis-paste-expression.png b/docs/visualize/images/timelion-vis-paste-expression.png new file mode 100644 index 0000000000000000000000000000000000000000..86e175e40815bfd1f04129525db0804b0a1459ba GIT binary patch literal 520063 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ℑI^>Or5(W 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�DdYtz5S*Q(D%>eZ94``)-}Q=Xt(?T(xS%BTWX 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

+

{loading ? : details?.host?.hostname}

@@ -93,8 +96,8 @@ export const HostDetailsFlyout = memo(() => { <> {show === 'details' && ( <> - - + + )} @@ -105,31 +108,31 @@ export const HostDetailsFlyout = memo(() => { ); }); -HostDetailsFlyout.displayName = 'HostDetailsFlyout'; +EndpointDetailsFlyout.displayName = 'EndpointDetailsFlyout'; const PolicyResponseFlyoutPanel = memo<{ hostMeta: HostMetadata; }>(({ hostMeta }) => { - const { show, ...queryParams } = useHostSelector(uiQueryParams); - const responseConfig = useHostSelector(policyResponseConfigurations); - const responseActions = useHostSelector(policyResponseActions); - const responseAttentionCount = useHostSelector(policyResponseFailedOrWarningActionCount); - const loading = useHostSelector(policyResponseLoading); - const error = useHostSelector(policyResponseError); + const { show, ...queryParams } = useEndpointSelector(uiQueryParams); + const responseConfig = useEndpointSelector(policyResponseConfigurations); + const responseActions = useEndpointSelector(policyResponseActions); + const responseAttentionCount = useEndpointSelector(policyResponseFailedOrWarningActionCount); + const loading = useEndpointSelector(policyResponseLoading); + const error = useEndpointSelector(policyResponseError); const { formatUrl } = useFormatUrl(SecurityPageName.administration); const [detailsUri, detailsRoutePath] = useMemo( () => [ formatUrl( - getHostListPath({ - name: 'hostList', + getEndpointListPath({ + name: 'endpointList', ...queryParams, - selected_host: hostMeta.host.id, + selected_endpoint: hostMeta.host.id, }) ), - getHostListPath({ - name: 'hostList', + getEndpointListPath({ + name: 'endpointList', ...queryParams, - selected_host: hostMeta.host.id, + selected_endpoint: hostMeta.host.id, }), ], [hostMeta.host.id, formatUrl, queryParams] @@ -137,7 +140,7 @@ const PolicyResponseFlyoutPanel = memo<{ const backToDetailsClickHandler = useNavigateByRouterEventHandler(detailsRoutePath); const backButtonProp = useMemo((): FlyoutSubHeaderProps['backButton'] => { return { - title: i18n.translate('xpack.securitySolution.endpoint.host.policyResponse.backLinkTitle', { + title: i18n.translate('xpack.securitySolution.endpoint.policyResponse.backLinkTitle', { defaultMessage: 'Endpoint Details', }), href: detailsUri, @@ -149,13 +152,13 @@ const PolicyResponseFlyoutPanel = memo<{ <> - - + +

@@ -164,7 +167,7 @@ const PolicyResponseFlyoutPanel = memo<{ } diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response.tsx index 3a1dd180405e0..231e301a93aab 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response.tsx @@ -90,7 +90,7 @@ const ResponseActions = memo(

{formatResponse(key)}

@@ -162,7 +162,7 @@ export const PolicyResponse = memo( attentionCount > 0 && ( {attentionCount} diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response_friendly_names.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response_friendly_names.ts index 020e8c9e38ad5..07ab38fd52776 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response_friendly_names.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response_friendly_names.ts @@ -9,198 +9,189 @@ import { i18n } from '@kbn/i18n'; const policyResponses: Array<[string, string]> = [ [ 'configure_dns_events', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_dns_events', - { defaultMessage: 'Configure DNS Events' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.configure_dns_events', { + defaultMessage: 'Configure DNS Events', + }), ], [ 'configure_elasticsearch_connection', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_elasticsearch_connection', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_elasticsearch_connection', { defaultMessage: 'Configure Elastic Search Connection' } ), ], [ 'configure_file_events', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_file_events', - { defaultMessage: 'Configure File Events' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.configure_file_events', { + defaultMessage: 'Configure File Events', + }), ], [ 'configure_imageload_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_imageload_events', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_imageload_events', { defaultMessage: 'Configure Image Load Events' } ), ], [ 'configure_kernel', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_kernel', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.configure_kernel', { defaultMessage: 'Configure Kernel', }), ], [ 'configure_logging', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_logging', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.configure_logging', { defaultMessage: 'Configure Logging', }), ], [ 'configure_malware', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_malware', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.configure_malware', { defaultMessage: 'Configure Malware', }), ], [ 'configure_network_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_network_events', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_network_events', { defaultMessage: 'Configure Network Events' } ), ], [ 'configure_process_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_process_events', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_process_events', { defaultMessage: 'Configure Process Events' } ), ], [ 'configure_registry_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_registry_events', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_registry_events', { defaultMessage: 'Configure Registry Events' } ), ], [ 'configure_security_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_security_events', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_security_events', { defaultMessage: 'Configure Security Events' } ), ], [ 'connect_kernel', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.connect_kernel', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.connect_kernel', { defaultMessage: 'Connect Kernel', }), ], [ 'detect_async_image_load_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_async_image_load_events', + 'xpack.securitySolution.endpoint.details.policyResponse.detect_async_image_load_events', { defaultMessage: 'Detect Async Image Load Events' } ), ], [ 'detect_file_open_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_open_events', + 'xpack.securitySolution.endpoint.details.policyResponse.detect_file_open_events', { defaultMessage: 'Detect File Open Events' } ), ], [ 'detect_file_write_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_write_events', + 'xpack.securitySolution.endpoint.details.policyResponse.detect_file_write_events', { defaultMessage: 'Detect File Write Events' } ), ], [ 'detect_network_events', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_network_events', - { defaultMessage: 'Detect Network Events' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.detect_network_events', { + defaultMessage: 'Detect Network Events', + }), ], [ 'detect_process_events', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_process_events', - { defaultMessage: 'Detect Process Events' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.detect_process_events', { + defaultMessage: 'Detect Process Events', + }), ], [ 'detect_registry_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_registry_events', + 'xpack.securitySolution.endpoint.details.policyResponse.detect_registry_events', { defaultMessage: 'Detect Registry Events' } ), ], [ 'detect_sync_image_load_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_sync_image_load_events', + 'xpack.securitySolution.endpoint.details.policyResponse.detect_sync_image_load_events', { defaultMessage: 'Detect Sync Image Load Events' } ), ], [ 'download_global_artifacts', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.download_global_artifacts', + 'xpack.securitySolution.endpoint.details.policyResponse.download_global_artifacts', { defaultMessage: 'Download Global Artifacts' } ), ], [ 'download_user_artifacts', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.download_user_artifacts', + 'xpack.securitySolution.endpoint.details.policyResponse.download_user_artifacts', { defaultMessage: 'Download User Artifacts' } ), ], [ 'load_config', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.load_config', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.load_config', { defaultMessage: 'Load Config', }), ], [ 'load_malware_model', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.load_malware_model', - { defaultMessage: 'Load Malware Model' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.load_malware_model', { + defaultMessage: 'Load Malware Model', + }), ], [ 'read_elasticsearch_config', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.read_elasticsearch_config', + 'xpack.securitySolution.endpoint.details.policyResponse.read_elasticsearch_config', { defaultMessage: 'Read ElasticSearch Config' } ), ], [ 'read_events_config', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.read_events_config', - { defaultMessage: 'Read Events Config' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.read_events_config', { + defaultMessage: 'Read Events Config', + }), ], [ 'read_kernel_config', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.read_kernel_config', - { defaultMessage: 'Read Kernel Config' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.read_kernel_config', { + defaultMessage: 'Read Kernel Config', + }), ], [ 'read_logging_config', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.read_logging_config', - { defaultMessage: 'Read Logging Config' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.read_logging_config', { + defaultMessage: 'Read Logging Config', + }), ], [ 'read_malware_config', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.read_malware_config', - { defaultMessage: 'Read Malware Config' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.read_malware_config', { + defaultMessage: 'Read Malware Config', + }), ], [ 'workflow', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.workflow', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.workflow', { defaultMessage: 'Workflow', }), ], @@ -211,43 +202,43 @@ const responseMap = new Map(policyResponses); // Additional values used in the Policy Response UI responseMap.set( 'success', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.success', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.success', { defaultMessage: 'Success', }) ); responseMap.set( 'warning', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.warning', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.warning', { defaultMessage: 'Warning', }) ); responseMap.set( 'failure', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.failed', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.failed', { defaultMessage: 'Failed', }) ); responseMap.set( 'logging', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.logging', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.logging', { defaultMessage: 'Logging', }) ); responseMap.set( 'streaming', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.streaming', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.streaming', { defaultMessage: 'Streaming', }) ); responseMap.set( 'malware', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.malware', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.malware', { defaultMessage: 'Malware', }) ); responseMap.set( 'events', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.events', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.events', { defaultMessage: 'Events', }) ); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks.ts index d11335df875e9..a9c84678c88a9 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks.ts @@ -7,16 +7,18 @@ import { useSelector } from 'react-redux'; import { useMemo } from 'react'; import { useKibana } from '../../../../common/lib/kibana'; -import { HostState } from '../types'; +import { EndpointState } from '../types'; import { - MANAGEMENT_STORE_HOSTS_NAMESPACE, + MANAGEMENT_STORE_ENDPOINTS_NAMESPACE, MANAGEMENT_STORE_GLOBAL_NAMESPACE, } from '../../../common/constants'; import { State } from '../../../../common/store'; -export function useHostSelector(selector: (state: HostState) => TSelected) { +export function useEndpointSelector(selector: (state: EndpointState) => TSelected) { return useSelector(function (state: State) { return selector( - state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][MANAGEMENT_STORE_HOSTS_NAMESPACE] as HostState + state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][ + MANAGEMENT_STORE_ENDPOINTS_NAMESPACE + ] as EndpointState ); }); } diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx index bb6003f73714d..09df6d6ece042 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx @@ -7,12 +7,12 @@ import React from 'react'; import * as reactTestingLibrary from '@testing-library/react'; -import { HostList } from './index'; +import { EndpointList } from './index'; import { - mockHostDetailsApiResult, - mockHostResultList, - setHostListApiMockImplementation, -} from '../store/mock_host_result_list'; + mockEndpointDetailsApiResult, + mockEndpointResultList, + setEndpointListApiMockImplementation, +} from '../store/mock_endpoint_result_list'; import { AppContextTestRender, createAppRootMockRenderer } from '../../../../common/mock/endpoint'; import { HostInfo, @@ -27,7 +27,7 @@ import { mockPolicyResultList } from '../../policy/store/policy_list/test_mock_u jest.mock('../../../../common/components/link_to'); -describe('when on the hosts page', () => { +describe('when on the list page', () => { const docGenerator = new EndpointDocGenerator(); let render: () => ReturnType; let history: AppContextTestRender['history']; @@ -38,9 +38,9 @@ describe('when on the hosts page', () => { beforeEach(() => { const mockedContext = createAppRootMockRenderer(); ({ history, store, coreStart, middlewareSpy } = mockedContext); - render = () => mockedContext.render(); + render = () => mockedContext.render(); reactTestingLibrary.act(() => { - history.push('/hosts'); + history.push('/endpoints'); }); }); @@ -50,10 +50,10 @@ describe('when on the hosts page', () => { expect(timelineFlyout).toBeNull(); }); - describe('when there are no hosts or polices', () => { + describe('when there are no endpoints or polices', () => { beforeEach(() => { - setHostListApiMockImplementation(coreStart.http, { - hostsResults: [], + setEndpointListApiMockImplementation(coreStart.http, { + endpointsResults: [], }); }); @@ -70,8 +70,8 @@ describe('when on the hosts page', () => { describe('when there are policies, but no hosts', () => { beforeEach(async () => { - setHostListApiMockImplementation(coreStart.http, { - hostsResults: [], + setEndpointListApiMockImplementation(coreStart.http, { + endpointsResults: [], endpointPackageConfigs: mockPolicyResultList({ total: 3 }).items, }); }); @@ -111,7 +111,7 @@ describe('when on the hosts page', () => { it('should not show the flyout', () => { const renderResult = render(); expect.assertions(1); - return renderResult.findByTestId('hostDetailsFlyout').catch((e) => { + return renderResult.findByTestId('endpointDetailsFlyout').catch((e) => { expect(e).not.toBeNull(); }); }); @@ -122,7 +122,7 @@ describe('when on the hosts page', () => { let firstPolicyID: string; beforeEach(() => { reactTestingLibrary.act(() => { - const hostListData = mockHostResultList({ total: 4 }).hosts; + const hostListData = mockEndpointResultList({ total: 4 }).hosts; firstPolicyID = hostListData[0].metadata.Endpoint.policy.applied.id; @@ -142,8 +142,8 @@ describe('when on the hosts page', () => { const ingestPackageConfigs = mockPolicyResultList({ total: 1 }).items; ingestPackageConfigs[0].id = firstPolicyID; - setHostListApiMockImplementation(coreStart.http, { - hostsResults: hostListData, + setEndpointListApiMockImplementation(coreStart.http, { + endpointsResults: hostListData, endpointPackageConfigs: ingestPackageConfigs, }); }); @@ -152,7 +152,7 @@ describe('when on the hosts page', () => { it('should display rows in the table', async () => { const renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const rows = await renderResult.findAllByRole('row'); expect(rows).toHaveLength(5); @@ -160,15 +160,15 @@ describe('when on the hosts page', () => { it('should show total', async () => { const renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); - const total = await renderResult.findByTestId('hostListTableTotal'); + const total = await renderResult.findByTestId('endpointListTableTotal'); expect(total.textContent).toEqual('4 Hosts'); }); it('should display correct status', async () => { const renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const hostStatuses = await renderResult.findAllByTestId('rowHostStatus'); @@ -194,7 +194,7 @@ describe('when on the hosts page', () => { it('should display correct policy status', async () => { const renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const policyStatuses = await renderResult.findAllByTestId('rowPolicyStatus'); @@ -213,7 +213,7 @@ describe('when on the hosts page', () => { it('should display policy name as a link', async () => { const renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const firstPolicyName = (await renderResult.findAllByTestId('policyNameCellLink'))[0]; expect(firstPolicyName).not.toBeNull(); @@ -225,7 +225,7 @@ describe('when on the hosts page', () => { beforeEach(async () => { renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const hostNameLinks = await renderResult.findAllByTestId('hostnameCellLink'); if (hostNameLinks.length) { @@ -234,7 +234,7 @@ describe('when on the hosts page', () => { }); it('should show the flyout', () => { - return renderResult.findByTestId('hostDetailsFlyout').then((flyout) => { + return renderResult.findByTestId('endpointDetailsFlyout').then((flyout) => { expect(flyout).not.toBeNull(); }); }); @@ -298,12 +298,12 @@ describe('when on the hosts page', () => { return policyResponse; }; - const dispatchServerReturnedHostPolicyResponse = ( + const dispatchServerReturnedEndpointPolicyResponse = ( overallStatus: HostPolicyResponseActionStatus = HostPolicyResponseActionStatus.success ) => { reactTestingLibrary.act(() => { store.dispatch({ - type: 'serverReturnedHostPolicyResponse', + type: 'serverReturnedEndpointPolicyResponse', payload: { policy_response: createPolicyResponse(overallStatus), }, @@ -316,7 +316,7 @@ describe('when on the hosts page', () => { // eslint-disable-next-line @typescript-eslint/naming-convention host_status, metadata: { host, ...details }, - } = mockHostDetailsApiResult(); + } = mockEndpointDetailsApiResult(); hostDetails = { host_status, @@ -334,18 +334,18 @@ describe('when on the hosts page', () => { const policy = docGenerator.generatePolicyPackageConfig(); policy.id = hostDetails.metadata.Endpoint.policy.applied.id; - setHostListApiMockImplementation(coreStart.http, { - hostsResults: [hostDetails], + setEndpointListApiMockImplementation(coreStart.http, { + endpointsResults: [hostDetails], endpointPackageConfigs: [policy], }); reactTestingLibrary.act(() => { - history.push('/hosts?selected_host=1'); + history.push('/endpoints?selected_endpoint=1'); }); renderAndWaitForData = async () => { const renderResult = render(); - await middlewareSpy.waitForAction('serverReturnedHostDetails'); + await middlewareSpy.waitForAction('serverReturnedEndpointDetails'); return renderResult; }; }); @@ -355,7 +355,7 @@ describe('when on the hosts page', () => { it('should show the flyout', async () => { const renderResult = await renderAndWaitForData(); - return renderResult.findByTestId('hostDetailsFlyout').then((flyout) => { + return renderResult.findByTestId('endpointDetailsFlyout').then((flyout) => { expect(flyout).not.toBeNull(); }); }); @@ -387,7 +387,7 @@ describe('when on the hosts page', () => { const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusLink).not.toBeNull(); expect(policyStatusLink.getAttribute('href')).toEqual( - '/hosts?page_index=0&page_size=10&selected_host=1&show=policy_response' + '/endpoints?page_index=0&page_size=10&selected_endpoint=1&show=policy_response' ); }); @@ -400,14 +400,14 @@ describe('when on the hosts page', () => { }); const changedUrlAction = await userChangedUrlChecker; expect(changedUrlAction.payload.search).toEqual( - '?page_index=0&page_size=10&selected_host=1&show=policy_response' + '?page_index=0&page_size=10&selected_endpoint=1&show=policy_response' ); }); it('should display Success overall policy status', async () => { const renderResult = await renderAndWaitForData(); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.success); + dispatchServerReturnedEndpointPolicyResponse(HostPolicyResponseActionStatus.success); }); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusLink.textContent).toEqual('Success'); @@ -421,7 +421,7 @@ describe('when on the hosts page', () => { it('should display Warning overall policy status', async () => { const renderResult = await renderAndWaitForData(); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.warning); + dispatchServerReturnedEndpointPolicyResponse(HostPolicyResponseActionStatus.warning); }); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusLink.textContent).toEqual('Warning'); @@ -435,7 +435,7 @@ describe('when on the hosts page', () => { it('should display Failed overall policy status', async () => { const renderResult = await renderAndWaitForData(); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.failure); + dispatchServerReturnedEndpointPolicyResponse(HostPolicyResponseActionStatus.failure); }); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusLink.textContent).toEqual('Failed'); @@ -449,7 +449,7 @@ describe('when on the hosts page', () => { it('should display Unknown overall policy status', async () => { const renderResult = await renderAndWaitForData(); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse('' as HostPolicyResponseActionStatus); + dispatchServerReturnedEndpointPolicyResponse('' as HostPolicyResponseActionStatus); }); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusLink.textContent).toEqual('Unknown'); @@ -463,7 +463,7 @@ describe('when on the hosts page', () => { it('should include the link to reassignment in Ingest', async () => { coreStart.application.getUrlForApp.mockReturnValue('/app/ingestManager'); const renderResult = await renderAndWaitForData(); - const linkToReassign = await renderResult.findByTestId('hostDetailsLinkToIngest'); + const linkToReassign = await renderResult.findByTestId('endpointDetailsLinkToIngest'); expect(linkToReassign).not.toBeNull(); expect(linkToReassign.textContent).toEqual('Reassign Configuration'); expect(linkToReassign.getAttribute('href')).toEqual( @@ -475,7 +475,7 @@ describe('when on the hosts page', () => { beforeEach(async () => { coreStart.application.getUrlForApp.mockReturnValue('/app/ingestManager'); const renderResult = await renderAndWaitForData(); - const linkToReassign = await renderResult.findByTestId('hostDetailsLinkToIngest'); + const linkToReassign = await renderResult.findByTestId('endpointDetailsLinkToIngest'); reactTestingLibrary.act(() => { reactTestingLibrary.fireEvent.click(linkToReassign); }); @@ -491,7 +491,7 @@ describe('when on the hosts page', () => { beforeEach(async () => { coreStart.http.post.mockImplementation(async (requestOptions) => { if (requestOptions.path === '/api/endpoint/metadata') { - return mockHostResultList({ total: 0 }); + return mockEndpointResultList({ total: 0 }); } throw new Error(`POST to '${requestOptions.path}' does not have a mock response!`); }); @@ -502,44 +502,44 @@ describe('when on the hosts page', () => { reactTestingLibrary.fireEvent.click(policyStatusLink); }); await userChangedUrlChecker; - await middlewareSpy.waitForAction('serverReturnedHostPolicyResponse'); + await middlewareSpy.waitForAction('serverReturnedEndpointPolicyResponse'); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(); + dispatchServerReturnedEndpointPolicyResponse(); }); }); afterEach(reactTestingLibrary.cleanup); it('should hide the host details panel', async () => { - const hostDetailsFlyout = await renderResult.queryByTestId('hostDetailsFlyoutBody'); - expect(hostDetailsFlyout).toBeNull(); + const endpointDetailsFlyout = await renderResult.queryByTestId('endpointDetailsFlyoutBody'); + expect(endpointDetailsFlyout).toBeNull(); }); it('should display policy response sub-panel', async () => { expect( - await renderResult.findByTestId('hostDetailsPolicyResponseFlyoutHeader') + await renderResult.findByTestId('endpointDetailsPolicyResponseFlyoutHeader') ).not.toBeNull(); expect( - await renderResult.findByTestId('hostDetailsPolicyResponseFlyoutBody') + await renderResult.findByTestId('endpointDetailsPolicyResponseFlyoutBody') ).not.toBeNull(); }); it('should include the sub-panel title', async () => { expect( - (await renderResult.findByTestId('hostDetailsPolicyResponseFlyoutTitle')).textContent + (await renderResult.findByTestId('endpointDetailsPolicyResponseFlyoutTitle')).textContent ).toBe('Configuration Response'); }); it('should show a configuration section for each protection', async () => { const configAccordions = await renderResult.findAllByTestId( - 'hostDetailsPolicyResponseConfigAccordion' + 'endpointDetailsPolicyResponseConfigAccordion' ); expect(configAccordions).not.toBeNull(); }); it('should show an actions section for each configuration', async () => { const actionAccordions = await renderResult.findAllByTestId( - 'hostDetailsPolicyResponseActionsAccordion' + 'endpointDetailsPolicyResponseActionsAccordion' ); const action = await renderResult.findAllByTestId('policyResponseAction'); const statusHealth = await renderResult.findAllByTestId('policyResponseStatusHealth'); @@ -557,14 +557,14 @@ describe('when on the hosts page', () => { ); reactTestingLibrary.act(() => { store.dispatch({ - type: 'serverReturnedHostPolicyResponse', + type: 'serverReturnedEndpointPolicyResponse', payload: { policy_response: policyResponse, }, }); }); return renderResult - .findAllByTestId('hostDetailsPolicyResponseAttentionBadge') + .findAllByTestId('endpointDetailsPolicyResponseAttentionBadge') .catch((e) => { expect(e).not.toBeNull(); }); @@ -572,28 +572,28 @@ describe('when on the hosts page', () => { it('should show a numbered badge if at least one action failed', async () => { const policyResponseActionDispatched = middlewareSpy.waitForAction( - 'serverReturnedHostPolicyResponse' + 'serverReturnedEndpointPolicyResponse' ); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.failure); + dispatchServerReturnedEndpointPolicyResponse(HostPolicyResponseActionStatus.failure); }); await policyResponseActionDispatched; const attentionBadge = await renderResult.findAllByTestId( - 'hostDetailsPolicyResponseAttentionBadge' + 'endpointDetailsPolicyResponseAttentionBadge' ); expect(attentionBadge).not.toBeNull(); }); it('should show a numbered badge if at least one action has a warning', async () => { const policyResponseActionDispatched = middlewareSpy.waitForAction( - 'serverReturnedHostPolicyResponse' + 'serverReturnedEndpointPolicyResponse' ); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.warning); + dispatchServerReturnedEndpointPolicyResponse(HostPolicyResponseActionStatus.warning); }); await policyResponseActionDispatched; const attentionBadge = await renderResult.findAllByTestId( - 'hostDetailsPolicyResponseAttentionBadge' + 'endpointDetailsPolicyResponseAttentionBadge' ); expect(attentionBadge).not.toBeNull(); }); @@ -602,7 +602,7 @@ describe('when on the hosts page', () => { const subHeaderBackLink = await renderResult.findByTestId('flyoutSubHeaderBackButton'); expect(subHeaderBackLink.textContent).toBe('Endpoint Details'); expect(subHeaderBackLink.getAttribute('href')).toBe( - '/hosts?page_index=0&page_size=10&selected_host=1' + '/endpoints?page_index=0&page_size=10&selected_endpoint=1' ); }); @@ -614,7 +614,7 @@ describe('when on the hosts page', () => { }); const changedUrlAction = await userChangedUrlChecker; expect(changedUrlAction.payload.search).toEqual( - '?page_index=0&page_size=10&selected_host=1' + '?page_index=0&page_size=10&selected_endpoint=1' ); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx index cdea4bfcf9f86..a923d49012d70 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx @@ -25,9 +25,9 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { createStructuredSelector } from 'reselect'; import { useDispatch } from 'react-redux'; -import { HostDetailsFlyout } from './details'; +import { EndpointDetailsFlyout } from './details'; import * as selectors from '../store/selectors'; -import { useHostSelector } from './hooks'; +import { useEndpointSelector } from './hooks'; import { HOST_STATUS_TO_HEALTH_COLOR, POLICY_STATUS_TO_HEALTH_COLOR, @@ -46,12 +46,12 @@ import { AgentConfigDetailsDeployAgentAction, } from '../../../../../../ingest_manager/public'; import { SecurityPageName } from '../../../../app/types'; -import { getHostListPath, getHostDetailsPath } from '../../../common/routing'; +import { getEndpointListPath, getEndpointDetailsPath } from '../../../common/routing'; import { useFormatUrl } from '../../../../common/components/link_to'; -import { HostAction } from '../store/action'; -import { HostPolicyLink } from './components/host_policy_link'; +import { EndpointAction } from '../store/action'; +import { EndpointPolicyLink } from './components/endpoint_policy_link'; -const HostListNavLink = memo<{ +const EndpointListNavLink = memo<{ name: string; href: string; route: string; @@ -71,10 +71,10 @@ const HostListNavLink = memo<{ ); }); -HostListNavLink.displayName = 'HostListNavLink'; +EndpointListNavLink.displayName = 'EndpointListNavLink'; const selector = (createStructuredSelector as CreateStructuredSelector)(selectors); -export const HostList = () => { +export const EndpointList = () => { const history = useHistory(); const { listData, @@ -84,16 +84,16 @@ export const HostList = () => { listLoading: loading, listError, uiQueryParams: queryParams, - hasSelectedHost, + hasSelectedEndpoint, policyItems, selectedPolicyId, policyItemsLoading, endpointPackageVersion, - hostsExist, - } = useHostSelector(selector); + endpointsExist, + } = useEndpointSelector(selector); const { formatUrl, search } = useFormatUrl(SecurityPageName.administration); - const dispatch = useDispatch<(a: HostAction) => void>(); + const dispatch = useDispatch<(a: EndpointAction) => void>(); const paginationSetup = useMemo(() => { return { @@ -108,10 +108,10 @@ export const HostList = () => { const onTableChange = useCallback( ({ page }: { page: { index: number; size: number } }) => { const { index, size } = page; - // FIXME: PT: if host details is open, table is not displaying correct number of rows + // FIXME: PT: if endpoint details is open, table is not displaying correct number of rows history.push( - getHostListPath({ - name: 'hostList', + getEndpointListPath({ + name: 'endpointList', ...queryParams, page_index: JSON.stringify(index), page_size: JSON.stringify(size), @@ -130,12 +130,12 @@ export const HostList = () => { state: { onCancelNavigateTo: [ 'securitySolution:administration', - { path: getHostListPath({ name: 'hostList' }) }, + { path: getEndpointListPath({ name: 'endpointList' }) }, ], - onCancelUrl: formatUrl(getHostListPath({ name: 'hostList' })), + onCancelUrl: formatUrl(getEndpointListPath({ name: 'endpointList' })), onSaveNavigateTo: [ 'securitySolution:administration', - { path: getHostListPath({ name: 'hostList' }) }, + { path: getEndpointListPath({ name: 'endpointList' }) }, ], }, } @@ -148,7 +148,7 @@ export const HostList = () => { state: { onDoneNavigateTo: [ 'securitySolution:administration', - { path: getHostListPath({ name: 'hostList' }) }, + { path: getEndpointListPath({ name: 'endpointList' }) }, ], }, }); @@ -183,28 +183,28 @@ export const HostList = () => { ); const columns: Array>> = useMemo(() => { - const lastActiveColumnName = i18n.translate('xpack.securitySolution.endpointList.lastActive', { + const lastActiveColumnName = i18n.translate('xpack.securitySolution.endpoint.list.lastActive', { defaultMessage: 'Last Active', }); return [ { field: 'metadata.host', - name: i18n.translate('xpack.securitySolution.endpointList.hostname', { + name: i18n.translate('xpack.securitySolution.endpoint.list.hostname', { defaultMessage: 'Hostname', }), render: ({ hostname, id }: HostInfo['metadata']['host']) => { - const toRoutePath = getHostDetailsPath( + const toRoutePath = getEndpointDetailsPath( { ...queryParams, - name: 'hostDetails', - selected_host: id, + name: 'endpointDetails', + selected_endpoint: id, }, search ); const toRouteUrl = formatUrl(toRoutePath); return ( - { }, { field: 'host_status', - name: i18n.translate('xpack.securitySolution.endpointList.hostStatus', { - defaultMessage: 'Host Status', + name: i18n.translate('xpack.securitySolution.endpoint.list.hostStatus', { + defaultMessage: 'Agent Status', }), // eslint-disable-next-line react/display-name render: (hostStatus: HostInfo['host_status']) => { @@ -227,7 +227,7 @@ export const HostList = () => { className="eui-textTruncate" > @@ -237,33 +237,33 @@ export const HostList = () => { }, { field: 'metadata.Endpoint.policy.applied', - name: i18n.translate('xpack.securitySolution.endpointList.policy', { + name: i18n.translate('xpack.securitySolution.endpoint.list.policy', { defaultMessage: 'Integration', }), truncateText: true, // eslint-disable-next-line react/display-name render: (policy: HostInfo['metadata']['Endpoint']['policy']['applied']) => { return ( - {policy.name} - + ); }, }, { field: 'metadata.Endpoint.policy.applied', - name: i18n.translate('xpack.securitySolution.endpointList.policyStatus', { + name: i18n.translate('xpack.securitySolution.endpoint.list.policyStatus', { defaultMessage: 'Configuration Status', }), render: (policy: HostInfo['metadata']['Endpoint']['policy']['applied'], item: HostInfo) => { - const toRoutePath = getHostDetailsPath({ - name: 'hostPolicyResponse', + const toRoutePath = getEndpointDetailsPath({ + name: 'endpointPolicyResponse', ...queryParams, - selected_host: item.metadata.host.id, + selected_endpoint: item.metadata.host.id, }); const toRouteUrl = formatUrl(toRoutePath); return ( @@ -272,7 +272,7 @@ export const HostList = () => { className="eui-textTruncate" data-test-subj="rowPolicyStatus" > - { }, { field: 'metadata.host.os.name', - name: i18n.translate('xpack.securitySolution.endpointList.os', { + name: i18n.translate('xpack.securitySolution.endpoint.list.os', { defaultMessage: 'Operating System', }), truncateText: true, }, { field: 'metadata.host.ip', - name: i18n.translate('xpack.securitySolution.endpointList.ip', { + name: i18n.translate('xpack.securitySolution.endpoint.list.ip', { defaultMessage: 'IP Address', }), // eslint-disable-next-line react/display-name @@ -309,7 +309,7 @@ export const HostList = () => { }, { field: 'metadata.agent.version', - name: i18n.translate('xpack.securitySolution.endpointList.endpointVersion', { + name: i18n.translate('xpack.securitySolution.endpoint.list.endpointVersion', { defaultMessage: 'Version', }), }, @@ -330,10 +330,10 @@ export const HostList = () => { }, [formatUrl, queryParams, search]); const renderTableOrEmptyState = useMemo(() => { - if (hostsExist) { + if (endpointsExist) { return ( { } }, [ loading, - hostsExist, + endpointsExist, policyItemsLoading, policyItems, listData, @@ -377,7 +377,7 @@ export const HostList = () => { return ( @@ -385,15 +385,15 @@ export const HostList = () => {

@@ -403,7 +403,7 @@ export const HostList = () => {

@@ -411,12 +411,12 @@ export const HostList = () => { } > - {hasSelectedHost && } + {hasSelectedEndpoint && } {listData && listData.length > 0 && ( <> - + diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/url_from_query_params.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/url_from_query_params.ts index a14f1d0d0dd6c..c421f513556f4 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/url_from_query_params.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/url_from_query_params.ts @@ -7,10 +7,10 @@ // eslint-disable-next-line import/no-nodejs-modules import querystring from 'querystring'; -import { HostIndexUIQueryParams } from '../types'; +import { EndpointIndexUIQueryParams } from '../types'; import { AppLocation } from '../../../../../common/endpoint/types'; -export function urlFromQueryParams(queryParams: HostIndexUIQueryParams): Partial { +export function urlFromQueryParams(queryParams: EndpointIndexUIQueryParams): Partial { const search = querystring.stringify(queryParams); return { search, diff --git a/x-pack/plugins/security_solution/public/management/pages/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/index.test.tsx index 5ec42671ec3d2..9e496ce6c0b50 100644 --- a/x-pack/plugins/security_solution/public/management/pages/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/index.test.tsx @@ -30,7 +30,7 @@ describe('when in the Admistration tab', () => { it('should display the Management view when Ingest is ON', async () => { (useIngestEnabledCheck as jest.Mock).mockReturnValue({ allEnabled: true }); const renderResult = render(); - const hostPage = await renderResult.findByTestId('hostPage'); - expect(hostPage).not.toBeNull(); + const endpointPage = await renderResult.findByTestId('endpointPage'); + expect(endpointPage).not.toBeNull(); }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/index.tsx b/x-pack/plugins/security_solution/public/management/pages/index.tsx index 3e1c0743fb4f1..c20a3dd31d6a4 100644 --- a/x-pack/plugins/security_solution/public/management/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/index.tsx @@ -13,24 +13,24 @@ import { EuiText, EuiEmptyPrompt } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { PolicyContainer } from './policy'; import { - MANAGEMENT_ROUTING_HOSTS_PATH, + MANAGEMENT_ROUTING_ENDPOINTS_PATH, MANAGEMENT_ROUTING_POLICIES_PATH, MANAGEMENT_ROUTING_ROOT_PATH, } from '../common/constants'; import { NotFoundPage } from '../../app/404'; -import { HostsContainer } from './endpoint_hosts'; -import { getHostListPath } from '../common/routing'; +import { EndpointsContainer } from './endpoint_hosts'; +import { getEndpointListPath } from '../common/routing'; import { APP_ID, SecurityPageName } from '../../../common/constants'; import { GetUrlForApp } from '../../common/components/navigation/types'; import { AdministrationRouteSpyState } from '../../common/utils/route/types'; import { ADMINISTRATION } from '../../app/home/translations'; import { AdministrationSubTab } from '../types'; -import { HOSTS_TAB, POLICIES_TAB } from '../common/translations'; +import { ENDPOINTS_TAB, POLICIES_TAB } from '../common/translations'; import { SpyRoute } from '../../common/utils/route/spy_routes'; import { useIngestEnabledCheck } from '../../common/hooks/endpoint/ingest_enabled'; const TabNameMappedToI18nKey: Record = { - [AdministrationSubTab.hosts]: HOSTS_TAB, + [AdministrationSubTab.endpoints]: ENDPOINTS_TAB, [AdministrationSubTab.policies]: POLICIES_TAB, }; @@ -102,13 +102,13 @@ export const ManagementContainer = memo(() => { return ( - + { - history.replace(getHostListPath({ name: 'hostList' })); + history.replace(getEndpointListPath({ name: 'endpointList' })); return null; }} /> diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/agents_summary.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/agents_summary.tsx index 921493e239c0f..5dbd1b6ff4919 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/agents_summary.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/agents_summary.tsx @@ -34,7 +34,7 @@ export const AgentsSummary = memo((props) => { title: i18n.translate( 'xpack.securitySolution.endpoint.policyDetails.agentsSummary.totalTitle', { - defaultMessage: 'Hosts', + defaultMessage: 'Endpoints', } ), health: '', diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx index c81ffb0060c88..c934cfb94fc7e 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx @@ -10,7 +10,7 @@ import { mount } from 'enzyme'; import { PolicyDetails } from './policy_details'; import { EndpointDocGenerator } from '../../../../../common/endpoint/generate_data'; import { AppContextTestRender, createAppRootMockRenderer } from '../../../../common/mock/endpoint'; -import { getPolicyDetailPath, getHostListPath } from '../../../common/routing'; +import { getPolicyDetailPath, getEndpointListPath } from '../../../common/routing'; import { policyListApiPathHandlers } from '../store/policy_list/test_mock_utils'; jest.mock('../../../../common/components/link_to'); @@ -19,7 +19,7 @@ describe('Policy Details', () => { type FindReactWrapperResponse = ReturnType['find']>; const policyDetailsPathUrl = getPolicyDetailPath('1'); - const hostListPath = getHostListPath({ name: 'hostList' }); + const endpointListPath = getEndpointListPath({ name: 'endpointList' }); const sleep = (ms = 100) => new Promise((wakeup) => setTimeout(wakeup, ms)); const generator = new EndpointDocGenerator(); let history: AppContextTestRender['history']; @@ -129,7 +129,7 @@ describe('Policy Details', () => { const backToListButton = pageHeaderLeft.find('EuiButtonEmpty'); expect(backToListButton.prop('iconType')).toBe('arrowLeft'); - expect(backToListButton.prop('href')).toBe(hostListPath); + expect(backToListButton.prop('href')).toBe(endpointListPath); expect(backToListButton.text()).toBe('Back to endpoint hosts'); const pageTitle = pageHeaderLeft.find('[data-test-subj="pageViewHeaderLeftTitle"]'); @@ -143,7 +143,7 @@ describe('Policy Details', () => { ); expect(history.location.pathname).toEqual(policyDetailsPathUrl); backToListButton.simulate('click', { button: 0 }); - expect(history.location.pathname).toEqual(hostListPath); + expect(history.location.pathname).toEqual(endpointListPath); }); it('should display agent stats', async () => { await asyncActions; @@ -153,7 +153,7 @@ describe('Policy Details', () => { ); const agentsSummary = headerRight.find('EuiFlexGroup[data-test-subj="policyAgentsSummary"]'); expect(agentsSummary).toHaveLength(1); - expect(agentsSummary.text()).toBe('Hosts5Online3Offline1Error1'); + expect(agentsSummary.text()).toBe('Endpoints5Online3Offline1Error1'); }); it('should display cancel button', async () => { await asyncActions; @@ -175,7 +175,7 @@ describe('Policy Details', () => { const navigateToAppMockedCalls = coreStart.application.navigateToApp.mock.calls; expect(navigateToAppMockedCalls[navigateToAppMockedCalls.length - 1]).toEqual([ 'securitySolution:administration', - { path: hostListPath }, + { path: endpointListPath }, ]); }); it('should display save button', async () => { diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx index d309faf59d044..e54e684d788c0 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx @@ -43,7 +43,7 @@ import { PageViewHeaderTitle } from '../../../../common/components/endpoint/page import { ManagementPageView } from '../../../components/management_page_view'; import { SpyRoute } from '../../../../common/utils/route/spy_routes'; import { SecurityPageName } from '../../../../app/types'; -import { getHostListPath } from '../../../common/routing'; +import { getEndpointListPath } from '../../../common/routing'; import { useFormatUrl } from '../../../../common/components/link_to'; import { useNavigateToAppEventHandler } from '../../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; import { MANAGEMENT_APP_ID } from '../../../common/constants'; @@ -71,7 +71,7 @@ export const PolicyDetails = React.memo(() => { const [showConfirm, setShowConfirm] = useState(false); const [routeState, setRouteState] = useState(); const policyName = policyItem?.name ?? ''; - const hostListRouterPath = getHostListPath({ name: 'hostList' }); + const hostListRouterPath = getEndpointListPath({ name: 'endpointList' }); // Handle showing update statuses useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/management/store/middleware.ts b/x-pack/plugins/security_solution/public/management/store/middleware.ts index a29da9bef5875..c7a7d2cad0623 100644 --- a/x-pack/plugins/security_solution/public/management/store/middleware.ts +++ b/x-pack/plugins/security_solution/public/management/store/middleware.ts @@ -12,19 +12,19 @@ import { import { policyListMiddlewareFactory } from '../pages/policy/store/policy_list'; import { policyDetailsMiddlewareFactory } from '../pages/policy/store/policy_details'; import { - MANAGEMENT_STORE_HOSTS_NAMESPACE, + MANAGEMENT_STORE_ENDPOINTS_NAMESPACE, MANAGEMENT_STORE_GLOBAL_NAMESPACE, MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE, MANAGEMENT_STORE_POLICY_LIST_NAMESPACE, } from '../common/constants'; -import { hostMiddlewareFactory } from '../pages/endpoint_hosts/store/middleware'; +import { endpointMiddlewareFactory } from '../pages/endpoint_hosts/store/middleware'; const policyListSelector = (state: State) => state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][MANAGEMENT_STORE_POLICY_LIST_NAMESPACE]; const policyDetailsSelector = (state: State) => state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE]; const endpointsSelector = (state: State) => - state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][MANAGEMENT_STORE_HOSTS_NAMESPACE]; + state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][MANAGEMENT_STORE_ENDPOINTS_NAMESPACE]; export const managementMiddlewareFactory: SecuritySubPluginMiddlewareFactory = ( coreStart, @@ -39,6 +39,6 @@ export const managementMiddlewareFactory: SecuritySubPluginMiddlewareFactory = ( policyDetailsSelector, policyDetailsMiddlewareFactory(coreStart, depsStart) ), - substateMiddlewareFactory(endpointsSelector, hostMiddlewareFactory(coreStart, depsStart)), + substateMiddlewareFactory(endpointsSelector, endpointMiddlewareFactory(coreStart, depsStart)), ]; }; diff --git a/x-pack/plugins/security_solution/public/management/store/reducer.ts b/x-pack/plugins/security_solution/public/management/store/reducer.ts index f3c470fb1e8a3..eafd69c875ff1 100644 --- a/x-pack/plugins/security_solution/public/management/store/reducer.ts +++ b/x-pack/plugins/security_solution/public/management/store/reducer.ts @@ -14,14 +14,17 @@ import { initialPolicyListState, } from '../pages/policy/store/policy_list/reducer'; import { - MANAGEMENT_STORE_HOSTS_NAMESPACE, + MANAGEMENT_STORE_ENDPOINTS_NAMESPACE, MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE, MANAGEMENT_STORE_POLICY_LIST_NAMESPACE, } from '../common/constants'; import { ImmutableCombineReducers } from '../../common/store'; import { Immutable } from '../../../common/endpoint/types'; import { ManagementState } from '../types'; -import { hostListReducer, initialHostListState } from '../pages/endpoint_hosts/store/reducer'; +import { + endpointListReducer, + initialEndpointListState, +} from '../pages/endpoint_hosts/store/reducer'; const immutableCombineReducers: ImmutableCombineReducers = combineReducers; @@ -31,7 +34,7 @@ const immutableCombineReducers: ImmutableCombineReducers = combineReducers; export const mockManagementState: Immutable = { [MANAGEMENT_STORE_POLICY_LIST_NAMESPACE]: initialPolicyListState(), [MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE]: initialPolicyDetailsState(), - [MANAGEMENT_STORE_HOSTS_NAMESPACE]: initialHostListState, + [MANAGEMENT_STORE_ENDPOINTS_NAMESPACE]: initialEndpointListState, }; /** @@ -40,5 +43,5 @@ export const mockManagementState: Immutable = { export const managementReducer = immutableCombineReducers({ [MANAGEMENT_STORE_POLICY_LIST_NAMESPACE]: policyListReducer, [MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE]: policyDetailsReducer, - [MANAGEMENT_STORE_HOSTS_NAMESPACE]: hostListReducer, + [MANAGEMENT_STORE_ENDPOINTS_NAMESPACE]: endpointListReducer, }); diff --git a/x-pack/plugins/security_solution/public/management/types.ts b/x-pack/plugins/security_solution/public/management/types.ts index 86959caaba4f4..c35c9277b4488 100644 --- a/x-pack/plugins/security_solution/public/management/types.ts +++ b/x-pack/plugins/security_solution/public/management/types.ts @@ -7,7 +7,7 @@ import { CombinedState } from 'redux'; import { SecurityPageName } from '../app/types'; import { PolicyListState, PolicyDetailsState } from './pages/policy/types'; -import { HostState } from './pages/endpoint_hosts/types'; +import { EndpointState } from './pages/endpoint_hosts/types'; /** * The type for the management store global namespace. Used mostly internally to reference @@ -18,14 +18,14 @@ export type ManagementStoreGlobalNamespace = 'management'; export type ManagementState = CombinedState<{ policyList: PolicyListState; policyDetails: PolicyDetailsState; - hosts: HostState; + endpoints: EndpointState; }>; /** * The management list of sub-tabs. Changes to these will impact the Router routes. */ export enum AdministrationSubTab { - hosts = 'hosts', + endpoints = 'endpoints', policies = 'policy', } diff --git a/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx b/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx index 1d726a7dbd901..8b73253157edc 100644 --- a/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx @@ -7,13 +7,13 @@ import React, { memo } from 'react'; import { EuiCallOut, EuiButton, EuiButtonEmpty } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { getHostListPath } from '../../../management/common/routing'; +import { getEndpointListPath } from '../../../management/common/routing'; import { useNavigateToAppEventHandler } from '../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; import { useManagementFormatUrl } from '../../../management/components/hooks/use_management_format_url'; import { MANAGEMENT_APP_ID } from '../../../management/common/constants'; export const EndpointNotice = memo<{ onDismiss: () => void }>(({ onDismiss }) => { - const endpointsPath = getHostListPath({ name: 'hostList' }); + const endpointsPath = getEndpointListPath({ name: 'endpointList' }); const endpointsLink = useManagementFormatUrl(endpointsPath); const handleGetStartedClick = useNavigateToAppEventHandler(MANAGEMENT_APP_ID, { path: endpointsPath, diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 720ec2892093b..f6d818df0d0fa 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -16233,65 +16233,65 @@ "xpack.securitySolution.editDataProvider.valuePlaceholder": "値", "xpack.securitySolution.emptyMessage": "Elastic セキュリティは無料かつオープンのElastic SIEMに、Elastic Endpointを搭載。脅威の防御と検知、脅威への対応を支援します。開始するには、セキュリティソリューション関連データをElastic Stackに追加する必要があります。詳細については、ご覧ください ", "xpack.securitySolution.emptyString.emptyStringDescription": "空の文字列", - "xpack.securitySolution.endpoint.host.details.endpointVersion": "エンドポイントバージョン", - "xpack.securitySolution.endpoint.host.details.errorBody": "フライアウトを終了して、利用可能なホストを選択してください。", - "xpack.securitySolution.endpoint.host.details.errorTitle": "ホストが見つかりませんでした", - "xpack.securitySolution.endpoint.host.details.hostname": "ホスト名", - "xpack.securitySolution.endpoint.host.details.ipAddress": "IP アドレス", - "xpack.securitySolution.endpoint.host.details.lastSeen": "前回の認識", - "xpack.securitySolution.endpoint.host.details.linkToIngestTitle": "ポリシーの再割り当て", - "xpack.securitySolution.endpoint.host.details.os": "OS", - "xpack.securitySolution.endpoint.host.details.policy": "ポリシー", - "xpack.securitySolution.endpoint.host.details.policyStatus": "ポリシーステータス", - "xpack.securitySolution.endpoint.host.details.policyStatusValue": "{policyStatus, select, success {成功} warning {警告} failure {失敗} other {不明}}", - "xpack.securitySolution.endpoint.host.policyResponse.backLinkTitle": "エンドポイント詳細", - "xpack.securitySolution.endpoint.host.policyResponse.title": "ポリシー応答", - "xpack.securitySolution.endpoint.hostDetails.noPolicyResponse": "ポリシー応答がありません", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_dns_events": "DNSイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_elasticsearch_connection": "Elastic Search接続の構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_file_events": "ファイルイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_imageload_events": "画像読み込みイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_kernel": "カーネルの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_logging": "ロギングの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_malware": "マルウェアの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_network_events": "ネットワークイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_process_events": "プロセスイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_registry_events": "レジストリイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_security_events": "セキュリティイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.connect_kernel": "カーネルを接続", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_async_image_load_events": "非同期画像読み込みイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_open_events": "ファイルオープンイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_write_events": "ファイル書き込みイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_network_events": "ネットワークイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_process_events": "プロセスイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_registry_events": "レジストリイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_sync_image_load_events": "同期画像読み込みイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.download_global_artifacts": "グローバルアーチファクトをダウンロード", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.download_user_artifacts": "ユーザーアーチファクトをダウンロード", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.events": "イベント", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.failed": "失敗", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.load_config": "構成の読み込み", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.load_malware_model": "マルウェアモデルの読み込み", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.logging": "ログ", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.malware": "マルウェア", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_elasticsearch_config": "Elasticsearch構成を読み取る", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_events_config": "イベント構成を読み取る", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_kernel_config": "カーネル構成を読み取る", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_logging_config": "ロギング構成を読み取る", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_malware_config": "マルウェア構成を読み取る", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.streaming": "ストリーム中…", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.success": "成功", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.warning": "警告", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.workflow": "ワークフロー", - "xpack.securitySolution.endpoint.hostList.beta": "ベータ", - "xpack.securitySolution.endpoint.hostList.loadingPolicies": "ポリシー構成を読み込んでいます…", - "xpack.securitySolution.endpoint.hostList.noEndpointsInstructions": "セキュリティポリシーを作成しました。以下のステップに従い、エージェントでElastic Endpoint Security機能を有効にする必要があります。", - "xpack.securitySolution.endpoint.hostList.noEndpointsPrompt": "エージェントでElastic Endpoint Securityを有効にする", - "xpack.securitySolution.endpoint.hostList.noPolicies": "ポリシーがありません。", - "xpack.securitySolution.endpoint.hostList.stepOne": "既存のポリシーは以下のリストのとおりです。これは後から変更できます。", - "xpack.securitySolution.endpoint.hostList.stepOneTitle": "ホストの保護で使用するポリシーを選択", - "xpack.securitySolution.endpoint.hostList.stepTwo": "開始するために必要なコマンドが提供されます。", - "xpack.securitySolution.endpoint.hostList.stepTwoTitle": "Ingest Manager経由でEndpoint Securityによって有効にされたエージェントを登録", + "xpack.securitySolution.endpoint.details.endpointVersion": "エンドポイントバージョン", + "xpack.securitySolution.endpoint.details.errorBody": "フライアウトを終了して、利用可能なホストを選択してください。", + "xpack.securitySolution.endpoint.details.errorTitle": "ホストが見つかりませんでした", + "xpack.securitySolution.endpoint.details.hostname": "ホスト名", + "xpack.securitySolution.endpoint.details.ipAddress": "IP アドレス", + "xpack.securitySolution.endpoint.details.lastSeen": "前回の認識", + "xpack.securitySolution.endpoint.details.linkToIngestTitle": "ポリシーの再割り当て", + "xpack.securitySolution.endpoint.details.os": "OS", + "xpack.securitySolution.endpoint.details.policy": "ポリシー", + "xpack.securitySolution.endpoint.details.policyStatus": "ポリシーステータス", + "xpack.securitySolution.endpoint.details.policyStatusValue": "{policyStatus, select, success {成功} warning {警告} failure {失敗} other {不明}}", + "xpack.securitySolution.endpoint.policyResponse.backLinkTitle": "エンドポイント詳細", + "xpack.securitySolution.endpoint.policyResponse.title": "ポリシー応答", + "xpack.securitySolution.endpoint.details.noPolicyResponse": "ポリシー応答がありません", + "xpack.securitySolution.endpoint.details.policyResponse.configure_dns_events": "DNSイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_elasticsearch_connection": "Elastic Search接続の構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_file_events": "ファイルイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_imageload_events": "画像読み込みイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_kernel": "カーネルの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_logging": "ロギングの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_malware": "マルウェアの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_network_events": "ネットワークイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_process_events": "プロセスイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_registry_events": "レジストリイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_security_events": "セキュリティイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.connect_kernel": "カーネルを接続", + "xpack.securitySolution.endpoint.details.policyResponse.detect_async_image_load_events": "非同期画像読み込みイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_file_open_events": "ファイルオープンイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_file_write_events": "ファイル書き込みイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_network_events": "ネットワークイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_process_events": "プロセスイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_registry_events": "レジストリイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_sync_image_load_events": "同期画像読み込みイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.download_global_artifacts": "グローバルアーチファクトをダウンロード", + "xpack.securitySolution.endpoint.details.policyResponse.download_user_artifacts": "ユーザーアーチファクトをダウンロード", + "xpack.securitySolution.endpoint.details.policyResponse.events": "イベント", + "xpack.securitySolution.endpoint.details.policyResponse.failed": "失敗", + "xpack.securitySolution.endpoint.details.policyResponse.load_config": "構成の読み込み", + "xpack.securitySolution.endpoint.details.policyResponse.load_malware_model": "マルウェアモデルの読み込み", + "xpack.securitySolution.endpoint.details.policyResponse.logging": "ログ", + "xpack.securitySolution.endpoint.details.policyResponse.malware": "マルウェア", + "xpack.securitySolution.endpoint.details.policyResponse.read_elasticsearch_config": "Elasticsearch構成を読み取る", + "xpack.securitySolution.endpoint.details.policyResponse.read_events_config": "イベント構成を読み取る", + "xpack.securitySolution.endpoint.details.policyResponse.read_kernel_config": "カーネル構成を読み取る", + "xpack.securitySolution.endpoint.details.policyResponse.read_logging_config": "ロギング構成を読み取る", + "xpack.securitySolution.endpoint.details.policyResponse.read_malware_config": "マルウェア構成を読み取る", + "xpack.securitySolution.endpoint.details.policyResponse.streaming": "ストリーム中…", + "xpack.securitySolution.endpoint.details.policyResponse.success": "成功", + "xpack.securitySolution.endpoint.details.policyResponse.warning": "警告", + "xpack.securitySolution.endpoint.details.policyResponse.workflow": "ワークフロー", + "xpack.securitySolution.endpoint.list.beta": "ベータ", + "xpack.securitySolution.endpoint.list.loadingPolicies": "ポリシー構成を読み込んでいます…", + "xpack.securitySolution.endpoint.list.noEndpointsInstructions": "セキュリティポリシーを作成しました。以下のステップに従い、エージェントでElastic Endpoint Security機能を有効にする必要があります。", + "xpack.securitySolution.endpoint.list.noEndpointsPrompt": "エージェントでElastic Endpoint Securityを有効にする", + "xpack.securitySolution.endpoint.list.noPolicies": "ポリシーがありません。", + "xpack.securitySolution.endpoint.list.stepOne": "既存のポリシーは以下のリストのとおりです。これは後から変更できます。", + "xpack.securitySolution.endpoint.list.stepOneTitle": "ホストの保護で使用するポリシーを選択", + "xpack.securitySolution.endpoint.list.stepTwo": "開始するために必要なコマンドが提供されます。", + "xpack.securitySolution.endpoint.list.stepTwoTitle": "Ingest Manager経由でEndpoint Securityによって有効にされたエージェントを登録", "xpack.securitySolution.endpoint.ingestManager.createPackageConfig.endpointConfiguration": "このエージェント構成を使用するすべてのエージェントは基本ポリシーを使用します。セキュリティアプリでこのポリシーを変更できます。Fleetはこれらの変更をエージェントにデプロイします。", "xpack.securitySolution.endpoint.ingestToastMessage": "Ingest Managerが設定中に失敗しました。", "xpack.securitySolution.endpoint.ingestToastTitle": "アプリを初期化できませんでした", @@ -16412,16 +16412,16 @@ "xpack.securitySolution.endpoint.resolver.runningTrigger": "トリガーの実行中", "xpack.securitySolution.endpoint.resolver.terminatedProcess": "プロセスを中断しました", "xpack.securitySolution.endpoint.resolver.terminatedTrigger": "トリガーを中断しました", - "xpack.securitySolution.endpointList.endpointVersion": "バージョン", - "xpack.securitySolution.endpointList.hostname": "ホスト名", - "xpack.securitySolution.endpointList.hostStatus": "ホストステータス", - "xpack.securitySolution.endpointList.hostStatusValue": "{hostStatus, select, online {オンライン} error {エラー} other {オフライン}}", - "xpack.securitySolution.endpointList.ip": "IP アドレス", - "xpack.securitySolution.endpointList.lastActive": "前回のアーカイブ", - "xpack.securitySolution.endpointList.os": "オペレーティングシステム", - "xpack.securitySolution.endpointList.policy": "ポリシー", - "xpack.securitySolution.endpointList.policyStatus": "ポリシーステータス", - "xpack.securitySolution.endpointList.totalCount": "{totalItemCount, plural, one {# ホスト} other {# ホスト}}", + "xpack.securitySolution.endpoint.list.endpointVersion": "バージョン", + "xpack.securitySolution.endpoint.list.hostname": "ホスト名", + "xpack.securitySolution.endpoint.list.hostStatus": "ホストステータス", + "xpack.securitySolution.endpoint.list.hostStatusValue": "{hostStatus, select, online {オンライン} error {エラー} other {オフライン}}", + "xpack.securitySolution.endpoint.list.ip": "IP アドレス", + "xpack.securitySolution.endpoint.list.lastActive": "前回のアーカイブ", + "xpack.securitySolution.endpoint.list.os": "オペレーティングシステム", + "xpack.securitySolution.endpoint.list.policy": "ポリシー", + "xpack.securitySolution.endpoint.list.policyStatus": "ポリシーステータス", + "xpack.securitySolution.endpoint.list.totalCount": "{totalItemCount, plural, one {# ホスト} other {# ホスト}}", "xpack.securitySolution.endpointManagement.noPermissionsSubText": "Ingest Managerが無効である可能性があります。この機能を使用するには、Ingest Managerを有効にする必要があります。Ingest Managerを有効にする権限がない場合は、Kibana管理者に連絡してください。", "xpack.securitySolution.endpointManagemnet.noPermissionsText": "Elastic Security Administrationを使用するために必要なKibana権限がありません。", "xpack.securitySolution.enpdoint.resolver.panelutils.betaBadgeLabel": "BETA", @@ -16610,8 +16610,8 @@ "xpack.securitySolution.host.details.overview.platformTitle": "プラットフォーム", "xpack.securitySolution.host.details.overview.regionTitle": "地域", "xpack.securitySolution.host.details.versionLabel": "バージョン", - "xpack.securitySolution.hostList.pageSubTitle": "Elastic Endpoint Securityを実行しているホスト", - "xpack.securitySolution.hostList.pageTitle": "ホスト", + "xpack.securitySolution.endpoint.list.pageSubTitle": "Elastic Endpoint Securityを実行しているホスト", + "xpack.securitySolution.endpoint.list.pageTitle": "ホスト", "xpack.securitySolution.hosts.kqlPlaceholder": "例:host.name: \"foo\"", "xpack.securitySolution.hosts.navigation.alertsTitle": "外部アラート", "xpack.securitySolution.hosts.navigation.allHostsTitle": "すべてのホスト", @@ -16623,7 +16623,7 @@ "xpack.securitySolution.hosts.navigaton.matrixHistogram.errorFetchingAuthenticationsData": "認証データをクエリできませんでした", "xpack.securitySolution.hosts.navigaton.matrixHistogram.errorFetchingEventsData": "イベントデータをクエリできませんでした", "xpack.securitySolution.hosts.pageTitle": "ホスト", - "xpack.securitySolution.hostsTab": "ホスト", + "xpack.securitySolution.endpointsTab": "ホスト", "xpack.securitySolution.hostsTable.firstLastSeenToolTip": "選択された日付範囲との相関付けです", "xpack.securitySolution.hostsTable.hostsTitle": "すべてのホスト", "xpack.securitySolution.hostsTable.lastSeenTitle": "前回の認識", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 69820834cad5d..590b27db5b19b 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -16238,65 +16238,65 @@ "xpack.securitySolution.editDataProvider.valuePlaceholder": "值", "xpack.securitySolution.emptyMessage": "Elastic Security 将免费且开放的 Elastic SIEM 和 Elastic Endpoint Security 整合在一起,从而防御、检测并响应威胁。首先,您需要将安全解决方案相关数据添加到 Elastic Stack。有关更多信息,请查看我们的 ", "xpack.securitySolution.emptyString.emptyStringDescription": "空字符串", - "xpack.securitySolution.endpoint.host.details.endpointVersion": "Endpoint 版本", - "xpack.securitySolution.endpoint.host.details.errorBody": "请退出浮出控件并选择可用主机。", - "xpack.securitySolution.endpoint.host.details.errorTitle": "找不到主机", - "xpack.securitySolution.endpoint.host.details.hostname": "主机名", - "xpack.securitySolution.endpoint.host.details.ipAddress": "IP 地址", - "xpack.securitySolution.endpoint.host.details.lastSeen": "最后看到时间", - "xpack.securitySolution.endpoint.host.details.linkToIngestTitle": "重新分配策略", - "xpack.securitySolution.endpoint.host.details.os": "OS", - "xpack.securitySolution.endpoint.host.details.policy": "政策", - "xpack.securitySolution.endpoint.host.details.policyStatus": "策略状态", - "xpack.securitySolution.endpoint.host.details.policyStatusValue": "{policyStatus, select, success {成功} warning {警告} failure {失败} other {未知}}", - "xpack.securitySolution.endpoint.host.policyResponse.backLinkTitle": "终端详情", - "xpack.securitySolution.endpoint.host.policyResponse.title": "策略响应", - "xpack.securitySolution.endpoint.hostDetails.noPolicyResponse": "没有可用的策略响应", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_dns_events": "配置 DNS 事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_elasticsearch_connection": "配置 Elastic 搜索连接", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_file_events": "配置文件事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_imageload_events": "配置映像加载事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_kernel": "配置内核", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_logging": "配置日志记录", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_malware": "配置恶意软件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_network_events": "配置网络事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_process_events": "配置进程事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_registry_events": "配置注册表事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_security_events": "配置安全事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.connect_kernel": "连接内核", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_async_image_load_events": "检测异步映像加载事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_open_events": "检测文件打开事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_write_events": "检测文件写入事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_network_events": "检测网络事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_process_events": "检测进程事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_registry_events": "检测注册表事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_sync_image_load_events": "检测同步映像加载事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.download_global_artifacts": "下载全局项目", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.download_user_artifacts": "下面用户项目", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.events": "事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.failed": "失败", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.load_config": "加载配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.load_malware_model": "加载恶意软件模型", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.logging": "日志", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.malware": "恶意软件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_elasticsearch_config": "读取 ElasticSearch 配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_events_config": "读取时间配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_kernel_config": "读取内核配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_logging_config": "读取日志配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_malware_config": "读取恶意软件配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.streaming": "流式传输", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.success": "成功", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.warning": "警告", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.workflow": "工作流", - "xpack.securitySolution.endpoint.hostList.beta": "公测版", - "xpack.securitySolution.endpoint.hostList.loadingPolicies": "正在加载政策配置", - "xpack.securitySolution.endpoint.hostList.noEndpointsInstructions": "您已创建安全策略。现在您需要按照下面的步骤在代理上启用 Elastic Endpoint Security 功能。", - "xpack.securitySolution.endpoint.hostList.noEndpointsPrompt": "在您的代理上启用 Elastic Endpoint Security", - "xpack.securitySolution.endpoint.hostList.noPolicies": "没有策略。", - "xpack.securitySolution.endpoint.hostList.stepOne": "现有策略在下面列出。之后可以对其进行更改。", - "xpack.securitySolution.endpoint.hostList.stepOneTitle": "选择要用于保护主机的策略", - "xpack.securitySolution.endpoint.hostList.stepTwo": "为了让您入门,将会为您提供必要的命令。", - "xpack.securitySolution.endpoint.hostList.stepTwoTitle": "通过采集管理器注册启用 Endpoint Security 的代理", + "xpack.securitySolution.endpoint.details.endpointVersion": "Endpoint 版本", + "xpack.securitySolution.endpoint.details.errorBody": "请退出浮出控件并选择可用主机。", + "xpack.securitySolution.endpoint.details.errorTitle": "找不到主机", + "xpack.securitySolution.endpoint.details.hostname": "主机名", + "xpack.securitySolution.endpoint.details.ipAddress": "IP 地址", + "xpack.securitySolution.endpoint.details.lastSeen": "最后看到时间", + "xpack.securitySolution.endpoint.details.linkToIngestTitle": "重新分配策略", + "xpack.securitySolution.endpoint.details.os": "OS", + "xpack.securitySolution.endpoint.details.policy": "政策", + "xpack.securitySolution.endpoint.details.policyStatus": "策略状态", + "xpack.securitySolution.endpoint.details.policyStatusValue": "{policyStatus, select, success {成功} warning {警告} failure {失败} other {未知}}", + "xpack.securitySolution.endpoint.policyResponse.backLinkTitle": "终端详情", + "xpack.securitySolution.endpoint.policyResponse.title": "策略响应", + "xpack.securitySolution.endpoint.details.noPolicyResponse": "没有可用的策略响应", + "xpack.securitySolution.endpoint.details.policyResponse.configure_dns_events": "配置 DNS 事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_elasticsearch_connection": "配置 Elastic 搜索连接", + "xpack.securitySolution.endpoint.details.policyResponse.configure_file_events": "配置文件事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_imageload_events": "配置映像加载事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_kernel": "配置内核", + "xpack.securitySolution.endpoint.details.policyResponse.configure_logging": "配置日志记录", + "xpack.securitySolution.endpoint.details.policyResponse.configure_malware": "配置恶意软件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_network_events": "配置网络事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_process_events": "配置进程事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_registry_events": "配置注册表事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_security_events": "配置安全事件", + "xpack.securitySolution.endpoint.details.policyResponse.connect_kernel": "连接内核", + "xpack.securitySolution.endpoint.details.policyResponse.detect_async_image_load_events": "检测异步映像加载事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_file_open_events": "检测文件打开事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_file_write_events": "检测文件写入事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_network_events": "检测网络事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_process_events": "检测进程事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_registry_events": "检测注册表事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_sync_image_load_events": "检测同步映像加载事件", + "xpack.securitySolution.endpoint.details.policyResponse.download_global_artifacts": "下载全局项目", + "xpack.securitySolution.endpoint.details.policyResponse.download_user_artifacts": "下面用户项目", + "xpack.securitySolution.endpoint.details.policyResponse.events": "事件", + "xpack.securitySolution.endpoint.details.policyResponse.failed": "失败", + "xpack.securitySolution.endpoint.details.policyResponse.load_config": "加载配置", + "xpack.securitySolution.endpoint.details.policyResponse.load_malware_model": "加载恶意软件模型", + "xpack.securitySolution.endpoint.details.policyResponse.logging": "日志", + "xpack.securitySolution.endpoint.details.policyResponse.malware": "恶意软件", + "xpack.securitySolution.endpoint.details.policyResponse.read_elasticsearch_config": "读取 ElasticSearch 配置", + "xpack.securitySolution.endpoint.details.policyResponse.read_events_config": "读取时间配置", + "xpack.securitySolution.endpoint.details.policyResponse.read_kernel_config": "读取内核配置", + "xpack.securitySolution.endpoint.details.policyResponse.read_logging_config": "读取日志配置", + "xpack.securitySolution.endpoint.details.policyResponse.read_malware_config": "读取恶意软件配置", + "xpack.securitySolution.endpoint.details.policyResponse.streaming": "流式传输", + "xpack.securitySolution.endpoint.details.policyResponse.success": "成功", + "xpack.securitySolution.endpoint.details.policyResponse.warning": "警告", + "xpack.securitySolution.endpoint.details.policyResponse.workflow": "工作流", + "xpack.securitySolution.endpoint.list.beta": "公测版", + "xpack.securitySolution.endpoint.list.loadingPolicies": "正在加载政策配置", + "xpack.securitySolution.endpoint.list.noEndpointsInstructions": "您已创建安全策略。现在您需要按照下面的步骤在代理上启用 Elastic Endpoint Security 功能。", + "xpack.securitySolution.endpoint.list.noEndpointsPrompt": "在您的代理上启用 Elastic Endpoint Security", + "xpack.securitySolution.endpoint.list.noPolicies": "没有策略。", + "xpack.securitySolution.endpoint.list.stepOne": "现有策略在下面列出。之后可以对其进行更改。", + "xpack.securitySolution.endpoint.list.stepOneTitle": "选择要用于保护主机的策略", + "xpack.securitySolution.endpoint.list.stepTwo": "为了让您入门,将会为您提供必要的命令。", + "xpack.securitySolution.endpoint.list.stepTwoTitle": "通过采集管理器注册启用 Endpoint Security 的代理", "xpack.securitySolution.endpoint.ingestManager.createPackageConfig.endpointConfiguration": "使用此代理配置的任何代理都会使用基本策略。可以在 Security 应用中对此策略进行更改,Fleet 会将这些更改部署到代理。", "xpack.securitySolution.endpoint.ingestToastMessage": "采集管理器在其设置期间失败。", "xpack.securitySolution.endpoint.ingestToastTitle": "应用无法初始化", @@ -16418,16 +16418,16 @@ "xpack.securitySolution.endpoint.resolver.runningTrigger": "正在运行的触发器", "xpack.securitySolution.endpoint.resolver.terminatedProcess": "已终止进程", "xpack.securitySolution.endpoint.resolver.terminatedTrigger": "已终止触发器", - "xpack.securitySolution.endpointList.endpointVersion": "版本", - "xpack.securitySolution.endpointList.hostname": "主机名", - "xpack.securitySolution.endpointList.hostStatus": "主机状态", - "xpack.securitySolution.endpointList.hostStatusValue": "{hostStatus, select, online {联机} error {错误} other {脱机}}", - "xpack.securitySolution.endpointList.ip": "IP 地址", - "xpack.securitySolution.endpointList.lastActive": "上次活动时间", - "xpack.securitySolution.endpointList.os": "操作系统", - "xpack.securitySolution.endpointList.policy": "政策", - "xpack.securitySolution.endpointList.policyStatus": "策略状态", - "xpack.securitySolution.endpointList.totalCount": "{totalItemCount, plural, one {# 个主机} other {# 个主机}}", + "xpack.securitySolution.endpoint.list.endpointVersion": "版本", + "xpack.securitySolution.endpoint.list.hostname": "主机名", + "xpack.securitySolution.endpoint.list.hostStatus": "主机状态", + "xpack.securitySolution.endpoint.list.hostStatusValue": "{hostStatus, select, online {联机} error {错误} other {脱机}}", + "xpack.securitySolution.endpoint.list.ip": "IP 地址", + "xpack.securitySolution.endpoint.list.lastActive": "上次活动时间", + "xpack.securitySolution.endpoint.list.os": "操作系统", + "xpack.securitySolution.endpoint.list.policy": "政策", + "xpack.securitySolution.endpoint.list.policyStatus": "策略状态", + "xpack.securitySolution.endpoint.list.totalCount": "{totalItemCount, plural, one {# 个主机} other {# 个主机}}", "xpack.securitySolution.endpointManagement.noPermissionsSubText": "似乎采集管理器已禁用。必须启用采集管理器,才能使用此功能。如果您无权启用采集管理器,请联系您的 Kibana 管理员。", "xpack.securitySolution.endpointManagemnet.noPermissionsText": "您没有所需的 Kibana 权限,无法使用 Elastic Security 管理", "xpack.securitySolution.enpdoint.resolver.panelutils.betaBadgeLabel": "公测版", @@ -16616,8 +16616,8 @@ "xpack.securitySolution.host.details.overview.platformTitle": "平台", "xpack.securitySolution.host.details.overview.regionTitle": "地区", "xpack.securitySolution.host.details.versionLabel": "版本", - "xpack.securitySolution.hostList.pageSubTitle": "运行 Elastic Endpoint Security 的主机", - "xpack.securitySolution.hostList.pageTitle": "主机", + "xpack.securitySolution.endpoint.list.pageSubTitle": "运行 Elastic Endpoint Security 的主机", + "xpack.securitySolution.endpoint.list.pageTitle": "主机", "xpack.securitySolution.hosts.kqlPlaceholder": "例如 host.name:“foo”", "xpack.securitySolution.hosts.navigation.alertsTitle": "外部告警", "xpack.securitySolution.hosts.navigation.allHostsTitle": "所有主机", @@ -16629,7 +16629,7 @@ "xpack.securitySolution.hosts.navigaton.matrixHistogram.errorFetchingAuthenticationsData": "无法查询身份验证数据", "xpack.securitySolution.hosts.navigaton.matrixHistogram.errorFetchingEventsData": "无法查询事件数据", "xpack.securitySolution.hosts.pageTitle": "主机", - "xpack.securitySolution.hostsTab": "主机", + "xpack.securitySolution.endpointsTab": "主机", "xpack.securitySolution.hostsTable.firstLastSeenToolTip": "相对于选定日期范围", "xpack.securitySolution.hostsTable.hostsTitle": "所有主机", "xpack.securitySolution.hostsTable.lastSeenTitle": "最后看到时间", diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts index 85d0e56231643..0037c39b8fed2 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts @@ -13,14 +13,14 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const testSubjects = getService('testSubjects'); - describe('host list', function () { + describe('endpoint list', function () { this.tags('ciGroup7'); const sleep = (ms = 100) => new Promise((resolve) => setTimeout(resolve, ms)); describe('when there is data,', () => { before(async () => { await esArchiver.load('endpoint/metadata/api_feature', { useCreate: true }); - await pageObjects.endpoint.navigateToHostList(); + await pageObjects.endpoint.navigateToEndpointList(); }); after(async () => { await deleteMetadataStream(getService); @@ -28,14 +28,14 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('finds page title', async () => { const title = await testSubjects.getVisibleText('pageViewHeaderLeftTitle'); - expect(title).to.equal('Hosts'); + expect(title).to.equal('Endpoints'); }); it('displays table data', async () => { const expectedData = [ [ 'Hostname', - 'Host Status', + 'Agent Status', 'Integration', 'Configuration Status', 'Operating System', @@ -74,70 +74,76 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { 'Jan 24, 2020 @ 16:06:09.541', ], ]; - const tableData = await pageObjects.endpointPageUtils.tableData('hostListTable'); + const tableData = await pageObjects.endpointPageUtils.tableData('endpointListTable'); expect(tableData).to.eql(expectedData); }); it('does not show the details flyout initially', async () => { - await testSubjects.missingOrFail('hostDetailsFlyout'); + await testSubjects.missingOrFail('endpointDetailsFlyout'); }); describe('when the hostname is clicked on,', () => { it('display the details flyout', async () => { await (await testSubjects.find('hostnameCellLink')).click(); - await testSubjects.existOrFail('hostDetailsUpperList'); - await testSubjects.existOrFail('hostDetailsLowerList'); + await testSubjects.existOrFail('endpointDetailsUpperList'); + await testSubjects.existOrFail('endpointDetailsLowerList'); }); it('updates the details flyout when a new hostname is selected from the list', async () => { - // display flyout for the first host in the list + // display flyout for the first endpoint in the list await (await testSubjects.findAll('hostnameCellLink'))[0].click(); - await testSubjects.existOrFail('hostDetailsFlyoutTitle'); - const hostDetailTitle0 = await testSubjects.getVisibleText('hostDetailsFlyoutTitle'); - // select the 2nd host in the host list + await testSubjects.existOrFail('endpointDetailsFlyoutTitle'); + const endpointDetailTitle0 = await testSubjects.getVisibleText( + 'endpointDetailsFlyoutTitle' + ); + // select the 2nd endpoint in the endpoint list await (await testSubjects.findAll('hostnameCellLink'))[1].click(); await pageObjects.endpoint.waitForVisibleTextToChange( - 'hostDetailsFlyoutTitle', - hostDetailTitle0 + 'endpointDetailsFlyoutTitle', + endpointDetailTitle0 + ); + const endpointDetailTitle1 = await testSubjects.getVisibleText( + 'endpointDetailsFlyoutTitle' ); - const hostDetailTitle1 = await testSubjects.getVisibleText('hostDetailsFlyoutTitle'); - expect(hostDetailTitle1).to.not.eql(hostDetailTitle0); + expect(endpointDetailTitle1).to.not.eql(endpointDetailTitle0); }); it('has the same flyout info when the same hostname is selected', async () => { - // display flyout for the first host in the list + // display flyout for the first endpoint in the list await (await testSubjects.findAll('hostnameCellLink'))[1].click(); - await testSubjects.existOrFail('hostDetailsFlyoutTitle'); - const hostDetailTitleInitial = await testSubjects.getVisibleText( - 'hostDetailsFlyoutTitle' + await testSubjects.existOrFail('endpointDetailsFlyoutTitle'); + const endpointDetailTitleInitial = await testSubjects.getVisibleText( + 'endpointDetailsFlyoutTitle' ); - // select the same host in the host list + // select the same endpoint in the endpoint list await (await testSubjects.findAll('hostnameCellLink'))[1].click(); await sleep(500); // give page time to refresh and verify it did not change - const hostDetailTitleNew = await testSubjects.getVisibleText('hostDetailsFlyoutTitle'); - expect(hostDetailTitleNew).to.equal(hostDetailTitleInitial); + const endpointDetailTitleNew = await testSubjects.getVisibleText( + 'endpointDetailsFlyoutTitle' + ); + expect(endpointDetailTitleNew).to.equal(endpointDetailTitleInitial); }); // The integration does not work properly yet. Skipping this test for now. it.skip('navigates to ingest fleet when the Reassign Configuration link is clicked', async () => { await (await testSubjects.find('hostnameCellLink')).click(); - await (await testSubjects.find('hostDetailsLinkToIngest')).click(); + await (await testSubjects.find('endpointDetailsLinkToIngest')).click(); await testSubjects.existOrFail('fleetAgentListTable'); }); }); // This set of tests fails the flyout does not open in the before() and will be fixed in soon - describe.skip('has a url with a host id', () => { + describe.skip("has a url with an endpoint host's id", () => { before(async () => { - await pageObjects.endpoint.navigateToHostList( + await pageObjects.endpoint.navigateToEndpointList( 'selected_host=fc0ff548-feba-41b6-8367-65e8790d0eaf' ); }); it('shows a flyout', async () => { - await testSubjects.existOrFail('hostDetailsFlyoutBody'); - await testSubjects.existOrFail('hostDetailsUpperList'); - await testSubjects.existOrFail('hostDetailsLowerList'); + await testSubjects.existOrFail('endpointDetailsFlyoutBody'); + await testSubjects.existOrFail('endpointDetailsUpperList'); + await testSubjects.existOrFail('endpointDetailsLowerList'); }); it('displays details row headers', async () => { @@ -151,13 +157,15 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { 'Hostname', 'Sensor Version', ]; - const keys = await pageObjects.endpoint.hostFlyoutDescriptionKeys('hostDetailsFlyout'); + const keys = await pageObjects.endpoint.endpointFlyoutDescriptionKeys( + 'endpointDetailsFlyout' + ); expect(keys).to.eql(expectedData); }); it('displays details row descriptions', async () => { - const values = await pageObjects.endpoint.hostFlyoutDescriptionValues( - 'hostDetailsFlyout' + const values = await pageObjects.endpoint.endpointFlyoutDescriptionValues( + 'endpointDetailsFlyout' ); expect(values).to.eql([ @@ -178,7 +186,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { before(async () => { // clear out the data and reload the page await deleteMetadataStream(getService); - await pageObjects.endpoint.navigateToHostList(); + await pageObjects.endpoint.navigateToEndpointList(); }); it('displays empty Policy Table page.', async () => { await testSubjects.existOrFail('emptyPolicyTable'); diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts index 02f893029f819..1119906ba5cfa 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts @@ -81,7 +81,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.policy.confirmAndSave(); await testSubjects.existOrFail('policyDetailsSuccessMessage'); - await pageObjects.endpoint.navigateToHostList(); + await pageObjects.endpoint.navigateToEndpointList(); await pageObjects.policy.navigateToPolicyDetails(policyInfo.packageConfig.id); expect(await (await testSubjects.find('policyWindowsEvent_process')).isSelected()).to.equal( diff --git a/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts b/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts index ae4320fc5395f..f89ee5fe2729b 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts +++ b/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts @@ -14,12 +14,12 @@ export function EndpointPageProvider({ getService, getPageObjects }: FtrProvider return { /** - * Navigate to the Hosts list page + * Navigate to the Endpoints list page */ - async navigateToHostList(searchParams?: string) { + async navigateToEndpointList(searchParams?: string) { await pageObjects.common.navigateToUrlWithBrowserHistory( 'securitySolutionManagement', - `/hosts${searchParams ? `?${searchParams}` : ''}` + `/endpoints${searchParams ? `?${searchParams}` : ''}` ); await pageObjects.header.waitUntilLoadingHasFinished(); }, @@ -51,7 +51,7 @@ export function EndpointPageProvider({ getService, getPageObjects }: FtrProvider }); }, - async hostFlyoutDescriptionKeys(dataTestSubj: string) { + async endpointFlyoutDescriptionKeys(dataTestSubj: string) { await testSubjects.exists(dataTestSubj); const detailsData: WebElementWrapper = await testSubjects.find(dataTestSubj); const $ = await detailsData.parseDomContent(); @@ -65,7 +65,7 @@ export function EndpointPageProvider({ getService, getPageObjects }: FtrProvider ); }, - async hostFlyoutDescriptionValues(dataTestSubj: string) { + async endpointFlyoutDescriptionValues(dataTestSubj: string) { await testSubjects.exists(dataTestSubj); const detailsData: WebElementWrapper = await testSubjects.find(dataTestSubj); const $ = await detailsData.parseDomContent(); From 489b1349278c34d23f564aa12fd32ab8bdf93392 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 11 Aug 2020 20:47:20 +0300 Subject: [PATCH 061/113] Deprecate schema-less specs in Vega (#73805) * Deprecate schema-less specs in Vega Closes #30951 * update an error Message * update tests * update error message * Update vega_parser.ts Co-authored-by: Elastic Machine --- .../public/data_model/vega_parser.test.js | 27 +++++++----- .../public/data_model/vega_parser.ts | 44 +++++++++++-------- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 4 files changed, 40 insertions(+), 33 deletions(-) diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js index 62563dce2a18d..ac92f31b890ed 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js @@ -28,6 +28,18 @@ jest.mock('../lib/vega', () => ({ vegaLite: jest.requireActual('vega-lite'), })); +describe(`VegaParser.parseAsync`, () => { + test(`should throw an error in case of $spec is not defined`, async () => { + const vp = new VegaParser('{}'); + + await vp.parseAsync(); + + expect( + vp.error.startsWith('Your specification requires a "$schema" field with a valid URL') + ).toBeTruthy(); + }); +}); + describe(`VegaParser._setDefaultValue`, () => { function check(spec, expected, ...params) { return () => { @@ -149,23 +161,14 @@ describe('VegaParser._resolveEsQueries', () => { ); }); -describe('VegaParser._parseSchema', () => { - function check(schema, isVegaLite, warningCount) { +describe('VegaParser.parseSchema', () => { + function check(schema, isVegaLite) { return () => { const vp = new VegaParser({ $schema: schema }); - expect(vp._parseSchema()).toBe(isVegaLite); - expect(vp.spec).toEqual({ $schema: schema }); - expect(vp.warnings).toHaveLength(warningCount); + expect(vp.parseSchema(vp.spec).isVegaLite).toBe(isVegaLite); }; } - test('should warn on no vega version specified', () => { - const vp = new VegaParser({}); - expect(vp._parseSchema()).toBe(false); - expect(vp.spec).toEqual({ $schema: 'https://vega.github.io/schema/vega/v5.json' }); - expect(vp.warnings).toHaveLength(1); - }); - test( 'should not warn on current vega version', check('https://vega.github.io/schema/vega/v5.json', false, 0) diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.ts b/src/plugins/vis_type_vega/public/data_model/vega_parser.ts index 94d79071b8ef2..aceeefd953655 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.ts +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.ts @@ -55,7 +55,6 @@ const locToDirMap: Record = { top: 'column-reverse', bottom: 'column', }; -const DEFAULT_SCHEMA: string = 'https://vega.github.io/schema/vega/v5.json'; // If there is no "%type%" parameter, use this parser const DEFAULT_PARSER: string = 'elasticsearch'; @@ -117,8 +116,27 @@ export class VegaParser { if (this.isVegaLite !== undefined) throw new Error(); if (typeof this.spec === 'string') { - this.spec = hjson.parse(this.spec, { legacyRoot: false }); + const spec = hjson.parse(this.spec, { legacyRoot: false }); + + if (!spec.$schema) { + throw new Error( + i18n.translate('visTypeVega.vegaParser.inputSpecDoesNotSpecifySchemaErrorMessage', { + defaultMessage: `Your specification requires a {schemaParam} field with a valid URL for +Vega (see {vegaSchemaUrl}) or +Vega-Lite (see {vegaLiteSchemaUrl}). +The URL is an identifier only. Kibana and your browser will never access this URL.`, + values: { + schemaParam: '"$schema"', + vegaLiteSchemaUrl: 'https://vega.github.io/vega-lite/docs/spec.html#top-level', + vegaSchemaUrl: + 'https://vega.github.io/vega/docs/specification/#top-level-specification-properties', + }, + }) + ); + } + this.spec = spec; } + if (!_.isPlainObject(this.spec)) { throw new Error( i18n.translate('visTypeVega.vegaParser.invalidVegaSpecErrorMessage', { @@ -126,7 +144,7 @@ export class VegaParser { }) ); } - this.isVegaLite = this._parseSchema(); + this.isVegaLite = this.parseSchema(this.spec).isVegaLite; this.useHover = !this.isVegaLite; this._config = this._parseConfig(); @@ -497,23 +515,11 @@ export class VegaParser { /** * Parse Vega schema element - * @returns {boolean} is this a VegaLite schema? + * @returns {object} isVegaLite, libVersion * @private */ - _parseSchema() { - if (!this.spec) return false; - if (!this.spec.$schema) { - this._onWarning( - i18n.translate('visTypeVega.vegaParser.inputSpecDoesNotSpecifySchemaWarningMessage', { - defaultMessage: - 'The input spec does not specify a {schemaParam}, defaulting to {defaultSchema}', - values: { defaultSchema: `"${DEFAULT_SCHEMA}"`, schemaParam: '"$schema"' }, - }) - ); - this.spec.$schema = DEFAULT_SCHEMA; - } - - const schema = schemaParser(this.spec.$schema); + private parseSchema(spec: VegaSpec) { + const schema = schemaParser(spec.$schema); const isVegaLite = schema.library === 'vega-lite'; const libVersion = isVegaLite ? vegaLite.version : vega.version; @@ -531,7 +537,7 @@ export class VegaParser { ); } - return isVegaLite; + return { isVegaLite, libVersion }; } /** diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index f6d818df0d0fa..7321dde4647cc 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -4283,7 +4283,6 @@ "visTypeVega.vegaParser.dataExceedsSomeParamsUseTimesLimitErrorMessage": "データには {urlParam}、{valuesParam}、 {sourceParam} の内複数を含めることができません", "visTypeVega.vegaParser.hostConfigIsDeprecatedWarningMessage": "{deprecatedConfigName} は廃止されました。代わりに {newConfigName} を使用してください。", "visTypeVega.vegaParser.hostConfigValueTypeErrorMessage": "{configName} が含まれている場合、オブジェクトでなければなりません", - "visTypeVega.vegaParser.inputSpecDoesNotSpecifySchemaWarningMessage": "インプット仕様で {schemaParam} が指定されていないため、デフォルトで {defaultSchema} になります", "visTypeVega.vegaParser.invalidVegaSpecErrorMessage": "無効な Vega 仕様", "visTypeVega.vegaParser.kibanaConfigValueTypeErrorMessage": "{configName} が含まれている場合、オブジェクトでなければなりません", "visTypeVega.vegaParser.mapStyleValueTypeWarningMessage": "{mapStyleConfigName} は {mapStyleConfigFirstAllowedValue} か {mapStyleConfigSecondAllowedValue} のどちらかです", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 590b27db5b19b..525008fac2232 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -4284,7 +4284,6 @@ "visTypeVega.vegaParser.dataExceedsSomeParamsUseTimesLimitErrorMessage": "数据不得包含 {urlParam}、{valuesParam} 和 {sourceParam} 中的多个值", "visTypeVega.vegaParser.hostConfigIsDeprecatedWarningMessage": "{deprecatedConfigName} 已弃用。请改用 {newConfigName}。", "visTypeVega.vegaParser.hostConfigValueTypeErrorMessage": "如果存在,{configName} 必须为对象", - "visTypeVega.vegaParser.inputSpecDoesNotSpecifySchemaWarningMessage": "输入规范未指定 {schemaParam},其默认值为 {defaultSchema}", "visTypeVega.vegaParser.invalidVegaSpecErrorMessage": "Vega 规范无效", "visTypeVega.vegaParser.kibanaConfigValueTypeErrorMessage": "如果存在,{configName} 必须为对象", "visTypeVega.vegaParser.mapStyleValueTypeWarningMessage": "{mapStyleConfigName} 可能为 {mapStyleConfigFirstAllowedValue} 或 {mapStyleConfigSecondAllowedValue}", From bd8761ee15ba8bfd39ae9b01dac8b9b478eeb63b Mon Sep 17 00:00:00 2001 From: Robert Austin Date: Tue, 11 Aug 2020 13:57:56 -0400 Subject: [PATCH 062/113] [Resolver] Improve simulator. Add more click-through tests and panel tests. (#74601) ### Improved the simulator. * Replace `mapStateTransitions` with `map`. The usage and interface are the same, but `map` is not dependent on redux state. This will work for parts of the app that don't use redux (aka EUI). `map` also forces any `AutoSizer` instances used by EUI to show their full contents. `AutoSizer` works but it doesn't behave as expected in JSDOM. With this hack in place, we can bypass `AutoSizer`. Going forward, we should make sure to use something other than `EuiSelectable` for the dropdowns * Removed the `connectEnzymeWrapperAndStore` test helper. The new `map` simulator method doesn't rely on redux so we no longer need this explicit sync. * The simulator can receive a memory history instance. This allows tests to pass in a precreated / controlled memory instance. Useful for testing the query string. This design is not final. Instead we could have an 'intiialHistorySearch' parameter that sets the query string on instantiation as well as 'pushHistory' and 'replaceHistory' methods? * `findInDom` is now called `domNodes`. * `processNodeElementLooksSelected` and `processNodeElementLooksUnselected` are gone. Instead use `selectedProcessNode` and `unselectedProcessNode` to find the wrappers and assert that they wrappers contain the nodes you are interested in. * Added `processNodeSubmenu` method that gets the submenu that comes up when you click the events button on a process node. * Added `nodeListElement` method. This returns the list of nodes that shows up in the panel. Name is not final. * Added `nodeListItems` method. This returns the list item elements in the node list. Name is not final. * Added `nodeListNodeLinks` method. This returns the links in the items in the node list. Name is not final. * Added `nodeDetailElement` method. This gets the element that contains details about a node. Name is not final. * Added `nodeDetailBreadcrumbNodeListLink` method. Returns the link rendered in the breadcrumbs of the node detail view. Takes the user to the node list. Name is not final. * Added `nodeDetailViewTitle` method. This returns the title of the node detail view. Name is not final. * Added `nodeDetailDescriptionListEntries` method. This returns an entries list of the details in the node detail view. Name is not final * Added `resolveWrapper` method. Pass this a function that returns a `ReactWrapper`. The method will evaluate the returned wrapper after each event loop and return it once it isn't empty. ### Improved our mocks * We had a DataAccessLayer and ResolverTree mock named 'one_ancestor_two_children` that actually had no ancestors. Renamed them to `no_ancestors_two_children`. * New DataAccessLayer mock called `noAncestorsTwoChildrenWithRelatedEventsOnOrigin` ### Added new 'clickthrough' suite test * Added new test in the 'clickthrough' suite that asserts that a user can click the 'related events' button on a node and see the list of related event categories in the submenu. ### Improved the Resolver event model * Added `timestampAsDateSafeVersion` to the event model. This gets a `Date` object for the timestamp. (We still need make it clear that this model is ResolverSpecific) ### New `urlSearch` test helper. Use `urlSearch` when testing Resolver's interaction with the browser location. It calculates the expected 'search' value based on some Resolver specific parameters. * Use this to calculate a URL and then populate the memory history with this URL. This will allow you to see if Resolver loads correctly based on the URL state. * Use this to calculate the expected URL based on Resolver's current state. ### Added new 'panel' test * If Resolver is loaded with a url search parameter that selects a node, the node's details are shown in the panel. * When a history.push occurs that sets a search parameter that selects a node, the details of that node are shown. * Check that the url search is updated when the user interacts with the panel * Check that the panel shows the correct details for a node. (except for the timestamp. See TODO) ### Changed `data-test-subj`s * Removed `resolver:panel`. This was used on a wrapper element that we expect to remove soon. * Added `resolver:node-detail:breadcrumbs:node-list-link` for the buttons in the breadcrumb in the panel. * Added `resolver:node-detail:title` for the title element in the node detail view. * Added `resolver:node-detail:entry-title` and `resolver:node-detail:entry-description` for the details shown about a process in the node detail view. * Added `resolver:node-list:node-link`. This is the link shown for each node in the node list. * added `resolver:node-list:item` to each list item in the node list view. ### Removed dead code * `map.tsx` wasn't being used. It was renamed but the old version wasn't deleted. ### Improved the node detail view * Show the timestamp for a node's process event even if the timestamp is the unix epoch. Note: this is technically a bug fix but the bug is very obscure. * Show the PID for a node's process event when the PID is 0. Note: this is a bug fix. --- .../common/endpoint/models/event.ts | 19 +++ .../public/resolver/mocks/endpoint_event.ts | 4 +- .../public/resolver/mocks/resolver_tree.ts | 3 + .../connect_enzyme_wrapper_and_store.ts | 20 --- .../test_utilities/simulator/index.tsx | 69 +++++--- .../resolver/test_utilities/url_search.ts | 26 +++ .../public/resolver/view/assets.tsx | 14 +- .../resolver/view/clickthrough.test.tsx | 20 ++- .../public/resolver/view/map.tsx | 129 -------------- .../public/resolver/view/panel.test.tsx | 158 +++++++++++++++--- .../resolver/view/panels/cube_for_process.tsx | 67 +++++--- .../public/resolver/view/panels/index.tsx | 2 +- .../resolver/view/panels/process_details.tsx | 14 +- .../view/panels/process_list_with_counts.tsx | 26 +-- .../public/resolver/view/submenu.tsx | 32 ++-- .../translations/translations/ja-JP.json | 2 +- .../translations/translations/zh-CN.json | 2 +- 17 files changed, 336 insertions(+), 271 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts create mode 100644 x-pack/plugins/security_solution/public/resolver/test_utilities/url_search.ts delete mode 100644 x-pack/plugins/security_solution/public/resolver/view/map.tsx diff --git a/x-pack/plugins/security_solution/common/endpoint/models/event.ts b/x-pack/plugins/security_solution/common/endpoint/models/event.ts index 30e11819c0272..a0e9be58911c6 100644 --- a/x-pack/plugins/security_solution/common/endpoint/models/event.ts +++ b/x-pack/plugins/security_solution/common/endpoint/models/event.ts @@ -55,6 +55,25 @@ export function timestampSafeVersion(event: SafeResolverEvent): string | undefin : firstNonNullValue(event?.['@timestamp']); } +/** + * The `@timestamp` for the event, as a `Date` object. + * If `@timestamp` couldn't be parsed as a `Date`, returns `undefined`. + */ +export function timestampAsDateSafeVersion(event: SafeResolverEvent): Date | undefined { + const value = timestampSafeVersion(event); + if (value === undefined) { + return undefined; + } + + const date = new Date(value); + // Check if the date is valid + if (isFinite(date.getTime())) { + return date; + } else { + return undefined; + } +} + export function eventTimestamp(event: ResolverEvent): string | undefined | number { if (isLegacyEvent(event)) { return event.endgame.timestamp_utc; diff --git a/x-pack/plugins/security_solution/public/resolver/mocks/endpoint_event.ts b/x-pack/plugins/security_solution/public/resolver/mocks/endpoint_event.ts index c822fdf647c16..083f6b8baa59f 100644 --- a/x-pack/plugins/security_solution/public/resolver/mocks/endpoint_event.ts +++ b/x-pack/plugins/security_solution/public/resolver/mocks/endpoint_event.ts @@ -15,12 +15,14 @@ export function mockEndpointEvent({ parentEntityId, timestamp, lifecycleType, + pid = 0, }: { entityID: string; name: string; parentEntityId?: string; timestamp: number; lifecycleType?: string; + pid?: number; }): EndpointEvent { return { '@timestamp': timestamp, @@ -45,7 +47,7 @@ export function mockEndpointEvent({ executable: 'executable', args: 'args', name, - pid: 0, + pid, hash: { md5: 'hash.md5', }, diff --git a/x-pack/plugins/security_solution/public/resolver/mocks/resolver_tree.ts b/x-pack/plugins/security_solution/public/resolver/mocks/resolver_tree.ts index 5d2cbb2eab0dc..7edf4f8071ed8 100644 --- a/x-pack/plugins/security_solution/public/resolver/mocks/resolver_tree.ts +++ b/x-pack/plugins/security_solution/public/resolver/mocks/resolver_tree.ts @@ -175,18 +175,21 @@ export function mockTreeWithNoAncestorsAnd2Children({ secondChildID: string; }): ResolverTree { const origin: ResolverEvent = mockEndpointEvent({ + pid: 0, entityID: originID, name: 'c', parentEntityId: 'none', timestamp: 0, }); const firstChild: ResolverEvent = mockEndpointEvent({ + pid: 1, entityID: firstChildID, name: 'd', parentEntityId: originID, timestamp: 1, }); const secondChild: ResolverEvent = mockEndpointEvent({ + pid: 2, entityID: secondChildID, name: 'e', parentEntityId: originID, diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts b/x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts deleted file mode 100644 index 3a4a1f7d634d1..0000000000000 --- a/x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { Store } from 'redux'; -import { ReactWrapper } from 'enzyme'; - -/** - * We use the full-DOM emulation mode of `enzyme` via `mount`. Even though we use `react-redux`, `enzyme` - * does not update the DOM after state transitions. This subscribes to the `redux` store and after any state - * transition it asks `enzyme` to update the DOM to match the React state. - */ -export function connectEnzymeWrapperAndStore(store: Store, wrapper: ReactWrapper): void { - store.subscribe(() => { - // See https://enzymejs.github.io/enzyme/docs/api/ReactWrapper/update.html - return wrapper.update(); - }); -} diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx index 6f44c5aee7cac..cae6a18576ebd 100644 --- a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx @@ -10,7 +10,6 @@ import { mount, ReactWrapper } from 'enzyme'; import { createMemoryHistory, History as HistoryPackageHistoryInterface } from 'history'; import { CoreStart } from '../../../../../../../src/core/public'; import { coreMock } from '../../../../../../../src/core/public/mocks'; -import { connectEnzymeWrapperAndStore } from '../connect_enzyme_wrapper_and_store'; import { spyMiddlewareFactory } from '../spy_middleware_factory'; import { resolverMiddlewareFactory } from '../../store/middleware'; import { resolverReducer } from '../../store/reducer'; @@ -48,6 +47,7 @@ export class Simulator { dataAccessLayer, resolverComponentInstanceID, databaseDocumentID, + history, }: { /** * A (mock) data access layer that will be used to create the Resolver store. @@ -61,6 +61,7 @@ export class Simulator { * a databaseDocumentID to pass to Resolver. Resolver will use this in requests to the mock data layer. */ databaseDocumentID?: string; + history?: HistoryPackageHistoryInterface; }) { this.resolverComponentInstanceID = resolverComponentInstanceID; // create the spy middleware (for debugging tests) @@ -79,8 +80,9 @@ export class Simulator { // Create a redux store w/ the top level Resolver reducer and the enhancer that includes the Resolver middleware and the `spyMiddleware` this.store = createStore(resolverReducer, middlewareEnhancer); - // Create a fake 'history' instance that Resolver will use to read and write query string values - this.history = createMemoryHistory(); + // If needed, create a fake 'history' instance. + // Resolver will use to read and write query string values. + this.history = history ?? createMemoryHistory(); // Used for `KibanaContextProvider` const coreStart: CoreStart = coreMock.createStart(); @@ -95,9 +97,6 @@ export class Simulator { databaseDocumentID={databaseDocumentID} /> ); - - // Update the enzyme wrapper after each state transition - connectEnzymeWrapperAndStore(this.store, this.wrapper); } /** @@ -112,6 +111,16 @@ export class Simulator { return this.spyMiddleware.debugActions(); } + /** + * EUI uses a component called `AutoSizer` that won't render its children unless it has sufficient size. + * This forces any `AutoSizer` instances to have a large size. + */ + private forceAutoSizerOpen() { + this.wrapper + .find('AutoSizer') + .forEach((wrapper) => wrapper.setState({ width: 10000, height: 10000 })); + } + /** * Yield the result of `mapper` over and over, once per event-loop cycle. * After 10 times, quit. @@ -124,6 +133,7 @@ export class Simulator { yield mapper(); await new Promise((resolve) => { setTimeout(() => { + this.forceAutoSizerOpen(); this.wrapper.update(); resolve(); }, 0); @@ -174,6 +184,13 @@ export class Simulator { ); } + /** + * The items in the submenu that is opened by expanding a node in the map. + */ + public processNodeSubmenuItems(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:map:node-submenu-item"]'); + } + /** * Return the selected node query string values. */ @@ -206,38 +223,38 @@ export class Simulator { } /** - * An element with a list of all nodes. + * The titles of the links that select a node in the node list view. */ - public nodeListElement(): ReactWrapper { - return this.domNodes('[data-test-subj="resolver:node-list"]'); + public nodeListNodeLinkText(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-list:node-link:title"]'); } /** - * Return the items in the node list (the default panel view.) + * The icons in the links that select a node in the node list view. */ - public nodeListItems(): ReactWrapper { - return this.domNodes('[data-test-subj="resolver:node-list:item"]'); + public nodeListNodeLinkIcons(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-list:node-link:icon"]'); } /** - * The element containing the details for the selected node. + * Link rendered in the breadcrumbs of the node detail view. Takes the user to the node list. */ - public nodeDetailElement(): ReactWrapper { - return this.domNodes('[data-test-subj="resolver:node-detail"]'); + public nodeDetailBreadcrumbNodeListLink(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-detail:breadcrumbs:node-list-link"]'); } /** - * The details of the selected node are shown in a description list. This returns the title elements of the description list. + * The title element for the node detail view. */ - private nodeDetailEntryTitle(): ReactWrapper { - return this.domNodes('[data-test-subj="resolver:node-detail:entry-title"]'); + public nodeDetailViewTitle(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-detail:title"]'); } /** - * The details of the selected node are shown in a description list. This returns the description elements of the description list. + * The icon element for the node detail title. */ - private nodeDetailEntryDescription(): ReactWrapper { - return this.domNodes('[data-test-subj="resolver:node-detail:entry-description"]'); + public nodeDetailViewTitleIcon(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-detail:title-icon"]'); } /** @@ -253,8 +270,14 @@ export class Simulator { * The titles and descriptions (as text) from the node detail panel. */ public nodeDetailDescriptionListEntries(): Array<[string, string]> { - const titles = this.nodeDetailEntryTitle(); - const descriptions = this.nodeDetailEntryDescription(); + /** + * The details of the selected node are shown in a description list. This returns the title elements of the description list. + */ + const titles = this.domNodes('[data-test-subj="resolver:node-detail:entry-title"]'); + /** + * The details of the selected node are shown in a description list. This returns the description elements of the description list. + */ + const descriptions = this.domNodes('[data-test-subj="resolver:node-detail:entry-description"]'); const entries: Array<[string, string]> = []; for (let index = 0; index < Math.min(titles.length, descriptions.length); index++) { const title = titles.at(index).text(); diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/url_search.ts b/x-pack/plugins/security_solution/public/resolver/test_utilities/url_search.ts new file mode 100644 index 0000000000000..1a26e29d22da7 --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/url_search.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +interface Options { + /** + * The entity_id of the selected node. + */ + selectedEntityID?: string; +} + +/** + * Calculate the expected URL search based on options. + */ +export function urlSearch(resolverComponentInstanceID: string, options?: Options): string { + if (!options) { + return ''; + } + const params = new URLSearchParams(); + if (options.selectedEntityID !== undefined) { + params.set(`resolver-${resolverComponentInstanceID}-id`, options.selectedEntityID); + } + return params.toString(); +} diff --git a/x-pack/plugins/security_solution/public/resolver/view/assets.tsx b/x-pack/plugins/security_solution/public/resolver/view/assets.tsx index fc4a9daf17ad1..6962d300f7072 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/assets.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/assets.tsx @@ -4,6 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +/* eslint-disable react/display-name */ + import React, { memo } from 'react'; import euiThemeAmsterdamDark from '@elastic/eui/dist/eui_theme_amsterdam_dark.json'; import euiThemeAmsterdamLight from '@elastic/eui/dist/eui_theme_amsterdam_light.json'; @@ -11,7 +13,7 @@ import { htmlIdGenerator, ButtonColor } from '@elastic/eui'; import styled from 'styled-components'; import { i18n } from '@kbn/i18n'; import { useUiSetting } from '../../common/lib/kibana'; -import { DEFAULT_DARK_MODE } from '../../../common/constants'; +import { DEFAULT_DARK_MODE as defaultDarkMode } from '../../../common/constants'; import { ResolverProcessType } from '../types'; type ResolverColorNames = @@ -141,8 +143,6 @@ const PaintServers = memo(({ isDarkMode }: { isDarkMode: boolean }) => ( )); -PaintServers.displayName = 'PaintServers'; - /** * Ids of symbols to be linked by elements */ @@ -376,8 +376,6 @@ const SymbolsAndShapes = memo(({ isDarkMode }: { isDarkMode: boolean }) => ( )); -SymbolsAndShapes.displayName = 'SymbolsAndShapes'; - /** * This `` element is used to define the reusable assets for the Resolver * It confers several advantages, including but not limited to: @@ -386,7 +384,7 @@ SymbolsAndShapes.displayName = 'SymbolsAndShapes'; * 3. `` elements can be handled by compositor (faster) */ const SymbolDefinitionsComponent = memo(({ className }: { className?: string }) => { - const isDarkMode = useUiSetting(DEFAULT_DARK_MODE); + const isDarkMode = useUiSetting(defaultDarkMode); return ( @@ -397,8 +395,6 @@ const SymbolDefinitionsComponent = memo(({ className }: { className?: string }) ); }); -SymbolDefinitionsComponent.displayName = 'SymbolDefinitions'; - export const SymbolDefinitions = styled(SymbolDefinitionsComponent)` position: absolute; left: 100%; @@ -424,7 +420,7 @@ export const useResolverTheme = (): { nodeAssets: NodeStyleMap; cubeAssetsForNode: (isProcessTerimnated: boolean, isProcessTrigger: boolean) => NodeStyleConfig; } => { - const isDarkMode = useUiSetting(DEFAULT_DARK_MODE); + const isDarkMode = useUiSetting(defaultDarkMode); const theme = isDarkMode ? euiThemeAmsterdamDark : euiThemeAmsterdamLight; const getThemedOption = (lightOption: string, darkOption: string): string => { diff --git a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx index 98ea235d3524f..296e5b253c0b9 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx @@ -71,8 +71,9 @@ describe('Resolver, when analyzing a tree that has no ancestors and 2 children', }); }); - it(`should show the node list`, async () => { - await expect(simulator.map(() => simulator.nodeListElement().length)).toYieldEqualTo(1); + it(`should show links to the 3 nodes (with icons) in the node list.`, async () => { + await expect(simulator.map(() => simulator.nodeListNodeLinkText().length)).toYieldEqualTo(3); + await expect(simulator.map(() => simulator.nodeListNodeLinkIcons().length)).toYieldEqualTo(3); }); describe("when the second child node's first button has been clicked", () => { @@ -152,5 +153,20 @@ describe('Resolver, when analyzing a tree that has two related events for the or relatedEventButtons: 1, }); }); + describe('when the related events button is clicked', () => { + beforeEach(async () => { + const button = await simulator.resolveWrapper(() => + simulator.processNodeRelatedEventButton(entityIDs.origin) + ); + if (button) { + button.simulate('click'); + } + }); + it('should open the submenu', async () => { + await expect( + simulator.map(() => simulator.processNodeSubmenuItems().map((node) => node.text())) + ).toYieldEqualTo(['2 registry']); + }); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/resolver/view/map.tsx b/x-pack/plugins/security_solution/public/resolver/view/map.tsx deleted file mode 100644 index bbff2388af8b7..0000000000000 --- a/x-pack/plugins/security_solution/public/resolver/view/map.tsx +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -/* eslint-disable react/display-name */ - -import React, { useContext } from 'react'; -import { useSelector } from 'react-redux'; -import { useEffectOnce } from 'react-use'; -import { EuiLoadingSpinner } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import * as selectors from '../store/selectors'; -import { EdgeLine } from './edge_line'; -import { GraphControls } from './graph_controls'; -import { ProcessEventDot } from './process_event_dot'; -import { useCamera } from './use_camera'; -import { SymbolDefinitions, useResolverTheme } from './assets'; -import { useStateSyncingActions } from './use_state_syncing_actions'; -import { useResolverQueryParams } from './use_resolver_query_params'; -import { StyledMapContainer, StyledPanel, GraphContainer } from './styles'; -import { entityIDSafeVersion } from '../../../common/endpoint/models/event'; -import { SideEffectContext } from './side_effect_context'; - -/** - * The highest level connected Resolver component. Needs a `Provider` in its ancestry to work. - */ -export const ResolverMap = React.memo(function ({ - className, - databaseDocumentID, - resolverComponentInstanceID, -}: { - /** - * Used by `styled-components`. - */ - className?: string; - /** - * The `_id` value of an event in ES. - * Used as the origin of the Resolver graph. - */ - databaseDocumentID?: string; - /** - * A string literal describing where in the app resolver is located, - * used to prevent collisions in things like query params - */ - resolverComponentInstanceID: string; -}) { - /** - * This is responsible for dispatching actions that include any external data. - * `databaseDocumentID` - */ - useStateSyncingActions({ databaseDocumentID, resolverComponentInstanceID }); - - const { timestamp } = useContext(SideEffectContext); - - // use this for the entire render in order to keep things in sync - const timeAtRender = timestamp(); - - const { processNodePositions, connectingEdgeLineSegments } = useSelector( - selectors.visibleNodesAndEdgeLines - )(timeAtRender); - const terminatedProcesses = useSelector(selectors.terminatedProcesses); - const { projectionMatrix, ref, onMouseDown } = useCamera(); - const isLoading = useSelector(selectors.isLoading); - const hasError = useSelector(selectors.hasError); - const activeDescendantId = useSelector(selectors.ariaActiveDescendant); - const { colorMap } = useResolverTheme(); - const { cleanUpQueryParams } = useResolverQueryParams(); - - useEffectOnce(() => { - return () => cleanUpQueryParams(); - }); - - return ( - - {isLoading ? ( -
- -
- ) : hasError ? ( -
-
- {' '} - -
-
- ) : ( - - {connectingEdgeLineSegments.map(({ points: [startPosition, endPosition], metadata }) => ( - - ))} - {[...processNodePositions].map(([processEvent, position]) => { - const processEntityId = entityIDSafeVersion(processEvent); - return ( - - ); - })} - - )} - - - - - ); -}); diff --git a/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx index 78e5fd79bea13..4d391a6c9ce59 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx @@ -4,47 +4,143 @@ * you may not use this file except in compliance with the Elastic License. */ +import { createMemoryHistory, History as HistoryPackageHistoryInterface } from 'history'; + import { noAncestorsTwoChildren } from '../data_access_layer/mocks/no_ancestors_two_children'; import { Simulator } from '../test_utilities/simulator'; // Extend jest with a custom matcher import '../test_utilities/extend_jest'; +import { urlSearch } from '../test_utilities/url_search'; + +// the resolver component instance ID, used by the react code to distinguish piece of global state from those used by other resolver instances +const resolverComponentInstanceID = 'resolverComponentInstanceID'; -describe('Resolver: when analyzing a tree with no ancestors and two children', () => { - let simulator: Simulator; - let databaseDocumentID: string; +describe(`Resolver: when analyzing a tree with no ancestors and two children, and when the component instance ID is ${resolverComponentInstanceID}`, () => { + /** + * Get (or lazily create and get) the simulator. + */ + let simulator: () => Simulator; + /** lazily populated by `simulator`. */ + let simulatorInstance: Simulator | undefined; + let memoryHistory: HistoryPackageHistoryInterface; - // the resolver component instance ID, used by the react code to distinguish piece of global state from those used by other resolver instances - const resolverComponentInstanceID = 'resolverComponentInstanceID'; + // node IDs used by the generator + let entityIDs: { + origin: string; + firstChild: string; + secondChild: string; + }; - beforeEach(async () => { + beforeEach(() => { // create a mock data access layer const { metadata: dataAccessLayerMetadata, dataAccessLayer } = noAncestorsTwoChildren(); - // save a reference to the `_id` supported by the mock data layer - databaseDocumentID = dataAccessLayerMetadata.databaseDocumentID; + entityIDs = dataAccessLayerMetadata.entityIDs; + + memoryHistory = createMemoryHistory(); // create a resolver simulator, using the data access layer and an arbitrary component instance ID - simulator = new Simulator({ databaseDocumentID, dataAccessLayer, resolverComponentInstanceID }); + simulator = () => { + if (simulatorInstance) { + return simulatorInstance; + } else { + simulatorInstance = new Simulator({ + databaseDocumentID: dataAccessLayerMetadata.databaseDocumentID, + dataAccessLayer, + resolverComponentInstanceID, + history: memoryHistory, + }); + return simulatorInstance; + } + }; }); - it('should show the node list', async () => { - await expect(simulator.map(() => simulator.nodeListElement().length)).toYieldEqualTo(1); + afterEach(() => { + simulatorInstance = undefined; }); - it('should have 3 nodes in the node list', async () => { - await expect(simulator.map(() => simulator.nodeListItems().length)).toYieldEqualTo(3); + const queryStringWithOriginSelected = urlSearch(resolverComponentInstanceID, { + selectedEntityID: 'origin', }); - describe('when there is an item in the node list and it has been clicked', () => { + + describe(`when the URL query string is ${queryStringWithOriginSelected}`, () => { + beforeEach(() => { + memoryHistory.push({ + search: queryStringWithOriginSelected, + }); + }); + it('should show the node details for the origin', async () => { + await expect( + simulator().map(() => { + const titleWrapper = simulator().nodeDetailViewTitle(); + const titleIconWrapper = simulator().nodeDetailViewTitleIcon(); + return { + title: titleWrapper.exists() ? titleWrapper.text() : null, + titleIcon: titleIconWrapper.exists() ? titleIconWrapper.text() : null, + detailEntries: simulator().nodeDetailDescriptionListEntries(), + }; + }) + ).toYieldEqualTo({ + title: 'c', + titleIcon: 'Running Process', + detailEntries: [ + ['process.executable', 'executable'], + ['process.pid', '0'], + ['user.name', 'user.name'], + ['user.domain', 'user.domain'], + ['process.parent.pid', '0'], + ['process.hash.md5', 'hash.md5'], + ['process.args', 'args'], + ], + }); + }); + }); + + const queryStringWithFirstChildSelected = urlSearch(resolverComponentInstanceID, { + selectedEntityID: 'firstChild', + }); + + describe(`when the URL query string is ${queryStringWithFirstChildSelected}`, () => { + beforeEach(() => { + memoryHistory.push({ + search: queryStringWithFirstChildSelected, + }); + }); + it('should show the node details for the first child', async () => { + await expect( + simulator().map(() => simulator().nodeDetailDescriptionListEntries()) + ).toYieldEqualTo([ + ['process.executable', 'executable'], + ['process.pid', '1'], + ['user.name', 'user.name'], + ['user.domain', 'user.domain'], + ['process.parent.pid', '0'], + ['process.hash.md5', 'hash.md5'], + ['process.args', 'args'], + ]); + }); + }); + + it('should have 3 nodes (with icons) in the node list', async () => { + await expect(simulator().map(() => simulator().nodeListNodeLinkText().length)).toYieldEqualTo( + 3 + ); + await expect(simulator().map(() => simulator().nodeListNodeLinkIcons().length)).toYieldEqualTo( + 3 + ); + }); + + describe('when there is an item in the node list and its text has been clicked', () => { beforeEach(async () => { - const nodeListItems = await simulator.resolveWrapper(() => simulator.nodeListItems()); - expect(nodeListItems && nodeListItems.length).toBeTruthy(); - if (nodeListItems) { - nodeListItems.first().find('button').simulate('click'); + const nodeLinks = await simulator().resolveWrapper(() => simulator().nodeListNodeLinkText()); + expect(nodeLinks).toBeTruthy(); + if (nodeLinks) { + nodeLinks.first().simulate('click'); } }); it('should show the details for the first node', async () => { await expect( - simulator.map(() => simulator.nodeDetailDescriptionListEntries()) + simulator().map(() => simulator().nodeDetailDescriptionListEntries()) ).toYieldEqualTo([ ['process.executable', 'executable'], ['process.pid', '0'], @@ -55,5 +151,29 @@ describe('Resolver: when analyzing a tree with no ancestors and two children', ( ['process.args', 'args'], ]); }); + it("should have the first node's ID in the query string", async () => { + await expect(simulator().map(() => simulator().queryStringValues())).toYieldEqualTo({ + selectedNode: [entityIDs.origin], + }); + }); + describe('and when the node list link has been clicked', () => { + beforeEach(async () => { + const nodeListLink = await simulator().resolveWrapper(() => + simulator().nodeDetailBreadcrumbNodeListLink() + ); + if (nodeListLink) { + nodeListLink.simulate('click'); + } + }); + it('should show the list of nodes with links to each node', async () => { + await expect( + simulator().map(() => { + return simulator() + .nodeListNodeLinkText() + .map((node) => node.text()); + }) + ).toYieldEqualTo(['c', 'd', 'e']); + }); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx index 0d8f65b4e39e6..b7c8ed0dfd7db 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx @@ -4,42 +4,55 @@ * you may not use this file except in compliance with the Elastic License. */ +import styled from 'styled-components'; + +import { i18n } from '@kbn/i18n'; + +/* eslint-disable react/display-name */ + import React, { memo } from 'react'; import { useResolverTheme } from '../assets'; /** - * During user testing, one user indicated they wanted to see stronger visual relationships between - * Nodes on the graph and what's in the table. Using the same symbol in both places (as below) could help with that. + * Icon representing a process node. */ -export const CubeForProcess = memo(function CubeForProcess({ - isProcessTerminated, +export const CubeForProcess = memo(function ({ + running, + 'data-test-subj': dataTestSubj, }: { - isProcessTerminated: boolean; + 'data-test-subj'?: string; + /** + * True if the process represented by the node is still running. + */ + running: boolean; }) { const { cubeAssetsForNode } = useResolverTheme(); - const { cubeSymbol, descriptionText } = cubeAssetsForNode(isProcessTerminated, false); + const { cubeSymbol } = cubeAssetsForNode(!running, false); return ( - <> - - {descriptionText} - - - + + + {i18n.translate('xpack.securitySolution.resolver.node_icon', { + defaultMessage: '{running, select, true {Running Process} false {Terminated Process}}', + values: { running }, + })} + + + ); }); + +const StyledSVG = styled.svg` + position: relative; + top: 0.4em; + margin-right: 0.25em; +`; diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/index.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/index.tsx index 7e7e8b757baf7..b3c4eefe5fae7 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/index.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/index.tsx @@ -220,7 +220,7 @@ PanelContent.displayName = 'PanelContent'; export const Panel = memo(function Event({ className }: { className?: string }) { return ( - + ); diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx index 112a3400c4947..adfcc4cc44d1f 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx @@ -129,6 +129,7 @@ export const ProcessDetails = memo(function ProcessDetails({ defaultMessage: 'Events', } ), + 'data-test-subj': 'resolver:node-detail:breadcrumbs:node-list-link', onClick: () => { pushToQueryParams({ crumbId: '', crumbEvent: '' }); }, @@ -155,20 +156,23 @@ export const ProcessDetails = memo(function ProcessDetails({ return cubeAssetsForNode(isProcessTerminated, false); }, [processEvent, cubeAssetsForNode, isProcessTerminated]); - const titleId = useMemo(() => htmlIdGenerator('resolverTable')(), []); + const titleID = useMemo(() => htmlIdGenerator('resolverTable')(), []); return ( <> -

- - {processName} +

+ + {processName}

- {descriptionText} + {descriptionText} diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx index 11f005f8acbcd..1be4b4b055243 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx @@ -111,8 +111,11 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ }); }} > - - {name} + + {name} ); }, @@ -150,18 +153,10 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ const processTableView: ProcessTableView[] = useMemo( () => [...processNodePositions.keys()].map((processEvent) => { - let dateTime: Date | undefined; - const eventTime = event.timestampSafeVersion(processEvent); const name = event.processNameSafeVersion(processEvent); - if (eventTime) { - const date = new Date(eventTime); - if (isFinite(date.getTime())) { - dateTime = date; - } - } return { name, - timestamp: dateTime, + timestamp: event.timestampAsDateSafeVersion(processEvent), event: processEvent, }; }), @@ -172,12 +167,9 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ const crumbs = useMemo(() => { return [ { - text: i18n.translate( - 'xpack.securitySolution.endpoint.resolver.panel.processListWithCounts.events', - { - defaultMessage: 'All Process Events', - } - ), + text: i18n.translate('xpack.securitySolution.resolver.panel.nodeList.title', { + defaultMessage: 'All Process Events', + }), onClick: () => {}, }, ]; diff --git a/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx b/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx index 7f0ba244146fd..359a4e2dafd2e 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx @@ -4,8 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ +/* eslint-disable no-duplicate-imports */ + +/* eslint-disable react/display-name */ + import { i18n } from '@kbn/i18n'; -import React, { ReactNode, useState, useMemo, useCallback, useRef, useLayoutEffect } from 'react'; +import React, { useState, useMemo, useCallback, useRef, useLayoutEffect } from 'react'; import { EuiI18nNumber, EuiSelectable, @@ -15,6 +19,7 @@ import { htmlIdGenerator, } from '@elastic/eui'; import styled from 'styled-components'; +import { EuiSelectableOption } from '@elastic/eui'; import { Matrix3 } from '../types'; /** @@ -59,21 +64,21 @@ const OptionList = React.memo( subMenuOptions: ResolverSubmenuOptionList; isLoading: boolean; }) => { - const [options, setOptions] = useState(() => + const [options, setOptions] = useState(() => typeof subMenuOptions !== 'object' ? [] - : subMenuOptions.map((opt: ResolverSubmenuOption): { - label: string; - prepend?: ReactNode; - } => { - return opt.prefix + : subMenuOptions.map((option: ResolverSubmenuOption) => { + const dataTestSubj = 'resolver:map:node-submenu-item'; + return option.prefix ? { - label: opt.optionTitle, - prepend: {opt.prefix} , + label: option.optionTitle, + prepend: {option.prefix} , + 'data-test-subj': dataTestSubj, } : { - label: opt.optionTitle, + label: option.optionTitle, prepend: , + 'data-test-subj': dataTestSubj, }; }) ); @@ -88,11 +93,10 @@ const OptionList = React.memo( }, {}); }, [subMenuOptions]); - type ChangeOptions = Array<{ label: string; prepend?: ReactNode; checked?: string }>; const selectableProps = useMemo(() => { return { listProps: { showIcons: true, bordered: true }, - onChange: (newOptions: ChangeOptions) => { + onChange: (newOptions: EuiSelectableOption[]) => { const selectedOption = newOptions.find((opt) => opt.checked === 'on'); if (selectedOption) { const { label } = selectedOption; @@ -119,8 +123,6 @@ const OptionList = React.memo( } ); -OptionList.displayName = 'OptionList'; - /** * A Submenu to be displayed in one of two forms: * 1) Provided a collection of `optionsWithActions`: it will call `menuAction` then - if and when menuData becomes available - display each item with an optional prefix and call the supplied action for the options when that option is clicked. @@ -259,8 +261,6 @@ const NodeSubMenuComponents = React.memo( } ); -NodeSubMenuComponents.displayName = 'NodeSubMenu'; - export const NodeSubMenu = styled(NodeSubMenuComponents)` margin: 2px 0 0 0; padding: 0; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 7321dde4647cc..f2aeed63d6eea 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -16380,7 +16380,7 @@ "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.eventDescriptiveName": "{descriptor} {subject}", "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.events": "イベント", "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.wait": "イベントを待機しています...", - "xpack.securitySolution.endpoint.resolver.panel.processListWithCounts.events": "すべてのプロセスイベント", + "xpack.securitySolution.resolver.panel.nodeList.title": "すべてのプロセスイベント", "xpack.securitySolution.endpoint.resolver.panel.relatedCounts.numberOfEventsInCrumb": "{totalCount}件のイベント", "xpack.securitySolution.endpoint.resolver.panel.relatedDetail.missing": "関連イベントが見つかりません。", "xpack.securitySolution.endpoint.resolver.panel.relatedDetail.wait": "イベントを待機しています...", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 525008fac2232..82a6b128ad619 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -16386,7 +16386,7 @@ "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.eventDescriptiveName": "{descriptor} {subject}", "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.events": "事件", "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.wait": "等候事件......", - "xpack.securitySolution.endpoint.resolver.panel.processListWithCounts.events": "所有进程事件", + "xpack.securitySolution.resolver.panel.nodeList.title": "所有进程事件", "xpack.securitySolution.endpoint.resolver.panel.relatedCounts.numberOfEventsInCrumb": "{totalCount} 个事件", "xpack.securitySolution.endpoint.resolver.panel.relatedDetail.missing": "找不到相关事件。", "xpack.securitySolution.endpoint.resolver.panel.relatedDetail.wait": "等候事件......", From 7d3a1ff21858e4bd92bdf45d43b5239c01b6fe39 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 11 Aug 2020 12:27:24 -0600 Subject: [PATCH 063/113] [maps] fix drawing shapes (#74689) * [maps] fix drawing shapes * prevent re-render on state change --- x-pack/package.json | 4 +-- .../map/mb/draw_control/draw_control.js | 33 +++++++++++++------ .../public/routing/routes/maps_app/index.js | 6 ++-- .../routing/routes/maps_app/maps_app_view.js | 30 ++++++++++------- .../maps/public/selectors/map_selectors.ts | 24 +++----------- yarn.lock | 19 ++++++----- 6 files changed, 59 insertions(+), 57 deletions(-) diff --git a/x-pack/package.json b/x-pack/package.json index 962233a3a3973..b426e790c2d47 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -217,7 +217,7 @@ "@kbn/interpreter": "1.0.0", "@kbn/ui-framework": "1.0.0", "@mapbox/geojson-rewind": "^0.4.1", - "@mapbox/mapbox-gl-draw": "^1.1.2", + "@mapbox/mapbox-gl-draw": "^1.2.0", "@mapbox/mapbox-gl-rtl-text": "^0.2.3", "@scant/router": "^0.1.0", "@slack/webhook": "^5.0.0", @@ -397,4 +397,4 @@ "cypress-multi-reporters" ] } -} \ No newline at end of file +} diff --git a/x-pack/plugins/maps/public/connected_components/map/mb/draw_control/draw_control.js b/x-pack/plugins/maps/public/connected_components/map/mb/draw_control/draw_control.js index ac28a2d5d5a6d..2daa4b2c900f5 100644 --- a/x-pack/plugins/maps/public/connected_components/map/mb/draw_control/draw_control.js +++ b/x-pack/plugins/maps/public/connected_components/map/mb/draw_control/draw_control.js @@ -18,9 +18,12 @@ import { } from '../../../../elasticsearch_geo_utils'; import { DrawTooltip } from './draw_tooltip'; +const DRAW_RECTANGLE = 'draw_rectangle'; +const DRAW_CIRCLE = 'draw_circle'; + const mbDrawModes = MapboxDraw.modes; -mbDrawModes.draw_rectangle = DrawRectangle; -mbDrawModes.draw_circle = DrawCircle; +mbDrawModes[DRAW_RECTANGLE] = DrawRectangle; +mbDrawModes[DRAW_CIRCLE] = DrawCircle; export class DrawControl extends React.Component { constructor() { @@ -45,8 +48,10 @@ export class DrawControl extends React.Component { this._removeDrawControl(); } + // debounce with zero timeout needed to allow mapbox-draw finish logic to complete + // before _removeDrawControl is called _syncDrawControl = _.debounce(() => { - if (!this.props.mbMap) { + if (!this._isMounted) { return; } @@ -55,7 +60,7 @@ export class DrawControl extends React.Component { } else { this._removeDrawControl(); } - }, 256); + }, 0); _onDraw = (e) => { if (!e.features.length) { @@ -118,7 +123,7 @@ export class DrawControl extends React.Component { }; _removeDrawControl() { - if (!this._mbDrawControlAdded) { + if (!this.props.mbMap || !this._mbDrawControlAdded) { return; } @@ -129,6 +134,10 @@ export class DrawControl extends React.Component { } _updateDrawControl() { + if (!this.props.mbMap) { + return; + } + if (!this._mbDrawControlAdded) { this.props.mbMap.addControl(this._mbDrawControl); this._mbDrawControlAdded = true; @@ -136,11 +145,15 @@ export class DrawControl extends React.Component { this.props.mbMap.on('draw.create', this._onDraw); } - if (this.props.drawState.drawType === DRAW_TYPE.BOUNDS) { - this._mbDrawControl.changeMode('draw_rectangle'); - } else if (this.props.drawState.drawType === DRAW_TYPE.DISTANCE) { - this._mbDrawControl.changeMode('draw_circle'); - } else if (this.props.drawState.drawType === DRAW_TYPE.POLYGON) { + const drawMode = this._mbDrawControl.getMode(); + if (drawMode !== DRAW_RECTANGLE && this.props.drawState.drawType === DRAW_TYPE.BOUNDS) { + this._mbDrawControl.changeMode(DRAW_RECTANGLE); + } else if (drawMode !== DRAW_CIRCLE && this.props.drawState.drawType === DRAW_TYPE.DISTANCE) { + this._mbDrawControl.changeMode(DRAW_CIRCLE); + } else if ( + drawMode !== this._mbDrawControl.modes.DRAW_POLYGON && + this.props.drawState.drawType === DRAW_TYPE.POLYGON + ) { this._mbDrawControl.changeMode(this._mbDrawControl.modes.DRAW_POLYGON); } } diff --git a/x-pack/plugins/maps/public/routing/routes/maps_app/index.js b/x-pack/plugins/maps/public/routing/routes/maps_app/index.js index c5f959c54fb66..a2a4ab87affcd 100644 --- a/x-pack/plugins/maps/public/routing/routes/maps_app/index.js +++ b/x-pack/plugins/maps/public/routing/routes/maps_app/index.js @@ -14,7 +14,7 @@ import { getRefreshConfig, getTimeFilters, hasDirtyState, - hasUnsavedChanges, + getLayerListConfigOnly, } from '../../../selectors/map_selectors'; import { replaceLayerList, @@ -45,9 +45,7 @@ function mapStateToProps(state = {}) { flyoutDisplay: getFlyoutDisplay(state), refreshConfig: getRefreshConfig(state), filters: getFilters(state), - hasUnsavedChanges: (savedMap, initialLayerListConfig) => { - return hasUnsavedChanges(state, savedMap, initialLayerListConfig); - }, + layerListConfigOnly: getLayerListConfigOnly(state), query: getQuery(state), timeFilters: getTimeFilters(state), }; diff --git a/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js b/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js index 97a08f11a6757..91d00990772f4 100644 --- a/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js +++ b/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js @@ -103,7 +103,15 @@ export class MapsAppView extends React.Component { } _hasUnsavedChanges() { - return this.props.hasUnsavedChanges(this.props.savedMap, this.state.initialLayerListConfig); + const savedLayerList = this.props.savedMap.getLayerList(); + return !savedLayerList + ? !_.isEqual(this.props.layerListConfigOnly, this.state.initialLayerListConfig) + : // savedMap stores layerList as a JSON string using JSON.stringify. + // JSON.stringify removes undefined properties from objects. + // savedMap.getLayerList converts the JSON string back into Javascript array of objects. + // Need to perform the same process for layerListConfigOnly to compare apples to apples + // and avoid undefined properties in layerListConfigOnly triggering unsaved changes. + !_.isEqual(JSON.parse(JSON.stringify(this.props.layerListConfigOnly)), savedLayerList); } _setBreadcrumbs = () => { @@ -356,22 +364,20 @@ export class MapsAppView extends React.Component { ); } - render() { - const { filters, isFullScreen } = this.props; + _addFilter = (newFilters) => { + newFilters.forEach((filter) => { + filter.$state = { store: esFilters.FilterStateStore.APP_STATE }; + }); + this._onFiltersChange([...this.props.filters, ...newFilters]); + }; + render() { return this.state.initialized ? ( -
+
{this._renderTopNav()}

{`screenTitle placeholder`}

- { - newFilters.forEach((filter) => { - filter.$state = { store: esFilters.FilterStateStore.APP_STATE }; - }); - this._onFiltersChange([...filters, ...newFilters]); - }} - /> +
) : null; diff --git a/x-pack/plugins/maps/public/selectors/map_selectors.ts b/x-pack/plugins/maps/public/selectors/map_selectors.ts index e082398a02a9e..40ffda3f31c26 100644 --- a/x-pack/plugins/maps/public/selectors/map_selectors.ts +++ b/x-pack/plugins/maps/public/selectors/map_selectors.ts @@ -52,7 +52,6 @@ import { ISource } from '../classes/sources/source'; import { ITMSSource } from '../classes/sources/tms_source'; import { IVectorSource } from '../classes/sources/vector_source'; import { ILayer } from '../classes/layers/layer'; -import { ISavedGisMap } from '../routing/bootstrap/services/saved_gis_map'; function createLayerInstance( layerDescriptor: LayerDescriptor, @@ -298,6 +297,10 @@ export const getLayerList = createSelector( } ); +export const getLayerListConfigOnly = createSelector(getLayerListRaw, (layerDescriptorList) => { + return copyPersistentState(layerDescriptorList); +}); + export function getLayerById(layerId: string | null, state: MapStoreState): ILayer | undefined { return getLayerList(state).find((layer) => { return layerId === layer.getId(); @@ -417,22 +420,3 @@ export const areLayersLoaded = createSelector( return true; } ); - -export function hasUnsavedChanges( - state: MapStoreState, - savedMap: ISavedGisMap, - initialLayerListConfig: LayerDescriptor[] -) { - const layerListConfigOnly = copyPersistentState(getLayerListRaw(state)); - - const savedLayerList = savedMap.getLayerList(); - - return !savedLayerList - ? !_.isEqual(layerListConfigOnly, initialLayerListConfig) - : // savedMap stores layerList as a JSON string using JSON.stringify. - // JSON.stringify removes undefined properties from objects. - // savedMap.getLayerList converts the JSON string back into Javascript array of objects. - // Need to perform the same process for layerListConfigOnly to compare apples to apples - // and avoid undefined properties in layerListConfigOnly triggering unsaved changes. - !_.isEqual(JSON.parse(JSON.stringify(layerListConfigOnly)), savedLayerList); -} diff --git a/yarn.lock b/yarn.lock index 101f735355f0b..7731d2f7a8ea1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3026,10 +3026,10 @@ resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== -"@mapbox/geojsonhint@^2.0.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@mapbox/geojsonhint/-/geojsonhint-2.2.0.tgz#75ca94706e9a56e6debf4e1c78fabdc67978b883" - integrity sha512-8qQYRB+/2z2JsN5s6D0WAnpo69+3V3nvJsSFLwMB1dsaWz1V4oZeuoje9srbYAxxL8PXCwIywfhYa3GxOkBv5Q== +"@mapbox/geojsonhint@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/geojsonhint/-/geojsonhint-3.0.0.tgz#42448232ce4236cb89c1b69c36b0cadeac99e02e" + integrity sha512-zHcyh1rDHYnEBd6NvOWoeHLuvazlDkIjvz9MJx4cKwcKTlfrqgxVnTv1QLnVJnsSU5neJnhQJcgscR/Zl4uYgw== dependencies: concat-stream "^1.6.1" jsonlint-lines "1.7.1" @@ -3042,16 +3042,17 @@ resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= -"@mapbox/mapbox-gl-draw@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-draw/-/mapbox-gl-draw-1.1.2.tgz#247b3f0727db34c2641ab718df5eebeee69a2585" - integrity sha512-DWtATUAnJaGZYoH/y2O+QTRybxrp5y3w3eV5FXHFNVcKsCAojKEMB8ALKUG2IsiCKqV/JCAguK9AlPWR7Bjafw== +"@mapbox/mapbox-gl-draw@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-draw/-/mapbox-gl-draw-1.2.0.tgz#b6e5278afef65bd5d7d92366034997768e478ad9" + integrity sha512-gMrP2zn8PzDtrs72FMJTPytCumX5vUn9R7IK38qBOVy9UfqbdWr56KYuNA/2X+jKn4FIOpmWf8CWkKpOaQkv7w== dependencies: "@mapbox/geojson-area" "^0.2.1" "@mapbox/geojson-extent" "^0.3.2" "@mapbox/geojson-normalize" "0.0.1" - "@mapbox/geojsonhint" "^2.0.0" + "@mapbox/geojsonhint" "3.0.0" "@mapbox/point-geometry" "0.1.0" + eslint-plugin-import "^2.19.1" hat "0.0.3" lodash.isequal "^4.2.0" xtend "^4.0.1" From d78644229e670b6ef4e8be524ff005b305021b52 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 11 Aug 2020 12:59:23 -0700 Subject: [PATCH 064/113] [Reporting] Fix and test for Listing of Reports (#74453) * [Reporting] Fix and test for Listing of Reports * add sleeps * await selector instead of sleep * reduce changes * cleanup after csv generated * fix snapshot --- .../report_listing.test.tsx.snap | 3 + .../public/components/report_listing.tsx | 1 + .../plugins/reporting/server/routes/jobs.ts | 10 +- .../apps/dashboard/reporting/screenshots.ts | 10 +- .../functional/apps/discover/reporting.ts | 6 + .../functional/apps/lens/lens_reporting.ts | 6 + .../apps/reporting_management/index.ts | 2 +- .../report_delete_pagination.ts | 59 --------- .../reporting_management/report_listing.ts | 121 ++++++++++++++++++ .../functional/apps/visualize/reporting.ts | 6 + 10 files changed, 160 insertions(+), 64 deletions(-) delete mode 100644 x-pack/test/functional/apps/reporting_management/report_delete_pagination.ts create mode 100644 x-pack/test/functional/apps/reporting_management/report_listing.ts diff --git a/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap b/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap index ddba7842f1199..66c3aea8acc13 100644 --- a/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap +++ b/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap @@ -30,6 +30,7 @@ Array [ }, ] } + data-test-page={0} data-test-subj="reportJobListing" isSelectable={true} itemId="id" @@ -56,6 +57,7 @@ Array [ >
@@ -366,6 +368,7 @@ Array [ ,
diff --git a/x-pack/plugins/reporting/public/components/report_listing.tsx b/x-pack/plugins/reporting/public/components/report_listing.tsx index afcae93a8db16..80ef9311fd0e5 100644 --- a/x-pack/plugins/reporting/public/components/report_listing.tsx +++ b/x-pack/plugins/reporting/public/components/report_listing.tsx @@ -513,6 +513,7 @@ class ReportListingUi extends Component { isSelectable={true} onChange={this.onTableChange} data-test-subj="reportJobListing" + data-test-page={this.state.page} /> {this.state.selectedJobs.length > 0 ? this.renderDeleteButton() : null} diff --git a/x-pack/plugins/reporting/server/routes/jobs.ts b/x-pack/plugins/reporting/server/routes/jobs.ts index 4033719b053ba..e8eac9e577beb 100644 --- a/x-pack/plugins/reporting/server/routes/jobs.ts +++ b/x-pack/plugins/reporting/server/routes/jobs.ts @@ -35,7 +35,13 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { router.get( { path: `${MAIN_ENTRY}/list`, - validate: false, + validate: { + query: schema.object({ + page: schema.string({ defaultValue: '0' }), + size: schema.string({ defaultValue: '10' }), + ids: schema.maybe(schema.string()), + }), + }, }, userHandler(async (user, context, req, res) => { // ensure the async dependencies are loaded @@ -50,7 +56,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { page: queryPage = '0', size: querySize = '10', ids: queryIds = null, - } = req.query as ListQuery; + } = req.query as ListQuery; // NOTE: type inference is not working here. userHandler breaks it? const page = parseInt(queryPage, 10) || 0; const size = Math.min(100, parseInt(querySize, 10) || 10); const jobIds = queryIds ? queryIds.split(',') : null; diff --git a/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts b/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts index da1131d051581..cf70e5a7b8b6c 100644 --- a/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts +++ b/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts @@ -16,12 +16,13 @@ const mkdirAsync = promisify(fs.mkdir); const REPORTS_FOLDER = path.resolve(__dirname, 'reports'); -export default function ({ getService, getPageObjects }: FtrProviderContext) { +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']); const esArchiver = getService('esArchiver'); const browser = getService('browser'); const log = getService('log'); const config = getService('config'); - const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']); + const es = getService('es'); describe('Screenshots', () => { before('initialize tests', async () => { @@ -33,6 +34,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after('clean up archives', async () => { await esArchiver.unload('reporting/ecommerce'); await esArchiver.unload('reporting/ecommerce_kibana'); + await es.deleteByQuery({ + index: '.reporting-*', + refresh: true, + body: { query: { match_all: {} } }, + }); }); describe('Print PDF button', () => { diff --git a/x-pack/test/functional/apps/discover/reporting.ts b/x-pack/test/functional/apps/discover/reporting.ts index 32ccc59913dbc..7181bf0c74271 100644 --- a/x-pack/test/functional/apps/discover/reporting.ts +++ b/x-pack/test/functional/apps/discover/reporting.ts @@ -9,6 +9,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const log = getService('log'); + const es = getService('es'); const esArchiver = getService('esArchiver'); const browser = getService('browser'); const PageObjects = getPageObjects(['reporting', 'common', 'discover']); @@ -22,6 +23,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); after('clean up archives', async () => { await esArchiver.unload('reporting/ecommerce'); + await es.deleteByQuery({ + index: '.reporting-*', + refresh: true, + body: { query: { match_all: {} } }, + }); }); describe('Generate CSV button', () => { diff --git a/x-pack/test/functional/apps/lens/lens_reporting.ts b/x-pack/test/functional/apps/lens/lens_reporting.ts index 3e3d217b9d8d7..4974b63be6f72 100644 --- a/x-pack/test/functional/apps/lens/lens_reporting.ts +++ b/x-pack/test/functional/apps/lens/lens_reporting.ts @@ -9,6 +9,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'dashboard', 'reporting']); + const es = getService('es'); const esArchiver = getService('esArchiver'); const listingTable = getService('listingTable'); @@ -19,6 +20,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async () => { await esArchiver.unload('lens/reporting'); + await es.deleteByQuery({ + index: '.reporting-*', + refresh: true, + body: { query: { match_all: {} } }, + }); }); it('should not cause PDF reports to fail', async () => { diff --git a/x-pack/test/functional/apps/reporting_management/index.ts b/x-pack/test/functional/apps/reporting_management/index.ts index f44d5858d53a1..8606c46053ab0 100644 --- a/x-pack/test/functional/apps/reporting_management/index.ts +++ b/x-pack/test/functional/apps/reporting_management/index.ts @@ -9,6 +9,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default ({ loadTestFile }: FtrProviderContext) => { describe('reporting management app', function () { this.tags('ciGroup7'); - loadTestFile(require.resolve('./report_delete_pagination')); + loadTestFile(require.resolve('./report_listing')); }); }; diff --git a/x-pack/test/functional/apps/reporting_management/report_delete_pagination.ts b/x-pack/test/functional/apps/reporting_management/report_delete_pagination.ts deleted file mode 100644 index 488314030085f..0000000000000 --- a/x-pack/test/functional/apps/reporting_management/report_delete_pagination.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default ({ getPageObjects, getService }: FtrProviderContext) => { - const pageObjects = getPageObjects(['common', 'reporting']); - const log = getService('log'); - const retry = getService('retry'); - const security = getService('security'); - - const testSubjects = getService('testSubjects'); - const esArchiver = getService('esArchiver'); - - describe('Delete reports', function () { - before(async () => { - await security.testUser.setRoles(['kibana_admin', 'reporting_user']); - await esArchiver.load('empty_kibana'); - await esArchiver.load('reporting/archived_reports'); - await pageObjects.common.navigateToApp('reporting'); - await testSubjects.existOrFail('reportJobListing', { timeout: 200000 }); - }); - - after(async () => { - await esArchiver.unload('empty_kibana'); - await esArchiver.unload('reporting/archived_reports'); - await security.testUser.restoreDefaults(); - }); - - it('Confirm single report deletion works', async () => { - log.debug('Checking for reports.'); - await retry.try(async () => { - await testSubjects.click('checkboxSelectRow-k9a9xlwl0gpe1457b10rraq3'); - }); - const deleteButton = await testSubjects.find('deleteReportButton'); - await retry.waitFor('delete button to become enabled', async () => { - return await deleteButton.isEnabled(); - }); - await deleteButton.click(); - await testSubjects.exists('confirmModalBodyText'); - await testSubjects.click('confirmModalConfirmButton'); - await retry.try(async () => { - await testSubjects.waitForDeleted('checkboxSelectRow-k9a9xlwl0gpe1457b10rraq3'); - }); - }); - - // functional test for report pagination: https://github.com/elastic/kibana/pull/62881 - it('Report pagination', async () => { - const previousButton = await testSubjects.find('pagination-button-previous'); - expect(await previousButton.getAttribute('disabled')).to.be('true'); - await testSubjects.click('pagination-button-1'); - expect(await previousButton.getAttribute('disabled')).to.be(null); - }); - }); -}; diff --git a/x-pack/test/functional/apps/reporting_management/report_listing.ts b/x-pack/test/functional/apps/reporting_management/report_listing.ts new file mode 100644 index 0000000000000..5bb36103fc6f6 --- /dev/null +++ b/x-pack/test/functional/apps/reporting_management/report_listing.ts @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { WebElementWrapper } from 'test/functional/services/lib/web_element_wrapper'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +const getTableTextFromElement = async (tableEl: WebElementWrapper) => { + const rows = await tableEl.findAllByCssSelector('tbody tr'); + return ( + await Promise.all( + rows.map(async (row) => { + return await row.getVisibleText(); + }) + ) + ).join('\n'); +}; + +export default ({ getPageObjects, getService }: FtrProviderContext) => { + const pageObjects = getPageObjects(['common', 'reporting']); + const log = getService('log'); + const retry = getService('retry'); + const security = getService('security'); + + const testSubjects = getService('testSubjects'); + const findInstance = getService('find'); + const esArchiver = getService('esArchiver'); + + describe('Listing of Reports', function () { + before(async () => { + await security.testUser.setRoles(['kibana_admin', 'reporting_user']); + await esArchiver.load('empty_kibana'); + }); + + beforeEach(async () => { + // to reset the data after deletion testing + await esArchiver.load('reporting/archived_reports'); + await pageObjects.common.navigateToApp('reporting'); + await testSubjects.existOrFail('reportJobListing', { timeout: 200000 }); + }); + + after(async () => { + await esArchiver.unload('empty_kibana'); + await security.testUser.restoreDefaults(); + }); + + afterEach(async () => { + await esArchiver.unload('reporting/archived_reports'); + }); + + it('Confirm single report deletion works', async () => { + log.debug('Checking for reports.'); + await retry.try(async () => { + await testSubjects.click('checkboxSelectRow-k9a9xlwl0gpe1457b10rraq3'); + }); + const deleteButton = await testSubjects.find('deleteReportButton'); + await retry.waitFor('delete button to become enabled', async () => { + return await deleteButton.isEnabled(); + }); + await deleteButton.click(); + await testSubjects.exists('confirmModalBodyText'); + await testSubjects.click('confirmModalConfirmButton'); + await retry.try(async () => { + await testSubjects.waitForDeleted('checkboxSelectRow-k9a9xlwl0gpe1457b10rraq3'); + }); + }); + + it('Paginates content', async () => { + const previousButton = await testSubjects.find('pagination-button-previous'); + + // previous CAN NOT be clicked + expect(await previousButton.getAttribute('disabled')).to.be('true'); + + // scan page 1 + let tableText = await getTableTextFromElement(await testSubjects.find('reportJobListing')); + const PAGE_CONTENT_1 = `[Logs] File Type Scatter Plot\nvisualization\n2020-04-21 @ 07:01 PM\ntest_user\nCompleted at 2020-04-21 @ 07:02 PM +[Logs] File Type Scatter Plot\nvisualization\n2020-04-21 @ 07:01 PM\ntest_user\nCompleted at 2020-04-21 @ 07:02 PM +[Logs] Heatmap\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM +[Logs] Heatmap\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM +[Flights] Flight Delays\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM +[Flights] Flight Delays\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM +pdf\ndashboard\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM +pdf\ndashboard\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM +[Flights] Flight Cancellations\nvisualization\n2020-04-21 @ 06:59 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM +[Flights] Markdown Instructions\nvisualization\n2020-04-21 @ 06:59 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM`; + expect(tableText).to.be(PAGE_CONTENT_1); + + // click page 2 + await testSubjects.click('pagination-button-1'); + await findInstance.byCssSelector('[data-test-page="1"]'); + + // previous CAN be clicked + expect(await previousButton.getAttribute('disabled')).to.be(null); + + // scan page 2 + tableText = await getTableTextFromElement(await testSubjects.find('reportJobListing')); + const PAGE_CONTENT_2 = `[eCommerce] Revenue Tracking\ncanvas workpad\n2020-04-21 @ 06:58 PM\ntest_user\nCompleted at 2020-04-21 @ 06:59 PM +[Logs] Web Traffic\ncanvas workpad\n2020-04-21 @ 06:58 PM\ntest_user\nCompleted at 2020-04-21 @ 06:59 PM +[Flights] Overview\ncanvas workpad\n2020-04-21 @ 06:58 PM\ntest_user\nCompleted at 2020-04-21 @ 06:59 PM +[eCommerce] Revenue Dashboard\ndashboard\n2020-04-21 @ 06:57 PM\ntest_user\nCompleted at 2020-04-21 @ 06:58 PM +[Logs] Web Traffic\ndashboard\n2020-04-21 @ 06:57 PM\ntest_user\nCompleted at 2020-04-21 @ 06:58 PM +[Flights] Global Flight Dashboard\ndashboard\n2020-04-21 @ 06:56 PM\ntest_user\nCompleted at 2020-04-21 @ 06:57 PM +[Flights] Global Flight Dashboard\ndashboard\n2020-04-21 @ 06:56 PM\ntest_user\nCompleted at 2020-04-21 @ 06:57 PM +report4csv\n2020-04-21 @ 06:55 PM\ntest_user\nCompleted at 2020-04-21 @ 06:56 PM - Max size reached\nreport3csv\n2020-04-21 @ 06:55 PM +test_user\nCompleted at 2020-04-21 @ 06:55 PM - Max size reached\nreport2csv\n2020-04-21 @ 06:54 PM\ntest_user\nCompleted at 2020-04-21 @ 06:55 PM - Max size reached`; + expect(tableText).to.be(PAGE_CONTENT_2); + + // click page 3 + await testSubjects.click('pagination-button-2'); + await findInstance.byCssSelector('[data-test-page="2"]'); + + // scan page 3 + tableText = await getTableTextFromElement(await testSubjects.find('reportJobListing')); + const PAGE_CONTENT_3 = `report1csv\n2020-04-21 @ 06:54 PM\ntest_user\nCompleted at 2020-04-21 @ 06:54 PM - Max size reached`; + expect(tableText).to.be(PAGE_CONTENT_3); + }); + }); +}; diff --git a/x-pack/test/functional/apps/visualize/reporting.ts b/x-pack/test/functional/apps/visualize/reporting.ts index 02fd74e9480f7..d1cea5a4481b1 100644 --- a/x-pack/test/functional/apps/visualize/reporting.ts +++ b/x-pack/test/functional/apps/visualize/reporting.ts @@ -8,6 +8,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { + const es = getService('es'); const esArchiver = getService('esArchiver'); const browser = getService('browser'); const log = getService('log'); @@ -29,6 +30,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after('clean up archives', async () => { await esArchiver.unload('reporting/ecommerce'); await esArchiver.unload('reporting/ecommerce_kibana'); + await es.deleteByQuery({ + index: '.reporting-*', + refresh: true, + body: { query: { match_all: {} } }, + }); }); describe('Print PDF button', () => { From 506e9537bf1116f1ad7da2c85ec9befd491febc0 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Tue, 11 Aug 2020 23:28:43 +0300 Subject: [PATCH 065/113] [Search] Server strategy example (#71679) * Server strategy example * Add tsconfig Renamed is_partial to isPartial Added isPartial and isRunning to OSS response type * Docs + remove unused sample code * Fix test naming of arguments * ts * ts fix * Add filters and query input selector * Update examples/search_examples/public/components/app.tsx Co-authored-by: Lukas Olson * Use new service * exapmle plugin ts * unsubscribe + use timefilter * typo * docs * Add comments and use agg config * Added agg configs Added field selector Added a custom input param * Adding getEsQuery to query service (??) * Add server side example * docs * caps * list plugin in examples page * fix typo * Update examples/search_examples/public/application.tsx Co-authored-by: Lukas Olson * Update examples/search_examples/public/application.tsx Co-authored-by: Lukas Olson * Update examples/search_examples/public/components/app.tsx Co-authored-by: Lukas Olson * Update examples/search_examples/public/components/app.tsx Co-authored-by: Lukas Olson * Update examples/search_examples/public/components/app.tsx Co-authored-by: Lukas Olson * eslint Co-authored-by: Lukas Olson Co-authored-by: Elastic Machine --- ...data-public.iessearchresponse.ispartial.md | 13 + ...data-public.iessearchresponse.isrunning.md | 13 + ...n-plugins-data-public.iessearchresponse.md | 2 + ...ugin-plugins-data-public.isearchgeneric.md | 2 +- ...ugin-plugins-data-public.isearchoptions.md | 1 + ...ins-data-public.isearchoptions.strategy.md | 11 + ...n-plugins-data-public.searchinterceptor.md | 2 +- ...data-public.searchinterceptor.runsearch.md | 3 +- ...-data-server.iessearchrequest.indextype.md | 11 + ...in-plugins-data-server.iessearchrequest.md | 19 + ...ins-data-server.iessearchrequest.params.md | 11 + ...data-server.iessearchresponse.ispartial.md | 13 + ...data-server.iessearchresponse.isrunning.md | 13 + ...n-plugins-data-server.iessearchresponse.md | 20 + ...ta-server.iessearchresponse.rawresponse.md | 11 + .../kibana-plugin-plugins-data-server.md | 2 + examples/search_examples/README.md | 9 + examples/search_examples/common/index.ts | 32 ++ examples/search_examples/kibana.json | 9 + .../search_examples/public/application.tsx | 44 +++ .../search_examples/public/components/app.tsx | 341 ++++++++++++++++++ examples/search_examples/public/index.scss | 0 examples/search_examples/public/index.ts | 29 ++ examples/search_examples/public/plugin.ts | 76 ++++ examples/search_examples/public/types.ts | 36 ++ examples/search_examples/server/index.ts | 27 ++ .../search_examples/server/my_strategy.ts | 40 ++ examples/search_examples/server/plugin.ts | 73 ++++ .../search_examples/server/routes/index.ts | 19 + .../server/routes/register_routes.ts | 26 ++ .../server/routes/server_search_route.ts | 70 ++++ examples/search_examples/server/types.ts | 34 ++ examples/search_examples/tsconfig.json | 16 + .../data/common/search/es_search/types.ts | 8 + src/plugins/data/public/public.api.md | 9 +- src/plugins/data/public/query/mocks.ts | 1 + .../data/public/query/query_service.ts | 13 + .../data/public/search/search_interceptor.ts | 21 +- src/plugins/data/public/search/types.ts | 8 +- src/plugins/data/server/index.ts | 7 +- .../es_search/es_search_strategy.test.ts | 5 +- .../search/es_search/es_search_strategy.ts | 9 +- src/plugins/data/server/server.api.md | 43 ++- x-pack/plugins/data_enhanced/common/index.ts | 7 +- .../data_enhanced/common/search/index.ts | 7 +- .../data_enhanced/common/search/types.ts | 17 +- .../public/search/search_interceptor.test.ts | 64 ++-- .../public/search/search_interceptor.ts | 16 +- .../server/search/es_search_strategy.ts | 4 +- 49 files changed, 1161 insertions(+), 106 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.strategy.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.indextype.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.params.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md create mode 100644 examples/search_examples/README.md create mode 100644 examples/search_examples/common/index.ts create mode 100644 examples/search_examples/kibana.json create mode 100644 examples/search_examples/public/application.tsx create mode 100644 examples/search_examples/public/components/app.tsx create mode 100644 examples/search_examples/public/index.scss create mode 100644 examples/search_examples/public/index.ts create mode 100644 examples/search_examples/public/plugin.ts create mode 100644 examples/search_examples/public/types.ts create mode 100644 examples/search_examples/server/index.ts create mode 100644 examples/search_examples/server/my_strategy.ts create mode 100644 examples/search_examples/server/plugin.ts create mode 100644 examples/search_examples/server/routes/index.ts create mode 100644 examples/search_examples/server/routes/register_routes.ts create mode 100644 examples/search_examples/server/routes/server_search_route.ts create mode 100644 examples/search_examples/server/types.ts create mode 100644 examples/search_examples/tsconfig.json diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md new file mode 100644 index 0000000000000..00a56c6fe9c31 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-public.iessearchresponse.md) > [isPartial](./kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md) + +## IEsSearchResponse.isPartial property + +Indicates whether the results returned are complete or partial + +Signature: + +```typescript +isPartial?: boolean; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md new file mode 100644 index 0000000000000..56fb1a7519811 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-public.iessearchresponse.md) > [isRunning](./kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md) + +## IEsSearchResponse.isRunning property + +Indicates whether async search is still in flight + +Signature: + +```typescript +isRunning?: boolean; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md index ea7e2aef00d6e..041d79de3282e 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md @@ -14,5 +14,7 @@ export interface IEsSearchResponse extends IKibanaSearchResponse | Property | Type | Description | | --- | --- | --- | +| [isPartial](./kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md) | boolean | Indicates whether the results returned are complete or partial | +| [isRunning](./kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md) | boolean | Indicates whether async search is still in flight | | [rawResponse](./kibana-plugin-plugins-data-public.iessearchresponse.rawresponse.md) | SearchResponse<any> | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md index cdf19cd15a298..3bd6a398c8df5 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md @@ -7,5 +7,5 @@ Signature: ```typescript -export declare type ISearchGeneric = (request: IEsSearchRequest, options?: IStrategyOptions) => Observable; +export declare type ISearchGeneric = (request: IEsSearchRequest, options?: ISearchOptions) => Observable; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md index 05b7252606289..3eb38dc7d52e0 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md @@ -15,4 +15,5 @@ export interface ISearchOptions | Property | Type | Description | | --- | --- | --- | | [signal](./kibana-plugin-plugins-data-public.isearchoptions.signal.md) | AbortSignal | | +| [strategy](./kibana-plugin-plugins-data-public.isearchoptions.strategy.md) | string | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.strategy.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.strategy.md new file mode 100644 index 0000000000000..df7e050691a8f --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.strategy.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchOptions](./kibana-plugin-plugins-data-public.isearchoptions.md) > [strategy](./kibana-plugin-plugins-data-public.isearchoptions.strategy.md) + +## ISearchOptions.strategy property + +Signature: + +```typescript +strategy?: string; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md index 30e980b5ffc54..b3b7da05326d0 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md @@ -35,7 +35,7 @@ export declare class SearchInterceptor | Method | Modifiers | Description | | --- | --- | --- | -| [runSearch(request, signal)](./kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md) | | | +| [runSearch(request, signal, strategy)](./kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md) | | | | [search(request, options)](./kibana-plugin-plugins-data-public.searchinterceptor.search.md) | | Searches using the given search method. Overrides the AbortSignal with one that will abort either when cancelPending is called, when the request times out, or when the original AbortSignal is aborted. Updates the pendingCount when the request is started/finalized. | | [setupTimers(options)](./kibana-plugin-plugins-data-public.searchinterceptor.setuptimers.md) | | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md index 3601a00c48cf3..ad1d1dcb59d7b 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md @@ -7,7 +7,7 @@ Signature: ```typescript -protected runSearch(request: IEsSearchRequest, signal: AbortSignal): Observable; +protected runSearch(request: IEsSearchRequest, signal: AbortSignal, strategy?: string): Observable; ``` ## Parameters @@ -16,6 +16,7 @@ protected runSearch(request: IEsSearchRequest, signal: AbortSignal): Observable< | --- | --- | --- | | request | IEsSearchRequest | | | signal | AbortSignal | | +| strategy | string | | Returns: diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.indextype.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.indextype.md new file mode 100644 index 0000000000000..aaf4e55ee007b --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.indextype.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchRequest](./kibana-plugin-plugins-data-server.iessearchrequest.md) > [indexType](./kibana-plugin-plugins-data-server.iessearchrequest.indextype.md) + +## IEsSearchRequest.indexType property + +Signature: + +```typescript +indexType?: string; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.md new file mode 100644 index 0000000000000..0dfa23eb64c1b --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchRequest](./kibana-plugin-plugins-data-server.iessearchrequest.md) + +## IEsSearchRequest interface + +Signature: + +```typescript +export interface IEsSearchRequest extends IKibanaSearchRequest +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [indexType](./kibana-plugin-plugins-data-server.iessearchrequest.indextype.md) | string | | +| [params](./kibana-plugin-plugins-data-server.iessearchrequest.params.md) | ISearchRequestParams | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.params.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.params.md new file mode 100644 index 0000000000000..d65281973c951 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.params.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchRequest](./kibana-plugin-plugins-data-server.iessearchrequest.md) > [params](./kibana-plugin-plugins-data-server.iessearchrequest.params.md) + +## IEsSearchRequest.params property + +Signature: + +```typescript +params?: ISearchRequestParams; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md new file mode 100644 index 0000000000000..fbddfc1cd9fc4 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-server.iessearchresponse.md) > [isPartial](./kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md) + +## IEsSearchResponse.isPartial property + +Indicates whether the results returned are complete or partial + +Signature: + +```typescript +isPartial?: boolean; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md new file mode 100644 index 0000000000000..01f3982957d5c --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-server.iessearchresponse.md) > [isRunning](./kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md) + +## IEsSearchResponse.isRunning property + +Indicates whether async search is still in flight + +Signature: + +```typescript +isRunning?: boolean; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.md new file mode 100644 index 0000000000000..0407dce5fe418 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.md @@ -0,0 +1,20 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-server.iessearchresponse.md) + +## IEsSearchResponse interface + +Signature: + +```typescript +export interface IEsSearchResponse extends IKibanaSearchResponse +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [isPartial](./kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md) | boolean | Indicates whether the results returned are complete or partial | +| [isRunning](./kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md) | boolean | Indicates whether async search is still in flight | +| [rawResponse](./kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md) | SearchResponse<any> | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md new file mode 100644 index 0000000000000..0ee1691d0f697 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-server.iessearchresponse.md) > [rawResponse](./kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md) + +## IEsSearchResponse.rawResponse property + +Signature: + +```typescript +rawResponse: SearchResponse; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md index 1bcd575803f88..f472064c87755 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md @@ -36,6 +36,8 @@ | [EsQueryConfig](./kibana-plugin-plugins-data-server.esqueryconfig.md) | | | [FieldFormatConfig](./kibana-plugin-plugins-data-server.fieldformatconfig.md) | | | [Filter](./kibana-plugin-plugins-data-server.filter.md) | | +| [IEsSearchRequest](./kibana-plugin-plugins-data-server.iessearchrequest.md) | | +| [IEsSearchResponse](./kibana-plugin-plugins-data-server.iessearchresponse.md) | | | [IFieldSubType](./kibana-plugin-plugins-data-server.ifieldsubtype.md) | | | [IFieldType](./kibana-plugin-plugins-data-server.ifieldtype.md) | | | [IIndexPattern](./kibana-plugin-plugins-data-server.iindexpattern.md) | | diff --git a/examples/search_examples/README.md b/examples/search_examples/README.md new file mode 100644 index 0000000000000..bcc17bf7f3333 --- /dev/null +++ b/examples/search_examples/README.md @@ -0,0 +1,9 @@ +# search_examples + +> An awesome Kibana plugin + +--- + +## Development + +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/examples/search_examples/common/index.ts b/examples/search_examples/common/index.ts new file mode 100644 index 0000000000000..e1e7f6389ae83 --- /dev/null +++ b/examples/search_examples/common/index.ts @@ -0,0 +1,32 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IEsSearchResponse, IEsSearchRequest } from '../../../src/plugins/data/common'; + +export const PLUGIN_ID = 'searchExamples'; +export const PLUGIN_NAME = 'Search Examples'; + +export interface IMyStrategyRequest extends IEsSearchRequest { + get_cool: boolean; +} +export interface IMyStrategyResponse extends IEsSearchResponse { + cool: string; +} + +export const SERVER_SEARCH_ROUTE_PATH = '/api/examples/search'; diff --git a/examples/search_examples/kibana.json b/examples/search_examples/kibana.json new file mode 100644 index 0000000000000..7e392b8417360 --- /dev/null +++ b/examples/search_examples/kibana.json @@ -0,0 +1,9 @@ +{ + "id": "searchExamples", + "version": "8.0.0", + "server": true, + "ui": true, + "requiredPlugins": ["navigation", "data", "developerExamples"], + "optionalPlugins": [], + "requiredBundles": [] +} diff --git a/examples/search_examples/public/application.tsx b/examples/search_examples/public/application.tsx new file mode 100644 index 0000000000000..81e4ee8514c11 --- /dev/null +++ b/examples/search_examples/public/application.tsx @@ -0,0 +1,44 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import { AppMountParameters, CoreStart } from '../../../src/core/public'; +import { AppPluginStartDependencies } from './types'; +import { SearchExamplesApp } from './components/app'; + +export const renderApp = ( + { notifications, savedObjects, http }: CoreStart, + { navigation, data }: AppPluginStartDependencies, + { appBasePath, element }: AppMountParameters +) => { + ReactDOM.render( + , + element + ); + + return () => ReactDOM.unmountComponentAtNode(element); +}; diff --git a/examples/search_examples/public/components/app.tsx b/examples/search_examples/public/components/app.tsx new file mode 100644 index 0000000000000..31cc5e420da11 --- /dev/null +++ b/examples/search_examples/public/components/app.tsx @@ -0,0 +1,341 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState, useEffect } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage, I18nProvider } from '@kbn/i18n/react'; +import { BrowserRouter as Router } from 'react-router-dom'; + +import { + EuiButton, + EuiPage, + EuiPageBody, + EuiPageContent, + EuiPageContentBody, + EuiPageHeader, + EuiTitle, + EuiText, + EuiFlexGrid, + EuiFlexItem, + EuiCheckbox, + EuiSpacer, + EuiCode, + EuiComboBox, + EuiFormLabel, +} from '@elastic/eui'; + +import { CoreStart } from '../../../../src/core/public'; +import { mountReactNode } from '../../../../src/core/public/utils'; +import { NavigationPublicPluginStart } from '../../../../src/plugins/navigation/public'; + +import { + PLUGIN_ID, + PLUGIN_NAME, + IMyStrategyRequest, + IMyStrategyResponse, + SERVER_SEARCH_ROUTE_PATH, +} from '../../common'; + +import { + DataPublicPluginStart, + IndexPatternSelect, + IndexPattern, + IndexPatternField, +} from '../../../../src/plugins/data/public'; + +interface SearchExamplesAppDeps { + basename: string; + notifications: CoreStart['notifications']; + http: CoreStart['http']; + savedObjectsClient: CoreStart['savedObjects']['client']; + navigation: NavigationPublicPluginStart; + data: DataPublicPluginStart; +} + +function formatFieldToComboBox(field?: IndexPatternField | null) { + if (!field) return []; + return formatFieldsToComboBox([field]); +} + +function formatFieldsToComboBox(fields?: IndexPatternField[]) { + if (!fields) return []; + + return fields?.map((field) => { + return { + label: field.displayName || field.name, + }; + }); +} + +export const SearchExamplesApp = ({ + http, + basename, + notifications, + savedObjectsClient, + navigation, + data, +}: SearchExamplesAppDeps) => { + const [getCool, setGetCool] = useState(false); + const [timeTook, setTimeTook] = useState(); + const [indexPattern, setIndexPattern] = useState(); + const [numericFields, setNumericFields] = useState(); + const [selectedField, setSelectedField] = useState(); + + // Fetch the default index pattern using the `data.indexPatterns` service, as the component is mounted. + useEffect(() => { + const setDefaultIndexPattern = async () => { + const defaultIndexPattern = await data.indexPatterns.getDefault(); + setIndexPattern(defaultIndexPattern); + }; + + setDefaultIndexPattern(); + }, [data]); + + // Update the fields list every time the index pattern is modified. + useEffect(() => { + const fields = indexPattern?.fields.filter( + (field) => field.type === 'number' && field.aggregatable + ); + setNumericFields(fields); + setSelectedField(fields?.length ? fields[0] : null); + }, [indexPattern]); + + const doAsyncSearch = async (strategy?: string) => { + if (!indexPattern || !selectedField) return; + + // Constuct the query portion of the search request + const query = data.query.getEsQuery(indexPattern); + + // Constuct the aggregations portion of the search request by using the `data.search.aggs` service. + const aggs = [{ type: 'avg', params: { field: selectedField.name } }]; + const aggsDsl = data.search.aggs.createAggConfigs(indexPattern, aggs).toDsl(); + + const request = { + params: { + index: indexPattern.title, + body: { + aggs: aggsDsl, + query, + }, + }, + }; + + if (strategy) { + // Add a custom request parameter to be consumed by `MyStrategy`. + (request as IMyStrategyRequest).get_cool = getCool; + } + + // Submit the search request using the `data.search` service. + const searchSubscription$ = data.search + .search(request, { + strategy, + }) + .subscribe({ + next: (response) => { + if (!response.isPartial && !response.isRunning) { + setTimeTook(response.rawResponse.took); + const avgResult: number | undefined = response.rawResponse.aggregations + ? response.rawResponse.aggregations[1].value + : undefined; + const message = ( + + Searched {response.rawResponse.hits.total} documents.
+ The average of {selectedField.name} is {avgResult ? Math.floor(avgResult) : 0}. +
+ Is it Cool? {String((response as IMyStrategyResponse).cool)} +
+ ); + notifications.toasts.addSuccess({ + title: 'Query result', + text: mountReactNode(message), + }); + searchSubscription$.unsubscribe(); + } else if (response.isPartial && !response.isRunning) { + // TODO: Make response error status clearer + notifications.toasts.addWarning('An error has occurred'); + searchSubscription$.unsubscribe(); + } + }, + error: () => { + notifications.toasts.addDanger('Failed to run search'); + }, + }); + }; + + const onClickHandler = () => { + doAsyncSearch(); + }; + + const onMyStrategyClickHandler = () => { + doAsyncSearch('myStrategy'); + }; + + const onServerClickHandler = async () => { + if (!indexPattern || !selectedField) return; + try { + const response = await http.get(SERVER_SEARCH_ROUTE_PATH, { + query: { + index: indexPattern.title, + field: selectedField.name, + }, + }); + + notifications.toasts.addSuccess(`Server returned ${JSON.stringify(response)}`); + } catch (e) { + notifications.toasts.addDanger('Failed to run search'); + } + }; + + if (!indexPattern) return null; + + return ( + + + <> + + + + + +

+ +

+
+
+ + + + + + Index Pattern + { + const newIndexPattern = await data.indexPatterns.get(newIndexPatternId); + setIndexPattern(newIndexPattern); + }} + isClearable={false} + /> + + + Numeric Fields + { + const field = indexPattern.getFieldByName(option[0].label); + setSelectedField(field || null); + }} + sortMatchesBy="startsWith" + /> + + + + + + + + +

+ Searching Elasticsearch using data.search +

+
+ + If you want to fetch data from Elasticsearch, you can use the different services + provided by the data plugin. These help you get the index + pattern and search bar configuration, format them into a DSL query and send it + to Elasticsearch. + + + + + + + +

Writing a custom search strategy

+
+ + If you want to do some pre or post processing on the server, you might want to + create a custom search strategy. This example uses such a strategy, passing in + custom input and receiving custom output back. + + + } + checked={getCool} + onChange={(event) => setGetCool(event.target.checked)} + /> + + + + + + +

Using search on the server

+
+ + You can also run your search request from the server, without registering a + search strategy. This request does not take the configuration of{' '} + TopNavMenu into account, but you could pass those down to the + server as well. + + + + +
+
+
+
+ +
+
+ ); +}; diff --git a/examples/search_examples/public/index.scss b/examples/search_examples/public/index.scss new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/examples/search_examples/public/index.ts b/examples/search_examples/public/index.ts new file mode 100644 index 0000000000000..cd3208aa0c088 --- /dev/null +++ b/examples/search_examples/public/index.ts @@ -0,0 +1,29 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import './index.scss'; + +import { SearchExamplesPlugin } from './plugin'; + +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. +export function plugin() { + return new SearchExamplesPlugin(); +} +export { SearchExamplesPluginSetup, SearchExamplesPluginStart } from './types'; diff --git a/examples/search_examples/public/plugin.ts b/examples/search_examples/public/plugin.ts new file mode 100644 index 0000000000000..436304e9d5ff6 --- /dev/null +++ b/examples/search_examples/public/plugin.ts @@ -0,0 +1,76 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + AppMountParameters, + CoreSetup, + CoreStart, + Plugin, + AppNavLinkStatus, +} from '../../../src/core/public'; +import { + SearchExamplesPluginSetup, + SearchExamplesPluginStart, + AppPluginSetupDependencies, + AppPluginStartDependencies, +} from './types'; +import { PLUGIN_NAME } from '../common'; + +export class SearchExamplesPlugin + implements + Plugin< + SearchExamplesPluginSetup, + SearchExamplesPluginStart, + AppPluginSetupDependencies, + AppPluginStartDependencies + > { + public setup( + core: CoreSetup, + { developerExamples }: AppPluginSetupDependencies + ): SearchExamplesPluginSetup { + // Register an application into the side navigation menu + core.application.register({ + id: 'searchExamples', + title: PLUGIN_NAME, + navLinkStatus: AppNavLinkStatus.hidden, + async mount(params: AppMountParameters) { + // Load application bundle + const { renderApp } = await import('./application'); + // Get start services as specified in kibana.json + const [coreStart, depsStart] = await core.getStartServices(); + // Render the application + return renderApp(coreStart, depsStart, params); + }, + }); + + developerExamples.register({ + appId: 'searchExamples', + title: 'Search Examples', + description: `Search Examples`, + }); + + return {}; + } + + public start(core: CoreStart): SearchExamplesPluginStart { + return {}; + } + + public stop() {} +} diff --git a/examples/search_examples/public/types.ts b/examples/search_examples/public/types.ts new file mode 100644 index 0000000000000..0670cc5907449 --- /dev/null +++ b/examples/search_examples/public/types.ts @@ -0,0 +1,36 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { NavigationPublicPluginStart } from '../../../src/plugins/navigation/public'; +import { DataPublicPluginStart } from '../../../src/plugins/data/public'; +import { DeveloperExamplesSetup } from '../../developer_examples/public'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchExamplesPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchExamplesPluginStart {} + +export interface AppPluginSetupDependencies { + developerExamples: DeveloperExamplesSetup; +} + +export interface AppPluginStartDependencies { + navigation: NavigationPublicPluginStart; + data: DataPublicPluginStart; +} diff --git a/examples/search_examples/server/index.ts b/examples/search_examples/server/index.ts new file mode 100644 index 0000000000000..06d41490af57a --- /dev/null +++ b/examples/search_examples/server/index.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { PluginInitializerContext } from '../../../src/core/server'; +import { SearchExamplesPlugin } from './plugin'; + +export function plugin(initializerContext: PluginInitializerContext) { + return new SearchExamplesPlugin(initializerContext); +} + +export { SearchExamplesPluginSetup, SearchExamplesPluginStart } from './types'; diff --git a/examples/search_examples/server/my_strategy.ts b/examples/search_examples/server/my_strategy.ts new file mode 100644 index 0000000000000..a1116ddbd759b --- /dev/null +++ b/examples/search_examples/server/my_strategy.ts @@ -0,0 +1,40 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ISearchStrategy, PluginStart } from '../../../src/plugins/data/server'; +import { IMyStrategyResponse, IMyStrategyRequest } from '../common'; + +export const mySearchStrategyProvider = (data: PluginStart): ISearchStrategy => { + const es = data.search.getSearchStrategy('es'); + return { + search: async (context, request, options): Promise => { + request.debug = true; + const esSearchRes = await es.search(context, request, options); + return { + ...esSearchRes, + cool: (request as IMyStrategyRequest).get_cool ? 'YES' : 'NOPE', + }; + }, + cancel: async (context, id) => { + if (es.cancel) { + es.cancel(context, id); + } + }, + }; +}; diff --git a/examples/search_examples/server/plugin.ts b/examples/search_examples/server/plugin.ts new file mode 100644 index 0000000000000..deef5a53b2b73 --- /dev/null +++ b/examples/search_examples/server/plugin.ts @@ -0,0 +1,73 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + PluginInitializerContext, + CoreSetup, + CoreStart, + Plugin, + Logger, +} from '../../../src/core/server'; + +import { + SearchExamplesPluginSetup, + SearchExamplesPluginStart, + SearchExamplesPluginSetupDeps, + SearchExamplesPluginStartDeps, +} from './types'; +import { mySearchStrategyProvider } from './my_strategy'; +import { registerRoutes } from './routes'; + +export class SearchExamplesPlugin + implements + Plugin< + SearchExamplesPluginSetup, + SearchExamplesPluginStart, + SearchExamplesPluginSetupDeps, + SearchExamplesPluginStartDeps + > { + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + } + + public setup( + core: CoreSetup, + deps: SearchExamplesPluginSetupDeps + ) { + this.logger.debug('search_examples: Setup'); + const router = core.http.createRouter(); + + core.getStartServices().then(([_, depsStart]) => { + const myStrategy = mySearchStrategyProvider(depsStart.data); + deps.data.search.registerSearchStrategy('myStrategy', myStrategy); + registerRoutes(router, depsStart.data); + }); + + return {}; + } + + public start(core: CoreStart) { + this.logger.debug('search_examples: Started'); + return {}; + } + + public stop() {} +} diff --git a/examples/search_examples/server/routes/index.ts b/examples/search_examples/server/routes/index.ts new file mode 100644 index 0000000000000..ea575cf371bb7 --- /dev/null +++ b/examples/search_examples/server/routes/index.ts @@ -0,0 +1,19 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +export { registerRoutes } from './register_routes'; diff --git a/examples/search_examples/server/routes/register_routes.ts b/examples/search_examples/server/routes/register_routes.ts new file mode 100644 index 0000000000000..ac3ea28d89d26 --- /dev/null +++ b/examples/search_examples/server/routes/register_routes.ts @@ -0,0 +1,26 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IRouter } from 'kibana/server'; +import { PluginStart as DataPluginStart } from 'src/plugins/data/server'; +import { registerServerSearchRoute } from './server_search_route'; + +export function registerRoutes(router: IRouter, data: DataPluginStart) { + registerServerSearchRoute(router, data); +} diff --git a/examples/search_examples/server/routes/server_search_route.ts b/examples/search_examples/server/routes/server_search_route.ts new file mode 100644 index 0000000000000..6eb21cf34b4a3 --- /dev/null +++ b/examples/search_examples/server/routes/server_search_route.ts @@ -0,0 +1,70 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { PluginStart as DataPluginStart, IEsSearchRequest } from 'src/plugins/data/server'; +import { schema } from '@kbn/config-schema'; +import { IEsSearchResponse } from 'src/plugins/data/common'; +import { IRouter } from '../../../../src/core/server'; +import { SERVER_SEARCH_ROUTE_PATH } from '../../common'; + +export function registerServerSearchRoute(router: IRouter, data: DataPluginStart) { + router.get( + { + path: SERVER_SEARCH_ROUTE_PATH, + validate: { + query: schema.object({ + index: schema.maybe(schema.string()), + field: schema.maybe(schema.string()), + }), + }, + }, + async (context, request, response) => { + const { index, field } = request.query; + // Run a synchronous search server side, by enforcing a high keepalive and waiting for completion. + // If you wish to run the search with polling (in basic+), you'd have to poll on the search API. + // Please reach out to the @app-arch-team if you need this to be implemented. + const res = await data.search.search( + context, + { + params: { + index, + body: { + aggs: { + '1': { + avg: { + field, + }, + }, + }, + }, + waitForCompletionTimeout: '5m', + keepAlive: '5m', + }, + } as IEsSearchRequest, + {} + ); + + return response.ok({ + body: { + aggs: (res as IEsSearchResponse).rawResponse.aggregations, + }, + }); + } + ); +} diff --git a/examples/search_examples/server/types.ts b/examples/search_examples/server/types.ts new file mode 100644 index 0000000000000..da0f24a3012bb --- /dev/null +++ b/examples/search_examples/server/types.ts @@ -0,0 +1,34 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// Rename PluginStart to something better +import { PluginSetup, PluginStart } from '../../../src/plugins/data/server'; + +export interface SearchExamplesPluginSetupDeps { + data: PluginSetup; +} + +export interface SearchExamplesPluginStartDeps { + data: PluginStart; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchExamplesPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchExamplesPluginStart {} diff --git a/examples/search_examples/tsconfig.json b/examples/search_examples/tsconfig.json new file mode 100644 index 0000000000000..8a3ced743d0fa --- /dev/null +++ b/examples/search_examples/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./target", + "skipLibCheck": true + }, + "include": [ + "index.ts", + "common/**/*.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../typings/**/*", + ], + "exclude": [] +} diff --git a/src/plugins/data/common/search/es_search/types.ts b/src/plugins/data/common/search/es_search/types.ts index db2e31706e95c..6fc0923768703 100644 --- a/src/plugins/data/common/search/es_search/types.ts +++ b/src/plugins/data/common/search/es_search/types.ts @@ -31,5 +31,13 @@ export interface IEsSearchRequest extends IKibanaSearchRequest { } export interface IEsSearchResponse extends IKibanaSearchResponse { + /** + * Indicates whether async search is still in flight + */ + isRunning?: boolean; + /** + * Indicates whether the results returned are complete or partial + */ + isPartial?: boolean; rawResponse: SearchResponse; } diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 216ed018957e0..6225d74fb1b31 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -770,6 +770,8 @@ export interface IEsSearchRequest extends IKibanaSearchRequest { // // @public (undocumented) export interface IEsSearchResponse extends IKibanaSearchResponse { + isPartial?: boolean; + isRunning?: boolean; // (undocumented) rawResponse: SearchResponse_2; } @@ -1213,11 +1215,10 @@ export type InputTimeRange = TimeRange | { // @public (undocumented) export type ISearch = (request: IKibanaSearchRequest, options?: ISearchOptions) => Observable; -// Warning: (ae-forgotten-export) The symbol "IStrategyOptions" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "ISearchGeneric" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type ISearchGeneric = (request: IEsSearchRequest, options?: IStrategyOptions) => Observable; +export type ISearchGeneric = (request: IEsSearchRequest, options?: ISearchOptions) => Observable; // Warning: (ae-missing-release-tag) "ISearchOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1225,6 +1226,8 @@ export type ISearchGeneric = (request: IEsSearchRequest, options?: IStrategyOpti export interface ISearchOptions { // (undocumented) signal?: AbortSignal; + // (undocumented) + strategy?: string; } // Warning: (ae-forgotten-export) The symbol "SearchSource" needs to be exported by the entry point index.d.ts @@ -1723,7 +1726,7 @@ export class SearchInterceptor { // (undocumented) protected readonly requestTimeout?: number | undefined; // (undocumented) - protected runSearch(request: IEsSearchRequest, signal: AbortSignal): Observable; + protected runSearch(request: IEsSearchRequest, signal: AbortSignal, strategy?: string): Observable; search(request: IEsSearchRequest, options?: ISearchOptions): Observable; // (undocumented) protected setupTimers(options?: ISearchOptions): { diff --git a/src/plugins/data/public/query/mocks.ts b/src/plugins/data/public/query/mocks.ts index 8c15d9d6d0152..53c177de0fa39 100644 --- a/src/plugins/data/public/query/mocks.ts +++ b/src/plugins/data/public/query/mocks.ts @@ -44,6 +44,7 @@ const createStartContractMock = () => { savedQueries: jest.fn() as any, state$: new Observable(), timefilter: timefilterServiceMock.createStartContract(), + getEsQuery: jest.fn(), }; return startContract; diff --git a/src/plugins/data/public/query/query_service.ts b/src/plugins/data/public/query/query_service.ts index da514c0e24ea4..fe7fdcbb1d113 100644 --- a/src/plugins/data/public/query/query_service.ts +++ b/src/plugins/data/public/query/query_service.ts @@ -26,6 +26,9 @@ import { TimefilterService, TimefilterSetup } from './timefilter'; import { createSavedQueryService } from './saved_query/saved_query_service'; import { createQueryStateObservable } from './state_sync/create_global_query_observable'; import { QueryStringManager, QueryStringContract } from './query_string'; +import { buildEsQuery, getEsQueryConfig } from '../../common'; +import { getUiSettings } from '../services'; +import { IndexPattern } from '..'; /** * Query Service @@ -86,6 +89,16 @@ export class QueryService { savedQueries: createSavedQueryService(savedObjectsClient), state$: this.state$, timefilter: this.timefilter, + getEsQuery: (indexPattern: IndexPattern) => { + const timeFilter = this.timefilter.timefilter.createFilter(indexPattern); + + return buildEsQuery( + indexPattern, + this.queryStringManager.getQuery(), + [...this.filterManager.getFilters(), ...(timeFilter ? [timeFilter] : [])], + getEsQueryConfig(getUiSettings()) + ); + }, }; } diff --git a/src/plugins/data/public/search/search_interceptor.ts b/src/plugins/data/public/search/search_interceptor.ts index 677ad0ccea677..d6fcde8e986f3 100644 --- a/src/plugins/data/public/search/search_interceptor.ts +++ b/src/plugins/data/public/search/search_interceptor.ts @@ -17,11 +17,12 @@ * under the License. */ +import { trimEnd } from 'lodash'; import { BehaviorSubject, throwError, timer, Subscription, defer, from, Observable } from 'rxjs'; import { finalize, filter } from 'rxjs/operators'; import { ApplicationStart, Toast, ToastsStart, CoreStart } from 'kibana/public'; import { getCombinedSignal, AbortError } from '../../common/utils'; -import { IEsSearchRequest, IEsSearchResponse } from '../../common/search'; +import { IEsSearchRequest, IEsSearchResponse, ES_SEARCH_STRATEGY } from '../../common/search'; import { ISearchOptions } from './types'; import { getLongQueryNotification } from './long_query_notification'; import { SearchUsageCollector } from './collectors'; @@ -92,14 +93,20 @@ export class SearchInterceptor { protected runSearch( request: IEsSearchRequest, - signal: AbortSignal + signal: AbortSignal, + strategy?: string ): Observable { const { id, ...searchRequest } = request; - const path = id != null ? `/internal/search/es/${id}` : '/internal/search/es'; - const method = 'POST'; + const path = trimEnd(`/internal/search/${strategy || ES_SEARCH_STRATEGY}/${id || ''}`, '/'); const body = JSON.stringify(id != null ? {} : searchRequest); - const response = this.deps.http.fetch({ path, method, body, signal }); - return from(response); + return from( + this.deps.http.fetch({ + method: 'POST', + path, + body, + signal, + }) + ); } /** @@ -120,7 +127,7 @@ export class SearchInterceptor { const { combinedSignal, cleanup } = this.setupTimers(options); this.pendingCount$.next(++this.pendingCount); - return this.runSearch(request, combinedSignal).pipe( + return this.runSearch(request, combinedSignal, options?.strategy).pipe( finalize(() => { this.pendingCount$.next(--this.pendingCount); cleanup(); diff --git a/src/plugins/data/public/search/types.ts b/src/plugins/data/public/search/types.ts index ec74275f35c04..f80a13d048a68 100644 --- a/src/plugins/data/public/search/types.ts +++ b/src/plugins/data/public/search/types.ts @@ -37,6 +37,7 @@ import { GetInternalStartServicesFn } from '../types'; export interface ISearchOptions { signal?: AbortSignal; + strategy?: string; } export type ISearch = ( @@ -44,14 +45,9 @@ export type ISearch = ( options?: ISearchOptions ) => Observable; -// Service API types -export interface IStrategyOptions extends ISearchOptions { - strategy?: string; -} - export type ISearchGeneric = ( request: IEsSearchRequest, - options?: IStrategyOptions + options?: ISearchOptions ) => Observable; export interface ISearchStartLegacy { diff --git a/src/plugins/data/server/index.ts b/src/plugins/data/server/index.ts index 1f3d7fbcb9f0f..73ed88850d787 100644 --- a/src/plugins/data/server/index.ts +++ b/src/plugins/data/server/index.ts @@ -161,7 +161,12 @@ import { toAbsoluteDates, } from '../common'; -export { EsaggsExpressionFunctionDefinition, ParsedInterval } from '../common'; +export { + EsaggsExpressionFunctionDefinition, + ParsedInterval, + IEsSearchRequest, + IEsSearchResponse, +} from '../common'; export { ISearchStrategy, diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.test.ts b/src/plugins/data/server/search/es_search/es_search_strategy.test.ts index bc59bdee6a40a..2888f9d9d20b5 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.test.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.test.ts @@ -78,7 +78,7 @@ describe('ES search strategy', () => { }); }); - it('returns total, loaded, and raw response', async () => { + it('has all response parameters', async () => { const params = { index: 'logstash-*' }; const esSearch = await esSearchStrategyProvider(mockConfig$, mockLogger); @@ -86,7 +86,8 @@ describe('ES search strategy', () => { params, }); - expect(response).toHaveProperty('total'); + expect(response.isRunning).toBe(false); + expect(response.isPartial).toBe(false); expect(response).toHaveProperty('loaded'); expect(response).toHaveProperty('rawResponse'); }); diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.ts b/src/plugins/data/server/search/es_search/es_search_strategy.ts index 78ead6df1a44e..234c30376d6db 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.ts @@ -30,7 +30,7 @@ export const esSearchStrategyProvider = ( ): ISearchStrategy => { return { search: async (context, request, options) => { - logger.info(`search ${JSON.stringify(request.params)}`); + logger.info(`search ${request.params?.index}`); const config = await config$.pipe(first()).toPromise(); const defaultParams = getDefaultSearchParams(config); @@ -56,7 +56,12 @@ export const esSearchStrategyProvider = ( // The above query will either complete or timeout and throw an error. // There is no progress indication on this api. - return { rawResponse, ...getTotalLoaded(rawResponse._shards) }; + return { + isPartial: false, + isRunning: false, + rawResponse, + ...getTotalLoaded(rawResponse._shards), + }; } catch (e) { if (usage) usage.trackError(); throw e; diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index 013034c79d3f3..37d569a4bf9fe 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -369,6 +369,30 @@ export function getTotalLoaded({ total, failed, successful }: ShardsResponse): { loaded: number; }; +// Warning: (ae-forgotten-export) The symbol "IKibanaSearchRequest" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "IEsSearchRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface IEsSearchRequest extends IKibanaSearchRequest { + // (undocumented) + indexType?: string; + // Warning: (ae-forgotten-export) The symbol "ISearchRequestParams" needs to be exported by the entry point index.d.ts + // + // (undocumented) + params?: ISearchRequestParams; +} + +// Warning: (ae-forgotten-export) The symbol "IKibanaSearchResponse" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "IEsSearchResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface IEsSearchResponse extends IKibanaSearchResponse { + isPartial?: boolean; + isRunning?: boolean; + // (undocumented) + rawResponse: SearchResponse; +} + // Warning: (ae-missing-release-tag) "IFieldFormatsRegistry" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -547,8 +571,6 @@ export interface ISearchSetup { export interface ISearchStart { getSearchStrategy: (name: string) => ISearchStrategy; // Warning: (ae-forgotten-export) The symbol "RequestHandlerContext" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "IKibanaSearchRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "IKibanaSearchResponse" needs to be exported by the entry point index.d.ts // // (undocumented) search: (context: RequestHandlerContext, request: IKibanaSearchRequest, options: ISearchOptions) => Promise; @@ -560,9 +582,6 @@ export interface ISearchStart { export interface ISearchStrategy { // (undocumented) cancel?: (context: RequestHandlerContext, id: string) => Promise; - // Warning: (ae-forgotten-export) The symbol "IEsSearchRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "IEsSearchResponse" needs to be exported by the entry point index.d.ts - // // (undocumented) search: (context: RequestHandlerContext, request: IEsSearchRequest, options?: ISearchOptions) => Promise; } @@ -817,13 +836,13 @@ export function usageProvider(core: CoreSetup_2): SearchUsage; // src/plugins/data/server/index.ts:101:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:127:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:127:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:180:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:181:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:182:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:183:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:184:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:185:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:188:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:185:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:186:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:187:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:188:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:189:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:190:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:193:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/x-pack/plugins/data_enhanced/common/index.ts b/x-pack/plugins/data_enhanced/common/index.ts index 4d38e5486907c..1f1cd938c97d1 100644 --- a/x-pack/plugins/data_enhanced/common/index.ts +++ b/x-pack/plugins/data_enhanced/common/index.ts @@ -4,9 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { - EnhancedSearchParams, - IEnhancedEsSearchRequest, - IAsyncSearchRequest, - IAsyncSearchResponse, -} from './search'; +export { EnhancedSearchParams, IEnhancedEsSearchRequest, IAsyncSearchRequest } from './search'; diff --git a/x-pack/plugins/data_enhanced/common/search/index.ts b/x-pack/plugins/data_enhanced/common/search/index.ts index 9137e551adeb2..129e412a47ccf 100644 --- a/x-pack/plugins/data_enhanced/common/search/index.ts +++ b/x-pack/plugins/data_enhanced/common/search/index.ts @@ -4,9 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { - EnhancedSearchParams, - IEnhancedEsSearchRequest, - IAsyncSearchRequest, - IAsyncSearchResponse, -} from './types'; +export { EnhancedSearchParams, IEnhancedEsSearchRequest, IAsyncSearchRequest } from './types'; diff --git a/x-pack/plugins/data_enhanced/common/search/types.ts b/x-pack/plugins/data_enhanced/common/search/types.ts index c29deee5e4cb3..a5d7d326cecd5 100644 --- a/x-pack/plugins/data_enhanced/common/search/types.ts +++ b/x-pack/plugins/data_enhanced/common/search/types.ts @@ -4,11 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - IEsSearchRequest, - IEsSearchResponse, - ISearchRequestParams, -} from '../../../../../src/plugins/data/common'; +import { IEsSearchRequest, ISearchRequestParams } from '../../../../../src/plugins/data/common'; export interface EnhancedSearchParams extends ISearchRequestParams { ignoreThrottled: boolean; @@ -23,17 +19,6 @@ export interface IAsyncSearchRequest extends IEsSearchRequest { params?: EnhancedSearchParams; } -export interface IAsyncSearchResponse extends IEsSearchResponse { - /** - * Indicates whether async search is still in flight - */ - is_running?: boolean; - /** - * Indicates whether the results returned are complete or partial - */ - is_partial?: boolean; -} - export interface IEnhancedEsSearchRequest extends IEsSearchRequest { /** * Used to determine whether to use the _rollups_search or a regular search endpoint. diff --git a/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts b/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts index 639f56d0cafca..d004511fa4674 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts @@ -72,8 +72,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, rawResponse: { took: 1, @@ -99,8 +99,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: true, + isPartial: false, + isRunning: true, id: 1, rawResponse: { took: 1, @@ -110,8 +110,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 20, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, rawResponse: { took: 1, @@ -144,8 +144,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: true, - is_running: false, + isPartial: true, + isRunning: false, id: 1, }, }, @@ -168,8 +168,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 500, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, @@ -194,16 +194,16 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: true, + isPartial: false, + isRunning: true, id: 1, }, }, { time: 300, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, @@ -238,8 +238,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 2000, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, @@ -262,16 +262,16 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: true, + isPartial: false, + isRunning: true, id: 1, }, }, { time: 2000, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, @@ -302,8 +302,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: true, + isPartial: false, + isRunning: true, id: 1, }, }, @@ -311,8 +311,8 @@ describe('EnhancedSearchInterceptor', () => { time: 10, value: { error: 'oh no', - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, isError: true, @@ -346,16 +346,16 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, { time: 20, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, @@ -380,8 +380,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 250, value: { - is_partial: true, - is_running: true, + isPartial: true, + isRunning: true, id: 1, rawResponse: { took: 1, @@ -391,8 +391,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 2000, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, rawResponse: { took: 1, diff --git a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts index 9662b9e17248b..bff9e2cb9048c 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Observable, throwError, EMPTY, timer, from } from 'rxjs'; +import { throwError, EMPTY, timer, from } from 'rxjs'; import { mergeMap, expand, takeUntil, finalize, tap } from 'rxjs/operators'; import { getLongQueryNotification } from './long_query_notification'; import { @@ -14,7 +14,7 @@ import { } from '../../../../../src/plugins/data/public'; import { AbortError, toPromise } from '../../../../../src/plugins/data/common'; import { IAsyncSearchOptions } from '.'; -import { IAsyncSearchRequest, IAsyncSearchResponse } from '../../common'; +import { IAsyncSearchRequest } from '../../common'; export class EnhancedSearchInterceptor extends SearchInterceptor { /** @@ -67,7 +67,7 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { public search( request: IAsyncSearchRequest, { pollInterval = 1000, ...options }: IAsyncSearchOptions = {} - ): Observable { + ) { let { id } = request; request.params = { @@ -80,15 +80,15 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { this.pendingCount$.next(++this.pendingCount); - return (this.runSearch(request, combinedSignal) as Observable).pipe( - expand((response: IAsyncSearchResponse) => { + return this.runSearch(request, combinedSignal, options?.strategy).pipe( + expand((response) => { // If the response indicates of an error, stop polling and complete the observable - if (!response || (!response.is_running && response.is_partial)) { + if (!response || (!response.isRunning && response.isPartial)) { return throwError(new AbortError()); } // If the response indicates it is complete, stop polling and complete the observable - if (!response.is_running) { + if (!response.isRunning) { return EMPTY; } @@ -97,7 +97,7 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { return timer(pollInterval).pipe( // Send future requests using just the ID from the response mergeMap(() => { - return this.runSearch({ id }, combinedSignal) as Observable; + return this.runSearch({ id }, combinedSignal, options?.strategy); }) ); }), diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts index 0ed5485cfb6c9..95f1285363f49 100644 --- a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts @@ -128,8 +128,8 @@ async function asyncSearch( return { id, - is_partial, - is_running, + isPartial: is_partial, + isRunning: is_running, rawResponse: shimHitsTotal(response), ...getTotalLoaded(response._shards), }; From a81059b14baebcd60e499fd3eaef425f00e91163 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Wed, 12 Aug 2020 09:24:43 +0100 Subject: [PATCH 066/113] [ML] Removing full lodash library imports (#74742) * [ML] Removing full lodash library imports * more has * fixing missing filter * removing _ * removing unused file * removing first use * removing comment --- x-pack/plugins/ml/common/util/job_utils.ts | 18 +++-- .../annotations_table/annotations_table.js | 14 ++-- .../anomalies_table/anomalies_table.js | 4 +- .../anomalies_table_columns.js | 4 +- .../anomalies_table/anomaly_details.js | 15 ++-- .../anomalies_table/influencers_cell.js | 4 +- .../components/anomalies_table/links_menu.js | 12 +-- .../explorer_chart_config_builder.js | 4 +- .../explorer_chart_distribution.js | 14 ++-- .../explorer_chart_single_metric.js | 14 ++-- .../explorer_charts_container_service.js | 59 +++++++------- .../explorer_charts_container_service.test.js | 10 +-- .../explorer/explorer_swimlane.tsx | 20 ++--- .../application/services/forecast_service.js | 34 ++++---- .../application/services/job_service.js | 48 ++++++----- .../application/services/mapping_service.js | 6 +- .../results_service/result_service_rx.ts | 35 ++++---- .../results_service/results_service.js | 81 ++++++++++--------- .../forecasting_modal/forecasting_modal.js | 8 +- .../timeseries_chart/timeseries_chart.js | 42 +++++----- .../timeseries_search_service.ts | 27 ++++--- .../timeseriesexplorer_utils.js | 34 ++++---- .../application/util/chart_config_builder.js | 11 +-- .../ml/public/application/util/inherits.js | 36 --------- .../public/application/util/time_buckets.js | 18 +++-- .../ml/server/lib/telemetry/telemetry.ts | 4 +- .../models/annotation_service/annotation.ts | 9 ++- .../bucket_span_estimator.js | 25 +++--- .../polled_data_checker.js | 4 +- .../models/data_visualizer/data_visualizer.ts | 77 +++++++++--------- .../validate_cardinality.test.ts | 14 ++-- .../validate_time_range.test.ts | 4 +- .../build_anomaly_table_items.js | 13 +-- .../models/results_service/results_service.ts | 14 ++-- 34 files changed, 365 insertions(+), 371 deletions(-) delete mode 100644 x-pack/plugins/ml/public/application/util/inherits.js diff --git a/x-pack/plugins/ml/common/util/job_utils.ts b/x-pack/plugins/ml/common/util/job_utils.ts index bb0e351ebfec8..8e6933ed5924f 100644 --- a/x-pack/plugins/ml/common/util/job_utils.ts +++ b/x-pack/plugins/ml/common/util/job_utils.ts @@ -4,7 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import isEmpty from 'lodash/isEmpty'; +import isEqual from 'lodash/isEqual'; +import each from 'lodash/each'; +import pick from 'lodash/pick'; + import semver from 'semver'; import moment, { Duration } from 'moment'; // @ts-ignore @@ -307,7 +311,7 @@ export function getSafeAggregationName(fieldName: string, index: number): string export function uniqWithIsEqual(arr: T): T { return arr.reduce((dedupedArray, value) => { - if (dedupedArray.filter((compareValue: any) => _.isEqual(compareValue, value)).length === 0) { + if (dedupedArray.filter((compareValue: any) => isEqual(compareValue, value)).length === 0) { dedupedArray.push(value); } return dedupedArray; @@ -328,7 +332,7 @@ export function basicJobValidation( if (job) { // Job details - if (_.isEmpty(job.job_id)) { + if (isEmpty(job.job_id)) { messages.push({ id: 'job_id_empty' }); valid = false; } else if (isJobIdValid(job.job_id) === false) { @@ -350,7 +354,7 @@ export function basicJobValidation( // Analysis Configuration if (job.analysis_config.categorization_filters) { let v = true; - _.each(job.analysis_config.categorization_filters, (d) => { + each(job.analysis_config.categorization_filters, (d) => { try { new RegExp(d); } catch (e) { @@ -382,8 +386,8 @@ export function basicJobValidation( valid = false; } else { let v = true; - _.each(job.analysis_config.detectors, (d) => { - if (_.isEmpty(d.function)) { + each(job.analysis_config.detectors, (d) => { + if (isEmpty(d.function)) { v = false; } }); @@ -400,7 +404,7 @@ export function basicJobValidation( // create an array of objects with a subset of the attributes // where we want to make sure they are not be the same across detectors const compareSubSet = job.analysis_config.detectors.map((d) => - _.pick(d, [ + pick(d, [ 'function', 'field_name', 'by_field_name', diff --git a/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js b/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js index 69f7635a66032..c6ca4fb821984 100644 --- a/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js +++ b/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js @@ -9,7 +9,9 @@ * This version supports both fetching the annotations by itself (used in the jobs list) and * getting the annotations via props (used in Anomaly Explorer and Single Series Viewer). */ -import _ from 'lodash'; + +import uniq from 'lodash/uniq'; + import PropTypes from 'prop-types'; import rison from 'rison-node'; import React, { Component, Fragment } from 'react'; @@ -255,18 +257,18 @@ export class AnnotationsTable extends Component { // if the annotation is at the series level // then pass the partitioning field(s) and detector index to the Single Metric Viewer - if (_.has(annotation, 'detector_index')) { + if (annotation.detector_index !== undefined) { mlTimeSeriesExplorer.detectorIndex = annotation.detector_index; } - if (_.has(annotation, 'partition_field_value')) { + if (annotation.partition_field_value !== undefined) { entityCondition[annotation.partition_field_name] = annotation.partition_field_value; } - if (_.has(annotation, 'over_field_value')) { + if (annotation.over_field_value !== undefined) { entityCondition[annotation.over_field_name] = annotation.over_field_value; } - if (_.has(annotation, 'by_field_value')) { + if (annotation.by_field_value !== undefined) { // Note that analyses with by and over fields, will have a top-level by_field_name, // but the by_field_value(s) will be in the nested causes array. entityCondition[annotation.by_field_name] = annotation.by_field_value; @@ -421,7 +423,7 @@ export class AnnotationsTable extends Component { }, ]; - const jobIds = _.uniq(annotations.map((a) => a.job_id)); + const jobIds = uniq(annotations.map((a) => a.job_id)); if (jobIds.length > 1) { columns.unshift({ field: 'job_id', diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js index 2a890f75fecd8..378ee82805173 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js @@ -9,7 +9,7 @@ */ import PropTypes from 'prop-types'; -import _ from 'lodash'; +import get from 'lodash/get'; import React, { Component } from 'react'; @@ -70,7 +70,7 @@ class AnomaliesTable extends Component { } else { const examples = item.entityName === 'mlcategory' - ? _.get(this.props.tableData, ['examplesByJobId', item.jobId, item.entityValue]) + ? get(this.props.tableData, ['examplesByJobId', item.jobId, item.entityValue]) : undefined; let definition = undefined; diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js index af7c6c8e289f3..57f3a08713ffe 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js @@ -7,7 +7,7 @@ import { EuiButtonIcon, EuiLink, EuiScreenReaderOnly } from '@elastic/eui'; import React from 'react'; -import _ from 'lodash'; +import get from 'lodash/get'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -251,7 +251,7 @@ export function getColumns( sortable: false, truncateText: true, render: (item) => { - const examples = _.get(examplesByJobId, [item.jobId, item.entityValue], []); + const examples = get(examplesByJobId, [item.jobId, item.entityValue], []); return ( { - const simplified = _.pick(cause, 'typical', 'actual', 'probability'); + const simplified = pick(cause, 'typical', 'actual', 'probability'); // Get the 'entity field name/value' to display in the cause - // For by and over, use by_field_name/value (over_field_name/value are in the top level fields) // For just an 'over' field - the over_field_name/value appear in both top level and cause. - simplified.entityName = _.has(cause, 'by_field_name') - ? cause.by_field_name - : cause.over_field_name; - simplified.entityValue = _.has(cause, 'by_field_value') - ? cause.by_field_value - : cause.over_field_value; + simplified.entityName = cause.by_field_name ? cause.by_field_name : cause.over_field_name; + simplified.entityValue = cause.by_field_value ? cause.by_field_value : cause.over_field_value; return simplified; }); } @@ -471,7 +468,7 @@ export class AnomalyDetails extends Component { renderDetails() { const detailItems = getDetailsItems(this.props.anomaly, this.props.examples, this.props.filter); - const isInterimResult = _.get(this.props.anomaly, 'source.is_interim', false); + const isInterimResult = get(this.props.anomaly, 'source.is_interim', false); return ( diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/influencers_cell.js b/x-pack/plugins/ml/public/application/components/anomalies_table/influencers_cell.js index 2e42606c048d7..abdb0961351ab 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/influencers_cell.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/influencers_cell.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import each from 'lodash/each'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; @@ -148,7 +148,7 @@ export class InfluencersCell extends Component { const influencers = []; recordInfluencers.forEach((influencer) => { - _.each(influencer, (influencerFieldValue, influencerFieldName) => { + each(influencer, (influencerFieldValue, influencerFieldName) => { influencers.push({ influencerFieldName, influencerFieldValue, diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js index f603264896cd3..0e4d736a01e47 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; import moment from 'moment'; import rison from 'rison-node'; import PropTypes from 'prop-types'; @@ -58,7 +58,7 @@ class LinksMenuUI extends Component { // If url_value contains $earliest$ and $latest$ tokens, add in times to the source record. // Create a copy of the record as we are adding properties into it. - const record = _.cloneDeep(anomaly.source); + const record = cloneDeep(anomaly.source); const timestamp = record.timestamp; const configuredUrlValue = customUrl.url_value; const timeRangeInterval = parseInterval(customUrl.time_range); @@ -99,7 +99,7 @@ class LinksMenuUI extends Component { if ( (configuredUrlValue.includes('$mlcategoryterms$') || configuredUrlValue.includes('$mlcategoryregex$')) && - _.has(record, 'mlcategory') + record.mlcategory !== undefined ) { const jobId = record.job_id; @@ -156,15 +156,15 @@ class LinksMenuUI extends Component { // Extract the by, over and partition fields for the record. const entityCondition = {}; - if (_.has(record, 'partition_field_value')) { + if (record.partition_field_value !== undefined) { entityCondition[record.partition_field_name] = record.partition_field_value; } - if (_.has(record, 'over_field_value')) { + if (record.over_field_value !== undefined) { entityCondition[record.over_field_name] = record.over_field_value; } - if (_.has(record, 'by_field_value')) { + if (record.by_field_value !== undefined) { // Note that analyses with by and over fields, will have a top-level by_field_name, // but the by_field_value(s) will be in the nested causes array. // TODO - drilldown from cause in expanded row only? diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_config_builder.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_config_builder.js index b5e9daad7d1c1..b75784c95c520 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_config_builder.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_config_builder.js @@ -9,8 +9,6 @@ * the raw data in the Explorer dashboard. */ -import _ from 'lodash'; - import { parseInterval } from '../../../../common/util/parse_interval'; import { getEntityFieldList } from '../../../../common/util/anomaly_utils'; import { buildConfigFromDetector } from '../../util/chart_config_builder'; @@ -30,7 +28,7 @@ export function buildConfig(record) { config.detectorLabel = record.function; if ( - _.has(mlJobService.detectorsByJob, record.job_id) && + mlJobService.detectorsByJob[record.job_id] !== undefined && detectorIndex < mlJobService.detectorsByJob[record.job_id].length ) { config.detectorLabel = diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js index 7a18914957ba9..00aca5d43be85 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js @@ -11,8 +11,8 @@ import PropTypes from 'prop-types'; import React from 'react'; +import { i18n } from '@kbn/i18n'; -import _ from 'lodash'; import d3 from 'd3'; import $ from 'jquery'; import moment from 'moment'; @@ -33,8 +33,6 @@ import { mlFieldFormatService } from '../../services/field_format_service'; import { CHART_TYPE } from '../explorer_constants'; -import { i18n } from '@kbn/i18n'; - const CONTENT_WRAPPER_HEIGHT = 215; // If a rare/event-distribution chart has a cardinality of 10 or less, @@ -403,7 +401,7 @@ export class ExplorerChartDistribution extends React.Component { .attr('cy', (d) => lineChartYScale(d[CHART_Y_ATTRIBUTE])) .attr('class', (d) => { let markerClass = 'metric-value'; - if (_.has(d, 'anomalyScore') && Number(d.anomalyScore) >= severity) { + if (d.anomalyScore !== undefined && Number(d.anomalyScore) >= severity) { markerClass += ' anomaly-marker '; markerClass += getSeverityWithLow(d.anomalyScore).id; } @@ -444,7 +442,7 @@ export class ExplorerChartDistribution extends React.Component { const tooltipData = [{ label: formattedDate }]; const seriesKey = config.detectorLabel; - if (_.has(marker, 'entity')) { + if (marker.entity !== undefined) { tooltipData.push({ label: i18n.translate('xpack.ml.explorer.distributionChart.entityLabel', { defaultMessage: 'entity', @@ -457,7 +455,7 @@ export class ExplorerChartDistribution extends React.Component { }); } - if (_.has(marker, 'anomalyScore')) { + if (marker.anomalyScore !== undefined) { const score = parseInt(marker.anomalyScore); const displayScore = score > 0 ? score : '< 1'; tooltipData.push({ @@ -494,7 +492,7 @@ export class ExplorerChartDistribution extends React.Component { valueAccessor: 'typical', }); } - if (typeof marker.byFieldName !== 'undefined' && _.has(marker, 'numberOfCauses')) { + if (typeof marker.byFieldName !== 'undefined' && marker.numberOfCauses !== undefined) { tooltipData.push({ label: i18n.translate( 'xpack.ml.explorer.distributionChart.unusualByFieldValuesLabel', @@ -532,7 +530,7 @@ export class ExplorerChartDistribution extends React.Component { }); } - if (_.has(marker, 'scheduledEvents')) { + if (marker.scheduledEvents !== undefined) { marker.scheduledEvents.forEach((scheduledEvent, i) => { tooltipData.push({ label: i18n.translate( diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js index 63775c5ca312e..4d53e747d4855 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js @@ -12,10 +12,10 @@ import PropTypes from 'prop-types'; import React from 'react'; -import _ from 'lodash'; import d3 from 'd3'; import $ from 'jquery'; import moment from 'moment'; +import { i18n } from '@kbn/i18n'; import { formatHumanReadableDateTime } from '../../util/date_utils'; import { formatValue } from '../../formatters/format_value'; @@ -40,8 +40,6 @@ import { getTimeBucketsFromCache } from '../../util/time_buckets'; import { mlEscape } from '../../util/string_utils'; import { mlFieldFormatService } from '../../services/field_format_service'; -import { i18n } from '@kbn/i18n'; - const CONTENT_WRAPPER_HEIGHT = 215; const CONTENT_WRAPPER_CLASS = 'ml-explorer-chart-content-wrapper'; @@ -307,7 +305,7 @@ export class ExplorerChartSingleMetric extends React.Component { .on('mouseout', () => tooltipService.hide()); const isAnomalyVisible = (d) => - _.has(d, 'anomalyScore') && Number(d.anomalyScore) >= severity; + d.anomalyScore !== undefined && Number(d.anomalyScore) >= severity; // Update all dots to new positions. dots @@ -380,7 +378,7 @@ export class ExplorerChartSingleMetric extends React.Component { const tooltipData = [{ label: formattedDate }]; const seriesKey = config.detectorLabel; - if (_.has(marker, 'anomalyScore')) { + if (marker.anomalyScore !== undefined) { const score = parseInt(marker.anomalyScore); const displayScore = score > 0 ? score : '< 1'; tooltipData.push({ @@ -411,7 +409,7 @@ export class ExplorerChartSingleMetric extends React.Component { // Show actual/typical when available except for rare detectors. // Rare detectors always have 1 as actual and the probability as typical. // Exposing those values in the tooltip with actual/typical labels might irritate users. - if (_.has(marker, 'actual') && config.functionDescription !== 'rare') { + if (marker.actual !== undefined && config.functionDescription !== 'rare') { // Display the record actual in preference to the chart value, which may be // different depending on the aggregation interval of the chart. tooltipData.push({ @@ -445,7 +443,7 @@ export class ExplorerChartSingleMetric extends React.Component { }, valueAccessor: 'value', }); - if (_.has(marker, 'byFieldName') && _.has(marker, 'numberOfCauses')) { + if (marker.byFieldName !== undefined && marker.numberOfCauses !== undefined) { tooltipData.push({ label: i18n.translate( 'xpack.ml.explorer.distributionChart.unusualByFieldValuesLabel', @@ -483,7 +481,7 @@ export class ExplorerChartSingleMetric extends React.Component { }); } - if (_.has(marker, 'scheduledEvents')) { + if (marker.scheduledEvents !== undefined) { tooltipData.push({ label: i18n.translate('xpack.ml.explorer.singleMetricChart.scheduledEventsLabel', { defaultMessage: 'Scheduled events', diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.js index 1b83a4ed30560..712b64af2db80 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.js @@ -11,7 +11,12 @@ * and manages the layout of the charts in the containing div. */ -import _ from 'lodash'; +import get from 'lodash/get'; +import each from 'lodash/each'; +import find from 'lodash/find'; +import sortBy from 'lodash/sortBy'; +import map from 'lodash/map'; +import reduce from 'lodash/reduce'; import { buildConfig } from './explorer_chart_config_builder'; import { chartLimits, getChartType } from '../../util/chart_utils'; @@ -113,7 +118,7 @@ export const anomalyDataChange = function ( // If source data can be plotted, use that, otherwise model plot will be available. const useSourceData = isSourceDataChartableForDetector(job, detectorIndex); if (useSourceData === true) { - const datafeedQuery = _.get(config, 'datafeedConfig.query', null); + const datafeedQuery = get(config, 'datafeedConfig.query', null); return mlResultsService .getMetricData( config.datafeedConfig.indices, @@ -131,8 +136,8 @@ export const anomalyDataChange = function ( // Extract the partition, by, over fields on which to filter. const criteriaFields = []; const detector = job.analysis_config.detectors[detectorIndex]; - if (_.has(detector, 'partition_field_name')) { - const partitionEntity = _.find(entityFields, { + if (detector.partition_field_name !== undefined) { + const partitionEntity = find(entityFields, { fieldName: detector.partition_field_name, }); if (partitionEntity !== undefined) { @@ -143,8 +148,8 @@ export const anomalyDataChange = function ( } } - if (_.has(detector, 'over_field_name')) { - const overEntity = _.find(entityFields, { fieldName: detector.over_field_name }); + if (detector.over_field_name !== undefined) { + const overEntity = find(entityFields, { fieldName: detector.over_field_name }); if (overEntity !== undefined) { criteriaFields.push( { fieldName: 'over_field_name', fieldValue: overEntity.fieldName }, @@ -153,8 +158,8 @@ export const anomalyDataChange = function ( } } - if (_.has(detector, 'by_field_name')) { - const byEntity = _.find(entityFields, { fieldName: detector.by_field_name }); + if (detector.by_field_name !== undefined) { + const byEntity = find(entityFields, { fieldName: detector.by_field_name }); if (byEntity !== undefined) { criteriaFields.push( { fieldName: 'by_field_name', fieldValue: byEntity.fieldName }, @@ -236,7 +241,7 @@ export const anomalyDataChange = function ( filterField = config.entityFields.find((f) => f.fieldType === 'partition'); } - const datafeedQuery = _.get(config, 'datafeedConfig.query', null); + const datafeedQuery = get(config, 'datafeedConfig.query', null); return mlResultsService.getEventDistributionData( config.datafeedConfig.indices, splitField, @@ -285,7 +290,7 @@ export const anomalyDataChange = function ( if (eventDistribution.length > 0 && records.length > 0) { const filterField = records[0].by_field_value || records[0].over_field_value; chartData = eventDistribution.filter((d) => d.entity !== filterField); - _.map(metricData, (value, time) => { + map(metricData, (value, time) => { // The filtering for rare/event_distribution charts needs to be handled // differently because of how the source data is structured. // For rare chart values we are only interested wether a value is either `0` or not, @@ -304,7 +309,7 @@ export const anomalyDataChange = function ( } }); } else { - chartData = _.map(metricData, (value, time) => ({ + chartData = map(metricData, (value, time) => ({ date: +time, value: value, })); @@ -314,7 +319,7 @@ export const anomalyDataChange = function ( // Iterate through the anomaly records, adding anomalyScore properties // to the chartData entries for anomalous buckets. const chartDataForPointSearch = getChartDataForPointSearch(chartData, records[0], chartType); - _.each(records, (record) => { + each(records, (record) => { // Look for a chart point with the same time as the record. // If none found, insert a point for anomalies due to a gap in the data. const recordTime = record[ML_TIME_FIELD_NAME]; @@ -330,13 +335,13 @@ export const anomalyDataChange = function ( chartPoint.actual = record.actual; chartPoint.typical = record.typical; } else { - const causes = _.get(record, 'causes', []); + const causes = get(record, 'causes', []); if (causes.length > 0) { chartPoint.byFieldName = record.by_field_name; chartPoint.numberOfCauses = causes.length; if (causes.length === 1) { // If only a single cause, copy actual and typical values to the top level. - const cause = _.first(record.causes); + const cause = record.causes[0]; chartPoint.actual = cause.actual; chartPoint.typical = cause.typical; } @@ -351,7 +356,7 @@ export const anomalyDataChange = function ( // Add a scheduledEvents property to any points in the chart data set // which correspond to times of scheduled events for the job. if (scheduledEvents !== undefined) { - _.each(scheduledEvents, (events, time) => { + each(scheduledEvents, (events, time) => { const chartPoint = findChartPointForTime(chartDataForPointSearch, Number(time)); if (chartPoint !== undefined) { // Note if the scheduled event coincides with an absence of the underlying metric data, @@ -385,10 +390,10 @@ export const anomalyDataChange = function ( .then((response) => { // calculate an overall min/max for all series const processedData = response.map(processChartData); - const allDataPoints = _.reduce( + const allDataPoints = reduce( processedData, (datapoints, series) => { - _.each(series, (d) => datapoints.push(d)); + each(series, (d) => datapoints.push(d)); return datapoints; }, [] @@ -420,7 +425,7 @@ function processRecordsForDisplay(anomalyRecords) { // Aggregate by job, detector, and analysis fields (partition, by, over). const aggregatedData = {}; - _.each(anomalyRecords, (record) => { + each(anomalyRecords, (record) => { // Check if we can plot a chart for this record, depending on whether the source data // is chartable, and if model plot is enabled for the job. const job = mlJobService.getJob(record.job_id); @@ -524,20 +529,20 @@ function processRecordsForDisplay(anomalyRecords) { let recordsForSeries = []; // Convert to an array of the records with the highest record_score per unique series. - _.each(aggregatedData, (detectorsForJob) => { - _.each(detectorsForJob, (groupsForDetector) => { + each(aggregatedData, (detectorsForJob) => { + each(detectorsForJob, (groupsForDetector) => { if (groupsForDetector.maxScoreRecord !== undefined) { // Detector with no partition / by field. recordsForSeries.push(groupsForDetector.maxScoreRecord); } else { - _.each(groupsForDetector, (valuesForGroup) => { - _.each(valuesForGroup, (dataForGroupValue) => { + each(groupsForDetector, (valuesForGroup) => { + each(valuesForGroup, (dataForGroupValue) => { if (dataForGroupValue.maxScoreRecord !== undefined) { recordsForSeries.push(dataForGroupValue.maxScoreRecord); } else { // Second level of aggregation for partition and by/over. - _.each(dataForGroupValue, (splitsForGroup) => { - _.each(splitsForGroup, (dataForSplitValue) => { + each(dataForGroupValue, (splitsForGroup) => { + each(splitsForGroup, (dataForSplitValue) => { recordsForSeries.push(dataForSplitValue.maxScoreRecord); }); }); @@ -547,7 +552,7 @@ function processRecordsForDisplay(anomalyRecords) { } }); }); - recordsForSeries = _.sortBy(recordsForSeries, 'record_score').reverse(); + recordsForSeries = sortBy(recordsForSeries, 'record_score').reverse(); return recordsForSeries; } @@ -564,7 +569,7 @@ function calculateChartRange( // Calculate the time range for the charts. // Fit in as many points in the available container width plotted at the job bucket span. const midpointMs = Math.ceil((earliestMs + latestMs) / 2); - const maxBucketSpanMs = Math.max.apply(null, _.map(seriesConfigs, 'bucketSpanSeconds')) * 1000; + const maxBucketSpanMs = Math.max.apply(null, map(seriesConfigs, 'bucketSpanSeconds')) * 1000; const pointsToPlotFullSelection = Math.ceil((latestMs - earliestMs) / maxBucketSpanMs); @@ -588,7 +593,7 @@ function calculateChartRange( let minMs = recordsToPlot[0][timeFieldName]; let maxMs = recordsToPlot[0][timeFieldName]; - _.each(recordsToPlot, (record) => { + each(recordsToPlot, (record) => { const diffMs = maxMs - minMs; if (diffMs < maxTimeSpan) { const recordTime = record[timeFieldName]; diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.test.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.test.js index 433aa65cc5dd4..a7d422d161108 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.test.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.test.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; import mockAnomalyChartRecords from './__mocks__/mock_anomaly_chart_records.json'; import mockDetectorsByJob from './__mocks__/mock_detectors_by_job.json'; @@ -24,10 +24,10 @@ import mockSeriesPromisesResponse from './__mocks__/mock_series_promises_respons // suitable responses from the mocked services. The mocked services check against the // provided alternative values and return specific modified mock responses for the test case. -const mockJobConfigClone = _.cloneDeep(mockJobConfig); +const mockJobConfigClone = cloneDeep(mockJobConfig); // adjust mock data to tests against null/0 values -const mockMetricClone = _.cloneDeep(mockSeriesPromisesResponse[0][0]); +const mockMetricClone = cloneDeep(mockSeriesPromisesResponse[0][0]); mockMetricClone.results['1486712700000'] = null; mockMetricClone.results['1486713600000'] = 0; @@ -127,7 +127,7 @@ describe('explorerChartsContainerService', () => { }); test('filtering should skip values of null', (done) => { - const mockAnomalyChartRecordsClone = _.cloneDeep(mockAnomalyChartRecords).map((d) => { + const mockAnomalyChartRecordsClone = cloneDeep(mockAnomalyChartRecords).map((d) => { d.job_id = 'mock-job-id-distribution'; return d; }); @@ -151,7 +151,7 @@ describe('explorerChartsContainerService', () => { }); test('field value with trailing dot should not throw an error', (done) => { - const mockAnomalyChartRecordsClone = _.cloneDeep(mockAnomalyChartRecords); + const mockAnomalyChartRecordsClone = cloneDeep(mockAnomalyChartRecords); mockAnomalyChartRecordsClone[1].partition_field_value = 'AAL.'; expect(() => { diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx b/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx index 2590ab2f1cb23..05e082711f619 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx +++ b/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx @@ -10,7 +10,9 @@ import React from 'react'; import './_explorer.scss'; -import _, { isEqual } from 'lodash'; +import isEqual from 'lodash/isEqual'; +import uniq from 'lodash/uniq'; +import get from 'lodash/get'; import d3 from 'd3'; import moment from 'moment'; import DragSelect from 'dragselect'; @@ -176,9 +178,9 @@ export class ExplorerSwimlane extends React.Component { } ); - selectedData.laneLabels = _.uniq(selectedData.laneLabels); - selectedData.times = _.uniq(selectedData.times); - if (_.isEqual(selectedData, previousSelectedData) === false) { + selectedData.laneLabels = uniq(selectedData.laneLabels); + selectedData.times = uniq(selectedData.times); + if (isEqual(selectedData, previousSelectedData) === false) { // If no cells containing anomalies have been selected, // immediately clear the selection, otherwise trigger // a reload with the updated selected cells. @@ -246,7 +248,7 @@ export class ExplorerSwimlane extends React.Component { selectedTimes: d3.extent(times), }; - if (_.isEqual(oldSelection, newSelection)) { + if (isEqual(oldSelection, newSelection)) { triggerNewSelection = false; } @@ -277,8 +279,8 @@ export class ExplorerSwimlane extends React.Component { // Check for selection and reselect the corresponding swimlane cell // if the time range and lane label are still in view. const selectionState = selection; - const selectedType = _.get(selectionState, 'type', undefined); - const selectionViewByFieldName = _.get(selectionState, 'viewByFieldName', ''); + const selectedType = get(selectionState, 'type', undefined); + const selectionViewByFieldName = get(selectionState, 'viewByFieldName', ''); // If a selection was done in the other swimlane, add the "masked" classes // to de-emphasize the swimlane cells. @@ -288,8 +290,8 @@ export class ExplorerSwimlane extends React.Component { } const cellsToSelect: Node[] = []; - const selectedLanes = _.get(selectionState, 'lanes', []); - const selectedTimes = _.get(selectionState, 'times', []); + const selectedLanes = get(selectionState, 'lanes', []); + const selectedTimes = get(selectionState, 'times', []); const selectedTimeExtent = d3.extent(selectedTimes); if ( diff --git a/x-pack/plugins/ml/public/application/services/forecast_service.js b/x-pack/plugins/ml/public/application/services/forecast_service.js index ed5a29ff74a63..57e50387a03ab 100644 --- a/x-pack/plugins/ml/public/application/services/forecast_service.js +++ b/x-pack/plugins/ml/public/application/services/forecast_service.js @@ -6,7 +6,9 @@ // Service for carrying out requests to run ML forecasts and to obtain // data on forecasts that have been performed. -import _ from 'lodash'; +import get from 'lodash/get'; +import find from 'lodash/find'; +import each from 'lodash/each'; import { map } from 'rxjs/operators'; import { ml } from './ml_api_service'; @@ -129,8 +131,8 @@ function getForecastDateRange(job, forecastId) { }, }) .then((resp) => { - obj.earliest = _.get(resp, 'aggregations.earliest.value', null); - obj.latest = _.get(resp, 'aggregations.latest.value', null); + obj.earliest = get(resp, 'aggregations.earliest.value', null); + obj.latest = get(resp, 'aggregations.latest.value', null); if (obj.earliest === null || obj.latest === null) { reject(resp); } else { @@ -157,8 +159,8 @@ function getForecastData( // Extract the partition, by, over fields on which to filter. const criteriaFields = []; const detector = job.analysis_config.detectors[detectorIndex]; - if (_.has(detector, 'partition_field_name')) { - const partitionEntity = _.find(entityFields, { fieldName: detector.partition_field_name }); + if (detector.partition_field_name !== undefined) { + const partitionEntity = find(entityFields, { fieldName: detector.partition_field_name }); if (partitionEntity !== undefined) { criteriaFields.push( { fieldName: 'partition_field_name', fieldValue: partitionEntity.fieldName }, @@ -167,8 +169,8 @@ function getForecastData( } } - if (_.has(detector, 'over_field_name')) { - const overEntity = _.find(entityFields, { fieldName: detector.over_field_name }); + if (detector.over_field_name !== undefined) { + const overEntity = find(entityFields, { fieldName: detector.over_field_name }); if (overEntity !== undefined) { criteriaFields.push( { fieldName: 'over_field_name', fieldValue: overEntity.fieldName }, @@ -177,8 +179,8 @@ function getForecastData( } } - if (_.has(detector, 'by_field_name')) { - const byEntity = _.find(entityFields, { fieldName: detector.by_field_name }); + if (detector.by_field_name !== undefined) { + const byEntity = find(entityFields, { fieldName: detector.by_field_name }); if (byEntity !== undefined) { criteriaFields.push( { fieldName: 'by_field_name', fieldValue: byEntity.fieldName }, @@ -222,7 +224,7 @@ function getForecastData( ]; // Add in term queries for each of the specified criteria. - _.each(criteriaFields, (criteria) => { + each(criteriaFields, (criteria) => { filterCriteria.push({ term: { [criteria.fieldName]: criteria.fieldValue, @@ -281,13 +283,13 @@ function getForecastData( }) .pipe( map((resp) => { - const aggregationsByTime = _.get(resp, ['aggregations', 'times', 'buckets'], []); - _.each(aggregationsByTime, (dataForTime) => { + const aggregationsByTime = get(resp, ['aggregations', 'times', 'buckets'], []); + each(aggregationsByTime, (dataForTime) => { const time = dataForTime.key; obj.results[time] = { - prediction: _.get(dataForTime, ['prediction', 'value']), - forecastUpper: _.get(dataForTime, ['forecastUpper', 'value']), - forecastLower: _.get(dataForTime, ['forecastLower', 'value']), + prediction: get(dataForTime, ['prediction', 'value']), + forecastUpper: get(dataForTime, ['forecastUpper', 'value']), + forecastLower: get(dataForTime, ['forecastLower', 'value']), }; }); @@ -355,7 +357,7 @@ function getForecastRequestStats(job, forecastId) { }) .then((resp) => { if (resp.hits.total !== 0) { - obj.stats = _.first(resp.hits.hits)._source; + obj.stats = resp.hits.hits[0]._source; } resolve(obj); }) diff --git a/x-pack/plugins/ml/public/application/services/job_service.js b/x-pack/plugins/ml/public/application/services/job_service.js index 7e90758ffd7db..704d76059f75c 100644 --- a/x-pack/plugins/ml/public/application/services/job_service.js +++ b/x-pack/plugins/ml/public/application/services/job_service.js @@ -4,7 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; +import each from 'lodash/each'; +import find from 'lodash/find'; +import get from 'lodash/get'; +import isNumber from 'lodash/isNumber'; import moment from 'moment'; import { i18n } from '@kbn/i18n'; @@ -135,10 +139,10 @@ class JobService { const jobStats = statsResp.jobs[j]; if (job.job_id === jobStats.job_id) { job.state = jobStats.state; - job.data_counts = _.cloneDeep(jobStats.data_counts); - job.model_size_stats = _.cloneDeep(jobStats.model_size_stats); + job.data_counts = cloneDeep(jobStats.data_counts); + job.model_size_stats = cloneDeep(jobStats.model_size_stats); if (jobStats.node) { - job.node = _.cloneDeep(jobStats.node); + job.node = cloneDeep(jobStats.node); } if (jobStats.open_time) { job.open_time = jobStats.open_time; @@ -212,10 +216,10 @@ class JobService { newJob.state = statsJob.state; newJob.data_counts = {}; newJob.model_size_stats = {}; - newJob.data_counts = _.cloneDeep(statsJob.data_counts); - newJob.model_size_stats = _.cloneDeep(statsJob.model_size_stats); + newJob.data_counts = cloneDeep(statsJob.data_counts); + newJob.model_size_stats = cloneDeep(statsJob.model_size_stats); if (newJob.node) { - newJob.node = _.cloneDeep(statsJob.node); + newJob.node = cloneDeep(statsJob.node); } if (statsJob.open_time) { @@ -352,7 +356,7 @@ class JobService { // create a deep copy of a job object // also remove items from the job which are set by the server and not needed // in the future this formatting could be optional - const tempJob = _.cloneDeep(job); + const tempJob = cloneDeep(job); // remove all of the items which should not be copied // such as counts, state and times @@ -375,7 +379,7 @@ class JobService { delete tempJob.analysis_config.use_per_partition_normalization; - _.each(tempJob.analysis_config.detectors, (d) => { + each(tempJob.analysis_config.detectors, (d) => { delete d.detector_index; }); @@ -469,7 +473,7 @@ class JobService { // find a job based on the id getJob(jobId) { - const job = _.find(jobs, (j) => { + const job = find(jobs, (j) => { return j.job_id === jobId; }); @@ -550,7 +554,7 @@ class JobService { // get fields from detectors if (job.analysis_config.detectors) { - _.each(job.analysis_config.detectors, (dtr) => { + each(job.analysis_config.detectors, (dtr) => { if (dtr.by_field_name) { fields[dtr.by_field_name] = {}; } @@ -568,7 +572,7 @@ class JobService { // get fields from influencers if (job.analysis_config.influencers) { - _.each(job.analysis_config.influencers, (inf) => { + each(job.analysis_config.influencers, (inf) => { fields[inf] = {}; }); } @@ -659,7 +663,7 @@ class JobService { return new Promise((resolve, reject) => { // if the end timestamp is a number, add one ms to it to make it // inclusive of the end of the data - if (_.isNumber(end)) { + if (isNumber(end)) { end++; } @@ -780,7 +784,7 @@ class JobService { }); } }); - _.each(tempGroups, (js, id) => { + each(tempGroups, (js, id) => { groups.push({ id, jobs: js }); }); return groups; @@ -837,9 +841,9 @@ function processBasicJobInfo(localJobService, jobsList) { const customUrlsByJob = {}; // use cloned copy of jobs list so not to alter the original - const jobsListCopy = _.cloneDeep(jobsList); + const jobsListCopy = cloneDeep(jobsList); - _.each(jobsListCopy, (jobObj) => { + each(jobsListCopy, (jobObj) => { const analysisConfig = jobObj.analysis_config; const bucketSpan = parseInterval(analysisConfig.bucket_span); @@ -848,20 +852,20 @@ function processBasicJobInfo(localJobService, jobsList) { bucketSpanSeconds: bucketSpan.asSeconds(), }; - if (_.has(jobObj, 'description') && /^\s*$/.test(jobObj.description) === false) { + if (jobObj.description !== undefined && /^\s*$/.test(jobObj.description) === false) { job.description = jobObj.description; } else { // Just use the id as the description. job.description = jobObj.job_id; } - job.detectors = _.get(analysisConfig, 'detectors', []); + job.detectors = get(analysisConfig, 'detectors', []); detectorsByJob[job.id] = job.detectors; - if (_.has(jobObj, 'custom_settings.custom_urls')) { + if (jobObj.custom_settings !== undefined && jobObj.custom_settings.custom_urls !== undefined) { job.customUrls = []; - _.each(jobObj.custom_settings.custom_urls, (url) => { - if (_.has(url, 'url_name') && _.has(url, 'url_value') && isWebUrl(url.url_value)) { + each(jobObj.custom_settings.custom_urls, (url) => { + if (url.url_name !== undefined && url.url_value !== undefined && isWebUrl(url.url_value)) { // Only make web URLs (i.e. http or https) available in dashboard drilldowns. job.customUrls.push(url); } @@ -897,7 +901,7 @@ function createJobStats(jobsList, jobStats) { const mlNodes = {}; let failedJobs = 0; - _.each(jobsList, (job) => { + each(jobsList, (job) => { if (job.state === 'opened') { jobStats.open.value++; } else if (job.state === 'closed') { diff --git a/x-pack/plugins/ml/public/application/services/mapping_service.js b/x-pack/plugins/ml/public/application/services/mapping_service.js index 52aa5ed7413cb..251bb0bce5690 100644 --- a/x-pack/plugins/ml/public/application/services/mapping_service.js +++ b/x-pack/plugins/ml/public/application/services/mapping_service.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import each from 'lodash/each'; import { ml } from './ml_api_service'; @@ -16,8 +16,8 @@ export function getFieldTypeFromMapping(index, fieldName) { ml.getFieldCaps({ index, fields: [fieldName] }) .then((resp) => { let fieldType = ''; - _.each(resp.fields, (field) => { - _.each(field, (type) => { + each(resp.fields, (field) => { + each(field, (type) => { if (fieldType === '') { fieldType = type.type; } diff --git a/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts b/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts index d7f016b419377..898ca8894cbda 100644 --- a/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts +++ b/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts @@ -13,7 +13,8 @@ // Returned response contains a results property containing the requested aggregation. import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import _ from 'lodash'; +import each from 'lodash/each'; +import get from 'lodash/get'; import { Dictionary } from '../../../../common/types/common'; import { ML_MEDIAN_PERCENTS } from '../../../../common/util/job_utils'; import { JobId } from '../../../../common/types/anomaly_detection_jobs'; @@ -237,7 +238,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { ]; // Add in term queries for each of the specified criteria. - _.each(criteriaFields, (criteria) => { + each(criteriaFields, (criteria) => { mustCriteria.push({ term: { [criteria.fieldName]: criteria.fieldValue, @@ -316,12 +317,12 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { }) .pipe( map((resp) => { - const aggregationsByTime = _.get(resp, ['aggregations', 'times', 'buckets'], []); - _.each(aggregationsByTime, (dataForTime: any) => { + const aggregationsByTime = get(resp, ['aggregations', 'times', 'buckets'], []); + each(aggregationsByTime, (dataForTime: any) => { const time = dataForTime.key; - const modelUpper: number | undefined = _.get(dataForTime, ['modelUpper', 'value']); - const modelLower: number | undefined = _.get(dataForTime, ['modelLower', 'value']); - const actual = _.get(dataForTime, ['actual', 'value']); + const modelUpper: number | undefined = get(dataForTime, ['modelUpper', 'value']); + const modelLower: number | undefined = get(dataForTime, ['modelLower', 'value']); + const actual = get(dataForTime, ['actual', 'value']); obj.results[time] = { actual, @@ -375,7 +376,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -391,7 +392,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { } // Add in term queries for each of the specified criteria. - _.each(criteriaFields, (criteria) => { + each(criteriaFields, (criteria) => { boolCriteria.push({ term: { [criteria.fieldName]: criteria.fieldValue, @@ -428,7 +429,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { .pipe( map((resp) => { if (resp.hits.total !== 0) { - _.each(resp.hits.hits, (hit: any) => { + each(resp.hits.hits, (hit: any) => { obj.records.push(hit._source); }); } @@ -473,7 +474,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { jobIdFilterStr += `${i > 0 ? ' OR ' : ''}job_id:${jobId}`; }); boolCriteria.push({ @@ -536,15 +537,15 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { }) .pipe( map((resp) => { - const dataByJobId = _.get(resp, ['aggregations', 'jobs', 'buckets'], []); - _.each(dataByJobId, (dataForJob: any) => { + const dataByJobId = get(resp, ['aggregations', 'jobs', 'buckets'], []); + each(dataByJobId, (dataForJob: any) => { const jobId: string = dataForJob.key; const resultsForTime: Record = {}; - const dataByTime = _.get(dataForJob, ['times', 'buckets'], []); - _.each(dataByTime, (dataForTime: any) => { + const dataByTime = get(dataForJob, ['times', 'buckets'], []); + each(dataByTime, (dataForTime: any) => { const time: string = dataForTime.key; - const events: object[] = _.get(dataForTime, ['events', 'buckets']); - resultsForTime[time] = _.map(events, 'key'); + const events: any[] = get(dataForTime, ['events', 'buckets']); + resultsForTime[time] = events.map((e) => e.key); }); obj.events[jobId] = resultsForTime; }); diff --git a/x-pack/plugins/ml/public/application/services/results_service/results_service.js b/x-pack/plugins/ml/public/application/services/results_service/results_service.js index 50e2d0a5a2a0b..0c3b2e40c8e26 100644 --- a/x-pack/plugins/ml/public/application/services/results_service/results_service.js +++ b/x-pack/plugins/ml/public/application/services/results_service/results_service.js @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import each from 'lodash/each'; +import get from 'lodash/get'; import { ML_MEDIAN_PERCENTS } from '../../../../common/util/job_utils'; import { escapeForElasticsearchQuery } from '../../util/string_utils'; @@ -50,7 +51,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -131,18 +132,18 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const dataByJobId = _.get(resp, ['aggregations', 'jobId', 'buckets'], []); - _.each(dataByJobId, (dataForJob) => { + const dataByJobId = get(resp, ['aggregations', 'jobId', 'buckets'], []); + each(dataByJobId, (dataForJob) => { const jobId = dataForJob.key; const resultsForTime = {}; - const dataByTime = _.get(dataForJob, ['byTime', 'buckets'], []); - _.each(dataByTime, (dataForTime) => { - const value = _.get(dataForTime, ['anomalyScore', 'value']); + const dataByTime = get(dataForJob, ['byTime', 'buckets'], []); + each(dataByTime, (dataForTime) => { + const value = get(dataForTime, ['anomalyScore', 'value']); if (value !== undefined) { const time = dataForTime.key; - resultsForTime[time] = _.get(dataForTime, ['anomalyScore', 'value']); + resultsForTime[time] = get(dataForTime, ['anomalyScore', 'value']); } }); obj.results[jobId] = resultsForTime; @@ -198,7 +199,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -305,17 +306,17 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const fieldNameBuckets = _.get( + const fieldNameBuckets = get( resp, ['aggregations', 'influencerFieldNames', 'buckets'], [] ); - _.each(fieldNameBuckets, (nameBucket) => { + each(fieldNameBuckets, (nameBucket) => { const fieldName = nameBucket.key; const fieldValues = []; - const fieldValueBuckets = _.get(nameBucket, ['influencerFieldValues', 'buckets'], []); - _.each(fieldValueBuckets, (valueBucket) => { + const fieldValueBuckets = get(nameBucket, ['influencerFieldValues', 'buckets'], []); + each(fieldValueBuckets, (valueBucket) => { const fieldValueResult = { influencerFieldValue: valueBucket.key, maxAnomalyScore: valueBucket.maxAnomalyScore.value, @@ -360,7 +361,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -424,8 +425,8 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const buckets = _.get(resp, ['aggregations', 'influencerFieldValues', 'buckets'], []); - _.each(buckets, (bucket) => { + const buckets = get(resp, ['aggregations', 'influencerFieldValues', 'buckets'], []); + each(buckets, (bucket) => { const result = { influencerFieldValue: bucket.key, maxAnomalyScore: bucket.maxAnomalyScore.value, @@ -458,9 +459,9 @@ export function resultsServiceProvider(mlApiServices) { end: latestMs, }) .then((resp) => { - const dataByTime = _.get(resp, ['overall_buckets'], []); - _.each(dataByTime, (dataForTime) => { - const value = _.get(dataForTime, ['overall_score']); + const dataByTime = get(resp, ['overall_buckets'], []); + each(dataByTime, (dataForTime) => { + const value = get(dataForTime, ['overall_score']); if (value !== undefined) { obj.results[dataForTime.timestamp] = value; } @@ -517,7 +518,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -537,7 +538,7 @@ export function resultsServiceProvider(mlApiServices) { if (influencerFieldValues && influencerFieldValues.length > 0) { let influencerFilterStr = ''; - _.each(influencerFieldValues, (value, i) => { + each(influencerFieldValues, (value, i) => { if (i > 0) { influencerFilterStr += ' OR '; } @@ -625,17 +626,17 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const fieldValueBuckets = _.get( + const fieldValueBuckets = get( resp, ['aggregations', 'influencerFieldValues', 'buckets'], [] ); - _.each(fieldValueBuckets, (valueBucket) => { + each(fieldValueBuckets, (valueBucket) => { const fieldValue = valueBucket.key; const fieldValues = {}; - const timeBuckets = _.get(valueBucket, ['byTime', 'buckets'], []); - _.each(timeBuckets, (timeBucket) => { + const timeBuckets = get(valueBucket, ['byTime', 'buckets'], []); + each(timeBuckets, (timeBucket) => { const time = timeBucket.key; const score = timeBucket.maxAnomalyScore.value; fieldValues[time] = score; @@ -701,7 +702,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -744,7 +745,7 @@ export function resultsServiceProvider(mlApiServices) { }) .then((resp) => { if (resp.hits.total !== 0) { - _.each(resp.hits.hits, (hit) => { + each(resp.hits.hits, (hit) => { obj.records.push(hit._source); }); } @@ -797,7 +798,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -875,7 +876,7 @@ export function resultsServiceProvider(mlApiServices) { }) .then((resp) => { if (resp.hits.total !== 0) { - _.each(resp.hits.hits, (hit) => { + each(resp.hits.hits, (hit) => { obj.records.push(hit._source); }); } @@ -1000,7 +1001,7 @@ export function resultsServiceProvider(mlApiServices) { }) .then((resp) => { if (resp.hits.total !== 0) { - _.each(resp.hits.hits, (hit) => { + each(resp.hits.hits, (hit) => { obj.records.push(hit._source); }); } @@ -1079,8 +1080,8 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const dataByTimeBucket = _.get(resp, ['aggregations', 'eventRate', 'buckets'], []); - _.each(dataByTimeBucket, (dataForTime) => { + const dataByTimeBucket = get(resp, ['aggregations', 'eventRate', 'buckets'], []); + each(dataByTimeBucket, (dataForTime) => { const time = dataForTime.key; obj.results[time] = dataForTime.doc_count; }); @@ -1227,18 +1228,18 @@ export function resultsServiceProvider(mlApiServices) { // Because of the sampling, results of metricFunctions which use sum or count // can be significantly skewed. Taking into account totalHits we calculate a // a factor to normalize results for these metricFunctions. - const totalHits = _.get(resp, ['hits', 'total'], 0); - const successfulShards = _.get(resp, ['_shards', 'successful'], 0); + const totalHits = get(resp, ['hits', 'total'], 0); + const successfulShards = get(resp, ['_shards', 'successful'], 0); let normalizeFactor = 1; if (totalHits > successfulShards * SAMPLER_TOP_TERMS_SHARD_SIZE) { normalizeFactor = totalHits / (successfulShards * SAMPLER_TOP_TERMS_SHARD_SIZE); } - const dataByTime = _.get(resp, ['aggregations', 'sample', 'byTime', 'buckets'], []); + const dataByTime = get(resp, ['aggregations', 'sample', 'byTime', 'buckets'], []); const data = dataByTime.reduce((d, dataForTime) => { const date = +dataForTime.key; - const entities = _.get(dataForTime, ['entities', 'buckets'], []); + const entities = get(dataForTime, ['entities', 'buckets'], []); entities.forEach((entity) => { let value = metricFunction === 'count' ? entity.doc_count : entity.metric.value; @@ -1291,7 +1292,7 @@ export function resultsServiceProvider(mlApiServices) { { term: { job_id: jobId } }, ]; - _.each(criteriaFields, (criteria) => { + each(criteriaFields, (criteria) => { mustCriteria.push({ term: { [criteria.fieldName]: criteria.fieldValue, @@ -1339,11 +1340,11 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const aggregationsByTime = _.get(resp, ['aggregations', 'times', 'buckets'], []); - _.each(aggregationsByTime, (dataForTime) => { + const aggregationsByTime = get(resp, ['aggregations', 'times', 'buckets'], []); + each(aggregationsByTime, (dataForTime) => { const time = dataForTime.key; obj.results[time] = { - score: _.get(dataForTime, ['recordScore', 'value']), + score: get(dataForTime, ['recordScore', 'value']), }; }); diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js index 86f12d7ca68c8..d825844ffa14b 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js @@ -9,7 +9,7 @@ */ import PropTypes from 'prop-types'; -import _ from 'lodash'; +import get from 'lodash/get'; import React, { Component } from 'react'; @@ -250,8 +250,8 @@ export class ForecastingModalUI extends Component { .getForecastRequestStats(this.props.job, forecastId) .then((resp) => { // Get the progress (stats value is between 0 and 1). - const progress = _.get(resp, ['stats', 'forecast_progress'], previousProgress); - const status = _.get(resp, ['stats', 'forecast_status']); + const progress = get(resp, ['stats', 'forecast_progress'], previousProgress); + const status = get(resp, ['stats', 'forecast_status']); // The requests for forecast stats can get routed to different shards, // and if these operate at different speeds there is a chance that a @@ -263,7 +263,7 @@ export class ForecastingModalUI extends Component { } // Display any messages returned in the request stats. - let messages = _.get(resp, ['stats', 'forecast_messages'], []); + let messages = get(resp, ['stats', 'forecast_messages'], []); messages = messages.map((message) => ({ message, status: MESSAGE_LEVEL.WARNING })); this.setState({ messages }); diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js index 190bce1639c4a..7ec59f4acbc51 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js @@ -12,9 +12,13 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import useObservable from 'react-use/lib/useObservable'; -import _ from 'lodash'; +import isEqual from 'lodash/isEqual'; +import reduce from 'lodash/reduce'; +import each from 'lodash/each'; +import get from 'lodash/get'; import d3 from 'd3'; import moment from 'moment'; +import { i18n } from '@kbn/i18n'; import { getSeverityWithLow, @@ -49,8 +53,6 @@ import { unhighlightFocusChartAnnotation, } from './timeseries_chart_annotations'; -import { i18n } from '@kbn/i18n'; - const focusZoomPanelHeight = 25; const focusChartHeight = 310; const focusHeight = focusZoomPanelHeight + focusChartHeight; @@ -399,7 +401,7 @@ class TimeseriesChartIntl extends Component { if (zoomFrom) { focusLoadFrom = zoomFrom.getTime(); } else { - focusLoadFrom = _.reduce( + focusLoadFrom = reduce( combinedData, (memo, point) => Math.min(memo, point.date.getTime()), new Date(2099, 12, 31).getTime() @@ -410,11 +412,7 @@ class TimeseriesChartIntl extends Component { if (zoomTo) { focusLoadTo = zoomTo.getTime(); } else { - focusLoadTo = _.reduce( - combinedData, - (memo, point) => Math.max(memo, point.date.getTime()), - 0 - ); + focusLoadTo = reduce(combinedData, (memo, point) => Math.max(memo, point.date.getTime()), 0); } focusLoadTo = Math.min(focusLoadTo, contextXMax); @@ -431,7 +429,7 @@ class TimeseriesChartIntl extends Component { min: moment(new Date(contextXScaleDomain[0])), max: moment(contextXScaleDomain[1]), }; - if (!_.isEqual(newSelectedBounds, this.selectedBounds)) { + if (!isEqual(newSelectedBounds, this.selectedBounds)) { this.selectedBounds = newSelectedBounds; this.setContextBrushExtent( new Date(contextXScaleDomain[0]), @@ -764,7 +762,7 @@ class TimeseriesChartIntl extends Component { }) .attr('class', (d) => { let markerClass = 'metric-value'; - if (_.has(d, 'anomalyScore')) { + if (d.anomalyScore !== undefined) { markerClass += ` anomaly-marker ${getSeverityWithLow(d.anomalyScore).id}`; } return markerClass; @@ -887,14 +885,14 @@ class TimeseriesChartIntl extends Component { ); const zoomOptions = [{ durationMs: autoZoomDuration, label: 'auto' }]; - _.each(ZOOM_INTERVAL_OPTIONS, (option) => { + each(ZOOM_INTERVAL_OPTIONS, (option) => { if (option.duration.asSeconds() > minSecs && option.duration.asSeconds() < boundsSecs) { zoomOptions.push({ durationMs: option.duration.asMilliseconds(), label: option.label }); } }); xPos += zoomLabel.node().getBBox().width + 4; - _.each(zoomOptions, (option) => { + each(zoomOptions, (option) => { const text = zoomGroup .append('a') .attr('data-ms', option.durationMs) @@ -960,7 +958,7 @@ class TimeseriesChartIntl extends Component { const combinedData = contextForecastData === undefined ? data : data.concat(contextForecastData); const valuesRange = { min: Number.MAX_VALUE, max: Number.MIN_VALUE }; - _.each(combinedData, (item) => { + each(combinedData, (item) => { valuesRange.min = Math.min(item.value, valuesRange.min); valuesRange.max = Math.max(item.value, valuesRange.max); }); @@ -973,7 +971,7 @@ class TimeseriesChartIntl extends Component { (contextForecastData !== undefined && contextForecastData.length > 0) ) { const boundsRange = { min: Number.MAX_VALUE, max: Number.MIN_VALUE }; - _.each(combinedData, (item) => { + each(combinedData, (item) => { boundsRange.min = Math.min(item.lower, boundsRange.min); boundsRange.max = Math.max(item.upper, boundsRange.max); }); @@ -1294,7 +1292,7 @@ class TimeseriesChartIntl extends Component { if (swimlaneData !== undefined && swimlaneData.length > 0) { // Adjust the earliest back to the time of the first swimlane point // if this is before the time filter minimum. - earliest = Math.min(_.first(swimlaneData).date.getTime(), bounds.min.valueOf()); + earliest = Math.min(swimlaneData[0].date.getTime(), bounds.min.valueOf()); } const contextAggMs = contextAggregationInterval.asMilliseconds(); @@ -1352,7 +1350,7 @@ class TimeseriesChartIntl extends Component { const formattedDate = formatHumanReadableDateTimeSeconds(marker.date); const tooltipData = [{ label: formattedDate }]; - if (_.has(marker, 'anomalyScore')) { + if (marker.anomalyScore !== undefined) { const score = parseInt(marker.anomalyScore); const displayScore = score > 0 ? score : '< 1'; tooltipData.push({ @@ -1387,7 +1385,7 @@ class TimeseriesChartIntl extends Component { // Show actual/typical when available except for rare detectors. // Rare detectors always have 1 as actual and the probability as typical. // Exposing those values in the tooltip with actual/typical labels might irritate users. - if (_.has(marker, 'actual') && marker.function !== 'rare') { + if (marker.actual !== undefined && marker.function !== 'rare') { // Display the record actual in preference to the chart value, which may be // different depending on the aggregation interval of the chart. tooltipData.push({ @@ -1421,7 +1419,7 @@ class TimeseriesChartIntl extends Component { }, valueAccessor: 'value', }); - if (_.has(marker, 'byFieldName') && _.has(marker, 'numberOfCauses')) { + if (marker.byFieldName !== undefined && marker.numberOfCauses !== undefined) { const numberOfCauses = marker.numberOfCauses; // If numberOfCauses === 1, won't go into this block as actual/typical copied to top level fields. const byFieldName = mlEscape(marker.byFieldName); @@ -1488,7 +1486,7 @@ class TimeseriesChartIntl extends Component { } } else { // TODO - need better formatting for small decimals. - if (_.get(marker, 'isForecast', false) === true) { + if (get(marker, 'isForecast', false) === true) { tooltipData.push({ label: i18n.translate( 'xpack.ml.timeSeriesExplorer.timeSeriesChart.withoutAnomalyScore.predictionLabel', @@ -1548,7 +1546,7 @@ class TimeseriesChartIntl extends Component { } } - if (_.has(marker, 'scheduledEvents')) { + if (marker.scheduledEvents !== undefined) { marker.scheduledEvents.forEach((scheduledEvent, i) => { tooltipData.push({ label: i18n.translate( @@ -1569,7 +1567,7 @@ class TimeseriesChartIntl extends Component { }); } - if (_.has(marker, 'annotation')) { + if (marker.annotation !== undefined) { tooltipData.length = 0; // header tooltipData.push({ diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseries_search_service.ts b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseries_search_service.ts index ce5a7565c519b..d1e959b33e5dc 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseries_search_service.ts +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseries_search_service.ts @@ -4,7 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import each from 'lodash/each'; +import find from 'lodash/find'; +import get from 'lodash/get'; +import filter from 'lodash/filter'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -35,8 +38,8 @@ function getMetricData( // Extract the partition, by, over fields on which to filter. const criteriaFields = []; const detector = job.analysis_config.detectors[detectorIndex]; - if (_.has(detector, 'partition_field_name')) { - const partitionEntity: any = _.find(entityFields, { + if (detector.partition_field_name !== undefined) { + const partitionEntity: any = find(entityFields, { fieldName: detector.partition_field_name, }); if (partitionEntity !== undefined) { @@ -47,8 +50,8 @@ function getMetricData( } } - if (_.has(detector, 'over_field_name')) { - const overEntity: any = _.find(entityFields, { fieldName: detector.over_field_name }); + if (detector.over_field_name !== undefined) { + const overEntity: any = find(entityFields, { fieldName: detector.over_field_name }); if (overEntity !== undefined) { criteriaFields.push( { fieldName: 'over_field_name', fieldValue: overEntity.fieldName }, @@ -57,8 +60,8 @@ function getMetricData( } } - if (_.has(detector, 'by_field_name')) { - const byEntity: any = _.find(entityFields, { fieldName: detector.by_field_name }); + if (detector.by_field_name !== undefined) { + const byEntity: any = find(entityFields, { fieldName: detector.by_field_name }); if (byEntity !== undefined) { criteriaFields.push( { fieldName: 'by_field_name', fieldValue: byEntity.fieldName }, @@ -97,7 +100,7 @@ function getMetricData( ) .pipe( map((resp) => { - _.each(resp.results, (value, time) => { + each(resp.results, (value, time) => { // @ts-ignore obj.results[time] = { actual: value, @@ -134,7 +137,7 @@ function getChartDetails( } obj.results.functionLabel = functionLabel; - const blankEntityFields = _.filter(entityFields, (entity) => { + const blankEntityFields = filter(entityFields, (entity) => { return entity.fieldValue === null; }); @@ -145,7 +148,7 @@ function getChartDetails( obj.results.entityData.entities = entityFields; resolve(obj); } else { - const entityFieldNames: string[] = _.map(blankEntityFields, 'fieldName'); + const entityFieldNames: string[] = blankEntityFields.map((f) => f.fieldName); ml.getCardinalityOfFields({ index: chartConfig.datafeedConfig.indices, fieldNames: entityFieldNames, @@ -155,12 +158,12 @@ function getChartDetails( latestMs, }) .then((results: any) => { - _.each(blankEntityFields, (field) => { + each(blankEntityFields, (field) => { // results will not contain keys for non-aggregatable fields, // so store as 0 to indicate over all field values. obj.results.entityData.entities.push({ fieldName: field.fieldName, - cardinality: _.get(results, field.fieldName, 0), + cardinality: get(results, field.fieldName, 0), }); }); diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/timeseriesexplorer_utils.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/timeseriesexplorer_utils.js index 857db302e664e..7d14bb43ef811 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/timeseriesexplorer_utils.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/timeseriesexplorer_utils.js @@ -10,7 +10,9 @@ * Viewer dashboard. */ -import _ from 'lodash'; +import each from 'lodash/each'; +import get from 'lodash/get'; +import find from 'lodash/find'; import moment from 'moment-timezone'; import { isTimeSeriesViewJob } from '../../../../common/util/job_utils'; @@ -41,7 +43,7 @@ export function createTimeSeriesJobData(jobs) { export function processMetricPlotResults(metricPlotData, modelPlotEnabled) { const metricPlotChartData = []; if (modelPlotEnabled === true) { - _.each(metricPlotData, (dataForTime, time) => { + each(metricPlotData, (dataForTime, time) => { metricPlotChartData.push({ date: new Date(+time), lower: dataForTime.modelLower, @@ -50,7 +52,7 @@ export function processMetricPlotResults(metricPlotData, modelPlotEnabled) { }); }); } else { - _.each(metricPlotData, (dataForTime, time) => { + each(metricPlotData, (dataForTime, time) => { metricPlotChartData.push({ date: new Date(+time), value: dataForTime.actual, @@ -66,7 +68,7 @@ export function processMetricPlotResults(metricPlotData, modelPlotEnabled) { // value, lower and upper keys. export function processForecastResults(forecastData) { const forecastPlotChartData = []; - _.each(forecastData, (dataForTime, time) => { + each(forecastData, (dataForTime, time) => { forecastPlotChartData.push({ date: new Date(+time), isForecast: true, @@ -83,7 +85,7 @@ export function processForecastResults(forecastData) { // i.e. array of Objects with keys date (JavaScript date) and score. export function processRecordScoreResults(scoreData) { const bucketScoreData = []; - _.each(scoreData, (dataForTime, time) => { + each(scoreData, (dataForTime, time) => { bucketScoreData.push({ date: new Date(+time), score: dataForTime.score, @@ -153,7 +155,7 @@ export function processDataForFocusAnomalies( chartPoint.anomalyScore = recordScore; chartPoint.function = record.function; - if (_.has(record, 'actual')) { + if (record.actual !== undefined) { // If cannot match chart point for anomaly time // substitute the value with the record's actual so it won't plot as null/0 if (chartPoint.value === null) { @@ -163,13 +165,13 @@ export function processDataForFocusAnomalies( chartPoint.actual = record.actual; chartPoint.typical = record.typical; } else { - const causes = _.get(record, 'causes', []); + const causes = get(record, 'causes', []); if (causes.length > 0) { chartPoint.byFieldName = record.by_field_name; chartPoint.numberOfCauses = causes.length; if (causes.length === 1) { // If only a single cause, copy actual and typical values to the top level. - const cause = _.first(record.causes); + const cause = record.causes[0]; chartPoint.actual = cause.actual; chartPoint.typical = cause.typical; // substitute the value with the record's actual so it won't plot as null/0 @@ -180,7 +182,7 @@ export function processDataForFocusAnomalies( } } - if (_.has(record, 'multi_bucket_impact')) { + if (record.multi_bucket_impact !== undefined) { chartPoint.multiBucketImpact = record.multi_bucket_impact; } } @@ -194,7 +196,7 @@ export function processDataForFocusAnomalies( // which correspond to times of scheduled events for the job. export function processScheduledEventsForChart(chartData, scheduledEvents) { if (scheduledEvents !== undefined) { - _.each(scheduledEvents, (events, time) => { + each(scheduledEvents, (events, time) => { const chartPoint = findNearestChartPointToTime(chartData, time); if (chartPoint !== undefined) { // Note if the scheduled event coincides with an absence of the underlying metric data, @@ -301,7 +303,7 @@ export function calculateAggregationInterval(bounds, bucketsTarget, jobs, select // Ensure the aggregation interval is always a multiple of the bucket span to avoid strange // behaviour such as adjacent chart buckets holding different numbers of job results. - const bucketSpanSeconds = _.find(jobs, { id: selectedJob.job_id }).bucketSpanSeconds; + const bucketSpanSeconds = find(jobs, { id: selectedJob.job_id }).bucketSpanSeconds; let aggInterval = buckets.getIntervalToNearestMultiple(bucketSpanSeconds); // Set the interval back to the job bucket span if the auto interval is smaller. @@ -324,8 +326,8 @@ export function calculateDefaultFocusRange( const combinedData = isForecastData === false ? contextChartData : contextChartData.concat(contextForecastData); - const earliestDataDate = _.first(combinedData).date; - const latestDataDate = _.last(combinedData).date; + const earliestDataDate = combinedData[0].date; + const latestDataDate = combinedData[combinedData.length - 1].date; let rangeEarliestMs; let rangeLatestMs; @@ -333,8 +335,8 @@ export function calculateDefaultFocusRange( if (isForecastData === true) { // Return a range centred on the start of the forecast range, depending // on the time range of the forecast and data. - const earliestForecastDataDate = _.first(contextForecastData).date; - const latestForecastDataDate = _.last(contextForecastData).date; + const earliestForecastDataDate = contextForecastData[0].date; + const latestForecastDataDate = contextForecastData[contextForecastData.length - 1].date; rangeLatestMs = Math.min( earliestForecastDataDate.getTime() + autoZoomDuration / 2, @@ -379,7 +381,7 @@ export function getAutoZoomDuration(jobs, selectedJob) { // Calculate the 'auto' zoom duration which shows data at bucket span granularity. // Get the minimum bucket span of selected jobs. // TODO - only look at jobs for which data has been returned? - const bucketSpanSeconds = _.find(jobs, { id: selectedJob.job_id }).bucketSpanSeconds; + const bucketSpanSeconds = find(jobs, { id: selectedJob.job_id }).bucketSpanSeconds; // In most cases the duration can be obtained by simply multiplying the points target // Check that this duration returns the bucket span when run back through the diff --git a/x-pack/plugins/ml/public/application/util/chart_config_builder.js b/x-pack/plugins/ml/public/application/util/chart_config_builder.js index 3b09e09d3dd4a..bc63404a106db 100644 --- a/x-pack/plugins/ml/public/application/util/chart_config_builder.js +++ b/x-pack/plugins/ml/public/application/util/chart_config_builder.js @@ -9,7 +9,7 @@ * in the source metric data. */ -import _ from 'lodash'; +import get from 'lodash/get'; import { mlFunctionToESAggregation } from '../../../common/util/job_utils'; @@ -44,15 +44,16 @@ export function buildConfigFromDetector(job, detectorIndex) { // aggregations//aggregations//cardinality/field // or aggs//aggs//cardinality/field let cardinalityField = undefined; - const topAgg = _.get(job.datafeed_config, 'aggregations') || _.get(job.datafeed_config, 'aggs'); - if (topAgg !== undefined && _.values(topAgg).length > 0) { + const topAgg = get(job.datafeed_config, 'aggregations') || get(job.datafeed_config, 'aggs'); + if (topAgg !== undefined && Object.values(topAgg).length > 0) { cardinalityField = - _.get(_.values(topAgg)[0], [ + get(Object.values(topAgg)[0], [ 'aggregations', summaryCountFieldName, 'cardinality', 'field', - ]) || _.get(_.values(topAgg)[0], ['aggs', summaryCountFieldName, 'cardinality', 'field']); + ]) || + get(Object.values(topAgg)[0], ['aggs', summaryCountFieldName, 'cardinality', 'field']); } if (detector.function === 'non_zero_count' && cardinalityField !== undefined) { diff --git a/x-pack/plugins/ml/public/application/util/inherits.js b/x-pack/plugins/ml/public/application/util/inherits.js deleted file mode 100644 index bf16e573117d9..0000000000000 --- a/x-pack/plugins/ml/public/application/util/inherits.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -// create a property descriptor for properties -// that won't change -function describeConst(val) { - return { - writable: false, - enumerable: false, - configurable: false, - value: val, - }; -} - -/** - * Apply inheritance in the legacy `_.class(SubClass).inherits(SuperClass)` - * @param {Function} SubClass class that should inherit SuperClass - * @param {Function} SuperClass - * @return {Function} - */ -export function inherits(SubClass, SuperClass) { - const prototype = Object.create(SuperClass.prototype, { - constructor: describeConst(SubClass), - superConstructor: describeConst(SuperClass), - }); - - Object.defineProperties(SubClass, { - prototype: describeConst(prototype), - Super: describeConst(SuperClass), - }); - - return SubClass; -} diff --git a/x-pack/plugins/ml/public/application/util/time_buckets.js b/x-pack/plugins/ml/public/application/util/time_buckets.js index 19d499faf6c8d..15b8f24804ec8 100644 --- a/x-pack/plugins/ml/public/application/util/time_buckets.js +++ b/x-pack/plugins/ml/public/application/util/time_buckets.js @@ -4,7 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import isPlainObject from 'lodash/isPlainObject'; +import isString from 'lodash/isString'; +import ary from 'lodash/ary'; +import sortBy from 'lodash/sortBy'; +import assign from 'lodash/assign'; import moment from 'moment'; import dateMath from '@elastic/datemath'; @@ -80,16 +84,16 @@ TimeBuckets.prototype.setBounds = function (input) { if (!input) return this.clearBounds(); let bounds; - if (_.isPlainObject(input)) { + if (isPlainObject(input)) { // accept the response from timefilter.getActiveBounds() bounds = [input.min, input.max]; } else { bounds = Array.isArray(input) ? input : []; } - const moments = _(bounds).map(_.ary(moment, 1)).sortBy(Number); + const moments = sortBy(bounds.map(ary(moment, 1)), Number); - const valid = moments.size() === 2 && moments.every(isValidMoment); + const valid = moments.length === 2 && moments.every(isValidMoment); if (!valid) { this.clearBounds(); throw new Error('invalid bounds set: ' + input); @@ -175,7 +179,7 @@ TimeBuckets.prototype.setInterval = function (input) { return; } - if (_.isString(interval)) { + if (isString(interval)) { input = interval; interval = parseInterval(interval); if (+interval === 0) { @@ -256,7 +260,7 @@ TimeBuckets.prototype.getInterval = function () { if (+scaled === +interval) return interval; decorateInterval(interval, duration); - return _.assign(scaled, { + return assign(scaled, { preScaled: interval, scale: interval / scaled, scaled: true, @@ -287,7 +291,7 @@ TimeBuckets.prototype.getIntervalToNearestMultiple = function (divisorSecs) { decorateInterval(nearestMultipleInt, this.getDuration()); // Check to see if the new interval is scaled compared to the original. - const preScaled = _.get(interval, 'preScaled'); + const preScaled = interval.preScaled; if (preScaled !== undefined && preScaled < nearestMultipleInt) { nearestMultipleInt.preScaled = preScaled; nearestMultipleInt.scale = preScaled / nearestMultipleInt; diff --git a/x-pack/plugins/ml/server/lib/telemetry/telemetry.ts b/x-pack/plugins/ml/server/lib/telemetry/telemetry.ts index f2162ff2c3d30..d9ebccd554733 100644 --- a/x-pack/plugins/ml/server/lib/telemetry/telemetry.ts +++ b/x-pack/plugins/ml/server/lib/telemetry/telemetry.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import isEmpty from 'lodash/isEmpty'; import { ISavedObjectsRepository } from 'kibana/server'; import { getInternalRepository } from './internal_repository'; @@ -58,7 +58,7 @@ export async function updateTelemetry(internalRepo?: ISavedObjectsRepository) { let telemetry = await getTelemetry(internalRepository); // Create if doesn't exist - if (telemetry === null || _.isEmpty(telemetry)) { + if (telemetry === null || isEmpty(telemetry)) { const newTelemetrySavedObject = await internalRepository.create( TELEMETRY_DOC_ID, initTelemetry(), diff --git a/x-pack/plugins/ml/server/models/annotation_service/annotation.ts b/x-pack/plugins/ml/server/models/annotation_service/annotation.ts index 8094689abf3e5..a585449db0a25 100644 --- a/x-pack/plugins/ml/server/models/annotation_service/annotation.ts +++ b/x-pack/plugins/ml/server/models/annotation_service/annotation.ts @@ -5,7 +5,8 @@ */ import Boom from 'boom'; -import _ from 'lodash'; +import each from 'lodash/each'; +import get from 'lodash/get'; import { ILegacyScopedClusterClient } from 'kibana/server'; import { ANNOTATION_EVENT_USER, ANNOTATION_TYPE } from '../../../common/constants/annotations'; @@ -190,7 +191,7 @@ export function annotationProvider({ callAsInternalUser }: ILegacyScopedClusterC if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i: number) => { + each(jobIds, (jobId, i: number) => { jobIdFilterStr += `${i! > 0 ? ' OR ' : ''}job_id:${jobId}`; }); boolCriteria.push({ @@ -293,7 +294,7 @@ export function annotationProvider({ callAsInternalUser }: ILegacyScopedClusterC throw new Error(`Annotations couldn't be retrieved from Elasticsearch.`); } - const docs: Annotations = _.get(resp, ['hits', 'hits'], []).map((d: EsResult) => { + const docs: Annotations = get(resp, ['hits', 'hits'], []).map((d: EsResult) => { // get the original source document and the document id, we need it // to identify the annotation when editing/deleting it. // if original `event` is undefined then substitute with 'user` by default @@ -305,7 +306,7 @@ export function annotationProvider({ callAsInternalUser }: ILegacyScopedClusterC } as Annotation; }); - const aggregations = _.get(resp, ['aggregations'], {}) as EsAggregationResult; + const aggregations = get(resp, ['aggregations'], {}) as EsAggregationResult; if (fields) { obj.aggregations = aggregations; } diff --git a/x-pack/plugins/ml/server/models/bucket_span_estimator/bucket_span_estimator.js b/x-pack/plugins/ml/server/models/bucket_span_estimator/bucket_span_estimator.js index 3758547779403..381c615051e3b 100644 --- a/x-pack/plugins/ml/server/models/bucket_span_estimator/bucket_span_estimator.js +++ b/x-pack/plugins/ml/server/models/bucket_span_estimator/bucket_span_estimator.js @@ -4,7 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; +import each from 'lodash/each'; +import remove from 'lodash/remove'; +import sortBy from 'lodash/sortBy'; +import get from 'lodash/get'; import { mlLog } from '../../client/log'; @@ -91,7 +95,7 @@ export function estimateBucketSpanFactory(mlClusterClient) { } else { // loop over partition values for (let j = 0; j < this.splitFieldValues.length; j++) { - const queryCopy = _.cloneDeep(this.query); + const queryCopy = cloneDeep(this.query); // add a term to the query to filter on the partition value queryCopy.bool.must.push({ term: { @@ -151,7 +155,7 @@ export function estimateBucketSpanFactory(mlClusterClient) { } }; - _.each(this.checkers, (check) => { + each(this.checkers, (check) => { check.check .run() .then((interval) => { @@ -174,7 +178,7 @@ export function estimateBucketSpanFactory(mlClusterClient) { } processResults() { - const allResults = _.map(this.checkers, 'result'); + const allResults = this.checkers.map((c) => c.result); let reducedResults = []; const numberOfSplitFields = this.splitFieldValues.length || 1; @@ -185,8 +189,8 @@ export function estimateBucketSpanFactory(mlClusterClient) { const pos = i * numberOfSplitFields; let resultsSubset = allResults.slice(pos, pos + numberOfSplitFields); // remove results of tests which have failed - resultsSubset = _.remove(resultsSubset, (res) => res !== null); - resultsSubset = _.sortBy(resultsSubset, (r) => r.ms); + resultsSubset = remove(resultsSubset, (res) => res !== null); + resultsSubset = sortBy(resultsSubset, (r) => r.ms); const tempMedian = this.findMedian(resultsSubset); if (tempMedian !== null) { @@ -194,7 +198,7 @@ export function estimateBucketSpanFactory(mlClusterClient) { } } - reducedResults = _.sortBy(reducedResults, (r) => r.ms); + reducedResults = sortBy(reducedResults, (r) => r.ms); return this.findMedian(reducedResults); } @@ -256,7 +260,7 @@ export function estimateBucketSpanFactory(mlClusterClient) { }, }) .then((resp) => { - const value = _.get(resp, ['aggregations', 'field_count', 'value'], 0); + const value = get(resp, ['aggregations', 'field_count', 'value'], 0); resolve(value); }) .catch((resp) => { @@ -293,9 +297,10 @@ export function estimateBucketSpanFactory(mlClusterClient) { }, }) .then((partitionResp) => { - if (_.has(partitionResp, 'aggregations.fields_bucket_counts.buckets')) { + // eslint-disable-next-line camelcase + if (partitionResp.aggregations?.fields_bucket_counts?.buckets !== undefined) { const buckets = partitionResp.aggregations.fields_bucket_counts.buckets; - fieldValues = _.map(buckets, (b) => b.key); + fieldValues = buckets.map((b) => b.key); } resolve(fieldValues); }) diff --git a/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js b/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js index 347843e276c36..d3bbd59f3cf9b 100644 --- a/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js +++ b/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js @@ -10,7 +10,7 @@ * And a minimum bucket span */ -import _ from 'lodash'; +import get from 'lodash/get'; export function polledDataCheckerFactory({ callAsCurrentUser }) { class PolledDataChecker { @@ -29,7 +29,7 @@ export function polledDataCheckerFactory({ callAsCurrentUser }) { const interval = { name: '1m', ms: 60000 }; this.performSearch(interval.ms) .then((resp) => { - const fullBuckets = _.get(resp, 'aggregations.non_empty_buckets.buckets', []); + const fullBuckets = get(resp, 'aggregations.non_empty_buckets.buckets', []); const result = this.isPolledData(fullBuckets, interval); if (result.pass) { // data is polled, return a flag and the minimumBucketSpan which should be diff --git a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts index 7f19f32373e07..838315d8d272c 100644 --- a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts +++ b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts @@ -5,7 +5,10 @@ */ import { ILegacyScopedClusterClient } from 'kibana/server'; -import _ from 'lodash'; +import get from 'lodash/get'; +import each from 'lodash/each'; +import last from 'lodash/last'; +import find from 'lodash/find'; import { KBN_FIELD_TYPES } from '../../../../../../src/plugins/data/server'; import { ML_JOB_FIELD_TYPES } from '../../../common/constants/field_types'; import { getSafeAggregationName } from '../../../common/util/job_utils'; @@ -216,7 +219,7 @@ const getAggIntervals = async ( const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); const aggregations = - aggsPath.length > 0 ? _.get(respStats.aggregations, aggsPath) : respStats.aggregations; + aggsPath.length > 0 ? get(respStats.aggregations, aggsPath) : respStats.aggregations; return Object.keys(aggregations).reduce((p, aggName) => { const stats = [aggregations[aggName].min, aggregations[aggName].max]; @@ -300,9 +303,7 @@ export const getHistogramsForFields = async ( const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); const aggregations = - aggsPath.length > 0 - ? _.get(respChartsData.aggregations, aggsPath) - : respChartsData.aggregations; + aggsPath.length > 0 ? get(respChartsData.aggregations, aggsPath) : respChartsData.aggregations; const chartsData: ChartData[] = fields.map( (field): ChartData => { @@ -382,8 +383,8 @@ export class DataVisualizer { // To avoid checking for the existence of too many aggregatable fields in one request, // split the check into multiple batches (max 200 fields per request). const batches: string[][] = [[]]; - _.each(aggregatableFields, (field) => { - let lastArray: string[] = _.last(batches) as string[]; + each(aggregatableFields, (field) => { + let lastArray: string[] = last(batches) as string[]; if (lastArray.length === AGGREGATABLE_EXISTS_REQUEST_BATCH_SIZE) { lastArray = []; batches.push(lastArray); @@ -475,7 +476,7 @@ export class DataVisualizer { // Batch up fields by type, getting stats for multiple fields at a time. const batches: Field[][] = []; const batchedFields: { [key: string]: Field[][] } = {}; - _.each(fields, (field) => { + each(fields, (field) => { if (field.fieldName === undefined) { // undefined fieldName is used for a document count request. // getDocumentCountStats requires timeField - don't add to batched requests if not defined @@ -487,7 +488,7 @@ export class DataVisualizer { if (batchedFields[fieldType] === undefined) { batchedFields[fieldType] = [[]]; } - let lastArray: Field[] = _.last(batchedFields[fieldType]) as Field[]; + let lastArray: Field[] = last(batchedFields[fieldType]) as Field[]; if (lastArray.length === FIELDS_REQUEST_BATCH_SIZE) { lastArray = []; batchedFields[fieldType].push(lastArray); @@ -496,7 +497,7 @@ export class DataVisualizer { } }); - _.each(batchedFields, (lists) => { + each(batchedFields, (lists) => { batches.push(...lists); }); @@ -636,7 +637,7 @@ export class DataVisualizer { body, }); const aggregations = resp.aggregations; - const totalCount = _.get(resp, ['hits', 'total'], 0); + const totalCount = get(resp, ['hits', 'total'], 0); const stats = { totalCount, aggregatableExistsFields: [] as FieldData[], @@ -645,12 +646,12 @@ export class DataVisualizer { const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); const sampleCount = - samplerShardSize > 0 ? _.get(aggregations, ['sample', 'doc_count'], 0) : totalCount; + samplerShardSize > 0 ? get(aggregations, ['sample', 'doc_count'], 0) : totalCount; aggregatableFields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field, i); - const count = _.get(aggregations, [...aggsPath, `${safeFieldName}_count`, 'doc_count'], 0); + const count = get(aggregations, [...aggsPath, `${safeFieldName}_count`, 'doc_count'], 0); if (count > 0) { - const cardinality = _.get( + const cardinality = get( aggregations, [...aggsPath, `${safeFieldName}_cardinality`, 'value'], 0 @@ -745,12 +746,12 @@ export class DataVisualizer { }); const buckets: { [key: string]: number } = {}; - const dataByTimeBucket: Array<{ key: string; doc_count: number }> = _.get( + const dataByTimeBucket: Array<{ key: string; doc_count: number }> = get( resp, ['aggregations', 'eventRate', 'buckets'], [] ); - _.each(dataByTimeBucket, (dataForTime) => { + each(dataByTimeBucket, (dataForTime) => { const time = dataForTime.key; buckets[time] = dataForTime.doc_count; }); @@ -851,12 +852,12 @@ export class DataVisualizer { const batchStats: NumericFieldStats[] = []; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); - const docCount = _.get( + const docCount = get( aggregations, [...aggsPath, `${safeFieldName}_field_stats`, 'doc_count'], 0 ); - const fieldStatsResp = _.get( + const fieldStatsResp = get( aggregations, [...aggsPath, `${safeFieldName}_field_stats`, 'actual_stats'], {} @@ -867,20 +868,20 @@ export class DataVisualizer { topAggsPath.push('top'); } - const topValues: Bucket[] = _.get(aggregations, [...topAggsPath, 'buckets'], []); + const topValues: Bucket[] = get(aggregations, [...topAggsPath, 'buckets'], []); const stats: NumericFieldStats = { fieldName: field.fieldName, count: docCount, - min: _.get(fieldStatsResp, 'min', 0), - max: _.get(fieldStatsResp, 'max', 0), - avg: _.get(fieldStatsResp, 'avg', 0), + min: get(fieldStatsResp, 'min', 0), + max: get(fieldStatsResp, 'max', 0), + avg: get(fieldStatsResp, 'avg', 0), isTopValuesSampled: field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD || samplerShardSize > 0, topValues, topValuesSampleSize: topValues.reduce( (acc, curr) => acc + curr.doc_count, - _.get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0) + get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0) ), topValuesSamplerShardSize: field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD @@ -889,12 +890,12 @@ export class DataVisualizer { }; if (stats.count > 0) { - const percentiles = _.get( + const percentiles = get( aggregations, [...aggsPath, `${safeFieldName}_percentiles`, 'values'], [] ); - const medianPercentile: { value: number; key: number } | undefined = _.find(percentiles, { + const medianPercentile: { value: number; key: number } | undefined = find(percentiles, { key: 50, }); stats.median = medianPercentile !== undefined ? medianPercentile!.value : 0; @@ -978,7 +979,7 @@ export class DataVisualizer { topAggsPath.push('top'); } - const topValues: Bucket[] = _.get(aggregations, [...topAggsPath, 'buckets'], []); + const topValues: Bucket[] = get(aggregations, [...topAggsPath, 'buckets'], []); const stats = { fieldName: field.fieldName, @@ -987,7 +988,7 @@ export class DataVisualizer { topValues, topValuesSampleSize: topValues.reduce( (acc, curr) => acc + curr.doc_count, - _.get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0) + get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0) ), topValuesSamplerShardSize: field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD @@ -1046,12 +1047,12 @@ export class DataVisualizer { const batchStats: DateFieldStats[] = []; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); - const docCount = _.get( + const docCount = get( aggregations, [...aggsPath, `${safeFieldName}_field_stats`, 'doc_count'], 0 ); - const fieldStatsResp = _.get( + const fieldStatsResp = get( aggregations, [...aggsPath, `${safeFieldName}_field_stats`, 'actual_stats'], {} @@ -1059,8 +1060,8 @@ export class DataVisualizer { batchStats.push({ fieldName: field.fieldName, count: docCount, - earliest: _.get(fieldStatsResp, 'min', 0), - latest: _.get(fieldStatsResp, 'max', 0), + earliest: get(fieldStatsResp, 'min', 0), + latest: get(fieldStatsResp, 'max', 0), }); }); @@ -1115,17 +1116,17 @@ export class DataVisualizer { const safeFieldName = getSafeAggregationName(field.fieldName, i); const stats: BooleanFieldStats = { fieldName: field.fieldName, - count: _.get(aggregations, [...aggsPath, `${safeFieldName}_value_count`, 'doc_count'], 0), + count: get(aggregations, [...aggsPath, `${safeFieldName}_value_count`, 'doc_count'], 0), trueCount: 0, falseCount: 0, }; - const valueBuckets: Array<{ [key: string]: number }> = _.get( + const valueBuckets: Array<{ [key: string]: number }> = get( aggregations, [...aggsPath, `${safeFieldName}_values`, 'buckets'], [] ); - _.forEach(valueBuckets, (bucket) => { + valueBuckets.forEach((bucket) => { stats[`${bucket.key_as_string}Count`] = bucket.doc_count; }); @@ -1182,8 +1183,8 @@ export class DataVisualizer { // If the field is not in the _source (as will happen if the // field is populated using copy_to in the index mapping), // there will be no example to add. - // Use lodash _.get() to support field names containing dots. - const example: any = _.get(hits[i]._source, field); + // Use lodash get() to support field names containing dots. + const example: any = get(hits[i]._source, field); if (example !== undefined && stats.examples.indexOf(example) === -1) { stats.examples.push(example); if (stats.examples.length === maxExamples) { @@ -1216,7 +1217,7 @@ export class DataVisualizer { // Look ahead to the last percentiles and process these too if // they don't add more than 50% to the value range. - const lastValue = (_.last(percentileBuckets) as any).value; + const lastValue = (last(percentileBuckets) as any).value; const upperBound = lowerBound + 1.5 * (lastValue - lowerBound); const filteredLength = percentileBuckets.length; for (let i = filteredLength; i < percentiles.length; i++) { @@ -1237,7 +1238,7 @@ export class DataVisualizer { // Add in 0-5 and 95-100% if they don't add more // than 25% to the value range at either end. - const lastValue: number = (_.last(percentileBuckets) as any).value; + const lastValue: number = (last(percentileBuckets) as any).value; const maxDiff = 0.25 * (lastValue - lowerBound); if (lowerBound - dataMin < maxDiff) { percentileBuckets.splice(0, 0, percentiles[0]); diff --git a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.test.ts b/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.test.ts index 92933877e2836..16ee70ad9efde 100644 --- a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.test.ts +++ b/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; import { ILegacyScopedClusterClient } from 'kibana/server'; @@ -145,7 +145,7 @@ describe('ML - validateCardinality', () => { test: (ids: string[]) => void ) => { const job = getJobConfig(fieldName); - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality( mlClusterClientFactory(mockCardinality), @@ -250,7 +250,7 @@ describe('ML - validateCardinality', () => { it(`disabled model_plot, over field cardinality of ${cardinality} doesn't trigger a warning`, () => { const job = (getJobConfig('over_field_name') as unknown) as CombinedJob; job.model_plot_config = { enabled: false }; - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality(mlClusterClientFactory(mockCardinality), job).then((messages) => { const ids = messages.map((m) => m.id); @@ -261,7 +261,7 @@ describe('ML - validateCardinality', () => { it(`enabled model_plot, over field cardinality of ${cardinality} triggers a model plot warning`, () => { const job = (getJobConfig('over_field_name') as unknown) as CombinedJob; job.model_plot_config = { enabled: true }; - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality(mlClusterClientFactory(mockCardinality), job).then((messages) => { const ids = messages.map((m) => m.id); @@ -272,7 +272,7 @@ describe('ML - validateCardinality', () => { it(`disabled model_plot, by field cardinality of ${cardinality} triggers a field cardinality warning`, () => { const job = (getJobConfig('by_field_name') as unknown) as CombinedJob; job.model_plot_config = { enabled: false }; - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality(mlClusterClientFactory(mockCardinality), job).then((messages) => { const ids = messages.map((m) => m.id); @@ -283,7 +283,7 @@ describe('ML - validateCardinality', () => { it(`enabled model_plot, by field cardinality of ${cardinality} triggers a model plot warning and field cardinality warning`, () => { const job = (getJobConfig('by_field_name') as unknown) as CombinedJob; job.model_plot_config = { enabled: true }; - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality(mlClusterClientFactory(mockCardinality), job).then((messages) => { const ids = messages.map((m) => m.id); @@ -294,7 +294,7 @@ describe('ML - validateCardinality', () => { it(`enabled model_plot with terms, by field cardinality of ${cardinality} triggers just field cardinality warning`, () => { const job = (getJobConfig('by_field_name') as unknown) as CombinedJob; job.model_plot_config = { enabled: true, terms: 'AAL,AAB' }; - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality(mlClusterClientFactory(mockCardinality), job).then((messages) => { const ids = messages.map((m) => m.id); diff --git a/x-pack/plugins/ml/server/models/job_validation/validate_time_range.test.ts b/x-pack/plugins/ml/server/models/job_validation/validate_time_range.test.ts index f74d8a26ef370..a45be189ba3d8 100644 --- a/x-pack/plugins/ml/server/models/job_validation/validate_time_range.test.ts +++ b/x-pack/plugins/ml/server/models/job_validation/validate_time_range.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; import { ILegacyScopedClusterClient } from 'kibana/server'; @@ -144,7 +144,7 @@ describe('ML - validateTimeRange', () => { }); it('invalid time field', () => { - const mockSearchResponseInvalid = _.cloneDeep(mockSearchResponse); + const mockSearchResponseInvalid = cloneDeep(mockSearchResponse); mockSearchResponseInvalid.fieldCaps = undefined; const duration = { start: 0, end: 1 }; return validateTimeRange( diff --git a/x-pack/plugins/ml/server/models/results_service/build_anomaly_table_items.js b/x-pack/plugins/ml/server/models/results_service/build_anomaly_table_items.js index e664a1403d7d6..588e0e10a8d63 100644 --- a/x-pack/plugins/ml/server/models/results_service/build_anomaly_table_items.js +++ b/x-pack/plugins/ml/server/models/results_service/build_anomaly_table_items.js @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import sortBy from 'lodash/sortBy'; +import each from 'lodash/each'; import moment from 'moment-timezone'; import { @@ -55,7 +56,7 @@ export function buildAnomalyTableItems(anomalyRecords, aggregationInterval, date if (source.influencers !== undefined) { const influencers = []; - const sourceInfluencers = _.sortBy(source.influencers, 'influencer_field_name'); + const sourceInfluencers = sortBy(source.influencers, 'influencer_field_name'); sourceInfluencers.forEach((influencer) => { const influencerFieldName = influencer.influencer_field_name; influencer.influencer_field_values.forEach((influencerFieldValue) => { @@ -172,10 +173,10 @@ function aggregateAnomalies(anomalyRecords, interval, dateFormatTz) { // Flatten the aggregatedData to give a list of records with // the highest score per bucketed time / jobId / detectorIndex. const summaryRecords = []; - _.each(aggregatedData, (times, roundedTime) => { - _.each(times, (jobIds) => { - _.each(jobIds, (entityDetectors) => { - _.each(entityDetectors, (record) => { + each(aggregatedData, (times, roundedTime) => { + each(times, (jobIds) => { + each(jobIds, (entityDetectors) => { + each(entityDetectors, (record) => { summaryRecords.push({ time: +roundedTime, source: record, diff --git a/x-pack/plugins/ml/server/models/results_service/results_service.ts b/x-pack/plugins/ml/server/models/results_service/results_service.ts index 04997e517bba9..8e71384942b57 100644 --- a/x-pack/plugins/ml/server/models/results_service/results_service.ts +++ b/x-pack/plugins/ml/server/models/results_service/results_service.ts @@ -4,7 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import sortBy from 'lodash/sortBy'; +import slice from 'lodash/slice'; +import get from 'lodash/get'; import moment from 'moment'; import { SearchResponse } from 'elasticsearch'; import { ILegacyScopedClusterClient } from 'kibana/server'; @@ -175,7 +177,7 @@ export function resultsServiceProvider(mlClusterClient: ILegacyScopedClusterClie }); // Sort anomalies in ascending time order. - records = _.sortBy(records, 'timestamp'); + records = sortBy(records, 'timestamp'); tableData.interval = aggregationInterval; if (aggregationInterval === 'auto') { // Determine the actual interval to use if aggregating. @@ -197,7 +199,7 @@ export function resultsServiceProvider(mlClusterClient: ILegacyScopedClusterClie const categoryIdsByJobId: { [key: string]: any } = {}; categoryAnomalies.forEach((anomaly) => { - if (!_.has(categoryIdsByJobId, anomaly.jobId)) { + if (categoryIdsByJobId[anomaly.jobId] === undefined) { categoryIdsByJobId[anomaly.jobId] = []; } if (categoryIdsByJobId[anomaly.jobId].indexOf(anomaly.entityValue) === -1) { @@ -289,7 +291,7 @@ export function resultsServiceProvider(mlClusterClient: ILegacyScopedClusterClie }; const resp = await callAsInternalUser('search', query); - const maxScore = _.get(resp, ['aggregations', 'max_score', 'value'], null); + const maxScore = get(resp, ['aggregations', 'max_score', 'value'], null); return { maxScore }; } @@ -353,7 +355,7 @@ export function resultsServiceProvider(mlClusterClient: ILegacyScopedClusterClie }, }); - const bucketsByJobId: Array<{ key: string; maxTimestamp: { value?: number } }> = _.get( + const bucketsByJobId: Array<{ key: string; maxTimestamp: { value?: number } }> = get( resp, ['aggregations', 'byJobId', 'buckets'], [] @@ -387,7 +389,7 @@ export function resultsServiceProvider(mlClusterClient: ILegacyScopedClusterClie if (resp.hits.total !== 0) { resp.hits.hits.forEach((hit: any) => { if (maxExamples) { - examplesByCategoryId[hit._source.category_id] = _.slice( + examplesByCategoryId[hit._source.category_id] = slice( hit._source.examples, 0, Math.min(hit._source.examples.length, maxExamples) From 21b9b36c94d73afb0469ac5f7ee608b20695d213 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Wed, 12 Aug 2020 14:05:23 +0300 Subject: [PATCH 067/113] [Vega] add functional tests for Vega visualization (#74097) * [Vega] [Inspector] add functional tests for Request tab * add some tests for Vega Debug tab * add clipboard permissions for webdriver * add smoke tests for data grid * fix CI * add some tests for vega expression funcitons * change order * Update _vega_chart.ts * Rename dagta_grid.ts to data_grid.ts * Update index.ts * Update data_grid.ts * stabilize tests Co-authored-by: Elastic Machine --- .../public/components/vega_actions_menu.tsx | 2 +- .../vega_inspector/components/spec_viewer.tsx | 8 +- .../vega_inspector/vega_data_inspector.tsx | 3 + test/functional/apps/visualize/_vega_chart.ts | 193 +++++++++++++++++- .../page_objects/vega_chart_page.ts | 65 +++++- test/functional/services/common/browser.ts | 12 ++ test/functional/services/data_grid.ts | 55 +++++ test/functional/services/index.ts | 9 +- test/functional/services/inspector.ts | 12 ++ test/functional/services/remote/webdriver.ts | 12 +- .../services/visualizations/index.ts | 1 + .../visualizations/vega_debug_inspector.ts | 68 ++++++ 12 files changed, 422 insertions(+), 18 deletions(-) create mode 100644 test/functional/services/data_grid.ts create mode 100644 test/functional/services/visualizations/vega_debug_inspector.ts diff --git a/src/plugins/vis_type_vega/public/components/vega_actions_menu.tsx b/src/plugins/vis_type_vega/public/components/vega_actions_menu.tsx index f10954df432c2..33fa1ceefd3d5 100644 --- a/src/plugins/vis_type_vega/public/components/vega_actions_menu.tsx +++ b/src/plugins/vis_type_vega/public/components/vega_actions_menu.tsx @@ -70,7 +70,7 @@ function VegaActionsMenu({ formatHJson, formatJson }: VegaActionsMenuProps) { return ( {
{(copy) => ( - + {copyToClipboardLabel} )} diff --git a/src/plugins/vis_type_vega/public/vega_inspector/vega_data_inspector.tsx b/src/plugins/vis_type_vega/public/vega_inspector/vega_data_inspector.tsx index 3b9427c96e62a..6dfa7a23c4fe8 100644 --- a/src/plugins/vis_type_vega/public/vega_inspector/vega_data_inspector.tsx +++ b/src/plugins/vis_type_vega/public/vega_inspector/vega_data_inspector.tsx @@ -47,11 +47,13 @@ export const VegaDataInspector = ({ adapters }: VegaDataInspectorProps) => { id: 'data-viewer--id', name: dataSetsLabel, content: , + 'data-test-subj': 'vegaDataInspectorDataViewerButton', }, { id: 'signal-viewer--id', name: signalValuesLabel, content: , + 'data-test-subj': 'vegaDataInspectorSignalViewerButton', }, { id: 'spec-viewer--id', @@ -59,6 +61,7 @@ export const VegaDataInspector = ({ adapters }: VegaDataInspectorProps) => { content: ( ), + 'data-test-subj': 'vegaDataInspectorSpecViewerButton', }, ]; diff --git a/test/functional/apps/visualize/_vega_chart.ts b/test/functional/apps/visualize/_vega_chart.ts index a1ed8460f1b22..b59d9590bb62a 100644 --- a/test/functional/apps/visualize/_vega_chart.ts +++ b/test/functional/apps/visualize/_vega_chart.ts @@ -16,10 +16,25 @@ * specific language governing permissions and limitations * under the License. */ - +import { unzip } from 'lodash'; import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; +const getTestSpec = (expression: string) => ` +{ +config: { "kibana": {"renderer": "svg"} } +$schema: https://vega.github.io/schema/vega/v5.json +marks: [{ + type: text + encode: { update: { text: { value: "Test" } } } +}] +signals: [ { + on: [{ + events: click + update: ${expression} + }] +}]}`; + export default function ({ getPageObjects, getService }: FtrProviderContext) { const PageObjects = getPageObjects([ 'timePicker', @@ -29,7 +44,11 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'vegaChart', ]); const filterBar = getService('filterBar'); + const inspector = getService('inspector'); + const vegaDebugInspectorView = getService('vegaDebugInspector'); const log = getService('log'); + const retry = getService('retry'); + const browser = getService('browser'); describe('vega chart in visualize app', () => { before(async () => { @@ -88,5 +107,177 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); }); + + describe('Inspector Panel', () => { + it('should have inspector enabled', async () => { + await inspector.expectIsEnabled(); + }); + + describe('Request Tab', () => { + beforeEach(async () => { + await inspector.open(); + }); + + afterEach(async () => { + await inspector.close(); + }); + + it('should contain "Statistics", "Request", "Response" tabs', async () => { + await inspector.openInspectorRequestsView(); + + for (const getFn of [ + inspector.getOpenRequestDetailRequestButton, + inspector.getOpenRequestDetailResponseButton, + inspector.getOpenRequestStatisticButton, + ]) { + await retry.try(async () => { + const requestStatisticTab = await getFn(); + + expect(await requestStatisticTab.isEnabled()).to.be(true); + }); + } + }); + + it('should set the default query name if not given in the schema', async () => { + const requests = await inspector.getRequestNames(); + + expect(requests).to.be('Unnamed request #0'); + }); + + it('should log the request statistic', async () => { + await inspector.openInspectorRequestsView(); + const rawTableData = await inspector.getTableData(); + + expect(unzip(rawTableData)[0].join(', ')).to.be( + 'Hits, Hits (total), Query time, Request timestamp' + ); + }); + }); + + describe('Debug Tab', () => { + beforeEach(async () => { + await inspector.open(); + }); + + afterEach(async () => { + await inspector.close(); + }); + + it('should contain "Data Sets", "Signal Values", "Spec" tabs', async () => { + await vegaDebugInspectorView.openVegaDebugInspectorView(); + + for (const getFn of [ + vegaDebugInspectorView.getOpenDataViewerButton, + vegaDebugInspectorView.getOpenSignalViewerButton, + vegaDebugInspectorView.getOpenSpecViewerButton, + ]) { + await retry.try(async () => { + const requestStatisticTab = await getFn(); + + expect(await requestStatisticTab.isEnabled()).to.be(true); + }); + } + }); + + it('should contain data on "Signal Values" tab', async () => { + await vegaDebugInspectorView.openVegaDebugInspectorView(); + await vegaDebugInspectorView.navigateToSignalViewerTab(); + + const { rows, columns } = await vegaDebugInspectorView.getGridTableData(); + + expect(columns.join(', ')).to.be('Signal, Value'); + expect(rows.length).to.be.greaterThan(0); + expect(rows[0].length).to.be(2); + }); + + it('should contain data on "Signal Values" tab', async () => { + await vegaDebugInspectorView.openVegaDebugInspectorView(); + await vegaDebugInspectorView.navigateToDataViewerTab(); + + const { rows, columns } = await vegaDebugInspectorView.getGridTableData(); + + expect(columns.length).to.be.greaterThan(0); + expect(rows.length).to.be.greaterThan(0); + }); + + it('should be able to copy vega spec to clipboard', async () => { + await vegaDebugInspectorView.openVegaDebugInspectorView(); + await vegaDebugInspectorView.navigateToSpecViewerTab(); + + const copyCopyToClipboardButton = await vegaDebugInspectorView.getCopyClipboardButton(); + + expect(await copyCopyToClipboardButton.isEnabled()).to.be(true); + + // The "clipboard-read" permission of the Permissions API must be granted + if (!(await browser.checkBrowserPermission('clipboard-read'))) { + return; + } + + await copyCopyToClipboardButton.click(); + + expect( + (await browser.getClipboardValue()).includes( + '"$schema": "https://vega.github.io/schema/vega-lite/' + ) + ).to.be(true); + }); + }); + }); + + describe('Vega extension functions', () => { + beforeEach(async () => { + await filterBar.removeAllFilters(); + }); + + const fillSpecAndGo = async (newSpec: string) => { + await PageObjects.vegaChart.fillSpec(newSpec); + await PageObjects.visEditor.clickGo(); + + const viewContainer = await PageObjects.vegaChart.getViewContainer(); + const textElement = await viewContainer.findByTagName('text'); + + await textElement.click(); + }; + + it('should update global time range by calling "kibanaSetTimeFilter" expression', async () => { + await fillSpecAndGo(getTestSpec('kibanaSetTimeFilter("2019", "2020")')); + + const currentTimeRange = await PageObjects.timePicker.getTimeConfig(); + + expect(currentTimeRange.start).to.be('Jan 1, 2019 @ 00:00:00.000'); + expect(currentTimeRange.end).to.be('Jan 1, 2020 @ 00:00:00.000'); + }); + + it('should set filter by calling "kibanaAddFilter" expression', async () => { + await fillSpecAndGo( + getTestSpec('kibanaAddFilter({ query_string: { query: "response:200" }})') + ); + + expect(await filterBar.getFilterCount()).to.be(1); + }); + + it('should remove filter by calling "kibanaRemoveFilter" expression', async () => { + await filterBar.addFilter('response', 'is', '200'); + + expect(await filterBar.getFilterCount()).to.be(1); + + await fillSpecAndGo( + getTestSpec('kibanaRemoveFilter({ match_phrase: { response: "200" }})') + ); + + expect(await filterBar.getFilterCount()).to.be(0); + }); + + it('should remove all filters by calling "kibanaRemoveAllFilters" expression', async () => { + await filterBar.addFilter('response', 'is', '200'); + await filterBar.addFilter('response', 'is', '500'); + + expect(await filterBar.getFilterCount()).to.be(2); + + await fillSpecAndGo(getTestSpec('kibanaRemoveAllFilters()')); + + expect(await filterBar.getFilterCount()).to.be(0); + }); + }); }); } diff --git a/test/functional/page_objects/vega_chart_page.ts b/test/functional/page_objects/vega_chart_page.ts index b9906911b00f1..1173c35af3384 100644 --- a/test/functional/page_objects/vega_chart_page.ts +++ b/test/functional/page_objects/vega_chart_page.ts @@ -18,8 +18,14 @@ */ import { Key } from 'selenium-webdriver'; +import expect from '@kbn/expect'; import { FtrProviderContext } from '../ftr_provider_context'; +const compareSpecs = (first: string, second: string) => { + const normalizeSpec = (spec: string) => spec.replace(/[\n ]/g, ''); + return normalizeSpec(first) === normalizeSpec(second); +}; + export function VegaChartPageProvider({ getService, getPageObjects, @@ -28,24 +34,57 @@ export function VegaChartPageProvider({ const testSubjects = getService('testSubjects'); const browser = getService('browser'); const { common } = getPageObjects(['common']); + const retry = getService('retry'); class VegaChartPage { - public async getSpec() { + public getEditor() { + return testSubjects.find('vega-editor'); + } + + public getViewContainer() { + return find.byCssSelector('div.vgaVis__view'); + } + + public getControlContainer() { + return find.byCssSelector('div.vgaVis__controls'); + } + + public async getRawSpec() { // Adapted from console_page.js:getVisibleTextFromAceEditor(). Is there a common utilities file? - const editor = await testSubjects.find('vega-editor'); + const editor = await this.getEditor(); const lines = await editor.findAllByClassName('ace_line_group'); - const linesText = await Promise.all( + + return await Promise.all( lines.map(async (line) => { return await line.getVisibleText(); }) ); - return linesText.join('\n'); } - public async typeInSpec(text: string) { - const editor = await testSubjects.find('vega-editor'); + public async getSpec() { + return (await this.getRawSpec()).join('\n'); + } + + public async focusEditor() { + const editor = await this.getEditor(); const textarea = await editor.findByClassName('ace_content'); + await textarea.click(); + } + + public async fillSpec(newSpec: string) { + await retry.try(async () => { + await this.cleanSpec(); + await this.focusEditor(); + await browser.pressKeys(newSpec); + + expect(compareSpecs(await this.getSpec(), newSpec)).to.be(true); + }); + } + + public async typeInSpec(text: string) { + await this.focusEditor(); + let repeats = 20; while (--repeats > 0) { await browser.pressKeys(Key.ARROW_UP); @@ -55,12 +94,16 @@ export function VegaChartPageProvider({ await browser.pressKeys(text); } - public async getViewContainer() { - return await find.byCssSelector('div.vgaVis__view'); - } + public async cleanSpec() { + const editor = await this.getEditor(); + const aceGutter = await editor.findByClassName('ace_gutter'); + + await retry.try(async () => { + await aceGutter.doubleClick(); + await browser.pressKeys(Key.BACK_SPACE); - public async getControlContainer() { - return await find.byCssSelector('div.vgaVis__controls'); + expect(await this.getSpec()).to.be(''); + }); } public async getYAxisLabels() { diff --git a/test/functional/services/common/browser.ts b/test/functional/services/common/browser.ts index b0eec5e24f635..e81845023a8fa 100644 --- a/test/functional/services/common/browser.ts +++ b/test/functional/services/common/browser.ts @@ -489,5 +489,17 @@ export async function BrowserProvider({ getService }: FtrProviderContext) { const _id = idOrElement instanceof WebElementWrapper ? idOrElement._webElement : idOrElement; await driver.switchTo().frame(_id); } + + public async checkBrowserPermission(permission: string): Promise { + const result: any = await driver.executeAsyncScript( + `navigator.permissions.query({name:'${permission}'}).then(arguments[0])` + ); + + return Boolean(result?.state === 'granted'); + } + + public getClipboardValue(): Promise { + return driver.executeAsyncScript('navigator.clipboard.readText().then(arguments[0])'); + } })(); } diff --git a/test/functional/services/data_grid.ts b/test/functional/services/data_grid.ts new file mode 100644 index 0000000000000..40157caab5756 --- /dev/null +++ b/test/functional/services/data_grid.ts @@ -0,0 +1,55 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { FtrProviderContext } from '../ftr_provider_context'; + +interface TabbedGridData { + columns: string[]; + rows: string[][]; +} + +export function DataGridProvider({ getService }: FtrProviderContext) { + const find = getService('find'); + + class DataGrid { + async getDataGridTableData(): Promise { + const table = await find.byCssSelector('.euiDataGrid'); + const $ = await table.parseDomContent(); + + const columns = $('.euiDataGridHeaderCell__content') + .toArray() + .map((cell) => $(cell).text()); + const rows = $.findTestSubjects('dataGridRow') + .toArray() + .map((row) => + $(row) + .find('.euiDataGridRowCell__truncate') + .toArray() + .map((cell) => $(cell).text()) + ); + + return { + columns, + rows, + }; + } + } + + return new DataGrid(); +} diff --git a/test/functional/services/index.ts b/test/functional/services/index.ts index 7891a6b00f729..4c97d672bae2e 100644 --- a/test/functional/services/index.ts +++ b/test/functional/services/index.ts @@ -47,7 +47,12 @@ import { RemoteProvider } from './remote'; import { RenderableProvider } from './renderable'; import { TableProvider } from './table'; import { ToastsProvider } from './toasts'; -import { PieChartProvider, ElasticChartProvider } from './visualizations'; +import { DataGridProvider } from './data_grid'; +import { + PieChartProvider, + ElasticChartProvider, + VegaDebugInspectorViewProvider, +} from './visualizations'; import { ListingTableProvider } from './listing_table'; import { SavedQueryManagementComponentProvider } from './saved_query_management_component'; import { KibanaSupertestProvider } from './supertest'; @@ -72,12 +77,14 @@ export const services = { dashboardPanelActions: DashboardPanelActionsProvider, flyout: FlyoutProvider, comboBox: ComboBoxProvider, + dataGrid: DataGridProvider, embedding: EmbeddingProvider, renderable: RenderableProvider, table: TableProvider, browser: BrowserProvider, pieChart: PieChartProvider, inspector: InspectorProvider, + vegaDebugInspector: VegaDebugInspectorViewProvider, appsMenu: AppsMenuProvider, globalNav: GlobalNavProvider, toasts: ToastsProvider, diff --git a/test/functional/services/inspector.ts b/test/functional/services/inspector.ts index d8ac224ddd9bc..1c0bf7ad46df1 100644 --- a/test/functional/services/inspector.ts +++ b/test/functional/services/inspector.ts @@ -233,6 +233,18 @@ export function InspectorProvider({ getService }: FtrProviderContext) { const singleRequest = await testSubjects.find('inspectorRequestName'); return await singleRequest.getVisibleText(); } + + public getOpenRequestStatisticButton() { + return testSubjects.find('inspectorRequestDetailStatistics'); + } + + public getOpenRequestDetailRequestButton() { + return testSubjects.find('inspectorRequestDetailRequest'); + } + + public getOpenRequestDetailResponseButton() { + return testSubjects.find('inspectorRequestDetailResponse'); + } } return new Inspector(); diff --git a/test/functional/services/remote/webdriver.ts b/test/functional/services/remote/webdriver.ts index 09fede7fe2546..d51b32f3cc497 100644 --- a/test/functional/services/remote/webdriver.ts +++ b/test/functional/services/remote/webdriver.ts @@ -53,9 +53,15 @@ const SECOND = 1000; const MINUTE = 60 * SECOND; const NO_QUEUE_COMMANDS = ['getLog', 'getStatus', 'newSession', 'quit']; const downloadDir = resolve(REPO_ROOT, 'target/functional-tests/downloads'); -const chromiumDownloadPrefs = { +const chromiumUserPrefs = { 'download.default_directory': downloadDir, 'download.prompt_for_download': false, + 'profile.content_settings.exceptions.clipboard': { + '[*.],*': { + last_modified: Date.now(), + setting: 1, + }, + }, }; /** @@ -135,7 +141,7 @@ async function attemptToCreateCommand( const prefs = new logging.Preferences(); prefs.setLevel(logging.Type.BROWSER, logging.Level.ALL); - chromeOptions.setUserPreferences(chromiumDownloadPrefs); + chromeOptions.setUserPreferences(chromiumUserPrefs); chromeOptions.setLoggingPrefs(prefs); chromeOptions.set('unexpectedAlertBehaviour', 'accept'); chromeOptions.setAcceptInsecureCerts(config.acceptInsecureCerts); @@ -185,7 +191,7 @@ async function attemptToCreateCommand( edgeOptions.setBinaryPath(edgePaths.browserPath); const options = edgeOptions.get('ms:edgeOptions'); // overriding options to include preferences - Object.assign(options, { prefs: chromiumDownloadPrefs }); + Object.assign(options, { prefs: chromiumUserPrefs }); edgeOptions.set('ms:edgeOptions', options); const session = await new Builder() .forBrowser('MicrosoftEdge') diff --git a/test/functional/services/visualizations/index.ts b/test/functional/services/visualizations/index.ts index 1da1691b07c2a..10019e63d684e 100644 --- a/test/functional/services/visualizations/index.ts +++ b/test/functional/services/visualizations/index.ts @@ -19,3 +19,4 @@ export { PieChartProvider } from './pie_chart'; export { ElasticChartProvider } from './elastic_chart'; +export { VegaDebugInspectorViewProvider } from './vega_debug_inspector'; diff --git a/test/functional/services/visualizations/vega_debug_inspector.ts b/test/functional/services/visualizations/vega_debug_inspector.ts new file mode 100644 index 0000000000000..3847ebbbf1279 --- /dev/null +++ b/test/functional/services/visualizations/vega_debug_inspector.ts @@ -0,0 +1,68 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { FtrProviderContext } from '../../ftr_provider_context'; + +export function VegaDebugInspectorViewProvider({ getService }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const inspector = getService('inspector'); + const dataGrid = getService('dataGrid'); + + class VegaDebugInspectorView { + async openVegaDebugInspectorView() { + await inspector.openInspectorView('inspectorViewChooserVega debug'); + } + + public getOpenDataViewerButton() { + return testSubjects.find('vegaDataInspectorDataViewerButton'); + } + + public getOpenSignalViewerButton() { + return testSubjects.find('vegaDataInspectorSignalViewerButton'); + } + + public getOpenSpecViewerButton() { + return testSubjects.find('vegaDataInspectorSpecViewerButton'); + } + + public getCopyClipboardButton() { + return testSubjects.find('vegaDataInspectorCopyClipboardButton'); + } + + public getGridTableData() { + return dataGrid.getDataGridTableData(); + } + + public async navigateToDataViewerTab() { + const dataViewerButton = await this.getOpenDataViewerButton(); + await dataViewerButton.click(); + } + + public async navigateToSignalViewerTab() { + const signalViewerButton = await this.getOpenSignalViewerButton(); + await signalViewerButton.click(); + } + + public async navigateToSpecViewerTab() { + const specViewerButton = await this.getOpenSpecViewerButton(); + await specViewerButton.click(); + } + } + + return new VegaDebugInspectorView(); +} From 178afd71fc825fc700e7bb5de39c1b34c72f2f7b Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Wed, 12 Aug 2020 13:42:43 +0200 Subject: [PATCH 068/113] [ML] Functional tests - stabilize DFA dependent variable input (#74829) This PR stabilizes the dependent variable input during tests by explicitly waiting for the options to load. --- .../configuration_step_form.tsx | 4 +++- .../ml/data_frame_analytics_creation.ts | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx index 571c7731822c0..2ae1996647463 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx @@ -397,7 +397,9 @@ export const ConfigurationStepForm: FC = ({ } isClearable={false} isInvalid={dependentVariable === ''} - data-test-subj="mlAnalyticsCreateJobWizardDependentVariableSelect" + data-test-subj={`mlAnalyticsCreateJobWizardDependentVariableSelect${ + loadingDepVarOptions ? ' loading' : ' loaded' + }`} /> diff --git a/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts b/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts index d8df2fb869ed7..474d6845ef3ec 100644 --- a/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts +++ b/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts @@ -228,23 +228,33 @@ export function MachineLearningDataFrameAnalyticsCreationProvider( await this.assertDestIndexValue(destIndex); }, + async waitForDependentVariableInputLoaded() { + await testSubjects.existOrFail('~mlAnalyticsCreateJobWizardDependentVariableSelect', { + timeout: 5 * 1000, + }); + await testSubjects.existOrFail('mlAnalyticsCreateJobWizardDependentVariableSelect loaded', { + timeout: 30 * 1000, + }); + }, + async assertDependentVariableInputExists() { await retry.tryForTime(8000, async () => { await testSubjects.existOrFail( - 'mlAnalyticsCreateJobWizardDependentVariableSelect > comboBoxInput' + '~mlAnalyticsCreateJobWizardDependentVariableSelect > comboBoxInput' ); }); }, async assertDependentVariableInputMissing() { await testSubjects.missingOrFail( - 'mlAnalyticsCreateJobWizardDependentVariableSelect > comboBoxInput' + '~mlAnalyticsCreateJobWizardDependentVariableSelect > comboBoxInput' ); }, async assertDependentVariableSelection(expectedSelection: string[]) { + await this.waitForDependentVariableInputLoaded(); const actualSelection = await comboBox.getComboBoxSelectedOptions( - 'mlAnalyticsCreateJobWizardDependentVariableSelect > comboBoxInput' + '~mlAnalyticsCreateJobWizardDependentVariableSelect > comboBoxInput' ); expect(actualSelection).to.eql( expectedSelection, @@ -253,8 +263,9 @@ export function MachineLearningDataFrameAnalyticsCreationProvider( }, async selectDependentVariable(dependentVariable: string) { + await this.waitForDependentVariableInputLoaded(); await comboBox.set( - 'mlAnalyticsCreateJobWizardDependentVariableSelect > comboBoxInput', + '~mlAnalyticsCreateJobWizardDependentVariableSelect > comboBoxInput', dependentVariable ); await this.assertDependentVariableSelection([dependentVariable]); From ed69f9b85aad2a245e0960890bc36131b488d9be Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 12 Aug 2020 07:09:49 -0600 Subject: [PATCH 069/113] [maps] implement save and return from dashboard (#74303) * pass originatingApp into App * save and return top nav option * clean up * navigate to originating app * functional test * tslint * cutOriginatingAppConnection * add functional test for cutting originating app flow * one more fix for cutting originator app and another functional test to verify * typo * review feedback Co-authored-by: Elastic Machine --- .../services/dashboard/panel_actions.ts | 11 + .../plugins/maps/public/kibana_services.d.ts | 11 + x-pack/plugins/maps/public/kibana_services.js | 13 + x-pack/plugins/maps/public/plugin.ts | 4 + .../bootstrap/services/saved_gis_map.ts | 1 + .../maps/public/routing/maps_router.js | 17 +- .../public/routing/routes/maps_app/index.js | 6 - .../routes/maps_app/load_map_and_render.js | 9 +- .../routing/routes/maps_app/maps_app_view.js | 8 +- .../routes/maps_app/top_nav_config.tsx | 304 ++++++++++-------- .../translations/translations/ja-JP.json | 11 - .../translations/translations/zh-CN.json | 11 - .../functional/apps/maps/embeddable/index.js | 1 + .../apps/maps/embeddable/save_and_return.js | 88 +++++ .../test/functional/page_objects/gis_page.js | 15 +- 15 files changed, 349 insertions(+), 161 deletions(-) create mode 100644 x-pack/test/functional/apps/maps/embeddable/save_and_return.js diff --git a/test/functional/services/dashboard/panel_actions.ts b/test/functional/services/dashboard/panel_actions.ts index 0f5d6ea74a6b6..bc21a62b9df79 100644 --- a/test/functional/services/dashboard/panel_actions.ts +++ b/test/functional/services/dashboard/panel_actions.ts @@ -70,6 +70,17 @@ export function DashboardPanelActionsProvider({ getService, getPageObjects }: Ft await PageObjects.common.waitForTopNavToBeVisible(); } + async editPanelByTitle(title?: string) { + log.debug(`editPanelByTitle(${title})`); + if (title) { + const panelOptions = await this.getPanelHeading(title); + await this.openContextMenu(panelOptions); + } else { + await this.openContextMenu(); + } + await testSubjects.clickWhenNotDisabled(EDIT_PANEL_DATA_TEST_SUBJ); + } + async clickExpandPanelToggle() { await testSubjects.click(TOGGLE_EXPAND_PANEL_DATA_TEST_SUBJ); } diff --git a/x-pack/plugins/maps/public/kibana_services.d.ts b/x-pack/plugins/maps/public/kibana_services.d.ts index 2e6911e89fa0a..2b28e1a8c7dbb 100644 --- a/x-pack/plugins/maps/public/kibana_services.d.ts +++ b/x-pack/plugins/maps/public/kibana_services.d.ts @@ -6,8 +6,10 @@ import { DataPublicPluginStart } from 'src/plugins/data/public'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { IndexPatternsService } from 'src/plugins/data/public/index_patterns'; +import { NavigateToAppOptions } from 'kibana/public'; import { MapsConfigType } from '../config'; import { MapsLegacyConfigType } from '../../../../src/plugins/maps_legacy/public'; +import { EmbeddableStart } from '../../../../src/plugins/embeddable/public'; export function getLicenseId(): any; export function getInspector(): any; @@ -77,3 +79,12 @@ export function setKibanaCommonConfig(config: MapsLegacyConfigType): void; export function setMapAppConfig(config: MapsConfigType): void; export function setKibanaVersion(version: string): void; export function setIsGoldPlus(isGoldPlus: boolean): void; +export function setEmbeddableService(embeddableService: EmbeddableStart): void; +export function getEmbeddableService(): EmbeddableStart; +export function setNavigateToApp( + navigateToApp: (appId: string, options?: NavigateToAppOptions | undefined) => Promise +): void; +export const navigateToApp: ( + appId: string, + options?: NavigateToAppOptions | undefined +) => Promise; diff --git a/x-pack/plugins/maps/public/kibana_services.js b/x-pack/plugins/maps/public/kibana_services.js index 89d578f27b118..9b035a87a3b37 100644 --- a/x-pack/plugins/maps/public/kibana_services.js +++ b/x-pack/plugins/maps/public/kibana_services.js @@ -177,3 +177,16 @@ export const setIsGoldPlus = (igp) => { export const getIsGoldPlus = () => { return isGoldPlus; }; + +let embeddableService; +export const setEmbeddableService = (_embeddableService) => { + embeddableService = _embeddableService; +}; +export const getEmbeddableService = () => { + return embeddableService; +}; + +export let navigateToApp; +export function setNavigateToApp(_navigateToApp) { + navigateToApp = _navigateToApp; +} diff --git a/x-pack/plugins/maps/public/plugin.ts b/x-pack/plugins/maps/public/plugin.ts index 8428a31d8b408..c374d3cb59b34 100644 --- a/x-pack/plugins/maps/public/plugin.ts +++ b/x-pack/plugins/maps/public/plugin.ts @@ -41,6 +41,8 @@ import { setUiActions, setUiSettings, setVisualizations, + setEmbeddableService, + setNavigateToApp, } from './kibana_services'; import { featureCatalogueEntry } from './feature_catalogue_entry'; // @ts-ignore @@ -113,6 +115,8 @@ export const bindStartCoreAndPlugins = (core: CoreStart, plugins: any) => { setUiActions(plugins.uiActions); setNavigation(plugins.navigation); setCoreI18n(core.i18n); + setEmbeddableService(plugins.embeddable); + setNavigateToApp(core.application.navigateToApp); }; /** diff --git a/x-pack/plugins/maps/public/routing/bootstrap/services/saved_gis_map.ts b/x-pack/plugins/maps/public/routing/bootstrap/services/saved_gis_map.ts index 4b474424bcdab..6f8e7777f671b 100644 --- a/x-pack/plugins/maps/public/routing/bootstrap/services/saved_gis_map.ts +++ b/x-pack/plugins/maps/public/routing/bootstrap/services/saved_gis_map.ts @@ -36,6 +36,7 @@ export interface ISavedGisMap extends SavedObject { layerListJSON?: string; mapStateJSON?: string; uiStateJSON?: string; + description?: string; getLayerList(): LayerDescriptor[]; syncWithStore(): void; } diff --git a/x-pack/plugins/maps/public/routing/maps_router.js b/x-pack/plugins/maps/public/routing/maps_router.js index 9992bd7a92ab1..9b7900d032f5a 100644 --- a/x-pack/plugins/maps/public/routing/maps_router.js +++ b/x-pack/plugins/maps/public/routing/maps_router.js @@ -7,7 +7,7 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; import { Router, Switch, Route, Redirect } from 'react-router-dom'; -import { getCoreI18n, getToasts } from '../kibana_services'; +import { getCoreI18n, getToasts, getEmbeddableService } from '../kibana_services'; import { createKbnUrlStateStorage, withNotifyOnErrors, @@ -39,6 +39,11 @@ const App = ({ history, appBasePath, onAppLeave }) => { const store = getStore(); const I18nContext = getCoreI18n().Context; + const stateTransfer = getEmbeddableService()?.getStateTransfer(history); + + const { originatingApp } = + stateTransfer?.getIncomingEditorState({ keysToRemoveAfterFetch: ['originatingApp'] }) || {}; + return ( @@ -50,13 +55,21 @@ const App = ({ history, appBasePath, onAppLeave }) => { )} /> } + render={() => ( + + )} /> // Redirect other routes to list, or if hash-containing, their non-hash equivalents { - dispatch(setSelectedLayer(null)); - dispatch(updateFlyout(FLYOUT_STATE.NONE)); - dispatch(removePreviewLayers()); - }, enableFullScreen: () => dispatch(enableFullScreen()), openMapSettings: () => dispatch(openMapSettings()), }; diff --git a/x-pack/plugins/maps/public/routing/routes/maps_app/load_map_and_render.js b/x-pack/plugins/maps/public/routing/routes/maps_app/load_map_and_render.js index 3eea5b00d324e..eebbb17582821 100644 --- a/x-pack/plugins/maps/public/routing/routes/maps_app/load_map_and_render.js +++ b/x-pack/plugins/maps/public/routing/routes/maps_app/load_map_and_render.js @@ -56,6 +56,13 @@ export const LoadMapAndRender = class extends React.Component { return ; } - return savedMap ? : null; + return savedMap ? ( + + ) : null; } }; diff --git a/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js b/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js index 91d00990772f4..23625b4591db7 100644 --- a/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js +++ b/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js @@ -51,6 +51,8 @@ export class MapsAppView extends React.Component { initialized: false, savedQuery: '', initialLayerListConfig: null, + // tracking originatingApp in state so the connection can be broken by users + originatingApp: props.originatingApp, }; } @@ -311,11 +313,15 @@ export class MapsAppView extends React.Component { savedMap: this.props.savedMap, isOpenSettingsDisabled: this.props.isOpenSettingsDisabled, isSaveDisabled: this.props.isSaveDisabled, - closeFlyout: this.props.closeFlyout, enableFullScreen: this.props.enableFullScreen, openMapSettings: this.props.openMapSettings, inspectorAdapters: this.props.inspectorAdapters, setBreadcrumbs: this._setBreadcrumbs, + stateTransfer: this.props.stateTransfer, + originatingApp: this.state.originatingApp, + cutOriginatingAppConnection: () => { + this.setState({ originatingApp: undefined }); + }, }); const { TopNavMenu } = getNavigation().ui; diff --git a/x-pack/plugins/maps/public/routing/routes/maps_app/top_nav_config.tsx b/x-pack/plugins/maps/public/routing/routes/maps_app/top_nav_config.tsx index 46d662b28a82f..8a4d8ae555895 100644 --- a/x-pack/plugins/maps/public/routing/routes/maps_app/top_nav_config.tsx +++ b/x-pack/plugins/maps/public/routing/routes/maps_app/top_nav_config.tsx @@ -7,16 +7,16 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { Adapters } from 'src/plugins/inspector/public'; -import { SavedObjectSaveOpts } from 'src/plugins/saved_objects/public'; import { getCoreChrome, getMapsCapabilities, getInspector, getToasts, getCoreI18n, + navigateToApp, } from '../../../kibana_services'; import { - SavedObjectSaveModal, + SavedObjectSaveModalOrigin, OnSaveProps, showSaveModal, } from '../../../../../../../src/plugins/saved_objects/public'; @@ -24,47 +24,197 @@ import { MAP_SAVED_OBJECT_TYPE } from '../../../../common/constants'; // @ts-expect-error import { goToSpecifiedPath } from '../../maps_router'; import { ISavedGisMap } from '../../bootstrap/services/saved_gis_map'; +import { EmbeddableStateTransfer } from '../../../../../../../src/plugins/embeddable/public'; export function getTopNavConfig({ savedMap, isOpenSettingsDisabled, isSaveDisabled, - closeFlyout, enableFullScreen, openMapSettings, inspectorAdapters, setBreadcrumbs, + stateTransfer, + originatingApp, + cutOriginatingAppConnection, }: { savedMap: ISavedGisMap; isOpenSettingsDisabled: boolean; isSaveDisabled: boolean; - closeFlyout: () => void; enableFullScreen: () => void; openMapSettings: () => void; inspectorAdapters: Adapters; setBreadcrumbs: () => void; + stateTransfer?: EmbeddableStateTransfer; + originatingApp?: string; + cutOriginatingAppConnection: () => void; }) { - return [ + const topNavConfigs = []; + const isNewMap = !savedMap.id; + const hasWritePermissions = getMapsCapabilities().save; + const hasSaveAndReturnConfig = hasWritePermissions && !isNewMap && originatingApp; + + async function onSave({ + newDescription, + newTitle, + newCopyOnSave, + isTitleDuplicateConfirmed, + onTitleDuplicate, + returnToOrigin, + }: OnSaveProps & { returnToOrigin: boolean }) { + const prevTitle = savedMap.title; + const prevDescription = savedMap.description; + savedMap.title = newTitle; + savedMap.description = newDescription; + savedMap.copyOnSave = newCopyOnSave; + + let id; + try { + savedMap.syncWithStore(); + id = await savedMap.save({ + confirmOverwrite: false, + isTitleDuplicateConfirmed, + onTitleDuplicate, + }); + // id not returned when save fails because of duplicate title check. + // return and let user confirm duplicate title. + if (!id) { + return {}; + } + } catch (err) { + getToasts().addDanger({ + title: i18n.translate('xpack.maps.topNav.saveErrorMessage', { + defaultMessage: `Error saving '{title}'`, + values: { title: savedMap.title }, + }), + text: err.message, + 'data-test-subj': 'saveMapError', + }); + // If the save wasn't successful, put the original values back. + savedMap.title = prevTitle; + savedMap.description = prevDescription; + return { error: err }; + } + + getToasts().addSuccess({ + title: i18n.translate('xpack.maps.topNav.saveSuccessMessage', { + defaultMessage: `Saved '{title}'`, + values: { title: savedMap.title }, + }), + 'data-test-subj': 'saveMapSuccess', + }); + + getCoreChrome().docTitle.change(savedMap.title); + setBreadcrumbs(); + goToSpecifiedPath(`/map/${id}${window.location.hash}`); + + const newlyCreated = newCopyOnSave || isNewMap; + if (newlyCreated && !returnToOrigin) { + cutOriginatingAppConnection(); + } else if (!!originatingApp && returnToOrigin) { + if (newlyCreated && stateTransfer) { + stateTransfer.navigateToWithEmbeddablePackage(originatingApp, { + state: { id, type: MAP_SAVED_OBJECT_TYPE }, + }); + } else { + navigateToApp(originatingApp); + } + } + + return { id }; + } + + if (hasSaveAndReturnConfig) { + topNavConfigs.push({ + id: 'saveAndReturn', + label: i18n.translate('xpack.maps.topNav.saveAndReturnButtonLabel', { + defaultMessage: 'Save and return', + }), + emphasize: true, + iconType: 'check', + run: () => { + onSave({ + newTitle: savedMap.title ? savedMap.title : '', + newDescription: savedMap.description ? savedMap.description : '', + newCopyOnSave: false, + isTitleDuplicateConfirmed: false, + returnToOrigin: true, + onTitleDuplicate: () => {}, + }); + }, + testId: 'mapSaveAndReturnButton', + }); + } + + if (hasWritePermissions) { + topNavConfigs.push({ + id: 'save', + label: hasSaveAndReturnConfig + ? i18n.translate('xpack.maps.topNav.saveAsButtonLabel', { + defaultMessage: 'Save as', + }) + : i18n.translate('xpack.maps.topNav.saveMapButtonLabel', { + defaultMessage: `save`, + }), + description: i18n.translate('xpack.maps.topNav.saveMapDescription', { + defaultMessage: `Save map`, + }), + emphasize: !hasSaveAndReturnConfig, + testId: 'mapSaveButton', + disableButton() { + return isSaveDisabled; + }, + tooltip() { + if (isSaveDisabled) { + return i18n.translate('xpack.maps.topNav.saveMapDisabledButtonTooltip', { + defaultMessage: 'Confirm or Cancel your layer changes before saving', + }); + } + }, + run: () => { + const saveModal = ( + {}} + documentInfo={{ + description: savedMap.description, + id: savedMap.id, + title: savedMap.title, + }} + objectType={i18n.translate('xpack.maps.topNav.saveModalType', { + defaultMessage: 'map', + })} + /> + ); + showSaveModal(saveModal, getCoreI18n().Context); + }, + }); + } + + topNavConfigs.push( { - id: 'full-screen', - label: i18n.translate('xpack.maps.mapController.fullScreenButtonLabel', { - defaultMessage: `full screen`, + id: 'mapSettings', + label: i18n.translate('xpack.maps.topNav.openSettingsButtonLabel', { + defaultMessage: `Map settings`, }), - description: i18n.translate('xpack.maps.mapController.fullScreenDescription', { - defaultMessage: `full screen`, + description: i18n.translate('xpack.maps.topNav.openSettingsDescription', { + defaultMessage: `Open map settings`, }), - testId: 'mapsFullScreenMode', + testId: 'openSettingsButton', + disableButton() { + return isOpenSettingsDisabled; + }, run() { - getCoreChrome().setIsVisible(false); - enableFullScreen(); + openMapSettings(); }, }, { id: 'inspect', - label: i18n.translate('xpack.maps.mapController.openInspectorButtonLabel', { + label: i18n.translate('xpack.maps.topNav.openInspectorButtonLabel', { defaultMessage: `inspect`, }), - description: i18n.translate('xpack.maps.mapController.openInspectorDescription', { + description: i18n.translate('xpack.maps.topNav.openInspectorDescription', { defaultMessage: `Open Inspector`, }), testId: 'openInspectorButton', @@ -73,122 +223,20 @@ export function getTopNavConfig({ }, }, { - id: 'mapSettings', - label: i18n.translate('xpack.maps.mapController.openSettingsButtonLabel', { - defaultMessage: `Map settings`, + id: 'full-screen', + label: i18n.translate('xpack.maps.topNav.fullScreenButtonLabel', { + defaultMessage: `full screen`, }), - description: i18n.translate('xpack.maps.mapController.openSettingsDescription', { - defaultMessage: `Open map settings`, + description: i18n.translate('xpack.maps.topNav.fullScreenDescription', { + defaultMessage: `full screen`, }), - testId: 'openSettingsButton', - disableButton() { - return isOpenSettingsDisabled; - }, + testId: 'mapsFullScreenMode', run() { - openMapSettings(); + getCoreChrome().setIsVisible(false); + enableFullScreen(); }, - }, - ...(getMapsCapabilities().save - ? [ - { - id: 'save', - label: i18n.translate('xpack.maps.mapController.saveMapButtonLabel', { - defaultMessage: `save`, - }), - description: i18n.translate('xpack.maps.mapController.saveMapDescription', { - defaultMessage: `Save map`, - }), - testId: 'mapSaveButton', - disableButton() { - return isSaveDisabled; - }, - tooltip() { - if (isSaveDisabled) { - return i18n.translate('xpack.maps.mapController.saveMapDisabledButtonTooltip', { - defaultMessage: 'Save or Cancel your layer changes before saving', - }); - } - }, - run: async () => { - const onSave = ({ - newTitle, - newCopyOnSave, - isTitleDuplicateConfirmed, - onTitleDuplicate, - }: OnSaveProps) => { - const currentTitle = savedMap.title; - savedMap.title = newTitle; - savedMap.copyOnSave = newCopyOnSave; - const saveOptions: SavedObjectSaveOpts = { - confirmOverwrite: false, - isTitleDuplicateConfirmed, - onTitleDuplicate, - }; - return doSave(savedMap, saveOptions, closeFlyout, setBreadcrumbs).then( - (response) => { - // If the save wasn't successful, put the original values back. - if (!response.id || response.error) { - savedMap.title = currentTitle; - } - return response; - } - ); - }; + } + ); - const saveModal = ( - {}} - title={savedMap.title} - showCopyOnSave={!!savedMap.id} - objectType={MAP_SAVED_OBJECT_TYPE} - showDescription={false} - /> - ); - showSaveModal(saveModal, getCoreI18n().Context); - }, - }, - ] - : []), - ]; -} - -async function doSave( - savedMap: ISavedGisMap, - saveOptions: SavedObjectSaveOpts, - closeFlyout: () => void, - setBreadcrumbs: () => void -) { - closeFlyout(); - savedMap.syncWithStore(); - let id; - - try { - id = await savedMap.save(saveOptions); - getCoreChrome().docTitle.change(savedMap.title); - } catch (err) { - getToasts().addDanger({ - title: i18n.translate('xpack.maps.mapController.saveErrorMessage', { - defaultMessage: `Error on saving '{title}'`, - values: { title: savedMap.title }, - }), - text: err.message, - 'data-test-subj': 'saveMapError', - }); - return { error: err }; - } - - if (id) { - goToSpecifiedPath(`/map/${id}${window.location.hash}`); - setBreadcrumbs(); - - getToasts().addSuccess({ - title: i18n.translate('xpack.maps.mapController.saveSuccessMessage', { - defaultMessage: `Saved '{title}'`, - values: { title: savedMap.title }, - }), - 'data-test-subj': 'saveMapSuccess', - }); - } - return { id }; + return topNavConfigs; } diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index f2aeed63d6eea..e5cd46b330ca8 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -10409,18 +10409,7 @@ "xpack.maps.layerWizardSelect.solutionsCategoryLabel": "ソリューション", "xpack.maps.loadMap.errorAttemptingToLoadSavedMap": "マップを読み込めません", "xpack.maps.map.initializeErrorTitle": "マップを初期化できません", - "xpack.maps.mapController.fullScreenButtonLabel": "全画面", - "xpack.maps.mapController.fullScreenDescription": "全画面", "xpack.maps.mapController.mapsBreadcrumbLabel": "マップ", - "xpack.maps.mapController.openInspectorButtonLabel": "検査", - "xpack.maps.mapController.openInspectorDescription": "インスペクターを開きます", - "xpack.maps.mapController.openSettingsButtonLabel": "マップ設定", - "xpack.maps.mapController.openSettingsDescription": "マップ設定を開く", - "xpack.maps.mapController.saveErrorMessage": "「{title}」の保存中にエラーが発生しました", - "xpack.maps.mapController.saveMapButtonLabel": "保存", - "xpack.maps.mapController.saveMapDescription": "マップを保存", - "xpack.maps.mapController.saveMapDisabledButtonTooltip": "保存する前に、レイヤーの変更を保存するか、キャンセルしてください", - "xpack.maps.mapController.saveSuccessMessage": "「{title}」が保存されました", "xpack.maps.mapEmbeddableFactory.invalidLayerList": "不正な形式のレイヤーリストによりマップを読み込めません", "xpack.maps.mapEmbeddableFactory.invalidSavedObject": "不正な形式の保存済みオブジェクトによりマップを読み込めません", "xpack.maps.mapListing.advancedSettingsLinkText": "高度な設定", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 82a6b128ad619..b273f6cc81baf 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -10411,18 +10411,7 @@ "xpack.maps.layerWizardSelect.solutionsCategoryLabel": "解决方案", "xpack.maps.loadMap.errorAttemptingToLoadSavedMap": "无法加载地图", "xpack.maps.map.initializeErrorTitle": "无法初始化地图", - "xpack.maps.mapController.fullScreenButtonLabel": "全屏", - "xpack.maps.mapController.fullScreenDescription": "全屏", "xpack.maps.mapController.mapsBreadcrumbLabel": "Maps", - "xpack.maps.mapController.openInspectorButtonLabel": "检查", - "xpack.maps.mapController.openInspectorDescription": "打开检查器", - "xpack.maps.mapController.openSettingsButtonLabel": "地图设置", - "xpack.maps.mapController.openSettingsDescription": "打开地图设置", - "xpack.maps.mapController.saveErrorMessage": "保存 “{title}” 时出错", - "xpack.maps.mapController.saveMapButtonLabel": "保存", - "xpack.maps.mapController.saveMapDescription": "保存地图", - "xpack.maps.mapController.saveMapDisabledButtonTooltip": "保存或在保存之前取消您的图层更改", - "xpack.maps.mapController.saveSuccessMessage": "已保存“{title}”", "xpack.maps.mapEmbeddableFactory.invalidLayerList": "无法加载地图,图层列表格式不正确", "xpack.maps.mapEmbeddableFactory.invalidSavedObject": "无法加载地图,已保存对象格式错误", "xpack.maps.mapListing.advancedSettingsLinkText": "高级设置", diff --git a/x-pack/test/functional/apps/maps/embeddable/index.js b/x-pack/test/functional/apps/maps/embeddable/index.js index bb3dbb0ea1ef2..81d24f73838e7 100644 --- a/x-pack/test/functional/apps/maps/embeddable/index.js +++ b/x-pack/test/functional/apps/maps/embeddable/index.js @@ -6,6 +6,7 @@ export default function ({ loadTestFile }) { describe('embeddable', function () { + loadTestFile(require.resolve('./save_and_return')); loadTestFile(require.resolve('./dashboard')); loadTestFile(require.resolve('./embeddable_state')); loadTestFile(require.resolve('./tooltip_filter_actions')); diff --git a/x-pack/test/functional/apps/maps/embeddable/save_and_return.js b/x-pack/test/functional/apps/maps/embeddable/save_and_return.js new file mode 100644 index 0000000000000..4aa44799db1f4 --- /dev/null +++ b/x-pack/test/functional/apps/maps/embeddable/save_and_return.js @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +export default function ({ getPageObjects, getService }) { + const PageObjects = getPageObjects(['common', 'dashboard', 'header', 'maps', 'visualize']); + const dashboardAddPanel = getService('dashboardAddPanel'); + const dashboardPanelActions = getService('dashboardPanelActions'); + const dashboardVisualizations = getService('dashboardVisualizations'); + const testSubjects = getService('testSubjects'); + + describe('save and return work flow', () => { + describe('new map', () => { + beforeEach(async () => { + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.clickNewDashboard(); + await dashboardAddPanel.clickCreateNewLink(); + await await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); + await PageObjects.visualize.clickMapsApp(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.maps.waitForLayersToLoad(); + }); + + describe('save', () => { + it('should return to dashboard and add new panel', async () => { + await PageObjects.maps.saveMap('map created from dashboard save and return'); + await PageObjects.dashboard.waitForRenderComplete(); + const panelCount = await PageObjects.dashboard.getPanelCount(); + expect(panelCount).to.equal(1); + }); + }); + + describe('save and uncheck return to origin switch', () => { + it('should cut the originator and stay in maps application', async () => { + await PageObjects.maps.saveMap( + 'map created from dashboard save and return with originator app cut', + true + ); + await PageObjects.maps.waitForLayersToLoad(); + await testSubjects.missingOrFail('mapSaveAndReturnButton'); + await testSubjects.existOrFail('mapSaveButton'); + }); + }); + }); + + describe('edit existing map', () => { + beforeEach(async () => { + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.loadSavedDashboard('map embeddable example'); + await PageObjects.dashboard.switchToEditMode(); + await dashboardPanelActions.editPanelByTitle('join example'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.maps.waitForLayersToLoad(); + }); + + describe('save and return', () => { + it('should return to dashboard', async () => { + await PageObjects.maps.clickSaveAndReturnButton(); + await PageObjects.dashboard.waitForRenderComplete(); + const panelCount = await PageObjects.dashboard.getPanelCount(); + expect(panelCount).to.equal(2); + }); + }); + + describe('save as', () => { + it('should return to dashboard and add new panel', async () => { + await PageObjects.maps.saveMap('Clone of map embeddable example'); + await PageObjects.dashboard.waitForRenderComplete(); + const panelCount = await PageObjects.dashboard.getPanelCount(); + expect(panelCount).to.equal(3); + }); + }); + + describe('save as and uncheck return to origin switch', () => { + it('should cut the originator and stay in maps application', async () => { + await PageObjects.maps.saveMap('Clone 2 of map embeddable example', true); + await PageObjects.maps.waitForLayersToLoad(); + await testSubjects.missingOrFail('mapSaveAndReturnButton'); + await testSubjects.existOrFail('mapSaveButton'); + }); + }); + }); + }); +} diff --git a/x-pack/test/functional/page_objects/gis_page.js b/x-pack/test/functional/page_objects/gis_page.js index b8f4faf3ebfd8..4998635096c39 100644 --- a/x-pack/test/functional/page_objects/gis_page.js +++ b/x-pack/test/functional/page_objects/gis_page.js @@ -139,12 +139,25 @@ export function GisPageProvider({ getService, getPageObjects }) { await renderable.waitForRender(); } - async saveMap(name) { + async saveMap(name, uncheckReturnToOriginModeSwitch = false) { await testSubjects.click('mapSaveButton'); await testSubjects.setValue('savedObjectTitle', name); + if (uncheckReturnToOriginModeSwitch) { + const redirectToOriginCheckboxExists = await testSubjects.exists( + 'returnToOriginModeSwitch' + ); + if (!redirectToOriginCheckboxExists) { + throw new Error('Unable to uncheck "returnToOriginModeSwitch", it does not exist.'); + } + await testSubjects.setEuiSwitch('returnToOriginModeSwitch', 'uncheck'); + } await testSubjects.clickWhenNotDisabled('confirmSaveSavedObjectButton'); } + async clickSaveAndReturnButton() { + await testSubjects.click('mapSaveAndReturnButton'); + } + async expectMissingSaveButton() { await testSubjects.missingOrFail('mapSaveButton'); } From 7f33e72ba7c103dbca1f8fffeeba8dc46b9906dc Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Wed, 12 Aug 2020 09:20:55 -0400 Subject: [PATCH 070/113] [SECURITY_SOLUTION] fix unenrolled query (#74798) --- .../server/endpoint/routes/metadata/support/unenroll.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.ts index 136f314aa415f..ca2ced177ab33 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.ts @@ -19,7 +19,7 @@ export async function findAllUnenrolledAgentIds( perPage: pageSize, showInactive: true, kuery: - '(fleet-agents.packages : "endpoint" AND fleet-agents.active : false) OR (NOT fleet-agents.packages : "endpoint" AND fleet-agents.active : true)', + '(fleet-agents.active : false) OR (NOT fleet-agents.packages : "endpoint" AND fleet-agents.active : true)', }; }; From 2e38f5a7059eb9ac13e3bf89eb726cab5bda5349 Mon Sep 17 00:00:00 2001 From: Kerry Gallagher Date: Wed, 12 Aug 2020 15:22:00 +0100 Subject: [PATCH 071/113] [Logs UI] Return 403s rather than 500s for ML privilege errors (#74506) * Add ML privileges error checks to all routes --- .../infra/server/lib/log_analysis/errors.ts | 14 ++++++++++++++ .../server/lib/log_analysis/log_entry_anomalies.ts | 11 +++++++++-- .../log_analysis/results/log_entry_anomalies.ts | 10 ++++++++++ .../results/log_entry_anomalies_datasets.ts | 10 ++++++++++ .../log_analysis/results/log_entry_categories.ts | 10 ++++++++++ .../results/log_entry_category_datasets.ts | 10 ++++++++++ .../results/log_entry_category_examples.ts | 10 ++++++++++ .../log_analysis/results/log_entry_examples.ts | 10 ++++++++++ .../routes/log_analysis/results/log_entry_rate.ts | 10 ++++++++++ 9 files changed, 93 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/infra/server/lib/log_analysis/errors.ts b/x-pack/plugins/infra/server/lib/log_analysis/errors.ts index a6d0db25084e8..ad46ebf710266 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/errors.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/errors.ts @@ -6,6 +6,12 @@ /* eslint-disable max-classes-per-file */ +import { + UnknownMLCapabilitiesError, + InsufficientMLCapabilities, + MLPrivilegesUninitialized, +} from '../../../../ml/server'; + export class NoLogAnalysisMlJobError extends Error { constructor(message?: string) { super(message); @@ -33,3 +39,11 @@ export class InsufficientAnomalyMlJobsConfigured extends Error { Object.setPrototypeOf(this, new.target.prototype); } } + +export const isMlPrivilegesError = (error: any) => { + return ( + error instanceof UnknownMLCapabilitiesError || + error instanceof InsufficientMLCapabilities || + error instanceof MLPrivilegesUninitialized + ); +}; diff --git a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts index a55958aee1285..f6d8a4a807e95 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts @@ -25,6 +25,7 @@ import { InsufficientAnomalyMlJobsConfigured, InsufficientLogAnalysisMlJobConfigurationError, UnknownCategoryError, + isMlPrivilegesError, } from './errors'; import { decodeOrThrow } from '../../../common/runtime_types'; import { @@ -65,7 +66,10 @@ async function getCompatibleAnomaliesJobIds( jobIds.push(logRateJobId); jobSpans = [...jobSpans, ...spans]; } catch (e) { - // Job wasn't found + if (isMlPrivilegesError(e)) { + throw e; + } + // An error is also thrown when no jobs are found } try { @@ -75,7 +79,10 @@ async function getCompatibleAnomaliesJobIds( jobIds.push(logCategoriesJobId); jobSpans = [...jobSpans, ...spans]; } catch (e) { - // Job wasn't found + if (isMlPrivilegesError(e)) { + throw e; + } + // An error is also thrown when no jobs are found } return { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies.ts index d79c9b9dd2c78..559609ebc7fbd 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies.ts @@ -17,6 +17,7 @@ import { import { createValidationFunction } from '../../../../common/runtime_types'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; import { getLogEntryAnomalies } from '../../../lib/log_analysis'; +import { isMlPrivilegesError } from '../../../lib/log_analysis/errors'; export const initGetLogEntryAnomaliesRoute = ({ framework }: InfraBackendLibs) => { framework.registerRoute( @@ -73,6 +74,15 @@ export const initGetLogEntryAnomaliesRoute = ({ framework }: InfraBackendLibs) = throw error; } + if (isMlPrivilegesError(error)) { + return response.customError({ + statusCode: 403, + body: { + message: error.message, + }, + }); + } + return response.customError({ statusCode: error.statusCode ?? 500, body: { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts index f1f1a1681a901..8b36f32f318a1 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts @@ -14,6 +14,7 @@ import { createValidationFunction } from '../../../../common/runtime_types'; import type { InfraBackendLibs } from '../../../lib/infra_types'; import { getLogEntryAnomaliesDatasets } from '../../../lib/log_analysis'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; +import { isMlPrivilegesError } from '../../../lib/log_analysis/errors'; export const initGetLogEntryAnomaliesDatasetsRoute = ({ framework }: InfraBackendLibs) => { framework.registerRoute( @@ -55,6 +56,15 @@ export const initGetLogEntryAnomaliesDatasetsRoute = ({ framework }: InfraBacken throw error; } + if (isMlPrivilegesError(error)) { + return response.customError({ + statusCode: 403, + body: { + message: error.message, + }, + }); + } + return response.customError({ statusCode: error.statusCode ?? 500, body: { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts index f57132ef1b505..2e2f2642b4a45 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts @@ -14,6 +14,7 @@ import { createValidationFunction } from '../../../../common/runtime_types'; import type { InfraBackendLibs } from '../../../lib/infra_types'; import { getTopLogEntryCategories } from '../../../lib/log_analysis'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; +import { isMlPrivilegesError } from '../../../lib/log_analysis/errors'; export const initGetLogEntryCategoriesRoute = ({ framework }: InfraBackendLibs) => { framework.registerRoute( @@ -66,6 +67,15 @@ export const initGetLogEntryCategoriesRoute = ({ framework }: InfraBackendLibs) throw error; } + if (isMlPrivilegesError(error)) { + return response.customError({ + statusCode: 403, + body: { + message: error.message, + }, + }); + } + return response.customError({ statusCode: error.statusCode ?? 500, body: { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts index b99ff920f81e4..20d1d919b5006 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts @@ -14,6 +14,7 @@ import { createValidationFunction } from '../../../../common/runtime_types'; import type { InfraBackendLibs } from '../../../lib/infra_types'; import { getLogEntryCategoryDatasets } from '../../../lib/log_analysis'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; +import { isMlPrivilegesError } from '../../../lib/log_analysis/errors'; export const initGetLogEntryCategoryDatasetsRoute = ({ framework }: InfraBackendLibs) => { framework.registerRoute( @@ -55,6 +56,15 @@ export const initGetLogEntryCategoryDatasetsRoute = ({ framework }: InfraBackend throw error; } + if (isMlPrivilegesError(error)) { + return response.customError({ + statusCode: 403, + body: { + message: error.message, + }, + }); + } + return response.customError({ statusCode: error.statusCode ?? 500, body: { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts index 11098ebe5c65b..0c408b7fc93f7 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts @@ -14,6 +14,7 @@ import { createValidationFunction } from '../../../../common/runtime_types'; import type { InfraBackendLibs } from '../../../lib/infra_types'; import { getLogEntryCategoryExamples } from '../../../lib/log_analysis'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; +import { isMlPrivilegesError } from '../../../lib/log_analysis/errors'; export const initGetLogEntryCategoryExamplesRoute = ({ framework, sources }: InfraBackendLibs) => { framework.registerRoute( @@ -65,6 +66,15 @@ export const initGetLogEntryCategoryExamplesRoute = ({ framework, sources }: Inf throw error; } + if (isMlPrivilegesError(error)) { + return response.customError({ + statusCode: 403, + body: { + message: error.message, + }, + }); + } + return response.customError({ statusCode: error.statusCode ?? 500, body: { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts index 7838a64a6045e..678c9f5666fc8 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts @@ -14,6 +14,7 @@ import { getLogEntryExamplesSuccessReponsePayloadRT, LOG_ANALYSIS_GET_LOG_ENTRY_RATE_EXAMPLES_PATH, } from '../../../../common/http_api/log_analysis'; +import { isMlPrivilegesError } from '../../../lib/log_analysis/errors'; export const initGetLogEntryExamplesRoute = ({ framework, sources }: InfraBackendLibs) => { framework.registerRoute( @@ -68,6 +69,15 @@ export const initGetLogEntryExamplesRoute = ({ framework, sources }: InfraBacken throw error; } + if (isMlPrivilegesError(error)) { + return response.customError({ + statusCode: 403, + body: { + message: error.message, + }, + }); + } + return response.customError({ statusCode: error.statusCode ?? 500, body: { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_rate.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_rate.ts index cd23c0193e291..23d8bd30c659b 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_rate.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_rate.ts @@ -15,6 +15,7 @@ import { import { createValidationFunction } from '../../../../common/runtime_types'; import { getLogEntryRateBuckets } from '../../../lib/log_analysis'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; +import { isMlPrivilegesError } from '../../../lib/log_analysis/errors'; export const initGetLogEntryRateRoute = ({ framework }: InfraBackendLibs) => { framework.registerRoute( @@ -56,6 +57,15 @@ export const initGetLogEntryRateRoute = ({ framework }: InfraBackendLibs) => { throw error; } + if (isMlPrivilegesError(error)) { + return response.customError({ + statusCode: 403, + body: { + message: error.message, + }, + }); + } + return response.customError({ statusCode: error.statusCode ?? 500, body: { From 64b609b0810a84c984edbb246e44232f17c1e6d6 Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Wed, 12 Aug 2020 17:09:16 +0200 Subject: [PATCH 072/113] [SIEM] Adds pin event to timeline cypress test (#74256) * adds 'pin event' cypress test * refactors code Co-authored-by: Elastic Machine --- .../integration/timeline_events.spec.ts | 39 +++++++++++++++++++ .../cypress/screens/timeline.ts | 2 + .../cypress/tasks/timeline.ts | 9 +++++ 3 files changed, 50 insertions(+) create mode 100644 x-pack/plugins/security_solution/cypress/integration/timeline_events.spec.ts diff --git a/x-pack/plugins/security_solution/cypress/integration/timeline_events.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timeline_events.spec.ts new file mode 100644 index 0000000000000..549cd134a04a4 --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/integration/timeline_events.spec.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PIN_EVENT } from '../screens/timeline'; + +import { loginAndWaitForPage } from '../tasks/login'; +import { openTimeline } from '../tasks/security_main'; +import { pinFirstEvent, populateTimeline, unpinFirstEvent } from '../tasks/timeline'; + +import { HOSTS_URL } from '../urls/navigation'; + +describe('timeline events', () => { + before(() => { + loginAndWaitForPage(HOSTS_URL); + openTimeline(); + populateTimeline(); + }); + + after(() => { + unpinFirstEvent(); + }); + + it('pins the first event to the timeline', () => { + cy.server(); + cy.route('POST', '**/api/solutions/security/graphql').as('persistTimeline'); + + pinFirstEvent(); + + cy.wait('@persistTimeline', { timeout: 10000 }).then((response) => { + cy.wrap(response.status).should('eql', 200); + cy.wrap(response.xhr.responseText).should('include', 'persistPinnedEventOnTimeline'); + }); + + cy.get(PIN_EVENT).should('have.attr', 'aria-label', 'Pinned event'); + }); +}); diff --git a/x-pack/plugins/security_solution/cypress/screens/timeline.ts b/x-pack/plugins/security_solution/cypress/screens/timeline.ts index 14282b84b5ffc..68425731f149a 100644 --- a/x-pack/plugins/security_solution/cypress/screens/timeline.ts +++ b/x-pack/plugins/security_solution/cypress/screens/timeline.ts @@ -19,6 +19,8 @@ export const ID_FIELD = '[data-test-subj="timeline"] [data-test-subj="field-name export const ID_TOGGLE_FIELD = '[data-test-subj="toggle-field-_id"]'; +export const PIN_EVENT = '[data-test-subj="pin"]'; + export const PROVIDER_BADGE = '[data-test-subj="providerBadge"]'; export const REMOVE_COLUMN = diff --git a/x-pack/plugins/security_solution/cypress/tasks/timeline.ts b/x-pack/plugins/security_solution/cypress/tasks/timeline.ts index 761fd2c1e6a0b..d5106f34cc9c5 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/timeline.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/timeline.ts @@ -12,6 +12,7 @@ import { ID_FIELD, ID_HEADER_FIELD, ID_TOGGLE_FIELD, + PIN_EVENT, SEARCH_OR_FILTER_CONTAINER, SERVER_SIDE_EVENT_COUNT, TIMELINE_DESCRIPTION, @@ -78,6 +79,10 @@ export const openTimelineSettings = () => { cy.get(TIMELINE_SETTINGS_ICON).trigger('click', { force: true }); }; +export const pinFirstEvent = () => { + cy.get(PIN_EVENT).first().click({ force: true }); +}; + export const populateTimeline = () => { executeTimelineKQL(hostExistsQuery); cy.get(SERVER_SIDE_EVENT_COUNT) @@ -88,6 +93,10 @@ export const populateTimeline = () => { }); }; +export const unpinFirstEvent = () => { + cy.get(PIN_EVENT).first().click({ force: true }); +}; + export const uncheckTimestampToggleField = () => { cy.get(TIMESTAMP_TOGGLE_FIELD).should('exist'); From be7e21c9259ca4108f98ebc7877ee0730c2402cb Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Wed, 12 Aug 2020 16:14:48 +0100 Subject: [PATCH 073/113] [Security Solution] put back savedObjectId in error message (#74775) * put back savedObjectId in error message * fix type error --- .../common/components/import_data_modal/index.tsx | 14 +++++++++++++- .../containers/detection_engine/rules/types.ts | 10 +++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx b/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx index 038c116c9fc8c..65dcdf8a6f9cb 100644 --- a/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx @@ -23,6 +23,8 @@ import React, { useCallback, useState } from 'react'; import { ImportDataResponse, ImportDataProps, + ImportRulesResponseError, + ImportResponseError, } from '../../../detections/containers/detection_engine/rules'; import { displayErrorToast, @@ -48,6 +50,12 @@ interface ImportDataModalProps { title: string; } +const isImportRulesResponseError = ( + error: ImportRulesResponseError | ImportResponseError +): error is ImportRulesResponseError => { + return (error as ImportRulesResponseError).rule_id !== undefined; +}; + /** * Modal component for importing Rules from a json file */ @@ -96,7 +104,11 @@ export const ImportDataModalComponent = ({ } if (importResponse.errors.length > 0) { const formattedErrors = importResponse.errors.map((e) => - failedDetailed(e.rule_id, e.error.status_code, e.error.message) + failedDetailed( + isImportRulesResponseError(e) ? e.rule_id : e.id, + e.error.status_code, + e.error.message + ) ); displayErrorToast(errorMessage, formattedErrors, dispatchToaster); } diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts index 78d2e2a5b0c2f..a5bbc0465ccc1 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts @@ -234,10 +234,18 @@ export interface ImportRulesResponseError { }; } +export interface ImportResponseError { + id: string; + error: { + status_code: number; + message: string; + }; +} + export interface ImportDataResponse { success: boolean; success_count: number; - errors: ImportRulesResponseError[]; + errors: Array; } export interface ExportDocumentsProps { From fb2b9a46af08d8369b206c323ad9a80425d7c5be Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Wed, 12 Aug 2020 10:41:12 -0500 Subject: [PATCH 074/113] [Security Solution] [Cases] Bugfix for special character tags filtering (#74849) --- .../public/cases/containers/api.test.tsx | 27 ++++++++++++++++++- .../public/cases/containers/api.ts | 2 +- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/cases/containers/api.test.tsx b/x-pack/plugins/security_solution/public/cases/containers/api.test.tsx index 321d330758e53..68a0d2834242e 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/api.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/api.test.tsx @@ -159,7 +159,32 @@ describe('Case Configuration API', () => { query: { ...DEFAULT_QUERY_PARAMS, reporters, - tags, + tags: ['"coke"', '"pepsi"'], + search: 'hello', + }, + signal: abortCtrl.signal, + }); + }); + test('tags with weird chars get handled gracefully', async () => { + const weirdTags: string[] = ['(', '"double"']; + + await getCases({ + filterOptions: { + ...DEFAULT_FILTER_OPTIONS, + reporters: [...respReporters, { username: null, full_name: null, email: null }], + tags: weirdTags, + status: '', + search: 'hello', + }, + queryParams: DEFAULT_QUERY_PARAMS, + signal: abortCtrl.signal, + }); + expect(fetchMock).toHaveBeenCalledWith(`${CASES_URL}/_find`, { + method: 'GET', + query: { + ...DEFAULT_QUERY_PARAMS, + reporters, + tags: ['"("', '"\\"double\\""'], search: 'hello', }, signal: abortCtrl.signal, diff --git a/x-pack/plugins/security_solution/public/cases/containers/api.ts b/x-pack/plugins/security_solution/public/cases/containers/api.ts index 35422fa3c5fef..83ee10e9b45a8 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/api.ts +++ b/x-pack/plugins/security_solution/public/cases/containers/api.ts @@ -132,7 +132,7 @@ export const getCases = async ({ }: FetchCasesProps): Promise => { const query = { reporters: filterOptions.reporters.map((r) => r.username ?? '').filter((r) => r !== ''), - tags: filterOptions.tags, + tags: filterOptions.tags.map((t) => `"${t.replace(/"/g, '\\"')}"`), ...(filterOptions.status !== '' ? { status: filterOptions.status } : {}), ...(filterOptions.search.length > 0 ? { search: filterOptions.search } : {}), ...queryParams, From 0e5ac40b0061e3abe63f8687cb1876759830e4be Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Wed, 12 Aug 2020 17:45:12 +0200 Subject: [PATCH 075/113] Support sentence case names for known processors (#74847) --- .../processor_information.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item_tooltip/processor_information.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item_tooltip/processor_information.tsx index 96abd7ebcd7ce..85320f43c1b83 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item_tooltip/processor_information.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item_tooltip/processor_information.tsx @@ -7,17 +7,19 @@ import React, { FunctionComponent, memo } from 'react'; import { EuiPanel, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import { ProcessorInternal } from '../../types'; +import { getProcessorDescriptor } from '../shared'; interface Props { processor: ProcessorInternal; } export const ProcessorInformation: FunctionComponent = memo(({ processor }) => { + const label = getProcessorDescriptor(processor.type)?.label ?? processor.type; return ( - {processor.type} + {label} {processor.options.description ? ( From 34195271c533a002b64d30633bc0e262b1904198 Mon Sep 17 00:00:00 2001 From: Brent Kimmel Date: Wed, 12 Aug 2020 11:56:05 -0400 Subject: [PATCH 076/113] [Security Solution][Resolver]Enzyme test related events closing (#74811) --- .../resolver/view/clickthrough.test.tsx | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx index 296e5b253c0b9..60122f2e450c7 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx @@ -162,10 +162,28 @@ describe('Resolver, when analyzing a tree that has two related events for the or button.simulate('click'); } }); - it('should open the submenu', async () => { + it('should open the submenu and display exactly one option with the correct count', async () => { await expect( simulator.map(() => simulator.processNodeSubmenuItems().map((node) => node.text())) ).toYieldEqualTo(['2 registry']); + await expect( + simulator.map(() => simulator.processNodeSubmenuItems().length) + ).toYieldEqualTo(1); + }); + }); + describe('and when the related events button is clicked again', () => { + beforeEach(async () => { + const button = await simulator.resolveWrapper(() => + simulator.processNodeRelatedEventButton(entityIDs.origin) + ); + if (button) { + button.simulate('click'); + } + }); + it('should close the submenu', async () => { + await expect( + simulator.map(() => simulator.processNodeSubmenuItems().length) + ).toYieldEqualTo(0); }); }); }); From 8f541984349c12e652eca872304e455633213690 Mon Sep 17 00:00:00 2001 From: Kaarina Tungseth Date: Wed, 12 Aug 2020 11:13:04 -0500 Subject: [PATCH 077/113] [DOCS] Canvas docs 7.9 refresh (#74000) * [DOCS] Canvas docs refresh * Reformatting * Image descriptions * Adds workpad redirect * Link fix pt 2 * Link fix part 3 * Link fix part 4 * Comments from Poff * Corrected file name * Review comment Co-authored-by: Elastic Machine --- docs/canvas/canvas-edit-workpads.asciidoc | 136 ++++++++++++++ docs/canvas/canvas-elements.asciidoc | 167 ------------------ docs/canvas/canvas-present-workpad.asciidoc | 30 +++- docs/canvas/canvas-share-workpad.asciidoc | 14 +- docs/canvas/canvas-tutorial.asciidoc | 6 +- docs/canvas/canvas-workpad.asciidoc | 140 --------------- docs/canvas/images/clone_element.gif | Bin 0 -> 1193990 bytes docs/canvas/images/copy_variable_syntax.png | Bin 0 -> 27610 bytes .../canvas/images/specify_variable_syntax.png | Bin 0 -> 17885 bytes docs/glossary.asciidoc | 2 +- docs/user/canvas.asciidoc | 162 ++++++++++++++++- 11 files changed, 334 insertions(+), 323 deletions(-) create mode 100644 docs/canvas/canvas-edit-workpads.asciidoc delete mode 100644 docs/canvas/canvas-elements.asciidoc delete mode 100644 docs/canvas/canvas-workpad.asciidoc create mode 100644 docs/canvas/images/clone_element.gif create mode 100644 docs/canvas/images/copy_variable_syntax.png create mode 100644 docs/canvas/images/specify_variable_syntax.png diff --git a/docs/canvas/canvas-edit-workpads.asciidoc b/docs/canvas/canvas-edit-workpads.asciidoc new file mode 100644 index 0000000000000..6558def8a7474 --- /dev/null +++ b/docs/canvas/canvas-edit-workpads.asciidoc @@ -0,0 +1,136 @@ +[role="xpack"] +[[edit-workpads]] +== Edit workpads + +To create the look and feel that you want, apply format settings to the entire workpad, or individual elements. + +[float] +[[create-variables]] +=== Create variables + +When you frequently use copy and paste, create variables to easily reuse strings and patterns. For example, when you clone a large workpad and need to connect your elements to a new index, use variables to update +each element instead of updating them manually. + +. Create the variables. +.. Click *Add a variable*. +.. Specify the variable options, then click *Save changes*. + +. Apply the variable. +.. Copy the variable. +.. Select the element you want to change, then open the expression editor. +.. Paste the variable. + +For example, to change the index pattern for a set of charts: + +Specify the variable options. + +[role="screenshot"] +image::images/specify_variable_syntax.png[Specify the variable syntax] + +Copy the variable, then apply it to each element you want to update in the *Expression editor*. + +[role="screenshot"] +image::images/copy_variable_syntax.png[Copy the variable syntax] + +[float] +[[apply-changes-to-the-entire-workpad]] +=== Apply changes to the entire workpad + +With stylesheets, you can change the look of the entire workpad, including fonts, colors, layout, and more. + +To get started, enter the changes you want to make in the *Global CSS overrides* text editor, then click *Apply stylesheet*. + +For example, to change the background for the entire workpad, enter: + +[source,text] +-------------------------------------------------- +.canvasPage { +background-color: #3990e6; +} +-------------------------------------------------- + +[float] +[[change-the-element-settings]] +=== Change the element settings + +Element settings enable you to change the display options at the element level. For example, use the element settings to change the dimensions, style, or location of an element. + +[float] +[[change-the-display-options]] +==== Change the display options + +Choose the display options for your elements. The options available depend on the element you select. + +To change the element display options, click *Display*, then make your changes in the editor. + +To use CSS overrides: + +. Click *+* next to *Element style*, then select *CSS*. +. In the *CSS* text editor, enter the changes you want to make, then click *Apply stylesheet*. + +For example, to center an element, enter: + +[source,text] +-------------------------------------------------- +.canvasRenderEl h1 { +text.align: center; +} +-------------------------------------------------- + +[float] +[[clone-elements]] +==== Clone elements +To use an element with the same functionality and appearance in multiple places, clone the element. + +Select the element, then click *Edit > Clone*. + +[role="screenshot"] +image::images/clone_element.gif[Clone elements] + +[float] +[[move-and-resize-elements]] +==== Move and resize elements + +Canvas provides you with many options to move and resize the elements on your workpad. + +* To move elements, click and hold the element, then drag to the new location. + +* To move elements by 1 pixel, select the element, press and hold Shift, then use your arrow keys. + +* To move elements by 10 pixels, select the element, then use your arrow keys. + +* To resize elements, click and drag the resize handles to the new dimensions. + +[float] +[[edit-elements]] +==== Edit elements + +The element editing options allow you to arrange and organize the elements on your workpad page. + +To align two or more elements: + +. Press and hold Shift, then select the elements you want to align. + +. Click *Edit > Alignment*, then select the alignment option. + +To distribute three or more elements: + +. Press and hold Shift, then select the elements you want to distribute. + +. Click *Edit > Distribution*, then select the distribution option. + +To reorder elements: + +. Select the element you want to reorder. + +. Click *Edit > Order*, then select the order option. + +[float] +[[delete-elements]] +==== Delete elements + +When you no longer need an element, delete it from your workpad. + +. Select the element you want to delete. + +. Click *Edit > Delete*. diff --git a/docs/canvas/canvas-elements.asciidoc b/docs/canvas/canvas-elements.asciidoc deleted file mode 100644 index 9c7467bb452fd..0000000000000 --- a/docs/canvas/canvas-elements.asciidoc +++ /dev/null @@ -1,167 +0,0 @@ -[role="xpack"] -[[add-canvas-elements]] -=== Add elements - -Create a story about your data by adding elements to your workpad that include images, text, charts, and more. You can create your own elements and connect them to your data sources, add saved objects, and add your own images. - -[float] -[[create-canvas-element]] -==== Create an element - -Choose the type of element you want to use, then connect it to your own data. - -. Click *Add element*, then select the element you want to use. -+ -[role="screenshot"] -image::images/canvas-element-select.gif[Canvas elements] - -. To familiarize yourself with the element, use the preconfigured data demo data. -+ -By default, most of the elements you create use demo data until you change the data source. The demo data includes a small data set that you can use to experiment with your element. - -. To connect the element to your data, select *Data*, then select one of the following data sources: - -* *{es} SQL* — Access your data in {es} using SQL syntax. For information about SQL syntax, refer to {ref}/sql-spec.html[SQL language]. - -* *{es} documents* — Access your data in {es} without using aggregations. To use, select an index and fields, and optionally enter a query using the <>. Use the *{es} documents* data source when you have low volume datasets, to view raw documents, or to plot exact, non-aggregated values on a chart. - -* *Timelion* — Access your time series data using <> queries. To use Timelion queries, you can enter a query using the <>. - -Each element can display a different data source. Pages and workpads often contain multiple data sources. - -[float] -[[canvas-add-object]] -==== Add a saved object - -Add <> to your workpad, such as maps and visualizations. - -. Click *Add element > Add from Visualize Library*. - -. Select the saved object you want to add. -+ -[role="screenshot"] -image::images/canvas-map-embed.gif[] - -. To use the customization options, click the panel menu, then select one of the following options: - -* *Edit map* — Opens <> or <> so that you can edit the original saved object. - -* *Edit panel title* — Adds a title to the saved object. - -* *Customize time range* — Exposes a time filter dedicated to the saved object. - -* *Inspect* — Allows you to drill down into the element data. - -[float] -[[canvas-add-image]] -==== Add your own image - -To personalize your workpad, add your own logos and graphics. - -. Click *Add element > Manage assets*. - -. On the *Manage workpad assets* window, drag and drop your images. - -. To add the image to the workpad, click the *Create image element* icon. -+ -[role="screenshot"] -image::images/canvas-add-image.gif[] - -[float] -[[move-canvas-elements]] -==== Organize elements - -Move and resize your elements to meet your design needs. - -* To move, click and hold the element, then drag to the new location. - -* To move by 1 pixel, select the element, press and hold Shift, then use your arrow keys. - -* To move by 10 pixels, select the element, then use your arrow keys. - -* To resize, click and drag the resize handles to the new dimensions. - -[float] -[[format-canvas-elements]] -==== Format elements - -For consistency and readability across your workpad pages, align, distribute, and reorder elements. - -To align two or more elements: - -. Press and hold Shift, then select the elements you want to align. - -. Click *Edit > Alignment*, then select the alignment option. - -To distribute three or more elements: - -. Press and hold Shift, then select the elements you want to distribute. - -. Click *Edit > Distribution*, then select the distribution option. - -To reorder elements: - -. Select the element you want to reorder. - -. Click *Edit > Order*, then select the order option. - -[float] -[[data-display]] -==== Change the element display options - -Each element has its own display options to fit your design needs. - -To choose the display options, click *Display*, then make your changes. - -To define the appearance of the container and border: - -. Next to *Element style*, click *+*, then select *Container style*. - -. Expand *Container style*. - -. Change the *Appearance* and *Border* options. - -To apply CSS overrides: - -. Next to *Element style*, click *+*, then select *CSS*. - -. Enter the *CSS*. -+ -For example, to center the Markdown element, enter: -+ -[source,text] --------------------------------------------------- -.canvasRenderEl h1 { -text.align: center; -} --------------------------------------------------- - -. Click *Apply stylesheet*. - -[float] -[[save-elements]] -==== Save elements - -To use the elements across all workpads, save the elements. - -When you're ready to save your element, select the element, then click *Edit > Save as new element*. - -[role="screenshot"] -image::images/canvas_save_element.png[] - -To save a group of elements, press and hold Shift, select the elements you want to save, then click *Edit > Save as new element*. - -To access your saved elements, click *Add element > My elements*. - -[float] -[[delete-elements]] -==== Delete elements - -When you no longer need an element, delete it from your workpad. - -. Select the element you want to delete. - -. Click *Edit > Delete*. -+ -[role="screenshot"] -image::images/canvas_element_options.png[] diff --git a/docs/canvas/canvas-present-workpad.asciidoc b/docs/canvas/canvas-present-workpad.asciidoc index e0139ab943104..a6d801b74fce1 100644 --- a/docs/canvas/canvas-present-workpad.asciidoc +++ b/docs/canvas/canvas-present-workpad.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[canvas-present-workpad]] -=== Present your workpad +== Present your workpad When you are ready to present your workpad, use and enable the presentation options. @@ -21,3 +21,31 @@ image::images/canvas-autoplay-interval.png[Element autoplay interval] image::images/canvas-fullscreen.png[Fullscreen mode] . When you are ready to exit fullscreen mode, press the Esc (Escape) key. + +[float] +[[zoom-in-out]] +=== Use the zoom options + +To get a closer look at a portion of your workpad, use the zoom options. + +. Click *View > Zoom*. + +. Select the zoom option. ++ +[role="screenshot"] +image::images/canvas-zoom-controls.png[Zoom controls] + +[float] +[[configure-auto-refresh-interval]] +=== Change the auto-refresh interval + +Change how often the data refreshes on your workpad. + +. Click *View > Auto refresh settings*. + +. Select the interval you want to use, or *Set a custom interval*. ++ +[role="screenshot"] +image::images/canvas-refresh-interval.png[Element data refresh interval] ++ +To manually refresh the data, click image:canvas/images/canvas-refresh-data.png[]. diff --git a/docs/canvas/canvas-share-workpad.asciidoc b/docs/canvas/canvas-share-workpad.asciidoc index a095253c6cff3..f6cd2d93a9372 100644 --- a/docs/canvas/canvas-share-workpad.asciidoc +++ b/docs/canvas/canvas-share-workpad.asciidoc @@ -1,12 +1,12 @@ [role="xpack"] [[workpad-share-options]] -=== Share your workpad +== Share your workpad When you've finished your workpad, you can share it outside of {kib}. [float] [[export-single-workpad]] -==== Export workpads +=== Export workpads Create a JSON file of your workpad that you can export outside of {kib}. @@ -19,9 +19,9 @@ Want to export multiple workpads? Go to the *Canvas* home page, select the workp [float] [[create-workpad-pdf]] -==== Create a PDF +=== Create a PDF -If you have a license that supports the {report-features}, you can create a PDF copy of your workpad that you can save and share outside {kib}. +If you have a subscription that supports the {report-features}, you can create a PDF copy of your workpad that you can save and share outside {kib}. Click *Share > PDF reports > Generate PDF*. @@ -32,9 +32,9 @@ For more information, refer to <> or a script. Click *Share > PDF reports > Copy POST URL*. @@ -45,7 +45,7 @@ For more information, refer to <>. +* Build presentations of your own live data with <>. * Learn more about <> — the building blocks of your workpad. diff --git a/docs/canvas/canvas-workpad.asciidoc b/docs/canvas/canvas-workpad.asciidoc deleted file mode 100644 index 9d49c5f492bbb..0000000000000 --- a/docs/canvas/canvas-workpad.asciidoc +++ /dev/null @@ -1,140 +0,0 @@ -[role="xpack"] -[[create-canvas-workpad]] -== Create a workpad - -A Canvas _workpad_ provides you with a workspace where you can build presentations of your live data. - -To create a workpad, choose one of the following options: - -* <> - -* <> - -* <> - -* <> - -[float] -[[blank-canvas-workpad]] -=== Start with a blank workpad - -To use the background colors, images, and data of your choice, start with a blank workpad. - -. Open the menu, then go to *Canvas*. - -. On the *Canvas workpads* view, click *Create workpad*. - -. Add a *Name* to your workpad. - -. In the *Width* and *Height* fields, specify the size. - -. Select the layout. -+ -For example, click *720p* for a traditional presentation layout. - -. Click the *Background color* picker, then select the background color for your workpad. -+ -[role="screenshot"] -image::images/canvas-background-color-picker.png[Canvas color picker] - -[float] -[[canvas-template-workpad]] -=== Create a workpad from a template - -If you're unsure about where to start, you can use one of the preconfigured templates that come with Canvas. - -. Open the menu, then go to *Canvas*. - -. On the *Canvas workpads* view, select *Templates*. - -. Click the preconfigured template that you want to use. - -. Add your own *Name* to the workpad. - -[float] -[[import-canvas-workpad]] -=== Import an existing workpad - -When you want to use a workpad that someone else has already started, import the JSON file into Canvas. - -. Open the menu, then go to *Canvas*. - -. On the *Canvas workpads* view, click and drag the file to the *Import workpad JSON file* field. - -[float] -[[sample-data-workpad]] -=== Use a sample data workpad - -Each of the sample data sets comes with a Canvas workpad that you can use for your own workpad inspiration. - -. Add a {kibana-ref}/add-sample-data.html[sample data set]. - -. On the *Add Data* page, click *View data*, then select *Canvas*. - -[float] -[[apply-workpad-styles]] -=== Apply a set of styles to the entire workpad - -To make your workpad look exactly the way you want, use the editor to apply CSS overrides. - -. Expand *Global CSS overrides*. - -. Enter the CSS. -+ -For example, to change the background on every page, enter: -+ -[source,text] --------------------------------------------------- -.canvasPage { -background-color: #3990e6; -} --------------------------------------------------- - -. Click *Apply stylesheet*. - -[float] -[[configure-auto-refresh-interval]] -=== Change the auto-refresh interval - -Change how often the data refreshes on your workpad. - -. Click *View > Auto refresh settings*. - -. Select the interval you want to use, or *Set a custom interval*. -+ -[role="screenshot"] -image::images/canvas-refresh-interval.png[Element data refresh interval] -+ -To manually refresh the data, click image:canvas/images/canvas-refresh-data.png[]. - -[float] -[[zoom-in-out]] -=== Use the zoom options - -To get a closer look at a portion of your workpad, use the zoom options. - -. Click *View > Zoom*. - -. Select the zoom option. -+ -[role="screenshot"] -image::images/canvas-zoom-controls.png[Zoom controls] - -[float] -[[add-more-pages]] -=== Add pages - -Organize your ideas onto separate pages by adding more pages. - -. Click *Page 1*, then click *+*. - -. On the *Page* editor panel, select the page transition from the *Transition* dropdown. -+ -[role="screenshot"] -image::images/canvas-add-pages.gif[Add pages] - -include::{kib-repo-dir}/canvas/canvas-elements.asciidoc[] - -include::{kib-repo-dir}/canvas/canvas-present-workpad.asciidoc[] - -include::{kib-repo-dir}/canvas/canvas-share-workpad.asciidoc[] diff --git a/docs/canvas/images/clone_element.gif b/docs/canvas/images/clone_element.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef8f44223d240c9349b5b13caea45f5665dd6928 GIT binary patch literal 1193990 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%0D2jKuf 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

C{ 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

1&4cG>eTu<~G8DxoT0|=cA&)3T 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

AiRRh442XlhTU9Xl@RY0$>4l8}T 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%0AE34(JWXq~tEB?%<8w`vmS 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

SQWY0>Q+n_1b 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 literal 0 HcmV?d00001 diff --git a/docs/canvas/images/specify_variable_syntax.png b/docs/canvas/images/specify_variable_syntax.png new file mode 100644 index 0000000000000000000000000000000000000000..98168c3d62ee52a8d20d20fd4a2551fde280ae87 GIT binary patch literal 17885 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. See -{kibana-ref}/create-canvas-workpad.html[Create a workpad]. +{kibana-ref}/canvas.html[Create a workpad]. // end::workpad-def[] diff --git a/docs/user/canvas.asciidoc b/docs/user/canvas.asciidoc index 355684f7448a1..317ec67dd7c0a 100644 --- a/docs/user/canvas.asciidoc +++ b/docs/user/canvas.asciidoc @@ -18,16 +18,170 @@ With Canvas, you can: * Focus the data you want to display with filters. [role="screenshot"] -image::images/canvas-gs-example.png[] +image::images/canvas-gs-example.png[Getting started example] For a quick overview of Canvas, watch link:https://www.youtube.com/watch?v=ZqvF_5-1xjQ[Stand out with Canvas]. -//When https://github.com/elastic/Video/issues/358 is resolved, update this link. + +[float] +[[create-workpads]] +== Create workpads + +A _workpad_ provides you with a space where you can build presentations of your live data. + +[float] +[[start-with-a-blank-workpad]] +=== Start with a blank workpad + +To use the background colors, images, and data of your choice, start with a blank workpad. + +. Open the menu, then go to *Canvas*. + +. On the *Canvas workpads* view, click *Create workpad*. + +. Add a *Name* to your workpad. + +. In the *Width* and *Height* fields, specify the size. + +. Select the layout. ++ +For example, click *720p* for a traditional presentation layout. + +. Click the *Background color* picker, then select the background color for your workpad. ++ +[role="screenshot"] +image::images/canvas-background-color-picker.png[Canvas color picker] + +[float] +[[create-workpads-from-templates]] +=== Create workpads from templates + +If you're unsure about where to start, you can use one of the preconfigured templates that come with Canvas. + +. Open the menu, then go to *Canvas*. + +. On the *Canvas workpads* view, select *Templates*. + +. Click the preconfigured template that you want to use. + +. Add your own *Name* to the workpad. + +[float] +[[import-existing-workpads]] +=== Import existing workpads + +When you want to use a workpad that someone else has already started, import the JSON file into Canvas. + +. Open the menu, then go to *Canvas*. + +. On the *Canvas workpads* view, click and drag the file to the *Import workpad JSON file* field. + +[float] +[[use-sample-data-workpads]] +=== Use sample data workpads + +Each of the sample data sets comes with a Canvas workpad that you can use for your own workpad inspiration. + +. Add a {kibana-ref}/add-sample-data.html[sample data set]. + +. On the *Add Data* page, click *View data*, then select *Canvas*. + +[float] +[[add-canvas-elements]] +== Add elements + +Create a story about your data by adding elements to your workpad that include images, text, charts, and more. + +[float] +[[create-elements]] +=== Create elements + +Choose the type of element you want to use, then use the preconfigured demo data to familiarize yourself with the element. When you're ready, connect the element to your own data. By default, most of the elements you create use +demo data until you change the data source. The demo data includes a small data set that you can use to experiment with your element. + +To begin, click *Add element*, then select the element you want to use. + +[role="screenshot"] +image::images/canvas-element-select.gif[Canvas elements] + +When you're ready to connect the element to your data, select *Data*, then select one of the following data sources: + +* *{es} SQL* — Access your data in {es} using {ref}/sql-spec.html[SQL syntax]. + +* *{es} documents* — Access your data in {es} without using aggregations. To use, select an index and fields, and optionally enter a query using the <>. Use the *{es} documents* data source when you have low volume datasets, to view raw documents, or to plot exact, non-aggregated values on a chart. + +* *Timelion* — Access your time series data using <> queries. To use Timelion queries, you can enter a query using the <>. + +Each element can display a different data source, and pages and workpads often contain multiple data sources. + +When you're ready to save your element, select the element, then click *Edit > Save as new element*. + +[role="screenshot"] +image::images/canvas_save_element.png[] + +To save a group of elements, press and hold Shift, select the elements you want to save, then click *Edit > Save as new element*. + +Elements are saved in *Add element > My elements*. + +[float] +[[add-existing-visuualizations]] +=== Add existing visualizations + +Add <> to your workpad, such as maps and visualizations. + +. Click *Add element > Add from Visualize Library*. + +. Select the saved object you want to add. ++ +[role="screenshot"] +image::images/canvas-map-embed.gif[] + +. To use the customization options, click the panel menu, then select one of the following options: + +* *Edit map* — Opens <> or <> so that you can edit the original saved object. + +* *Edit panel title* — Adds a title to the saved object. + +* *Customize time range* — Exposes a time filter dedicated to the saved object. + +* *Inspect* — Allows you to drill down into the element data. + +[float] +[[add-your-own-images]] +=== Add your own images + +To personalize your workpad, add your own logos and graphics. + +. Click *Add element > Manage assets*. + +. On the *Manage workpad assets* window, drag and drop your images. + +. To add the image to the workpad, click the *Create image element* icon. ++ +[role="screenshot"] +image::images/canvas-add-image.gif[Add image to Canvas] + +[float] +[[add-more-pages]] +== Add pages + +Organize and separate your ideas by adding more pages. + +. Click *Page 1*, then click *+*. + +. On the *Page* editor panel, select the page transition from the *Transition* dropdown. ++ +[role="screenshot"] +image::images/canvas-add-pages.gif[Add pages] -- -include::{kib-repo-dir}/canvas/canvas-tutorial.asciidoc[] +include::{kib-repo-dir}/canvas/canvas-edit-workpads.asciidoc[] + +include::{kib-repo-dir}/canvas/canvas-present-workpad.asciidoc[] -include::{kib-repo-dir}/canvas/canvas-workpad.asciidoc[] +include::{kib-repo-dir}/canvas/canvas-share-workpad.asciidoc[] + +include::{kib-repo-dir}/canvas/canvas-tutorial.asciidoc[] include::{kib-repo-dir}/canvas/canvas-expression-lifecycle.asciidoc[] From 6ee2460ebc0ccb673a13368cc05af861df19cd2e Mon Sep 17 00:00:00 2001 From: Constance Date: Wed, 12 Aug 2020 09:33:10 -0700 Subject: [PATCH 078/113] [Enterprise Search] Add solution-level side navigation (#74705) * Add basic layout/sidebar blocking - note: we should *not* set left: 0 / top: 0 etc., as this can interfere with Kibana's existing UI (e.g. docked navigation, telemetry callout) * Add sidebar styles + static links * Refactor SideNav to be a reusable component - So that Workplace Search can reuse the same layout but pass in their own custom nav + Refactor AppSearch to use Layout in router * Refactor all views to account for in-router Layout * Fix root redirects not working as expected - If enterpriseSearchUrl hasn't been set, all pages should redirect to SetupGuide, not just root - The engines redirect simply wasn't working at all - it would always show a blank page when '/' was clicked in the Kibana breadcrumbs. Not sure if this is a Kibana issue - had to change to a component load to fix + Simplify index.test.tsx (probably unreasonable and not super helpful to add assertions for each new route) * Implement active styling for links * Fix failing location tests - By adding a new useLocation mock + add SideNavLink active class test TODO: I should probably rename react_router_history.mock to just react_router.mock * Add responsive toggle + styling * Add navigation accessibility attributes/controls * [Feedback] Update mobile UX to close menu on link click/navigation - This requires updating our EUI/React Router components to accept and run custom onClick events - Also requires adding a new ReactContext to pass down closeNavigation, but that's not too onerous thanks to useContext --- .../public/applications/__mocks__/index.ts | 2 +- .../__mocks__/react_router_history.mock.ts | 10 +- .../components/empty_states/empty_state.tsx | 73 ++++++------ .../components/empty_states/error_state.tsx | 16 ++- .../components/empty_states/loading_state.tsx | 21 ++-- .../engine_overview/engine_overview.scss | 13 +- .../engine_overview/engine_overview.tsx | 111 +++++++++--------- .../applications/app_search/index.test.tsx | 54 ++++----- .../public/applications/app_search/index.tsx | 70 +++++++++-- .../applications/shared/layout/index.ts | 8 ++ .../applications/shared/layout/layout.scss | 81 +++++++++++++ .../shared/layout/layout.test.tsx | 61 ++++++++++ .../applications/shared/layout/layout.tsx | 60 ++++++++++ .../applications/shared/layout/side_nav.scss | 75 ++++++++++++ .../shared/layout/side_nav.test.tsx | 92 +++++++++++++++ .../applications/shared/layout/side_nav.tsx | 107 +++++++++++++++++ .../shared/layout/side_nav_bg.svg | 25 ++++ .../react_router_helpers/eui_link.test.tsx | 9 ++ .../shared/react_router_helpers/eui_link.tsx | 26 ++-- 19 files changed, 741 insertions(+), 173 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/layout/index.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.scss create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.scss create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav_bg.svg diff --git a/x-pack/plugins/enterprise_search/public/applications/__mocks__/index.ts b/x-pack/plugins/enterprise_search/public/applications/__mocks__/index.ts index 6f82946c0ea14..e999d40a3f8e6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/__mocks__/index.ts +++ b/x-pack/plugins/enterprise_search/public/applications/__mocks__/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export { mockHistory } from './react_router_history.mock'; +export { mockHistory, mockLocation } from './react_router_history.mock'; export { mockKibanaContext } from './kibana_context.mock'; export { mockLicenseContext } from './license_context.mock'; export { diff --git a/x-pack/plugins/enterprise_search/public/applications/__mocks__/react_router_history.mock.ts b/x-pack/plugins/enterprise_search/public/applications/__mocks__/react_router_history.mock.ts index fd422465d87f1..779eb1a043e8c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/__mocks__/react_router_history.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/__mocks__/react_router_history.mock.ts @@ -5,7 +5,7 @@ */ /** - * NOTE: This variable name MUST start with 'mock*' in order for + * NOTE: These variable names MUST start with 'mock*' in order for * Jest to accept its use within a jest.mock() */ export const mockHistory = { @@ -15,9 +15,17 @@ export const mockHistory = { pathname: '/current-path', }, }; +export const mockLocation = { + key: 'someKey', + pathname: '/current-path', + search: '?query=something', + hash: '#hash', + state: {}, +}; jest.mock('react-router-dom', () => ({ useHistory: jest.fn(() => mockHistory), + useLocation: jest.fn(() => mockLocation), })); /** diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/empty_state.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/empty_state.tsx index d6c38629d8143..4d2b790e7fb97 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/empty_state.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/empty_state.tsx @@ -5,7 +5,7 @@ */ import React, { useContext } from 'react'; -import { EuiPage, EuiPageBody, EuiPageContent, EuiEmptyPrompt, EuiButton } from '@elastic/eui'; +import { EuiPageContent, EuiEmptyPrompt, EuiButton } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { sendTelemetry } from '../../../shared/telemetry'; @@ -32,43 +32,40 @@ export const EmptyState: React.FC = () => { }; return ( - + <> - - - - - - -

Zr6m>wDLxAJ7?>lW7< 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

- } - titleSize="l" - body={ -

- -

- } - actions={ - - - - } - /> - - - + + + + +

+ } + titleSize="l" + body={ +

+ +

+ } + actions={ + + + + } + /> + + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx index 3753ad5433e8f..c5a5f1fbb921f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx @@ -5,7 +5,7 @@ */ import React from 'react'; -import { EuiPage, EuiPageBody, EuiPageContent } from '@elastic/eui'; +import { EuiPageContent } from '@elastic/eui'; import { ErrorStatePrompt } from '../../../shared/error_state'; import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; @@ -16,16 +16,14 @@ import './empty_states.scss'; export const ErrorState: React.FC = () => { return ( - + <> - - - - - - - + + + + + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/loading_state.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/loading_state.tsx index 533dca7d0ab79..221091b79dc54 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/loading_state.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/loading_state.tsx @@ -5,7 +5,7 @@ */ import React from 'react'; -import { EuiPage, EuiPageBody, EuiPageContent, EuiSpacer, EuiLoadingContent } from '@elastic/eui'; +import { EuiPageContent, EuiSpacer, EuiLoadingContent } from '@elastic/eui'; import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { EngineOverviewHeader } from '../engine_overview_header'; @@ -14,17 +14,14 @@ import './empty_states.scss'; export const LoadingState: React.FC = () => { return ( - + <> - - - - - - - - - - + + + + + + + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.scss b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.scss index 2c7f7de6458e2..e39bbbc95564b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.scss +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.scss @@ -4,18 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -/** - * Engine Overview - */ .engineOverview { - width: 100%; - - &__body { - padding: $euiSize; + padding: $euiSize; - @include euiBreakpoint('m', 'l', 'xl') { - padding: $euiSizeXL; - } + @include euiBreakpoint('m', 'l', 'xl') { + padding: $euiSizeXL; } } diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.tsx index 286c32b2a443b..acac5d17665b7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview.tsx @@ -6,8 +6,6 @@ import React, { useContext, useEffect, useState } from 'react'; import { - EuiPage, - EuiPageBody, EuiPageContent, EuiPageContentHeader, EuiPageContentBody, @@ -92,64 +90,61 @@ export const EngineOverview: React.FC = () => { if (!engines.length) return ; return ( - + <> - - - - - - -

- - -

-
-
- - - - - {metaEngines.length > 0 && ( - <> - - - -

- - -

-
-
- - - - - )} -
-
-
+ + + + +

+ + +

+
+
+ + + + + {metaEngines.length > 0 && ( + <> + + + +

+ + +

+
+
+ + + + + )} +
+ ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx index 45e318ca0f9d9..9e660d10053ec 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx @@ -10,37 +10,33 @@ import React, { useContext } from 'react'; import { Redirect } from 'react-router-dom'; import { shallow } from 'enzyme'; -import { SetupGuide } from './components/setup_guide'; -import { EngineOverview } from './components/engine_overview'; - -import { AppSearch } from './'; - -describe('App Search Routes', () => { - describe('/', () => { - it('redirects to Setup Guide when enterpriseSearchUrl is not set', () => { - (useContext as jest.Mock).mockImplementationOnce(() => ({ enterpriseSearchUrl: '' })); - const wrapper = shallow(); - - expect(wrapper.find(Redirect)).toHaveLength(1); - expect(wrapper.find(EngineOverview)).toHaveLength(0); - }); - - it('renders Engine Overview when enterpriseSearchUrl is set', () => { - (useContext as jest.Mock).mockImplementationOnce(() => ({ - enterpriseSearchUrl: 'https://foo.bar', - })); - const wrapper = shallow(); - - expect(wrapper.find(EngineOverview)).toHaveLength(1); - expect(wrapper.find(Redirect)).toHaveLength(0); - }); +import { Layout, SideNav, SideNavLink } from '../shared/layout'; +import { AppSearch, AppSearchNav } from './'; + +describe('AppSearch', () => { + it('renders', () => { + const wrapper = shallow(); + + expect(wrapper.find(Layout)).toHaveLength(1); + }); + + it('redirects to Setup Guide when enterpriseSearchUrl is not set', () => { + (useContext as jest.Mock).mockImplementationOnce(() => ({ enterpriseSearchUrl: '' })); + const wrapper = shallow(); + + expect(wrapper.find(Redirect)).toHaveLength(1); + expect(wrapper.find(Layout)).toHaveLength(0); }); +}); - describe('/setup_guide', () => { - it('renders', () => { - const wrapper = shallow(); +describe('AppSearchNav', () => { + it('renders', () => { + const wrapper = shallow(); - expect(wrapper.find(SetupGuide)).toHaveLength(1); - }); + expect(wrapper.find(SideNav)).toHaveLength(1); + expect(wrapper.find(SideNavLink).first().prop('to')).toEqual('/engines'); + expect(wrapper.find(SideNavLink).last().prop('to')).toEqual( + 'http://localhost:3002/as#/role-mappings' + ); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx index 8f7142f1631a9..d69b3ba29b0ca 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx @@ -5,24 +5,80 @@ */ import React, { useContext } from 'react'; -import { Route, Redirect } from 'react-router-dom'; +import { Route, Redirect, Switch } from 'react-router-dom'; +import { i18n } from '@kbn/i18n'; + +import { APP_SEARCH_PLUGIN } from '../../../common/constants'; import { KibanaContext, IKibanaContext } from '../index'; +import { Layout, SideNav, SideNavLink } from '../shared/layout'; import { SetupGuide } from './components/setup_guide'; import { EngineOverview } from './components/engine_overview'; export const AppSearch: React.FC = () => { const { enterpriseSearchUrl } = useContext(KibanaContext) as IKibanaContext; + if (!enterpriseSearchUrl) + return ( + + + + + + + {/* Kibana displays a blank page on redirect if this isn't included */} + + + ); return ( - <> - - {!enterpriseSearchUrl ? : } - - + + - + + }> + + + {/* For some reason a Redirect to /engines just doesn't work here - it shows a blank page */} + + + + + + + + + + ); +}; + +export const AppSearchNav: React.FC = () => { + const { enterpriseSearchUrl } = useContext(KibanaContext) as IKibanaContext; + const externalUrl = `${enterpriseSearchUrl}/as#`; + + return ( + + + {i18n.translate('xpack.enterpriseSearch.appSearch.nav.engines', { + defaultMessage: 'Engines', + })} + + + {i18n.translate('xpack.enterpriseSearch.appSearch.nav.settings', { + defaultMessage: 'Account Settings', + })} + + + {i18n.translate('xpack.enterpriseSearch.appSearch.nav.credentials', { + defaultMessage: 'Credentials', + })} + + + {i18n.translate('xpack.enterpriseSearch.appSearch.nav.roleMappings', { + defaultMessage: 'Role Mappings', + })} + + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/index.ts b/x-pack/plugins/enterprise_search/public/applications/shared/layout/index.ts new file mode 100644 index 0000000000000..2211cdee6c730 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { Layout } from './layout'; +export { SideNav, SideNavLink } from './side_nav'; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.scss b/x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.scss new file mode 100644 index 0000000000000..c73a527147961 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.scss @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +.enterpriseSearchLayout { + $sideBarWidth: $euiSize * 15; + $sideBarMobileHeight: $euiSize * 4.75; + + display: block; + position: relative; + left: $sideBarWidth; + width: calc(100% - #{$sideBarWidth}); + padding: 0; + + @include euiBreakpoint('xs', 's', 'm') { + left: auto; + width: 100%; + } + + &__sideBarToggle { + display: none; + + @include euiBreakpoint('xs', 's', 'm') { + display: block; + + position: absolute; + right: $euiSize; + top: $sideBarMobileHeight / 2; + transform: translateY(-50%) scale(0.9); + + .euiButton { + min-width: 0; + } + } + } + + &__sideBar { + z-index: $euiZNavigation; + position: fixed; + margin-left: -1 * $sideBarWidth; + margin-right: 0; + overflow-y: auto; + overflow-x: hidden; + + $kibanaHeader: 49px; // NOTE: Keep an eye on this for changes + height: calc(100vh - #{$kibanaHeader}); + width: $sideBarWidth; + + background-color: $euiColorLightestShade; + box-shadow: inset (-1 * $euiSizeXS) 0 $euiSizeS (-1 * $euiSizeXS) rgba($euiShadowColor, 0.25); + + @include euiBreakpoint('xs', 's', 'm') { + position: relative; + width: 100%; + height: $sideBarMobileHeight; + margin-left: 0; + overflow-y: hidden; + + border-bottom: $euiBorderThin; + box-shadow: none; + + &--isOpen { + height: auto; + overflow-y: auto; + } + } + } + + &__body { + padding: $euiSizeXXL; + + @include euiBreakpoint('m') { + padding: $euiSizeL; + } + @include euiBreakpoint('xs', 's') { + padding: $euiSize; + } + } +} diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.test.tsx new file mode 100644 index 0000000000000..4053f2f4bb613 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.test.tsx @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; +import { EuiPageSideBar, EuiButton } from '@elastic/eui'; + +import { Layout, INavContext } from './layout'; + +describe('Layout', () => { + it('renders', () => { + const wrapper = shallow(); + + expect(wrapper.find('.enterpriseSearchLayout')).toHaveLength(1); + }); + + it('renders navigation', () => { + const wrapper = shallow(Hello World} />); + + expect(wrapper.find('.enterpriseSearchLayout__sideBar')).toHaveLength(1); + expect(wrapper.find('.nav-test')).toHaveLength(1); + }); + + it('renders navigation toggle state', () => { + const wrapper = shallow(Hello World} />); + expect(wrapper.find(EuiPageSideBar).prop('className')).not.toContain('--isOpen'); + expect(wrapper.find(EuiButton).prop('iconType')).toEqual('arrowRight'); + + const toggle = wrapper.find('[data-test-subj="enterpriseSearchNavToggle"]'); + toggle.simulate('click'); + + expect(wrapper.find(EuiPageSideBar).prop('className')).toContain('--isOpen'); + expect(wrapper.find(EuiButton).prop('iconType')).toEqual('arrowDown'); + }); + + it('passes down NavContext to navigation links', () => { + const wrapper = shallow(} />); + + const toggle = wrapper.find('[data-test-subj="enterpriseSearchNavToggle"]'); + toggle.simulate('click'); + expect(wrapper.find(EuiPageSideBar).prop('className')).toContain('--isOpen'); + + const context = (wrapper.find('ContextProvider').prop('value') as unknown) as INavContext; + context.closeNavigation(); + expect(wrapper.find(EuiPageSideBar).prop('className')).not.toContain('--isOpen'); + }); + + it('renders children', () => { + const wrapper = shallow( + +
Test
+
+ ); + + expect(wrapper.find('.enterpriseSearchLayout__body')).toHaveLength(1); + expect(wrapper.find('.testing')).toHaveLength(1); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.tsx new file mode 100644 index 0000000000000..b4497140b65b7 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/layout.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; +import classNames from 'classnames'; + +import { EuiPage, EuiPageSideBar, EuiPageBody, EuiButton } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import './layout.scss'; + +interface ILayoutProps { + navigation: React.ReactNode; +} + +export interface INavContext { + closeNavigation(): void; +} +export const NavContext = React.createContext({}); + +export const Layout: React.FC = ({ children, navigation }) => { + const [isNavOpen, setIsNavOpen] = useState(false); + const toggleNavigation = () => setIsNavOpen(!isNavOpen); + const closeNavigation = () => setIsNavOpen(false); + + const navClasses = classNames('enterpriseSearchLayout__sideBar', { + 'enterpriseSearchLayout__sideBar--isOpen': isNavOpen, // eslint-disable-line @typescript-eslint/naming-convention + }); + + return ( + + +
+ + {i18n.translate('xpack.enterpriseSearch.nav.menu', { + defaultMessage: 'Menu', + })} + +
+ {navigation} +
+ {children} +
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.scss b/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.scss new file mode 100644 index 0000000000000..d673542ba1983 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.scss @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +$euiSizeML: $euiSize * 1.25; // 20px - between medium and large ¯\_(ツ)_/¯ + +.enterpriseSearchProduct { + display: flex; + align-items: center; + padding: $euiSizeML; + + background-image: url('./side_nav_bg.svg'); + background-repeat: no-repeat; + + @include euiBreakpoint('xs', 's', 'm') { + padding: $euiSize $euiSizeML; + } + + &__icon { + display: flex; + align-items: center; + justify-content: center; + + width: $euiSizeXXL; + height: $euiSizeXXL; + margin-right: $euiSizeS; + + background-color: $euiColorEmptyShade; + border-radius: 50%; + @include euiSlightShadow(); + + .euiIcon { + width: $euiSizeML; + height: $euiSizeML; + } + } + + &__title { + .euiText { + font-weight: $euiFontWeightMedium; + } + } +} + +.enterpriseSearchNavLinks { + &__item { + display: block; + padding: $euiSizeM $euiSizeML; + font-size: $euiFontSizeS; + font-weight: $euiFontWeightMedium; + line-height: $euiFontSizeM; + + $activeBgColor: rgba($euiColorFullShade, 0.05); + + &--isActive { + background-color: $activeBgColor; + } + + &.euiLink { + color: $euiTextColor; + font-weight: $euiFontWeightMedium; + + &:hover { + color: $euiTextColor; + } + + &:focus { + outline: solid 0 $activeBgColor; + background-color: $activeBgColor; + } + } + } +} diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.test.tsx new file mode 100644 index 0000000000000..c117fa404a16b --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.test.tsx @@ -0,0 +1,92 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import '../../__mocks__/react_router_history.mock'; + +import React from 'react'; +import { useLocation } from 'react-router-dom'; +import { shallow } from 'enzyme'; + +import { EuiLink as EuiLinkExternal } from '@elastic/eui'; +import { EuiLink } from '../react_router_helpers'; +import { ENTERPRISE_SEARCH_PLUGIN, APP_SEARCH_PLUGIN } from '../../../../common/constants'; + +import { SideNav, SideNavLink } from './'; + +describe('SideNav', () => { + it('renders link children', () => { + const wrapper = shallow( + +
Hello World
+
+ ); + + expect(wrapper.type()).toEqual('nav'); + expect(wrapper.find('.enterpriseSearchNavLinks')).toHaveLength(1); + expect(wrapper.find('.testing')).toHaveLength(1); + }); + + it('renders a custom product', () => { + const wrapper = shallow(); + + expect(wrapper.find('h3').text()).toEqual('App Search'); + expect(wrapper.find('.enterpriseSearchProduct--appSearch')).toHaveLength(1); + }); +}); + +describe('SideNavLink', () => { + it('renders', () => { + const wrapper = shallow(Link); + + expect(wrapper.type()).toEqual('li'); + expect(wrapper.find(EuiLink)).toHaveLength(1); + expect(wrapper.find('.enterpriseSearchNavLinks__item')).toHaveLength(1); + }); + + it('renders an external link if isExternal is true', () => { + const wrapper = shallow( + + Link + + ); + const externalLink = wrapper.find(EuiLinkExternal); + + expect(externalLink).toHaveLength(1); + expect(externalLink.prop('href')).toEqual('http://website.com'); + expect(externalLink.prop('target')).toEqual('_blank'); + }); + + it('sets an active class if the current path matches the nav link', () => { + (useLocation as jest.Mock).mockImplementationOnce(() => ({ pathname: '/test/' })); + + const wrapper = shallow(Link); + + expect(wrapper.find('.enterpriseSearchNavLinks__item--isActive')).toHaveLength(1); + }); + + it('sets an active class if the current path is / and the link isRoot', () => { + (useLocation as jest.Mock).mockImplementationOnce(() => ({ pathname: '/' })); + + const wrapper = shallow( + + Link + + ); + + expect(wrapper.find('.enterpriseSearchNavLinks__item--isActive')).toHaveLength(1); + }); + + it('passes down custom classes and props', () => { + const wrapper = shallow( + + Link + + ); + + expect(wrapper.find('.testing')).toHaveLength(1); + expect(wrapper.find('[data-test-subj="testing"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.tsx new file mode 100644 index 0000000000000..5969fa7806a44 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav.tsx @@ -0,0 +1,107 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useContext } from 'react'; +import { useLocation } from 'react-router-dom'; +import classNames from 'classnames'; + +import { i18n } from '@kbn/i18n'; +import { EuiIcon, EuiTitle, EuiText, EuiLink as EuiLinkExternal } from '@elastic/eui'; // TODO: Remove EuiLinkExternal after full Kibana transition +import { EuiLink } from '../react_router_helpers'; + +import { ENTERPRISE_SEARCH_PLUGIN } from '../../../../common/constants'; + +import { NavContext, INavContext } from './layout'; + +import './side_nav.scss'; + +/** + * Side navigation - product & icon + links wrapper + */ + +interface ISideNavProps { + // Expects product plugin constants (@see common/constants.ts) + product: { + NAME: string; + ID: string; + }; +} + +export const SideNav: React.FC = ({ product, children }) => { + return ( + + ); +}; + +/** + * Side navigation link item + */ + +interface ISideNavLinkProps { + to: string; + isExternal?: boolean; + className?: string; + isRoot?: boolean; +} + +export const SideNavLink: React.FC = ({ + isExternal, + to, + children, + className, + isRoot, + ...rest +}) => { + const { closeNavigation } = useContext(NavContext) as INavContext; + + const { pathname } = useLocation(); + const currentPath = pathname.endsWith('/') ? pathname.slice(0, -1) : pathname; + const isActive = currentPath === to || (isRoot && currentPath === ''); + + const classes = classNames('enterpriseSearchNavLinks__item', className, { + 'enterpriseSearchNavLinks__item--isActive': !isExternal && isActive, // eslint-disable-line @typescript-eslint/naming-convention + }); + + return ( +
  • + {isExternal ? ( + + {children} + + ) : ( + + {children} + + )} +
  • + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav_bg.svg b/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav_bg.svg new file mode 100644 index 0000000000000..a19227ab7b7eb --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/side_nav_bg.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.test.tsx index 7d4c068b21155..76ee8293f2c8b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.test.tsx @@ -73,5 +73,14 @@ describe('EUI & React Router Component Helpers', () => { expect(mockHistory.push).not.toHaveBeenCalled(); }); + + it('calls inherited onClick actions in addition to default navigation', () => { + const customOnClick = jest.fn(); // Can be anything from telemetry to a state reset + const wrapper = mount(); + + wrapper.find(EuiLink).simulate('click', { shiftKey: true }); + + expect(customOnClick).toHaveBeenCalled(); + }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.tsx index f486e432bae76..b53b2f2b3b650 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.tsx @@ -19,13 +19,15 @@ import { letBrowserHandleEvent } from './link_events'; interface IEuiReactRouterProps { to: string; + onClick?(): void; } -export const EuiReactRouterHelper: React.FC = ({ to, children }) => { +export const EuiReactRouterHelper: React.FC = ({ to, onClick, children }) => { const history = useHistory(); - const onClick = (event: React.MouseEvent) => { - if (letBrowserHandleEvent(event)) return; + const reactRouterLinkClick = (event: React.MouseEvent) => { + if (onClick) onClick(); // Run any passed click events (e.g. telemetry) + if (letBrowserHandleEvent(event)) return; // Return early if the link behavior shouldn't be handled by React Router // Prevent regular link behavior, which causes a browser refresh. event.preventDefault(); @@ -37,21 +39,29 @@ export const EuiReactRouterHelper: React.FC = ({ to, child // Generate the correct link href (with basename etc. accounted for) const href = history.createHref({ pathname: to }); - const reactRouterProps = { href, onClick }; + const reactRouterProps = { href, onClick: reactRouterLinkClick }; return React.cloneElement(children as React.ReactElement, reactRouterProps); }; type TEuiReactRouterLinkProps = EuiLinkAnchorProps & IEuiReactRouterProps; type TEuiReactRouterButtonProps = EuiButtonProps & IEuiReactRouterProps; -export const EuiReactRouterLink: React.FC = ({ to, ...rest }) => ( - +export const EuiReactRouterLink: React.FC = ({ + to, + onClick, + ...rest +}) => ( + ); -export const EuiReactRouterButton: React.FC = ({ to, ...rest }) => ( - +export const EuiReactRouterButton: React.FC = ({ + to, + onClick, + ...rest +}) => ( + ); From c8b63c0b1b53266d9ccec52ae97006f73baba293 Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 12 Aug 2020 11:09:46 -0700 Subject: [PATCH 079/113] [src/dev/build] implement a getBuildNumber() mock (#74881) Co-authored-by: spalger --- .../build/lib/__mocks__/get_build_number.ts | 22 ++++++++++++ src/dev/build/lib/get_build_number.ts | 34 +++++++++++++++++++ src/dev/build/lib/version_info.test.ts | 2 ++ src/dev/build/lib/version_info.ts | 16 +-------- .../nodejs/download_node_builds_task.test.ts | 5 +-- .../nodejs/extract_node_builds_task.test.ts | 1 + .../verify_existing_node_builds_task.test.ts | 1 + 7 files changed, 62 insertions(+), 19 deletions(-) create mode 100644 src/dev/build/lib/__mocks__/get_build_number.ts create mode 100644 src/dev/build/lib/get_build_number.ts diff --git a/src/dev/build/lib/__mocks__/get_build_number.ts b/src/dev/build/lib/__mocks__/get_build_number.ts new file mode 100644 index 0000000000000..60cfd3d82557a --- /dev/null +++ b/src/dev/build/lib/__mocks__/get_build_number.ts @@ -0,0 +1,22 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export function getBuildNumber() { + return 12345; +} diff --git a/src/dev/build/lib/get_build_number.ts b/src/dev/build/lib/get_build_number.ts new file mode 100644 index 0000000000000..c512042592002 --- /dev/null +++ b/src/dev/build/lib/get_build_number.ts @@ -0,0 +1,34 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import os from 'os'; +import execa from 'execa'; + +export async function getBuildNumber() { + if (/^win/.test(os.platform())) { + // Windows does not have the wc process and `find /C /V ""` does not consistently work + const log = await execa('git', ['log', '--format="%h"']); + return log.stdout.split('\n').length; + } + + const wc = await execa.command('git log --format="%h" | wc -l', { + shell: true, + }); + return parseFloat(wc.stdout.trim()); +} diff --git a/src/dev/build/lib/version_info.test.ts b/src/dev/build/lib/version_info.test.ts index 1b0c71bf9220e..ec8c363ddaccf 100644 --- a/src/dev/build/lib/version_info.test.ts +++ b/src/dev/build/lib/version_info.test.ts @@ -20,6 +20,8 @@ import pkg from '../../../../package.json'; import { getVersionInfo } from './version_info'; +jest.mock('./get_build_number'); + describe('isRelease = true', () => { it('returns unchanged package.version, build sha, and build number', async () => { const versionInfo = await getVersionInfo({ diff --git a/src/dev/build/lib/version_info.ts b/src/dev/build/lib/version_info.ts index 958112c524bac..fb3530b4c4edf 100644 --- a/src/dev/build/lib/version_info.ts +++ b/src/dev/build/lib/version_info.ts @@ -17,22 +17,8 @@ * under the License. */ -import os from 'os'; - import execa from 'execa'; - -async function getBuildNumber() { - if (/^win/.test(os.platform())) { - // Windows does not have the wc process and `find /C /V ""` does not consistently work - const log = await execa('git', ['log', '--format="%h"']); - return log.stdout.split('\n').length; - } - - const wc = await execa.command('git log --format="%h" | wc -l', { - shell: true, - }); - return parseFloat(wc.stdout.trim()); -} +import { getBuildNumber } from './get_build_number'; interface Options { isRelease: boolean; diff --git a/src/dev/build/tasks/nodejs/download_node_builds_task.test.ts b/src/dev/build/tasks/nodejs/download_node_builds_task.test.ts index 6f08c8aa69750..413bf95cde877 100644 --- a/src/dev/build/tasks/nodejs/download_node_builds_task.test.ts +++ b/src/dev/build/tasks/nodejs/download_node_builds_task.test.ts @@ -26,13 +26,10 @@ import { import { Config, Platform } from '../../lib'; import { DownloadNodeBuilds } from './download_node_builds_task'; -// import * as NodeShasumsNS from '../node_shasums'; -// import * as NodeDownloadInfoNS from '../node_download_info'; -// import * as DownloadNS from '../../../lib/download'; -// import { DownloadNodeBuilds } from '../download_node_builds_task'; jest.mock('./node_shasums'); jest.mock('./node_download_info'); jest.mock('../../lib/download'); +jest.mock('../../lib/get_build_number'); expect.addSnapshotSerializer(createAnyInstanceSerializer(ToolingLog)); diff --git a/src/dev/build/tasks/nodejs/extract_node_builds_task.test.ts b/src/dev/build/tasks/nodejs/extract_node_builds_task.test.ts index 94c421f7c9a62..f1700ef7b578c 100644 --- a/src/dev/build/tasks/nodejs/extract_node_builds_task.test.ts +++ b/src/dev/build/tasks/nodejs/extract_node_builds_task.test.ts @@ -27,6 +27,7 @@ import { Config } from '../../lib'; import { ExtractNodeBuilds } from './extract_node_builds_task'; jest.mock('../../lib/fs'); +jest.mock('../../lib/get_build_number'); const Fs = jest.requireMock('../../lib/fs'); diff --git a/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.test.ts b/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.test.ts index f24b7ffc59c14..19416963d5edd 100644 --- a/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.test.ts +++ b/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.test.ts @@ -29,6 +29,7 @@ import { VerifyExistingNodeBuilds } from './verify_existing_node_builds_task'; jest.mock('./node_shasums'); jest.mock('./node_download_info'); jest.mock('../../lib/fs'); +jest.mock('../../lib/get_build_number'); const { getNodeShasums } = jest.requireMock('./node_shasums'); const { getNodeDownloadInfo } = jest.requireMock('./node_download_info'); From 041b78cec1f3acc76f25eef4fd88bba0cd231451 Mon Sep 17 00:00:00 2001 From: Josh Dover Date: Wed, 12 Aug 2020 12:45:38 -0600 Subject: [PATCH 080/113] [reporting] Pass along generic parameters in high-order route handler (#74879) --- x-pack/plugins/reporting/server/routes/jobs.ts | 14 +++++--------- .../routes/lib/authorized_user_pre_routing.ts | 4 ++-- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/reporting/server/routes/jobs.ts b/x-pack/plugins/reporting/server/routes/jobs.ts index e8eac9e577beb..510df119c2c47 100644 --- a/x-pack/plugins/reporting/server/routes/jobs.ts +++ b/x-pack/plugins/reporting/server/routes/jobs.ts @@ -52,11 +52,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); - const { - page: queryPage = '0', - size: querySize = '10', - ids: queryIds = null, - } = req.query as ListQuery; // NOTE: type inference is not working here. userHandler breaks it? + const { page: queryPage = '0', size: querySize = '10', ids: queryIds = null } = req.query; const page = parseInt(queryPage, 10) || 0; const size = Math.min(100, parseInt(querySize, 10) || 10); const jobIds = queryIds ? queryIds.split(',') : null; @@ -116,7 +112,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return handleUnavailable(res); } - const { docId } = req.params as { docId: string }; + const { docId } = req.params; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); @@ -161,7 +157,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return res.custom({ statusCode: 503 }); } - const { docId } = req.params as { docId: string }; + const { docId } = req.params; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); @@ -213,7 +209,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return handleUnavailable(res); } - const { docId } = req.params as { docId: string }; + const { docId } = req.params; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); @@ -239,7 +235,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return handleUnavailable(res); } - const { docId } = req.params as { docId: string }; + const { docId } = req.params; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); diff --git a/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts b/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts index 3758eafc6d718..e2f393aad57d2 100644 --- a/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts +++ b/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts @@ -12,7 +12,7 @@ import { getUserFactory } from './get_user'; type ReportingUser = AuthenticatedUser | null; const superuserRole = 'superuser'; -export type RequestHandlerUser = RequestHandler extends (...a: infer U) => infer R +export type RequestHandlerUser = RequestHandler extends (...a: infer U) => infer R ? (user: ReportingUser, ...a: U) => R : never; @@ -21,7 +21,7 @@ export const authorizedUserPreRoutingFactory = function authorizedUserPreRouting ) { const setupDeps = reporting.getPluginSetupDeps(); const getUser = getUserFactory(setupDeps.security); - return (handler: RequestHandlerUser): RequestHandler => { + return (handler: RequestHandlerUser): RequestHandler => { return (context, req, res) => { let user: ReportingUser = null; if (setupDeps.security && setupDeps.security.license.isEnabled()) { From 5d82ac15cb3206f8a54eaef6dd940a19a55986cb Mon Sep 17 00:00:00 2001 From: Josh Dover Date: Wed, 12 Aug 2020 12:46:13 -0600 Subject: [PATCH 081/113] Revert "[reporting] Pass along generic parameters in high-order route handler" (#74891) This reverts commit 041b78cec1f3acc76f25eef4fd88bba0cd231451. --- x-pack/plugins/reporting/server/routes/jobs.ts | 14 +++++++++----- .../routes/lib/authorized_user_pre_routing.ts | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/reporting/server/routes/jobs.ts b/x-pack/plugins/reporting/server/routes/jobs.ts index 510df119c2c47..e8eac9e577beb 100644 --- a/x-pack/plugins/reporting/server/routes/jobs.ts +++ b/x-pack/plugins/reporting/server/routes/jobs.ts @@ -52,7 +52,11 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); - const { page: queryPage = '0', size: querySize = '10', ids: queryIds = null } = req.query; + const { + page: queryPage = '0', + size: querySize = '10', + ids: queryIds = null, + } = req.query as ListQuery; // NOTE: type inference is not working here. userHandler breaks it? const page = parseInt(queryPage, 10) || 0; const size = Math.min(100, parseInt(querySize, 10) || 10); const jobIds = queryIds ? queryIds.split(',') : null; @@ -112,7 +116,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return handleUnavailable(res); } - const { docId } = req.params; + const { docId } = req.params as { docId: string }; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); @@ -157,7 +161,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return res.custom({ statusCode: 503 }); } - const { docId } = req.params; + const { docId } = req.params as { docId: string }; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); @@ -209,7 +213,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return handleUnavailable(res); } - const { docId } = req.params; + const { docId } = req.params as { docId: string }; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); @@ -235,7 +239,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return handleUnavailable(res); } - const { docId } = req.params; + const { docId } = req.params as { docId: string }; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); diff --git a/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts b/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts index e2f393aad57d2..3758eafc6d718 100644 --- a/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts +++ b/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts @@ -12,7 +12,7 @@ import { getUserFactory } from './get_user'; type ReportingUser = AuthenticatedUser | null; const superuserRole = 'superuser'; -export type RequestHandlerUser = RequestHandler extends (...a: infer U) => infer R +export type RequestHandlerUser = RequestHandler extends (...a: infer U) => infer R ? (user: ReportingUser, ...a: U) => R : never; @@ -21,7 +21,7 @@ export const authorizedUserPreRoutingFactory = function authorizedUserPreRouting ) { const setupDeps = reporting.getPluginSetupDeps(); const getUser = getUserFactory(setupDeps.security); - return (handler: RequestHandlerUser): RequestHandler => { + return (handler: RequestHandlerUser): RequestHandler => { return (context, req, res) => { let user: ReportingUser = null; if (setupDeps.security && setupDeps.security.license.isEnabled()) { From 2e5140d67b58ffd7220e4417ccafe06bc812ff47 Mon Sep 17 00:00:00 2001 From: Devon Thomson Date: Wed, 12 Aug 2020 15:31:44 -0400 Subject: [PATCH 082/113] [Dashboard First] Decouple Attribute Service and By Value Embeddables (#74302) * Added an interface that determines if an embeddable can be treated as either by reference or by value --- examples/embeddable_examples/kibana.json | 2 +- .../book/add_book_to_library_action.tsx | 55 ++++++ .../public/book/book_component.tsx | 32 +++- .../public/book/book_embeddable.tsx | 22 ++- .../public/book/book_embeddable_factory.tsx | 17 +- .../public/book/edit_book_action.tsx | 9 +- .../book/unlink_book_from_library_action.tsx | 55 ++++++ examples/embeddable_examples/public/plugin.ts | 24 ++- .../attribute_service/attribute_service.tsx | 156 ++++++++++++++++++ src/plugins/dashboard/public/index.ts | 1 + src/plugins/dashboard/public/plugin.tsx | 23 ++- src/plugins/embeddable/public/index.ts | 3 +- .../lib/embeddables/attribute_service.ts | 68 -------- .../public/lib/embeddables/index.ts | 1 - src/plugins/embeddable/public/lib/index.ts | 1 + .../reference_or_value_embeddable/index.ts | 20 +++ .../reference_or_value_embeddable/types.ts | 56 +++++++ src/plugins/embeddable/public/mocks.tsx | 1 - src/plugins/embeddable/public/plugin.tsx | 11 -- 19 files changed, 453 insertions(+), 104 deletions(-) create mode 100644 examples/embeddable_examples/public/book/add_book_to_library_action.tsx create mode 100644 examples/embeddable_examples/public/book/unlink_book_from_library_action.tsx create mode 100644 src/plugins/dashboard/public/attribute_service/attribute_service.tsx delete mode 100644 src/plugins/embeddable/public/lib/embeddables/attribute_service.ts create mode 100644 src/plugins/embeddable/public/lib/reference_or_value_embeddable/index.ts create mode 100644 src/plugins/embeddable/public/lib/reference_or_value_embeddable/types.ts diff --git a/examples/embeddable_examples/kibana.json b/examples/embeddable_examples/kibana.json index 771c19cfdbd3d..0ac40ae1889de 100644 --- a/examples/embeddable_examples/kibana.json +++ b/examples/embeddable_examples/kibana.json @@ -4,7 +4,7 @@ "kibanaVersion": "kibana", "server": true, "ui": true, - "requiredPlugins": ["embeddable", "uiActions"], + "requiredPlugins": ["embeddable", "uiActions", "dashboard"], "optionalPlugins": [], "extraPublicDirs": ["public/todo", "public/hello_world", "public/todo/todo_ref_embeddable"], "requiredBundles": ["kibanaReact"] diff --git a/examples/embeddable_examples/public/book/add_book_to_library_action.tsx b/examples/embeddable_examples/public/book/add_book_to_library_action.tsx new file mode 100644 index 0000000000000..b74a1d5642982 --- /dev/null +++ b/examples/embeddable_examples/public/book/add_book_to_library_action.tsx @@ -0,0 +1,55 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { i18n } from '@kbn/i18n'; +import { createAction, IncompatibleActionError } from '../../../../src/plugins/ui_actions/public'; +import { BookEmbeddable, BOOK_EMBEDDABLE } from './book_embeddable'; +import { ViewMode, isReferenceOrValueEmbeddable } from '../../../../src/plugins/embeddable/public'; + +interface ActionContext { + embeddable: BookEmbeddable; +} + +export const ACTION_ADD_BOOK_TO_LIBRARY = 'ACTION_ADD_BOOK_TO_LIBRARY'; + +export const createAddBookToLibraryAction = () => + createAction({ + getDisplayName: () => + i18n.translate('embeddableExamples.book.addToLibrary', { + defaultMessage: 'Add Book To Library', + }), + type: ACTION_ADD_BOOK_TO_LIBRARY, + order: 100, + getIconType: () => 'folderCheck', + isCompatible: async ({ embeddable }: ActionContext) => { + return ( + embeddable.type === BOOK_EMBEDDABLE && + embeddable.getInput().viewMode === ViewMode.EDIT && + isReferenceOrValueEmbeddable(embeddable) && + !embeddable.inputIsRefType(embeddable.getInput()) + ); + }, + execute: async ({ embeddable }: ActionContext) => { + if (!isReferenceOrValueEmbeddable(embeddable)) { + throw new IncompatibleActionError(); + } + const newInput = await embeddable.getInputAsRefType(); + embeddable.updateInput(newInput); + }, + }); diff --git a/examples/embeddable_examples/public/book/book_component.tsx b/examples/embeddable_examples/public/book/book_component.tsx index 064e13c131a0a..e46487641b913 100644 --- a/examples/embeddable_examples/public/book/book_component.tsx +++ b/examples/embeddable_examples/public/book/book_component.tsx @@ -20,7 +20,7 @@ import React from 'react'; import { EuiFlexItem, EuiFlexGroup, EuiIcon } from '@elastic/eui'; import { EuiText } from '@elastic/eui'; -import { EuiFlexGrid } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { withEmbeddableSubscription } from '../../../../src/plugins/embeddable/public'; import { BookEmbeddableInput, BookEmbeddableOutput, BookEmbeddable } from './book_embeddable'; @@ -44,26 +44,32 @@ function wrapSearchTerms(task?: string, search?: string) { ); } -export function BookEmbeddableComponentInner({ input: { search }, output: { attributes } }: Props) { +export function BookEmbeddableComponentInner({ + input: { search }, + output: { attributes }, + embeddable, +}: Props) { const title = attributes?.title; const author = attributes?.author; const readIt = attributes?.readIt; + const byReference = embeddable.inputIsRefType(embeddable.getInput()); + return ( - + {title ? ( -

    {wrapSearchTerms(title, search)},

    +

    {wrapSearchTerms(title, search)}

    ) : null} {author ? ( -
    -{wrapSearchTerms(author, search)}
    + -{wrapSearchTerms(author, search)}
    ) : null} @@ -76,7 +82,21 @@ export function BookEmbeddableComponentInner({ input: { search }, output: { attr
    )} - +
    + + + + {' '} + + {byReference + ? i18n.translate('embeddableExamples.book.byReferenceLabel', { + defaultMessage: 'Book is By Reference', + }) + : i18n.translate('embeddableExamples.book.byValueLabel', { + defaultMessage: 'Book is By Value', + })} + + ); diff --git a/examples/embeddable_examples/public/book/book_embeddable.tsx b/examples/embeddable_examples/public/book/book_embeddable.tsx index d49bd3280d97d..dd9418c0e8596 100644 --- a/examples/embeddable_examples/public/book/book_embeddable.tsx +++ b/examples/embeddable_examples/public/book/book_embeddable.tsx @@ -25,10 +25,11 @@ import { IContainer, EmbeddableOutput, SavedObjectEmbeddableInput, - AttributeService, + ReferenceOrValueEmbeddable, } from '../../../../src/plugins/embeddable/public'; import { BookSavedObjectAttributes } from '../../common'; import { BookEmbeddableComponent } from './book_component'; +import { AttributeService } from '../../../../src/plugins/dashboard/public'; export const BOOK_EMBEDDABLE = 'book'; export type BookEmbeddableInput = BookByValueInput | BookByReferenceInput; @@ -59,7 +60,8 @@ function getHasMatch(search?: string, savedAttributes?: BookSavedObjectAttribute ); } -export class BookEmbeddable extends Embeddable { +export class BookEmbeddable extends Embeddable + implements ReferenceOrValueEmbeddable { public readonly type = BOOK_EMBEDDABLE; private subscription: Subscription; private node?: HTMLElement; @@ -96,6 +98,18 @@ export class BookEmbeddable extends Embeddable { + return this.attributeService.inputIsRefType(input); + }; + + getInputAsValueType = async (): Promise => { + return this.attributeService.getInputAsValueType(this.input); + }; + + getInputAsRefType = async (): Promise => { + return this.attributeService.getInputAsRefType(this.input, { showSaveModal: true }); + }; + public render(node: HTMLElement) { if (this.node) { ReactDOM.unmountComponentAtNode(this.node); @@ -113,6 +127,10 @@ export class BookEmbeddable extends Embeddable(this.type); } - return this.attributeService; + return this.attributeService!; } } diff --git a/examples/embeddable_examples/public/book/edit_book_action.tsx b/examples/embeddable_examples/public/book/edit_book_action.tsx index 222f70e0be60f..b31d69696598e 100644 --- a/examples/embeddable_examples/public/book/edit_book_action.tsx +++ b/examples/embeddable_examples/public/book/edit_book_action.tsx @@ -22,11 +22,7 @@ import { i18n } from '@kbn/i18n'; import { BookSavedObjectAttributes, BOOK_SAVED_OBJECT } from '../../common'; import { createAction } from '../../../../src/plugins/ui_actions/public'; import { toMountPoint } from '../../../../src/plugins/kibana_react/public'; -import { - ViewMode, - EmbeddableStart, - SavedObjectEmbeddableInput, -} from '../../../../src/plugins/embeddable/public'; +import { ViewMode, SavedObjectEmbeddableInput } from '../../../../src/plugins/embeddable/public'; import { BookEmbeddable, BOOK_EMBEDDABLE, @@ -34,10 +30,11 @@ import { BookByValueInput, } from './book_embeddable'; import { CreateEditBookComponent } from './create_edit_book_component'; +import { DashboardStart } from '../../../../src/plugins/dashboard/public'; interface StartServices { openModal: OverlayStart['openModal']; - getAttributeService: EmbeddableStart['getAttributeService']; + getAttributeService: DashboardStart['getAttributeService']; } interface ActionContext { diff --git a/examples/embeddable_examples/public/book/unlink_book_from_library_action.tsx b/examples/embeddable_examples/public/book/unlink_book_from_library_action.tsx new file mode 100644 index 0000000000000..cef77092a642a --- /dev/null +++ b/examples/embeddable_examples/public/book/unlink_book_from_library_action.tsx @@ -0,0 +1,55 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { i18n } from '@kbn/i18n'; +import { createAction, IncompatibleActionError } from '../../../../src/plugins/ui_actions/public'; +import { BookEmbeddable, BOOK_EMBEDDABLE } from './book_embeddable'; +import { ViewMode, isReferenceOrValueEmbeddable } from '../../../../src/plugins/embeddable/public'; + +interface ActionContext { + embeddable: BookEmbeddable; +} + +export const ACTION_UNLINK_BOOK_FROM_LIBRARY = 'ACTION_UNLINK_BOOK_FROM_LIBRARY'; + +export const createUnlinkBookFromLibraryAction = () => + createAction({ + getDisplayName: () => + i18n.translate('embeddableExamples.book.unlinkFromLibrary', { + defaultMessage: 'Unlink Book from Library Item', + }), + type: ACTION_UNLINK_BOOK_FROM_LIBRARY, + order: 100, + getIconType: () => 'folderExclamation', + isCompatible: async ({ embeddable }: ActionContext) => { + return ( + embeddable.type === BOOK_EMBEDDABLE && + embeddable.getInput().viewMode === ViewMode.EDIT && + isReferenceOrValueEmbeddable(embeddable) && + embeddable.inputIsRefType(embeddable.getInput()) + ); + }, + execute: async ({ embeddable }: ActionContext) => { + if (!isReferenceOrValueEmbeddable(embeddable)) { + throw new IncompatibleActionError(); + } + const newInput = await embeddable.getInputAsValueType(); + embeddable.updateInput(newInput); + }, + }); diff --git a/examples/embeddable_examples/public/plugin.ts b/examples/embeddable_examples/public/plugin.ts index 95f4f5b41e198..0c6ed1eb3be48 100644 --- a/examples/embeddable_examples/public/plugin.ts +++ b/examples/embeddable_examples/public/plugin.ts @@ -58,6 +58,15 @@ import { BookEmbeddableFactoryDefinition, } from './book/book_embeddable_factory'; import { UiActionsStart } from '../../../src/plugins/ui_actions/public'; +import { + ACTION_ADD_BOOK_TO_LIBRARY, + createAddBookToLibraryAction, +} from './book/add_book_to_library_action'; +import { DashboardStart } from '../../../src/plugins/dashboard/public'; +import { + ACTION_UNLINK_BOOK_FROM_LIBRARY, + createUnlinkBookFromLibraryAction, +} from './book/unlink_book_from_library_action'; export interface EmbeddableExamplesSetupDependencies { embeddable: EmbeddableSetup; @@ -66,6 +75,7 @@ export interface EmbeddableExamplesSetupDependencies { export interface EmbeddableExamplesStartDependencies { embeddable: EmbeddableStart; + dashboard: DashboardStart; } interface ExampleEmbeddableFactories { @@ -86,6 +96,8 @@ export interface EmbeddableExamplesStart { declare module '../../../src/plugins/ui_actions/public' { export interface ActionContextMapping { [ACTION_EDIT_BOOK]: { embeddable: BookEmbeddable }; + [ACTION_ADD_BOOK_TO_LIBRARY]: { embeddable: BookEmbeddable }; + [ACTION_UNLINK_BOOK_FROM_LIBRARY]: { embeddable: BookEmbeddable }; } } @@ -144,17 +156,25 @@ export class EmbeddableExamplesPlugin this.exampleEmbeddableFactories.getBookEmbeddableFactory = deps.embeddable.registerEmbeddableFactory( BOOK_EMBEDDABLE, new BookEmbeddableFactoryDefinition(async () => ({ - getAttributeService: (await core.getStartServices())[1].embeddable.getAttributeService, + getAttributeService: (await core.getStartServices())[1].dashboard.getAttributeService, openModal: (await core.getStartServices())[0].overlays.openModal, })) ); const editBookAction = createEditBookAction(async () => ({ - getAttributeService: (await core.getStartServices())[1].embeddable.getAttributeService, + getAttributeService: (await core.getStartServices())[1].dashboard.getAttributeService, openModal: (await core.getStartServices())[0].overlays.openModal, })); deps.uiActions.registerAction(editBookAction); deps.uiActions.attachAction(CONTEXT_MENU_TRIGGER, editBookAction.id); + + const addBookToLibraryAction = createAddBookToLibraryAction(); + deps.uiActions.registerAction(addBookToLibraryAction); + deps.uiActions.attachAction(CONTEXT_MENU_TRIGGER, addBookToLibraryAction.id); + + const unlinkBookFromLibraryAction = createUnlinkBookFromLibraryAction(); + deps.uiActions.registerAction(unlinkBookFromLibraryAction); + deps.uiActions.attachAction(CONTEXT_MENU_TRIGGER, unlinkBookFromLibraryAction.id); } public start( diff --git a/src/plugins/dashboard/public/attribute_service/attribute_service.tsx b/src/plugins/dashboard/public/attribute_service/attribute_service.tsx new file mode 100644 index 0000000000000..c2f529fe399f3 --- /dev/null +++ b/src/plugins/dashboard/public/attribute_service/attribute_service.tsx @@ -0,0 +1,156 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { + EmbeddableInput, + SavedObjectEmbeddableInput, + isSavedObjectEmbeddableInput, + IEmbeddable, +} from '../embeddable_plugin'; +import { + SavedObjectsClientContract, + SimpleSavedObject, + I18nStart, + NotificationsStart, +} from '../../../../core/public'; +import { + SavedObjectSaveModal, + showSaveModal, + OnSaveProps, + SaveResult, +} from '../../../saved_objects/public'; + +/** + * The attribute service is a shared, generic service that embeddables can use to provide the functionality + * required to fulfill the requirements of the ReferenceOrValueEmbeddable interface. The attribute_service + * can also be used as a higher level wrapper to transform an embeddable input shape that references a saved object + * into an embeddable input shape that contains that saved object's attributes by value. + */ +export class AttributeService< + SavedObjectAttributes extends { title: string }, + ValType extends EmbeddableInput & { attributes: SavedObjectAttributes }, + RefType extends SavedObjectEmbeddableInput +> { + constructor( + private type: string, + private savedObjectsClient: SavedObjectsClientContract, + private i18nContext: I18nStart['Context'], + private toasts: NotificationsStart['toasts'] + ) {} + + public async unwrapAttributes(input: RefType | ValType): Promise { + if (this.inputIsRefType(input)) { + const savedObject: SimpleSavedObject = await this.savedObjectsClient.get< + SavedObjectAttributes + >(this.type, input.savedObjectId); + return savedObject.attributes; + } + return input.attributes; + } + + public async wrapAttributes( + newAttributes: SavedObjectAttributes, + useRefType: boolean, + embeddable?: IEmbeddable + ): Promise> { + const savedObjectId = + embeddable && isSavedObjectEmbeddableInput(embeddable.getInput()) + ? (embeddable.getInput() as SavedObjectEmbeddableInput).savedObjectId + : undefined; + if (!useRefType) { + return { attributes: newAttributes } as ValType; + } else { + try { + if (savedObjectId) { + await this.savedObjectsClient.update(this.type, savedObjectId, newAttributes); + return { savedObjectId } as RefType; + } else { + const savedItem = await this.savedObjectsClient.create(this.type, newAttributes); + return { savedObjectId: savedItem.id } as RefType; + } + } catch (error) { + this.toasts.addDanger({ + title: i18n.translate('dashboard.attributeService.saveToLibraryError', { + defaultMessage: `Panel was not saved to the library. Error: {errorMessage}`, + values: { + errorMessage: error.message, + }, + }), + 'data-test-subj': 'saveDashboardFailure', + }); + return Promise.reject({ error }); + } + } + } + + inputIsRefType = (input: ValType | RefType): input is RefType => { + return isSavedObjectEmbeddableInput(input); + }; + + getInputAsValueType = async (input: ValType | RefType): Promise => { + if (!this.inputIsRefType(input)) { + return input; + } + const attributes = await this.unwrapAttributes(input); + return { + ...input, + savedObjectId: undefined, + attributes, + }; + }; + + getInputAsRefType = async ( + input: ValType | RefType, + saveOptions?: { showSaveModal: boolean } | { title: string } + ): Promise => { + if (this.inputIsRefType(input)) { + return input; + } + + return new Promise((resolve, reject) => { + const onSave = async (props: OnSaveProps): Promise => { + try { + input.attributes.title = props.newTitle; + const wrappedInput = (await this.wrapAttributes(input.attributes, true)) as RefType; + resolve(wrappedInput); + return { id: wrappedInput.savedObjectId }; + } catch (error) { + reject(); + return { error }; + } + }; + + if (saveOptions && (saveOptions as { showSaveModal: boolean }).showSaveModal) { + showSaveModal( + reject()} + title={input.attributes.title} + showCopyOnSave={false} + objectType={this.type} + showDescription={false} + />, + this.i18nContext + ); + } + }); + }; +} diff --git a/src/plugins/dashboard/public/index.ts b/src/plugins/dashboard/public/index.ts index dcfde67cd9f13..8a9954cc77a2e 100644 --- a/src/plugins/dashboard/public/index.ts +++ b/src/plugins/dashboard/public/index.ts @@ -40,6 +40,7 @@ export { export { addEmbeddableToDashboardUrl } from './url_utils/url_helper'; export { SavedObjectDashboard } from './saved_dashboards'; export { SavedDashboardPanel } from './types'; +export { AttributeService } from './attribute_service/attribute_service'; export function plugin(initializerContext: PluginInitializerContext) { return new DashboardPlugin(initializerContext); diff --git a/src/plugins/dashboard/public/plugin.tsx b/src/plugins/dashboard/public/plugin.tsx index f1319665d258b..3b0863a9f4651 100644 --- a/src/plugins/dashboard/public/plugin.tsx +++ b/src/plugins/dashboard/public/plugin.tsx @@ -34,7 +34,13 @@ import { ScopedHistory, } from 'src/core/public'; import { UsageCollectionSetup } from '../../usage_collection/public'; -import { CONTEXT_MENU_TRIGGER, EmbeddableSetup, EmbeddableStart } from '../../embeddable/public'; +import { + CONTEXT_MENU_TRIGGER, + EmbeddableSetup, + EmbeddableStart, + SavedObjectEmbeddableInput, + EmbeddableInput, +} from '../../embeddable/public'; import { DataPublicPluginSetup, DataPublicPluginStart, esFilters } from '../../data/public'; import { SharePluginSetup, SharePluginStart, UrlGeneratorContract } from '../../share/public'; import { UiActionsSetup, UiActionsStart } from '../../ui_actions/public'; @@ -85,6 +91,7 @@ import { DashboardConstants } from './dashboard_constants'; import { addEmbeddableToDashboardUrl } from './url_utils/url_helper'; import { PlaceholderEmbeddableFactory } from './application/embeddable/placeholder'; import { UrlGeneratorState } from '../../share/public'; +import { AttributeService } from '.'; declare module '../../share/public' { export interface UrlGeneratorStateMapping { @@ -131,6 +138,13 @@ export interface DashboardStart { dashboardUrlGenerator?: DashboardUrlGenerator; dashboardFeatureFlagConfig: DashboardFeatureFlagConfig; DashboardContainerByValueRenderer: ReturnType; + getAttributeService: < + A extends { title: string }, + V extends EmbeddableInput & { attributes: A }, + R extends SavedObjectEmbeddableInput + >( + type: string + ) => AttributeService; } declare module '../../../plugins/ui_actions/public' { @@ -420,6 +434,13 @@ export class DashboardPlugin DashboardContainerByValueRenderer: createDashboardContainerByValueRenderer({ factory: dashboardContainerFactory, }), + getAttributeService: (type: string) => + new AttributeService( + type, + core.savedObjects.client, + core.i18n.Context, + core.notifications.toasts + ), }; } diff --git a/src/plugins/embeddable/public/index.ts b/src/plugins/embeddable/public/index.ts index fafbdda148de8..57253c1f741ab 100644 --- a/src/plugins/embeddable/public/index.ts +++ b/src/plugins/embeddable/public/index.ts @@ -28,7 +28,8 @@ export { ACTION_EDIT_PANEL, Adapters, AddPanelAction, - AttributeService, + ReferenceOrValueEmbeddable, + isReferenceOrValueEmbeddable, ChartActionContext, Container, ContainerInput, diff --git a/src/plugins/embeddable/public/lib/embeddables/attribute_service.ts b/src/plugins/embeddable/public/lib/embeddables/attribute_service.ts deleted file mode 100644 index a33f592350d9a..0000000000000 --- a/src/plugins/embeddable/public/lib/embeddables/attribute_service.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { SavedObjectsClientContract } from '../../../../../core/public'; -import { - SavedObjectEmbeddableInput, - isSavedObjectEmbeddableInput, - EmbeddableInput, - IEmbeddable, -} from '.'; -import { SimpleSavedObject } from '../../../../../core/public'; - -export class AttributeService< - SavedObjectAttributes, - ValType extends EmbeddableInput & { attributes: SavedObjectAttributes }, - RefType extends SavedObjectEmbeddableInput -> { - constructor(private type: string, private savedObjectsClient: SavedObjectsClientContract) {} - - public async unwrapAttributes(input: RefType | ValType): Promise { - if (isSavedObjectEmbeddableInput(input)) { - const savedObject: SimpleSavedObject = await this.savedObjectsClient.get< - SavedObjectAttributes - >(this.type, input.savedObjectId); - return savedObject.attributes; - } - return input.attributes; - } - - public async wrapAttributes( - newAttributes: SavedObjectAttributes, - useRefType: boolean, - embeddable?: IEmbeddable - ): Promise> { - const savedObjectId = - embeddable && isSavedObjectEmbeddableInput(embeddable.getInput()) - ? (embeddable.getInput() as SavedObjectEmbeddableInput).savedObjectId - : undefined; - - if (useRefType) { - if (savedObjectId) { - await this.savedObjectsClient.update(this.type, savedObjectId, newAttributes); - return { savedObjectId } as RefType; - } else { - const savedItem = await this.savedObjectsClient.create(this.type, newAttributes); - return { savedObjectId: savedItem.id } as RefType; - } - } else { - return { attributes: newAttributes } as ValType; - } - } -} diff --git a/src/plugins/embeddable/public/lib/embeddables/index.ts b/src/plugins/embeddable/public/lib/embeddables/index.ts index 06cb6e322acf3..5bab5ac27f3cc 100644 --- a/src/plugins/embeddable/public/lib/embeddables/index.ts +++ b/src/plugins/embeddable/public/lib/embeddables/index.ts @@ -25,5 +25,4 @@ export { ErrorEmbeddable, isErrorEmbeddable } from './error_embeddable'; export { withEmbeddableSubscription } from './with_subscription'; export { EmbeddableRoot } from './embeddable_root'; export * from './saved_object_embeddable'; -export { AttributeService } from './attribute_service'; export { EmbeddableRenderer, EmbeddableRendererProps } from './embeddable_renderer'; diff --git a/src/plugins/embeddable/public/lib/index.ts b/src/plugins/embeddable/public/lib/index.ts index b757fa59a7f3a..aef4c33ee1078 100644 --- a/src/plugins/embeddable/public/lib/index.ts +++ b/src/plugins/embeddable/public/lib/index.ts @@ -25,3 +25,4 @@ export * from './triggers'; export * from './containers'; export * from './panel'; export * from './state_transfer'; +export * from './reference_or_value_embeddable'; diff --git a/src/plugins/embeddable/public/lib/reference_or_value_embeddable/index.ts b/src/plugins/embeddable/public/lib/reference_or_value_embeddable/index.ts new file mode 100644 index 0000000000000..e9b8521a35ba5 --- /dev/null +++ b/src/plugins/embeddable/public/lib/reference_or_value_embeddable/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { ReferenceOrValueEmbeddable, isReferenceOrValueEmbeddable } from './types'; diff --git a/src/plugins/embeddable/public/lib/reference_or_value_embeddable/types.ts b/src/plugins/embeddable/public/lib/reference_or_value_embeddable/types.ts new file mode 100644 index 0000000000000..eaf5c94a09138 --- /dev/null +++ b/src/plugins/embeddable/public/lib/reference_or_value_embeddable/types.ts @@ -0,0 +1,56 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { EmbeddableInput, SavedObjectEmbeddableInput } from '..'; + +/** + * Any embeddable that implements this interface will be able to use input that is + * either by reference (backed by a saved object) OR by value, (provided + * by the container). + * @public + */ +export interface ReferenceOrValueEmbeddable< + ValTypeInput extends EmbeddableInput = EmbeddableInput, + RefTypeInput extends SavedObjectEmbeddableInput = SavedObjectEmbeddableInput +> { + /** + * determines whether the input is by value or by reference. + */ + inputIsRefType: (input: ValTypeInput | RefTypeInput) => input is RefTypeInput; + + /** + * Gets the embeddable's current input as its Value type + */ + getInputAsValueType: () => Promise; + + /** + * Gets the embeddable's current input as its Reference type + */ + getInputAsRefType: () => Promise; +} + +export function isReferenceOrValueEmbeddable( + incoming: unknown +): incoming is ReferenceOrValueEmbeddable { + return ( + !!(incoming as ReferenceOrValueEmbeddable).inputIsRefType && + !!(incoming as ReferenceOrValueEmbeddable).getInputAsValueType && + !!(incoming as ReferenceOrValueEmbeddable).getInputAsRefType + ); +} diff --git a/src/plugins/embeddable/public/mocks.tsx b/src/plugins/embeddable/public/mocks.tsx index 94aa980e446ca..fa79af909a427 100644 --- a/src/plugins/embeddable/public/mocks.tsx +++ b/src/plugins/embeddable/public/mocks.tsx @@ -97,7 +97,6 @@ const createStartContract = (): Start => { getEmbeddableFactories: jest.fn(), getEmbeddableFactory: jest.fn(), EmbeddablePanel: jest.fn(), - getAttributeService: jest.fn(), getEmbeddablePanel: jest.fn(), getStateTransfer: jest.fn(() => createEmbeddableStateTransferMock() as EmbeddableStateTransfer), }; diff --git a/src/plugins/embeddable/public/plugin.tsx b/src/plugins/embeddable/public/plugin.tsx index 319cbf8ec44b4..3cbd49279564f 100644 --- a/src/plugins/embeddable/public/plugin.tsx +++ b/src/plugins/embeddable/public/plugin.tsx @@ -37,10 +37,8 @@ import { defaultEmbeddableFactoryProvider, IEmbeddable, EmbeddablePanel, - SavedObjectEmbeddableInput, } from './lib'; import { EmbeddableFactoryDefinition } from './lib/embeddables/embeddable_factory_definition'; -import { AttributeService } from './lib/embeddables/attribute_service'; import { EmbeddableStateTransfer } from './lib/state_transfer'; export interface EmbeddableSetupDependencies { @@ -75,14 +73,6 @@ export interface EmbeddableStart { embeddableFactoryId: string ) => EmbeddableFactory | undefined; getEmbeddableFactories: () => IterableIterator; - getAttributeService: < - A, - V extends EmbeddableInput & { attributes: A }, - R extends SavedObjectEmbeddableInput - >( - type: string - ) => AttributeService; - EmbeddablePanel: EmbeddablePanelHOC; getEmbeddablePanel: (stateTransfer?: EmbeddableStateTransfer) => EmbeddablePanelHOC; getStateTransfer: (history?: ScopedHistory) => EmbeddableStateTransfer; @@ -159,7 +149,6 @@ export class EmbeddablePublicPlugin implements Plugin new AttributeService(type, core.savedObjects.client), getStateTransfer: (history?: ScopedHistory) => { return history ? new EmbeddableStateTransfer(core.application.navigateToApp, history) From c97916ea81c47cf33b58c2c2dcce6912a86c1de6 Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 12 Aug 2020 12:45:49 -0700 Subject: [PATCH 083/113] [babel] coalese some versions to prevent breaking yarn install (#74864) Co-authored-by: spalger Co-authored-by: Elastic Machine --- packages/kbn-pm/dist/index.js | 4 +- yarn.lock | 987 ++-------------------------------- 2 files changed, 53 insertions(+), 938 deletions(-) diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index ee141e1d8ab7a..9427cc57805e6 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -15108,7 +15108,7 @@ function getMarkerLines(loc, source, opts) { column: 0, line: -1 }, loc.start); - const endLoc = Object.assign({}, startLoc, {}, loc.end); + const endLoc = Object.assign({}, startLoc, loc.end); const { linesAbove = 2, linesBelow = 3 @@ -15530,7 +15530,7 @@ function isIdentifierName(name) { } } - return true; + return !isFirst; } /***/ }), diff --git a/yarn.lock b/yarn.lock index 7731d2f7a8ea1..4eac262ddfd2f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,14 +25,7 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/code-frame@^7.10.4": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== @@ -48,38 +41,7 @@ invariant "^2.2.4" semver "^5.5.0" -"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" - integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== - dependencies: - browserslist "^4.9.1" - invariant "^2.2.4" - semver "^5.5.0" - -"@babel/core@^7.0.1", "@babel/core@^7.1.0", "@babel/core@^7.4.3", "@babel/core@^7.7.5": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.11.1": +"@babel/core@^7.0.1", "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.4.3", "@babel/core@^7.7.5": version "7.11.1" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== @@ -101,17 +63,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.0.0", "@babel/generator@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" - integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA== - dependencies: - "@babel/types" "^7.9.0" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/generator@^7.11.0": +"@babel/generator@^7.0.0", "@babel/generator@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== @@ -120,24 +72,7 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" - integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== - dependencies: - "@babel/types" "^7.9.5" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" - integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-annotate-as-pure@^7.10.4": +"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== @@ -152,14 +87,6 @@ "@babel/helper-explode-assignable-expression" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" - "@babel/helper-builder-react-jsx-experimental@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz#f35e956a19955ff08c1258e44a515a6d6248646b" @@ -169,15 +96,6 @@ "@babel/helper-module-imports" "^7.10.4" "@babel/types" "^7.10.5" -"@babel/helper-builder-react-jsx-experimental@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43" - integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-module-imports" "^7.8.3" - "@babel/types" "^7.9.0" - "@babel/helper-builder-react-jsx@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" @@ -186,14 +104,6 @@ "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-builder-react-jsx@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" - integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/types" "^7.9.0" - "@babel/helper-compilation-targets@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" @@ -205,17 +115,6 @@ levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-compilation-targets@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" - integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== - dependencies: - "@babel/compat-data" "^7.8.6" - browserslist "^4.9.1" - invariant "^2.2.4" - levenary "^1.1.1" - semver "^5.5.0" - "@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" @@ -228,18 +127,6 @@ "@babel/helper-replace-supers" "^7.10.4" "@babel/helper-split-export-declaration" "^7.10.4" -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" - integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/helper-create-regexp-features-plugin@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" @@ -249,15 +136,6 @@ "@babel/helper-regex" "^7.10.4" regexpu-core "^4.7.0" -"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" - integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.7.0" - "@babel/helper-define-map@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" @@ -267,15 +145,6 @@ "@babel/types" "^7.10.5" lodash "^4.17.19" -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" - "@babel/helper-explode-assignable-expression@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" @@ -284,14 +153,6 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== - dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - "@babel/helper-function-name@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" @@ -301,24 +162,6 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-function-name@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" - integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.9.5" - "@babel/helper-get-function-arity@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" @@ -326,13 +169,6 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-hoist-variables@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" @@ -340,13 +176,6 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-hoist-variables@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" - integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" @@ -354,21 +183,7 @@ dependencies: "@babel/types" "^7.11.0" -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-imports@^7.10.4": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== @@ -388,19 +203,6 @@ "@babel/types" "^7.11.0" lodash "^4.17.19" -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" - "@babel/helper-optimise-call-expression@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" @@ -408,19 +210,7 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-plugin-utils@^7.10.4": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== @@ -432,13 +222,6 @@ dependencies: lodash "^4.17.19" -"@babel/helper-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" - integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== - dependencies: - lodash "^4.17.13" - "@babel/helper-remap-async-to-generator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" @@ -450,17 +233,6 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-remap-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" - integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-wrap-function" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - "@babel/helper-replace-supers@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" @@ -471,16 +243,6 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" - "@babel/helper-simple-access@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" @@ -489,14 +251,6 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - "@babel/helper-skip-transparent-expression-wrappers@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" @@ -511,28 +265,11 @@ dependencies: "@babel/types" "^7.11.0" -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" - integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== - -"@babel/helper-validator-identifier@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" - integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== - "@babel/helper-wrap-function@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" @@ -543,16 +280,6 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-wrap-function@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" - integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - "@babel/helpers@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" @@ -562,25 +289,7 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - -"@babel/highlight@^7.0.0", "@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.10.4": +"@babel/highlight@^7.0.0", "@babel/highlight@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== @@ -589,15 +298,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.2.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" - integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== - -"@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1", "@babel/parser@^7.11.2": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.2.tgz#0882ab8a455df3065ea2dcb4c753b2460a24bead" - integrity sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1", "@babel/parser@^7.11.2", "@babel/parser@^7.2.0", "@babel/parser@^7.7.5": + version "7.11.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.3.tgz#9e1eae46738bcd08e23e867bab43e7b95299a8f9" + integrity sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA== "@babel/plugin-proposal-async-generator-functions@^7.10.4": version "7.10.5" @@ -608,16 +312,7 @@ "@babel/helper-remap-async-to-generator" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" - integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" - -"@babel/plugin-proposal-class-properties@^7.10.4": +"@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.7.0": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== @@ -625,14 +320,6 @@ "@babel/helper-create-class-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-class-properties@^7.7.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" - integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-dynamic-import@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" @@ -641,14 +328,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" - integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-proposal-export-namespace-from@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" @@ -665,14 +344,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" - integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-proposal-logical-assignment-operators@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" @@ -689,14 +360,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" - integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-proposal-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" @@ -705,15 +368,7 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" - integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - -"@babel/plugin-proposal-object-rest-spread@^7.11.0": +"@babel/plugin-proposal-object-rest-spread@^7.11.0", "@babel/plugin-proposal-object-rest-spread@^7.6.2": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== @@ -722,14 +377,6 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" - integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-proposal-optional-catch-binding@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" @@ -738,14 +385,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-proposal-optional-chaining@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" @@ -755,14 +394,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" - integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-proposal-private-methods@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" @@ -771,7 +402,7 @@ "@babel/helper-create-class-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-unicode-property-regex@^7.10.4": +"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== @@ -779,14 +410,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" - integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.8" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -801,20 +424,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.10.4": +"@babel/plugin-syntax-class-properties@^7.10.4", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" - integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -829,12 +445,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" - integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== +"@babel/plugin-syntax-flow@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz#53351dd7ae01995e567d04ce42af1a6e0ba846a6" + integrity sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -850,27 +466,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" - integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" - integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" @@ -878,20 +480,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4": +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" @@ -920,13 +515,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" - integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-typescript@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" @@ -941,13 +529,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-async-to-generator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" @@ -957,15 +538,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-remap-async-to-generator" "^7.10.4" -"@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" - integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" @@ -973,13 +545,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-block-scoping@^7.10.4": version "7.11.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215" @@ -987,14 +552,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - lodash "^4.17.13" - "@babel/plugin-transform-classes@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" @@ -1009,20 +566,6 @@ "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" - integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" - globals "^11.1.0" - "@babel/plugin-transform-computed-properties@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" @@ -1030,13 +573,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-computed-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-destructuring@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" @@ -1044,14 +580,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" - integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-dotall-regex@^7.10.4": +"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== @@ -1059,14 +588,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" - integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-duplicate-keys@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" @@ -1074,13 +595,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" - integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" @@ -1089,21 +603,13 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-flow-strip-types@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" - integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg== +"@babel/plugin-transform-flow-strip-types@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz#c497957f09e86e3df7296271e9eb642876bf7788" + integrity sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-flow" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-flow" "^7.10.4" "@babel/plugin-transform-for-of@^7.10.4": version "7.10.4" @@ -1112,13 +618,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-for-of@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" - integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-function-name@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" @@ -1127,14 +626,6 @@ "@babel/helper-function-name" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-literals@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" @@ -1142,13 +633,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-member-expression-literals@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" @@ -1156,13 +640,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-modules-amd@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" @@ -1172,15 +649,6 @@ "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-amd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" - integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== - dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" - "@babel/plugin-transform-modules-commonjs@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" @@ -1191,16 +659,6 @@ "@babel/helper-simple-access" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" - integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== - dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" - "@babel/plugin-transform-modules-systemjs@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" @@ -1211,16 +669,6 @@ "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" - integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" - "@babel/plugin-transform-modules-umd@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" @@ -1229,14 +677,6 @@ "@babel/helper-module-transforms" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" - integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== - dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" @@ -1244,13 +684,6 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.10.4" -"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/plugin-transform-new-target@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" @@ -1258,13 +691,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-new-target@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" - integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-object-super@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" @@ -1273,14 +699,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-replace-supers" "^7.10.4" -"@babel/plugin-transform-object-super@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" - "@babel/plugin-transform-parameters@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" @@ -1289,14 +707,6 @@ "@babel/helper-get-function-arity" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-parameters@^7.8.7": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" - integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-property-literals@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" @@ -1304,19 +714,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-property-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-react-constant-elements@^7.0.0", "@babel/plugin-transform-react-constant-elements@^7.2.0", "@babel/plugin-transform-react-constant-elements@^7.6.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz#a75abc936a3819edec42d3386d9f1c93f28d9d9e" - integrity sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz#0f485260bf1c29012bb973e7e404749eaac12c9e" + integrity sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-react-display-name@^7.10.4": version "7.10.4" @@ -1325,13 +728,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-display-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" - integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-react-jsx-development@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz#6ec90f244394604623880e15ebc3c34c356258ba" @@ -1341,15 +737,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-development@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" - integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== - dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" - "@babel/plugin-transform-react-jsx-self@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz#cd301a5fed8988c182ed0b9d55e9bd6db0bd9369" @@ -1358,14 +745,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-self@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" - integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" - "@babel/plugin-transform-react-jsx-source@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4" @@ -1374,14 +753,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-source@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" - integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" - "@babel/plugin-transform-react-jsx@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2" @@ -1392,16 +763,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.9.4": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f" - integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw== - dependencies: - "@babel/helper-builder-react-jsx" "^7.9.0" - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" - "@babel/plugin-transform-react-pure-annotations@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz#3eefbb73db94afbc075f097523e445354a1c6501" @@ -1417,13 +778,6 @@ dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-regenerator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" - integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== - dependencies: - regenerator-transform "^0.14.2" - "@babel/plugin-transform-reserved-words@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" @@ -1431,13 +785,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-reserved-words@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" - integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-runtime@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz#e27f78eb36f19448636e05c33c90fd9ad9b8bccf" @@ -1455,13 +802,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-spread@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" @@ -1470,13 +810,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" -"@babel/plugin-transform-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-sticky-regex@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" @@ -1485,14 +818,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-regex" "^7.10.4" -"@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - "@babel/plugin-transform-template-literals@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" @@ -1501,14 +826,6 @@ "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-template-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-typeof-symbol@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" @@ -1516,13 +833,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" - integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-typescript@^7.10.4": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz#2b4879676af37342ebb278216dd090ac67f13abb" @@ -1547,81 +857,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.4.3", "@babel/preset-env@^7.4.5": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" - integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== - dependencies: - "@babel/compat-data" "^7.9.0" - "@babel/helper-compilation-targets" "^7.8.7" - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-async-generator-functions" "^7.8.3" - "@babel/plugin-proposal-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-json-strings" "^7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-numeric-separator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.9.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.9.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.8.0" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.8.3" - "@babel/plugin-transform-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.9.0" - "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" - "@babel/plugin-transform-dotall-regex" "^7.8.3" - "@babel/plugin-transform-duplicate-keys" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.9.0" - "@babel/plugin-transform-function-name" "^7.8.3" - "@babel/plugin-transform-literals" "^7.8.3" - "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.0" - "@babel/plugin-transform-modules-commonjs" "^7.9.0" - "@babel/plugin-transform-modules-systemjs" "^7.9.0" - "@babel/plugin-transform-modules-umd" "^7.9.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.8.3" - "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.7" - "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.7" - "@babel/plugin-transform-reserved-words" "^7.8.3" - "@babel/plugin-transform-shorthand-properties" "^7.8.3" - "@babel/plugin-transform-spread" "^7.8.3" - "@babel/plugin-transform-sticky-regex" "^7.8.3" - "@babel/plugin-transform-template-literals" "^7.8.3" - "@babel/plugin-transform-typeof-symbol" "^7.8.4" - "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.9.0" - browserslist "^4.9.1" - core-js-compat "^3.6.2" - invariant "^2.2.2" - levenary "^1.1.1" - semver "^5.5.0" - -"@babel/preset-env@^7.11.0": +"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.4.3", "@babel/preset-env@^7.4.5": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== @@ -1696,12 +932,12 @@ semver "^5.5.0" "@babel/preset-flow@^7.0.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.9.0.tgz#fee847c3e090b0b2d9227c1949e4da1d1379280d" - integrity sha512-88uSmlshIrlmPkNkEcx3UpSZ6b8n0UGBq0/0ZMZCF/uxAW0XIAUuDHBhIOAh0pvweafH4RxOwi/H3rWhtqOYPA== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.10.4.tgz#e0d9c72f8cb02d1633f6a5b7b16763aa2edf659f" + integrity sha512-XI6l1CptQCOBv+ZKYwynyswhtOKwpZZp5n0LG1QKCo8erRhqjoQV6nvx61Eg30JHpysWQSBwA2AWRU3pBbSY5g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-flow-strip-types" "^7.9.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-flow-strip-types" "^7.10.4" "@babel/preset-modules@^0.1.3": version "0.1.3" @@ -1714,19 +950,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.0.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d" - integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-react-display-name" "^7.8.3" - "@babel/plugin-transform-react-jsx" "^7.9.4" - "@babel/plugin-transform-react-jsx-development" "^7.9.0" - "@babel/plugin-transform-react-jsx-self" "^7.9.0" - "@babel/plugin-transform-react-jsx-source" "^7.9.0" - -"@babel/preset-react@^7.10.4": +"@babel/preset-react@^7.0.0", "@babel/preset-react@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf" integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw== @@ -1759,9 +983,9 @@ source-map-support "^0.5.16" "@babel/runtime-corejs2@^7.2.0", "@babel/runtime-corejs2@^7.6.3": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.9.2.tgz#f11d074ff99b9b4319b5ecf0501f12202bf2bf4d" - integrity sha512-ayjSOxuK2GaSDJFCtLgHnYjuMyIpViNujWrZo8GUpN60/n7juzJKK5yOo6RFVb0zdU9ACJFK+MsZrUnj3OmXMw== + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.11.2.tgz#700a03945ebad0d31ba6690fc8a6bcc9040faa47" + integrity sha512-AC/ciV28adSSpEkBglONBWq4/Lvm6GAZuxIoyVtsnUpZMl0bxLtoChEnYAkP+47KyOCayZanojtflUEUJtR/6Q== dependencies: core-js "^2.6.5" regenerator-runtime "^0.13.4" @@ -1773,42 +997,19 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" - integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.11.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.11.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.3.1", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.7": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c" - integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/standalone@^7.4.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.10.5.tgz#4ee38dc79fda10a2a0da0897f09e270310151314" - integrity sha512-PERGHqhQ7H3TrdglvSW4pEHULywMJEdytnzaR0VPF1HN45aS+3FcE62efb90XPKS9TlgrEUkYDvYMt+0m6G0YA== - -"@babel/template@^7.0.0", "@babel/template@^7.3.3", "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" + version "7.11.3" + resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.11.3.tgz#043e6ff3b12226e41ed2013418b9a4c055d9c21e" + integrity sha512-rcoT32Hw0faYhmCDR0P84ODKL5kpEdhYPgdzlTKs7+v9oJaVLsGvq0xlkmLRj01F6LrItH3tY9eEoRsPLie4RQ== -"@babel/template@^7.10.4": +"@babel/template@^7.0.0", "@babel/template@^7.10.4", "@babel/template@^7.3.3", "@babel/template@^7.7.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== @@ -1817,22 +1018,7 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.4.5", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" - integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.4": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== @@ -1847,31 +1033,7 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/traverse@^7.7.4": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" - integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.5" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.5" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" - integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0": +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== @@ -1880,24 +1042,6 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.3.3": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" - integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== - dependencies: - "@babel/helper-validator-identifier" "^7.9.5" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.4", "@babel/types@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" - integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== - dependencies: - "@babel/helper-validator-identifier" "^7.9.5" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -7695,13 +6839,6 @@ babel-plugin-add-react-displayname@^0.0.5: resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" integrity sha1-M51M3be2X9YtHfnbn+BN4TQSK9U= -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== - dependencies: - object.assign "^4.1.0" - babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" @@ -8653,16 +7790,6 @@ browserslist@^4.8.3: electron-to-chromium "^1.3.338" node-releases "^1.1.46" -browserslist@^4.9.1: - version "4.11.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad" - integrity sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A== - dependencies: - caniuse-lite "^1.0.30001035" - electron-to-chromium "^1.3.380" - node-releases "^1.1.52" - pkg-up "^3.1.0" - bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -9089,7 +8216,7 @@ can-use-dom@^0.1.0: resolved "https://registry.yarnpkg.com/can-use-dom/-/can-use-dom-0.1.0.tgz#22cc4a34a0abc43950f42c6411024a3f6366b45a" integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo= -caniuse-lite@^1.0.30000984, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001022, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001043: +caniuse-lite@^1.0.30000984, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001022, caniuse-lite@^1.0.30001043: version "1.0.30001094" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001094.tgz#0b11d02e1cdc201348dbd8e3e57bd9b6ce82b175" integrity sha512-ufHZNtMaDEuRBpTbqD93tIQnngmJ+oBknjvr0IbFympSdtFpAUFmNv4mVKbb53qltxFx0nK3iy32S9AqkLzUNA== @@ -12470,11 +11597,6 @@ electron-to-chromium@^1.3.191, electron-to-chromium@^1.3.338: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.340.tgz#5d4fe78e984d4211194cf5a52e08069543da146f" integrity sha512-hRFBAglhcj5iVYH+o8QU0+XId1WGoc0VGowJB1cuJAt3exHGrivZvWeAO5BRgBZqwZtwxjm8a5MQeGoT/Su3ww== -electron-to-chromium@^1.3.380: - version "1.3.382" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.382.tgz#cad02da655c33f7a3d6ca7525bd35c17e90f3a8f" - integrity sha512-gJfxOcgnBlXhfnUUObsq3n3ReU8CT6S8je97HndYRkKsNZMJJ38zO/pI5aqO7L3Myfq+E3pqPyKK/ynyLEQfBA== - electron-to-chromium@^1.3.413: version "1.3.465" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.465.tgz#d692e5c383317570c2bd82092a24a0308c6ccf29" @@ -22121,13 +21243,6 @@ node-releases@^1.1.25, node-releases@^1.1.46: dependencies: semver "^6.3.0" -node-releases@^1.1.52: - version "1.1.52" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" - integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== - dependencies: - semver "^6.3.0" - node-releases@^1.1.53: version "1.1.58" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" From 5b64a4cdfea92639ddf9e23c86c43dda5ea3ac68 Mon Sep 17 00:00:00 2001 From: Caroline Horn <549577+cchaos@users.noreply.github.com> Date: Wed, 12 Aug 2020 16:58:16 -0400 Subject: [PATCH 084/113] Empty index patterns page re-design (#68819) Empty index patterns page re-design --- .sass-lint.yml | 1 + ...-plugin-core-public.doclinksstart.links.md | 1 + docs/setup/connect-to-elasticsearch.asciidoc | 2 +- .../public/doc_links/doc_links_service.ts | 2 + src/core/public/public.api.md | 1 + .../redirect_no_index_pattern.tsx | 2 +- .../public/_templates.scss | 11 + .../public/_variables.scss | 1 + .../create_index_pattern_prompt/index.tsx | 108 ---- .../create_index_pattern_wizard.test.tsx.snap | 76 ++- .../__snapshots__/empty_state.test.tsx.snap | 66 --- .../components/empty_state/empty_state.tsx | 90 --- .../header/__snapshots__/header.test.tsx.snap | 4 +- .../components/header/header.tsx | 3 +- .../__snapshots__/indices_list.test.tsx.snap | 25 +- .../components/indices_list/indices_list.tsx | 2 +- .../loading_indices.test.tsx.snap | 46 +- .../loading_indices/loading_indices.tsx | 34 +- .../status_message/status_message.tsx | 2 +- .../step_index_pattern/step_index_pattern.tsx | 14 +- .../advanced_options.test.tsx.snap | 4 +- .../advanced_options/advanced_options.tsx | 4 +- .../header/__snapshots__/header.test.tsx.snap | 15 +- .../components/header/header.tsx | 9 +- .../components/time_field/time_field.scss | 7 - .../components/time_field/time_field.tsx | 2 - .../create_index_pattern_wizard.test.tsx | 1 - .../create_index_pattern_wizard.tsx | 44 +- .../lib/extract_time_fields.test.ts | 2 +- .../lib/extract_time_fields.ts | 2 +- .../lib/get_indices.test.ts | 25 +- .../lib/get_indices.ts | 8 +- .../edit_index_pattern/edit_index_pattern.tsx | 106 ++-- .../index_header/index_header.tsx | 28 +- .../edit_index_pattern/tabs/tabs.tsx | 1 + .../scripting_help/test_script.scss | 2 +- .../empty_index_pattern_prompt.test.tsx.snap | 99 ++++ .../assets/index_pattern_illustration.scss | 9 + .../assets/index_pattern_illustration.tsx | 551 ++++++++++++++++++ .../empty_index_pattern_prompt.scss | 31 + .../empty_index_pattern_prompt.test.tsx} | 32 +- .../empty_index_pattern_prompt.tsx | 111 ++++ .../empty_index_pattern_prompt/index.tsx | 20 + .../__snapshots__/empty_state.test.tsx.snap | 216 +++++++ .../empty_state/empty_state.scss | 23 + .../empty_state/empty_state.test.tsx | 74 +++ .../empty_state/empty_state.tsx | 234 ++++++++ .../empty_state/index.ts | 0 .../index_pattern_table.tsx | 114 +++- .../index_pattern_management/public/index.ts | 2 + .../mount_management_section.tsx | 6 +- .../index_pattern_management/public/mocks.ts | 3 + .../index_pattern_management/public/plugin.ts | 4 +- .../service/environment/environment.mock.ts | 44 ++ .../service/environment/environment.test.ts | 49 ++ .../public/service/environment/environment.ts | 52 ++ .../public/service/environment/index.ts | 20 + .../index_pattern_management_service.ts | 4 + .../index_pattern_management/public/types.ts | 7 + .../apps/management/_index_patterns_empty.ts | 66 +++ .../apps/management/_kibana_settings.js | 2 +- test/functional/apps/management/index.js | 1 + test/functional/page_objects/settings_page.ts | 13 +- x-pack/plugins/ml/kibana.json | 3 +- x-pack/plugins/ml/public/application/app.tsx | 3 +- x-pack/plugins/ml/public/plugin.ts | 14 +- .../translations/translations/ja-JP.json | 15 - .../translations/translations/zh-CN.json | 15 - .../index_patterns_security.ts | 2 +- 69 files changed, 2006 insertions(+), 584 deletions(-) create mode 100644 src/plugins/index_pattern_management/public/_templates.scss create mode 100644 src/plugins/index_pattern_management/public/_variables.scss delete mode 100644 src/plugins/index_pattern_management/public/components/create_index_pattern_prompt/index.tsx delete mode 100644 src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/empty_state/__snapshots__/empty_state.test.tsx.snap delete mode 100644 src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/empty_state/empty_state.tsx delete mode 100644 src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/time_field/time_field.scss create mode 100644 src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/__snapshots__/empty_index_pattern_prompt.test.tsx.snap create mode 100644 src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/assets/index_pattern_illustration.scss create mode 100644 src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/assets/index_pattern_illustration.tsx create mode 100644 src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.scss rename src/plugins/index_pattern_management/public/components/{create_index_pattern_wizard/components/empty_state/empty_state.test.tsx => index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.test.tsx} (57%) create mode 100644 src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.tsx create mode 100644 src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/index.tsx create mode 100644 src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/__snapshots__/empty_state.test.tsx.snap create mode 100644 src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.scss create mode 100644 src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.test.tsx create mode 100644 src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.tsx rename src/plugins/index_pattern_management/public/components/{create_index_pattern_wizard/components => index_pattern_table}/empty_state/index.ts (100%) create mode 100644 src/plugins/index_pattern_management/public/service/environment/environment.mock.ts create mode 100644 src/plugins/index_pattern_management/public/service/environment/environment.test.ts create mode 100644 src/plugins/index_pattern_management/public/service/environment/environment.ts create mode 100644 src/plugins/index_pattern_management/public/service/environment/index.ts create mode 100644 test/functional/apps/management/_index_patterns_empty.ts diff --git a/.sass-lint.yml b/.sass-lint.yml index d6eaaf391de1a..9eed50602f520 100644 --- a/.sass-lint.yml +++ b/.sass-lint.yml @@ -1,6 +1,7 @@ files: include: - 'src/legacy/core_plugins/metrics/**/*.s+(a|c)ss' + - 'src/plugins/index_pattern_management/**/*.s+(a|c)ss' - 'src/plugins/timelion/**/*.s+(a|c)ss' - 'src/plugins/vis_type_vislib/**/*.s+(a|c)ss' - 'src/plugins/vis_type_vega/**/*.s+(a|c)ss' diff --git a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md index a03b1b74fc1ac..842f90b7047c8 100644 --- a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md +++ b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md @@ -81,6 +81,7 @@ readonly links: { readonly loadingData: string; readonly introduction: string; }; + readonly addData: string; readonly kibana: string; readonly siem: { readonly guide: string; diff --git a/docs/setup/connect-to-elasticsearch.asciidoc b/docs/setup/connect-to-elasticsearch.asciidoc index bffb3f97cd1b9..f750784c47043 100644 --- a/docs/setup/connect-to-elasticsearch.asciidoc +++ b/docs/setup/connect-to-elasticsearch.asciidoc @@ -97,7 +97,7 @@ Using a wildcard is the more popular approach. comparisons. + Kibana reads the index mapping and lists all fields that contain a timestamp. If your -index doesn't have time-based data, choose *I don't want to use the Time Filter*. +index doesn't have time-based data, choose *I don't want to use the time filter*. + You must select a time field to use global time filters on your dashboards. diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index eb54983d0be13..8853d95181994 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -109,6 +109,7 @@ export class DocLinksService { loadingData: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/tutorial-load-dataset.html`, introduction: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/index-patterns.html`, }, + addData: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/connect-to-elasticsearch.html`, kibana: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/index.html`, siem: { guide: `${ELASTIC_WEBSITE_URL}guide/en/security/${DOC_LINK_VERSION}/index.html`, @@ -209,6 +210,7 @@ export interface DocLinksStart { readonly loadingData: string; readonly introduction: string; }; + readonly addData: string; readonly kibana: string; readonly siem: { readonly guide: string; diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md index 9b421e0172df0..0e879d16b4637 100644 --- a/src/core/public/public.api.md +++ b/src/core/public/public.api.md @@ -576,6 +576,7 @@ export interface DocLinksStart { readonly loadingData: string; readonly introduction: string; }; + readonly addData: string; readonly kibana: string; readonly siem: { readonly guide: string; diff --git a/src/plugins/data/public/index_patterns/index_patterns/redirect_no_index_pattern.tsx b/src/plugins/data/public/index_patterns/index_patterns/redirect_no_index_pattern.tsx index 7ed6525db6350..ac015f8dd33af 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/redirect_no_index_pattern.tsx +++ b/src/plugins/data/public/index_patterns/index_patterns/redirect_no_index_pattern.tsx @@ -40,7 +40,7 @@ export const onRedirectNoIndexPattern = ( const bannerMessage = i18n.translate('data.indexPatterns.ensureDefaultIndexPattern.bannerLabel', { defaultMessage: - "In order to visualize and explore data in Kibana, you'll need to create an index pattern to retrieve data from Elasticsearch.", + 'To visualize and explore data in Kibana, you must create an index pattern to retrieve data from Elasticsearch.', }); // Avoid being hostile to new users who don't have an index pattern setup yet diff --git a/src/plugins/index_pattern_management/public/_templates.scss b/src/plugins/index_pattern_management/public/_templates.scss new file mode 100644 index 0000000000000..5303537bddabc --- /dev/null +++ b/src/plugins/index_pattern_management/public/_templates.scss @@ -0,0 +1,11 @@ +%inp-empty-state-footer { + background: $euiColorLightestShade; + margin: 0 (-$euiSizeL) (-$euiSizeL); + padding: $euiSizeL; + border-radius: 0 0 $euiBorderRadius $euiBorderRadius; + + // sass-lint:disable-block mixins-before-declarations + @include euiBreakpoint('xs', 's') { + text-align: center; + } +} diff --git a/src/plugins/index_pattern_management/public/_variables.scss b/src/plugins/index_pattern_management/public/_variables.scss new file mode 100644 index 0000000000000..5da25a91bd77c --- /dev/null +++ b/src/plugins/index_pattern_management/public/_variables.scss @@ -0,0 +1 @@ +$inpEmptyStateMaxWidth: $euiSizeXXL * 19; diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_prompt/index.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_prompt/index.tsx deleted file mode 100644 index ab3b90177bcfd..0000000000000 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_prompt/index.tsx +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { - EuiDescriptionList, - EuiDescriptionListDescription, - EuiDescriptionListTitle, - EuiFlyout, - EuiFlyoutBody, - EuiFlyoutHeader, - EuiHorizontalRule, - EuiSpacer, - EuiText, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import React from 'react'; - -export const CreateIndexPatternPrompt = ({ onClose }: { onClose: () => void }) => ( - - - -

    - -

    -
    -
    - - -

    - -

    -
    - - -

    - -

    -
    - - - - - - - - - - - - - - - - - - - - - -
    -
    -); diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/__snapshots__/create_index_pattern_wizard.test.tsx.snap b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/__snapshots__/create_index_pattern_wizard.test.tsx.snap index 6d79515c172fe..0e5fc0582f72c 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/__snapshots__/create_index_pattern_wizard.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/__snapshots__/create_index_pattern_wizard.test.tsx.snap @@ -62,10 +62,37 @@ exports[`CreateIndexPatternWizard renders index pattern step when there are indi exports[`CreateIndexPatternWizard renders the empty state when there are no indices 1`] = ` - + +
    + + + - + +
    + + + - - } - > -

    - - - , - "learnHowLink": - - , - "needToIndex": - - , - } - } - /> -

    - - - -
    -

    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 Date: Tue, 11 Aug 2020 13:31:59 -0400 Subject: [PATCH 060/113] [Security Solution] Rename Administration > Hosts subtab to Endpoints (#74287) --- .../public/common/store/actions.ts | 4 +- .../public/management/common/constants.ts | 6 +- .../public/management/common/routing.ts | 40 ++--- .../public/management/common/translations.ts | 4 +- .../components/management_empty_state.tsx | 22 +-- .../management/pages/endpoint_hosts/index.tsx | 10 +- .../pages/endpoint_hosts/routes.tsx | 6 +- .../pages/endpoint_hosts/store/action.ts | 60 ++++---- ...on.test.ts => endpoint_pagination.test.ts} | 34 ++--- .../pages/endpoint_hosts/store/index.test.ts | 30 ++-- .../endpoint_hosts/store/middleware.test.ts | 32 ++-- .../pages/endpoint_hosts/store/middleware.ts | 96 ++++++------ ...t_list.ts => mock_endpoint_result_list.ts} | 47 +++--- .../pages/endpoint_hosts/store/reducer.ts | 52 +++---- .../pages/endpoint_hosts/store/selectors.ts | 81 +++++----- .../management/pages/endpoint_hosts/types.ts | 10 +- ...licy_link.tsx => endpoint_policy_link.tsx} | 8 +- ...{host_details.tsx => endpoint_details.tsx} | 63 ++++---- .../endpoint_hosts/view/details/index.tsx | 77 +++++----- .../view/details/policy_response.tsx | 6 +- .../details/policy_response_friendly_names.ts | 117 +++++++------- .../pages/endpoint_hosts/view/hooks.ts | 10 +- .../pages/endpoint_hosts/view/index.test.tsx | 122 +++++++-------- .../pages/endpoint_hosts/view/index.tsx | 100 ++++++------ .../view/url_from_query_params.ts | 4 +- .../public/management/pages/index.test.tsx | 4 +- .../public/management/pages/index.tsx | 14 +- .../pages/policy/view/agents_summary.tsx | 2 +- .../pages/policy/view/policy_details.test.tsx | 12 +- .../pages/policy/view/policy_details.tsx | 4 +- .../public/management/store/middleware.ts | 8 +- .../public/management/store/reducer.ts | 11 +- .../public/management/types.ts | 6 +- .../components/endpoint_notice/index.tsx | 4 +- .../translations/translations/ja-JP.json | 144 +++++++++--------- .../translations/translations/zh-CN.json | 144 +++++++++--------- .../apps/endpoint/endpoint_list.ts | 74 +++++---- .../apps/endpoint/policy_details.ts | 2 +- .../page_objects/endpoint_page.ts | 10 +- 39 files changed, 750 insertions(+), 730 deletions(-) rename x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/{host_pagination.test.ts => endpoint_pagination.test.ts} (80%) rename x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/{mock_host_result_list.ts => mock_endpoint_result_list.ts} (79%) rename x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/{host_policy_link.tsx => endpoint_policy_link.tsx} (89%) rename x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/{host_details.tsx => endpoint_details.tsx} (76%) diff --git a/x-pack/plugins/security_solution/public/common/store/actions.ts b/x-pack/plugins/security_solution/public/common/store/actions.ts index f2072aae1936f..cd8836e38bfef 100644 --- a/x-pack/plugins/security_solution/public/common/store/actions.ts +++ b/x-pack/plugins/security_solution/public/common/store/actions.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { HostAction } from '../../management/pages/endpoint_hosts/store/action'; +import { EndpointAction } from '../../management/pages/endpoint_hosts/store/action'; import { PolicyListAction } from '../../management/pages/policy/store/policy_list'; import { PolicyDetailsAction } from '../../management/pages/policy/store/policy_details'; @@ -13,4 +13,4 @@ export { dragAndDropActions } from './drag_and_drop'; export { inputsActions } from './inputs'; import { RoutingAction } from './routing'; -export type AppAction = HostAction | RoutingAction | PolicyListAction | PolicyDetailsAction; +export type AppAction = EndpointAction | RoutingAction | PolicyListAction | PolicyDetailsAction; diff --git a/x-pack/plugins/security_solution/public/management/common/constants.ts b/x-pack/plugins/security_solution/public/management/common/constants.ts index b07c47a398049..88396cc24a5e2 100644 --- a/x-pack/plugins/security_solution/public/management/common/constants.ts +++ b/x-pack/plugins/security_solution/public/management/common/constants.ts @@ -10,7 +10,7 @@ import { SecurityPageName } from '../../app/types'; // --[ ROUTING ]--------------------------------------------------------------------------- export const MANAGEMENT_APP_ID = `${APP_ID}:${SecurityPageName.administration}`; export const MANAGEMENT_ROUTING_ROOT_PATH = ''; -export const MANAGEMENT_ROUTING_HOSTS_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.hosts})`; +export const MANAGEMENT_ROUTING_ENDPOINTS_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.endpoints})`; export const MANAGEMENT_ROUTING_POLICIES_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.policies})`; export const MANAGEMENT_ROUTING_POLICY_DETAILS_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.policies})/:policyId`; @@ -21,5 +21,5 @@ export const MANAGEMENT_STORE_GLOBAL_NAMESPACE: ManagementStoreGlobalNamespace = export const MANAGEMENT_STORE_POLICY_LIST_NAMESPACE = 'policyList'; /** Namespace within the Management state where policy details state is maintained */ export const MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE = 'policyDetails'; -/** Namespace within the Management state where hosts state is maintained */ -export const MANAGEMENT_STORE_HOSTS_NAMESPACE = 'hosts'; +/** Namespace within the Management state where endpoint-host state is maintained */ +export const MANAGEMENT_STORE_ENDPOINTS_NAMESPACE = 'endpoints'; diff --git a/x-pack/plugins/security_solution/public/management/common/routing.ts b/x-pack/plugins/security_solution/public/management/common/routing.ts index eeb1533f57a67..ea162422abb6f 100644 --- a/x-pack/plugins/security_solution/public/management/common/routing.ts +++ b/x-pack/plugins/security_solution/public/management/common/routing.ts @@ -10,13 +10,13 @@ import { generatePath } from 'react-router-dom'; import querystring from 'querystring'; import { - MANAGEMENT_ROUTING_HOSTS_PATH, + MANAGEMENT_ROUTING_ENDPOINTS_PATH, MANAGEMENT_ROUTING_POLICIES_PATH, MANAGEMENT_ROUTING_POLICY_DETAILS_PATH, } from './constants'; import { AdministrationSubTab } from '../types'; import { appendSearch } from '../../common/components/link_to/helpers'; -import { HostIndexUIQueryParams } from '../pages/endpoint_hosts/types'; +import { EndpointIndexUIQueryParams } from '../pages/endpoint_hosts/types'; // Taken from: https://github.com/microsoft/TypeScript/issues/12936#issuecomment-559034150 type ExactKeys = Exclude extends never ? T1 : never; @@ -31,42 +31,44 @@ const querystringStringify: ( params: Exact ) => string = querystring.stringify; -/** Make `selected_host` required */ -type HostDetailsUrlProps = Omit & - Required>; +/** Make `selected_endpoint` required */ +type EndpointDetailsUrlProps = Omit & + Required>; -export const getHostListPath = ( - props: { name: 'default' | 'hostList' } & HostIndexUIQueryParams, +export const getEndpointListPath = ( + props: { name: 'default' | 'endpointList' } & EndpointIndexUIQueryParams, search?: string ) => { const { name, ...queryParams } = props; - const urlQueryParams = querystringStringify( + const urlQueryParams = querystringStringify( queryParams ); const urlSearch = `${urlQueryParams && !isEmpty(search) ? '&' : ''}${search ?? ''}`; - if (name === 'hostList') { - return `${generatePath(MANAGEMENT_ROUTING_HOSTS_PATH, { - tabName: AdministrationSubTab.hosts, + if (name === 'endpointList') { + return `${generatePath(MANAGEMENT_ROUTING_ENDPOINTS_PATH, { + tabName: AdministrationSubTab.endpoints, })}${appendSearch(`${urlQueryParams ? `${urlQueryParams}${urlSearch}` : urlSearch}`)}`; } return `${appendSearch(`${urlQueryParams ? `${urlQueryParams}${urlSearch}` : urlSearch}`)}`; }; -export const getHostDetailsPath = ( - props: { name: 'hostDetails' | 'hostPolicyResponse' } & HostIndexUIQueryParams & - HostDetailsUrlProps, +export const getEndpointDetailsPath = ( + props: { name: 'endpointDetails' | 'endpointPolicyResponse' } & EndpointIndexUIQueryParams & + EndpointDetailsUrlProps, search?: string ) => { const { name, ...queryParams } = props; - queryParams.show = (props.name === 'hostPolicyResponse' + queryParams.show = (props.name === 'endpointPolicyResponse' ? 'policy_response' - : '') as HostIndexUIQueryParams['show']; - const urlQueryParams = querystringStringify(queryParams); + : '') as EndpointIndexUIQueryParams['show']; + const urlQueryParams = querystringStringify( + queryParams + ); const urlSearch = `${urlQueryParams && !isEmpty(search) ? '&' : ''}${search ?? ''}`; - return `${generatePath(MANAGEMENT_ROUTING_HOSTS_PATH, { - tabName: AdministrationSubTab.hosts, + return `${generatePath(MANAGEMENT_ROUTING_ENDPOINTS_PATH, { + tabName: AdministrationSubTab.endpoints, })}${appendSearch(`${urlQueryParams ? `${urlQueryParams}${urlSearch}` : urlSearch}`)}`; }; diff --git a/x-pack/plugins/security_solution/public/management/common/translations.ts b/x-pack/plugins/security_solution/public/management/common/translations.ts index 70ccf715eaa09..03f6a80ef99a4 100644 --- a/x-pack/plugins/security_solution/public/management/common/translations.ts +++ b/x-pack/plugins/security_solution/public/management/common/translations.ts @@ -6,8 +6,8 @@ import { i18n } from '@kbn/i18n'; -export const HOSTS_TAB = i18n.translate('xpack.securitySolution.hostsTab', { - defaultMessage: 'Hosts', +export const ENDPOINTS_TAB = i18n.translate('xpack.securitySolution.endpointsTab', { + defaultMessage: 'Endpoints', }); export const POLICIES_TAB = i18n.translate('xpack.securitySolution.policiesTab', { diff --git a/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx b/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx index a4518d1a1f493..4617865d6aa6d 100644 --- a/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx +++ b/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx @@ -116,7 +116,7 @@ const PolicyEmptyState = React.memo<{ ); }); -const HostsEmptyState = React.memo<{ +const EndpointsEmptyState = React.memo<{ loading: boolean; onActionClick: (event: MouseEvent) => void; actionDisabled: boolean; @@ -126,14 +126,14 @@ const HostsEmptyState = React.memo<{ const policySteps = useMemo( () => [ { - title: i18n.translate('xpack.securitySolution.endpoint.hostList.stepOneTitle', { + title: i18n.translate('xpack.securitySolution.endpoint.list.stepOneTitle', { defaultMessage: 'Select the integration you want to use', }), children: ( <> @@ -151,7 +151,7 @@ const HostsEmptyState = React.memo<{ return loading ? ( @@ -159,7 +159,7 @@ const HostsEmptyState = React.memo<{ list ) : ( ); @@ -169,7 +169,7 @@ const HostsEmptyState = React.memo<{ ), }, { - title: i18n.translate('xpack.securitySolution.endpoint.hostList.stepTwoTitle', { + title: i18n.translate('xpack.securitySolution.endpoint.list.stepTwoTitle', { defaultMessage: 'Enroll your agents enabled with Endpoint Security through Ingest Manager', }), @@ -179,7 +179,7 @@ const HostsEmptyState = React.memo<{ @@ -211,13 +211,13 @@ const HostsEmptyState = React.memo<{ steps={policySteps} headerComponent={ } bodyComponent={ } @@ -265,7 +265,7 @@ const ManagementEmptyState = React.memo<{ }); PolicyEmptyState.displayName = 'PolicyEmptyState'; -HostsEmptyState.displayName = 'HostsEmptyState'; +EndpointsEmptyState.displayName = 'HostsEmptyState'; ManagementEmptyState.displayName = 'ManagementEmptyState'; -export { PolicyEmptyState, HostsEmptyState }; +export { PolicyEmptyState, EndpointsEmptyState as HostsEmptyState }; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/index.tsx index a970edd4d30f4..23e55301d22cb 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/index.tsx @@ -6,20 +6,20 @@ import { Switch, Route } from 'react-router-dom'; import React, { memo } from 'react'; -import { HostList } from './view'; -import { MANAGEMENT_ROUTING_HOSTS_PATH } from '../../common/constants'; +import { EndpointList } from './view'; +import { MANAGEMENT_ROUTING_ENDPOINTS_PATH } from '../../common/constants'; import { NotFoundPage } from '../../../app/404'; /** * Provides the routing container for the hosts related views */ -export const HostsContainer = memo(() => { +export const EndpointsContainer = memo(() => { return ( - + ); }); -HostsContainer.displayName = 'HostsContainer'; +EndpointsContainer.displayName = 'EndpointsContainer'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/routes.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/routes.tsx index 3f92358b93d56..727d2715f0974 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/routes.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/routes.tsx @@ -7,12 +7,12 @@ import React from 'react'; import { Route, Switch } from 'react-router-dom'; -import { HostList } from './view'; +import { EndpointList } from './view'; export const EndpointHostsRoutes: React.FC = () => ( - - + + ); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts index 4a4326d5b2919..2e188af41d2d7 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts @@ -12,35 +12,35 @@ import { import { ServerApiError } from '../../../../common/types'; import { GetPolicyListResponse } from '../../policy/types'; import { GetPackagesResponse } from '../../../../../../ingest_manager/common'; -import { HostState } from '../types'; +import { EndpointState } from '../types'; -interface ServerReturnedHostList { - type: 'serverReturnedHostList'; +interface ServerReturnedEndpointList { + type: 'serverReturnedEndpointList'; payload: HostResultList; } -interface ServerFailedToReturnHostList { - type: 'serverFailedToReturnHostList'; +interface ServerFailedToReturnEndpointList { + type: 'serverFailedToReturnEndpointList'; payload: ServerApiError; } -interface ServerReturnedHostDetails { - type: 'serverReturnedHostDetails'; +interface ServerReturnedEndpointDetails { + type: 'serverReturnedEndpointDetails'; payload: HostInfo; } -interface ServerFailedToReturnHostDetails { - type: 'serverFailedToReturnHostDetails'; +interface ServerFailedToReturnEndpointDetails { + type: 'serverFailedToReturnEndpointDetails'; payload: ServerApiError; } -interface ServerReturnedHostPolicyResponse { - type: 'serverReturnedHostPolicyResponse'; +interface ServerReturnedEndpointPolicyResponse { + type: 'serverReturnedEndpointPolicyResponse'; payload: GetHostPolicyResponse; } -interface ServerFailedToReturnHostPolicyResponse { - type: 'serverFailedToReturnHostPolicyResponse'; +interface ServerFailedToReturnEndpointPolicyResponse { + type: 'serverFailedToReturnEndpointPolicyResponse'; payload: ServerApiError; } @@ -63,8 +63,8 @@ interface UserSelectedEndpointPolicy { }; } -interface ServerCancelledHostListLoading { - type: 'serverCancelledHostListLoading'; +interface ServerCancelledEndpointListLoading { + type: 'serverCancelledEndpointListLoading'; } interface ServerCancelledPolicyItemsLoading { @@ -76,28 +76,28 @@ interface ServerReturnedEndpointPackageInfo { payload: GetPackagesResponse['response'][0]; } -interface ServerReturnedHostNonExistingPolicies { - type: 'serverReturnedHostNonExistingPolicies'; - payload: HostState['nonExistingPolicies']; +interface ServerReturnedEndpointNonExistingPolicies { + type: 'serverReturnedEndpointNonExistingPolicies'; + payload: EndpointState['nonExistingPolicies']; } -interface ServerReturnedHostExistValue { - type: 'serverReturnedHostExistValue'; +interface ServerReturnedEndpointExistValue { + type: 'serverReturnedEndpointExistValue'; payload: boolean; } -export type HostAction = - | ServerReturnedHostList - | ServerFailedToReturnHostList - | ServerReturnedHostDetails - | ServerFailedToReturnHostDetails - | ServerReturnedHostPolicyResponse - | ServerFailedToReturnHostPolicyResponse +export type EndpointAction = + | ServerReturnedEndpointList + | ServerFailedToReturnEndpointList + | ServerReturnedEndpointDetails + | ServerFailedToReturnEndpointDetails + | ServerReturnedEndpointPolicyResponse + | ServerFailedToReturnEndpointPolicyResponse | ServerReturnedPoliciesForOnboarding | ServerFailedToReturnPoliciesForOnboarding | UserSelectedEndpointPolicy - | ServerCancelledHostListLoading - | ServerReturnedHostExistValue + | ServerCancelledEndpointListLoading + | ServerReturnedEndpointExistValue | ServerCancelledPolicyItemsLoading | ServerReturnedEndpointPackageInfo - | ServerReturnedHostNonExistingPolicies; + | ServerReturnedEndpointNonExistingPolicies; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/host_pagination.test.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/endpoint_pagination.test.ts similarity index 80% rename from x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/host_pagination.test.ts rename to x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/endpoint_pagination.test.ts index 533b14e50f3dd..0fd970f4bed12 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/host_pagination.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/endpoint_pagination.test.ts @@ -13,41 +13,41 @@ import { coreMock } from '../../../../../../../../src/core/public/mocks'; import { HostResultList, AppLocation } from '../../../../../common/endpoint/types'; import { DepsStartMock, depsStartMock } from '../../../../common/mock/endpoint'; -import { hostMiddlewareFactory } from './middleware'; +import { endpointMiddlewareFactory } from './middleware'; -import { hostListReducer } from './reducer'; +import { endpointListReducer } from './reducer'; import { uiQueryParams } from './selectors'; -import { mockHostResultList } from './mock_host_result_list'; -import { HostState, HostIndexUIQueryParams } from '../types'; +import { mockEndpointResultList } from './mock_endpoint_result_list'; +import { EndpointState, EndpointIndexUIQueryParams } from '../types'; import { MiddlewareActionSpyHelper, createSpyMiddleware, } from '../../../../common/store/test_utils'; -import { getHostListPath } from '../../../common/routing'; +import { getEndpointListPath } from '../../../common/routing'; -describe('host list pagination: ', () => { +describe('endpoint list pagination: ', () => { let fakeCoreStart: jest.Mocked; let depsStart: DepsStartMock; let fakeHttpServices: jest.Mocked; let history: History; let store: Store; - let queryParams: () => HostIndexUIQueryParams; + let queryParams: () => EndpointIndexUIQueryParams; let waitForAction: MiddlewareActionSpyHelper['waitForAction']; let actionSpyMiddleware; const getEndpointListApiResponse = (): HostResultList => { - return mockHostResultList({ request_page_size: 1, request_page_index: 1, total: 10 }); + return mockEndpointResultList({ request_page_size: 1, request_page_index: 1, total: 10 }); }; - let historyPush: (params: HostIndexUIQueryParams) => void; + let historyPush: (params: EndpointIndexUIQueryParams) => void; beforeEach(() => { fakeCoreStart = coreMock.createStart(); depsStart = depsStartMock(); fakeHttpServices = fakeCoreStart.http as jest.Mocked; history = createBrowserHistory(); - const middleware = hostMiddlewareFactory(fakeCoreStart, depsStart); - ({ actionSpyMiddleware, waitForAction } = createSpyMiddleware()); - store = createStore(hostListReducer, applyMiddleware(middleware, actionSpyMiddleware)); + const middleware = endpointMiddlewareFactory(fakeCoreStart, depsStart); + ({ actionSpyMiddleware, waitForAction } = createSpyMiddleware()); + store = createStore(endpointListReducer, applyMiddleware(middleware, actionSpyMiddleware)); history.listen((location) => { store.dispatch({ type: 'userChangedUrl', payload: location }); @@ -55,12 +55,12 @@ describe('host list pagination: ', () => { queryParams = () => uiQueryParams(store.getState()); - historyPush = (nextQueryParams: HostIndexUIQueryParams): void => { - return history.push(getHostListPath({ name: 'hostList', ...nextQueryParams })); + historyPush = (nextQueryParams: EndpointIndexUIQueryParams): void => { + return history.push(getEndpointListPath({ name: 'endpointList', ...nextQueryParams })); }; }); - describe('when the user enteres the host list for the first time', () => { + describe('when the user enteres the endpoint list for the first time', () => { it('the api is called with page_index and page_size defaulting to 0 and 10 respectively', async () => { const apiResponse = getEndpointListApiResponse(); fakeHttpServices.post.mockResolvedValue(apiResponse); @@ -70,10 +70,10 @@ describe('host list pagination: ', () => { type: 'userChangedUrl', payload: { ...history.location, - pathname: getHostListPath({ name: 'hostList' }), + pathname: getEndpointListPath({ name: 'endpointList' }), }, }); - await waitForAction('serverReturnedHostList'); + await waitForAction('serverReturnedEndpointList'); expect(fakeHttpServices.post).toHaveBeenCalledWith('/api/endpoint/metadata', { body: JSON.stringify({ paging_properties: [{ page_index: '0' }, { page_size: '10' }], diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts index 8ff4ad5a043b5..b3ab3443809c8 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts @@ -5,24 +5,24 @@ */ import { createStore, Dispatch, Store } from 'redux'; -import { HostState } from '../types'; +import { EndpointState } from '../types'; import { listData } from './selectors'; -import { mockHostResultList } from './mock_host_result_list'; -import { HostAction } from './action'; -import { hostListReducer } from './reducer'; +import { mockEndpointResultList } from './mock_endpoint_result_list'; +import { EndpointAction } from './action'; +import { endpointListReducer } from './reducer'; -describe('HostList store concerns', () => { - let store: Store; - let dispatch: Dispatch; +describe('EndpointList store concerns', () => { + let store: Store; + let dispatch: Dispatch; const createTestStore = () => { - store = createStore(hostListReducer); + store = createStore(endpointListReducer); dispatch = store.dispatch; }; const loadDataToStore = () => { dispatch({ - type: 'serverReturnedHostList', - payload: mockHostResultList({ request_page_size: 1, request_page_index: 1, total: 10 }), + type: 'serverReturnedEndpointList', + payload: mockEndpointResultList({ request_page_size: 1, request_page_index: 1, total: 10 }), }); }; @@ -51,18 +51,18 @@ describe('HostList store concerns', () => { policyItemsLoading: false, endpointPackageInfo: undefined, nonExistingPolicies: {}, - hostsExist: true, + endpointsExist: true, }); }); - test('it handles `serverReturnedHostList', () => { - const payload = mockHostResultList({ + test('it handles `serverReturnedEndpointList', () => { + const payload = mockEndpointResultList({ request_page_size: 1, request_page_index: 1, total: 10, }); dispatch({ - type: 'serverReturnedHostList', + type: 'serverReturnedEndpointList', payload, }); @@ -80,7 +80,7 @@ describe('HostList store concerns', () => { loadDataToStore(); }); - test('it selects `hostListData`', () => { + test('it selects `endpointListData`', () => { const currentState = store.getState(); expect(listData(currentState)).toEqual(currentState.hosts); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts index 1c5c4fbac51ba..77ade5bcc6971 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts @@ -16,36 +16,36 @@ import { } from '../../../../common/store/test_utils'; import { Immutable, HostResultList } from '../../../../../common/endpoint/types'; import { AppAction } from '../../../../common/store/actions'; -import { mockHostResultList } from './mock_host_result_list'; +import { mockEndpointResultList } from './mock_endpoint_result_list'; import { listData } from './selectors'; -import { HostState } from '../types'; -import { hostListReducer } from './reducer'; -import { hostMiddlewareFactory } from './middleware'; -import { getHostListPath } from '../../../common/routing'; +import { EndpointState } from '../types'; +import { endpointListReducer } from './reducer'; +import { endpointMiddlewareFactory } from './middleware'; +import { getEndpointListPath } from '../../../common/routing'; -describe('host list middleware', () => { +describe('endpoint list middleware', () => { let fakeCoreStart: jest.Mocked; let depsStart: DepsStartMock; let fakeHttpServices: jest.Mocked; - type HostListStore = Store, Immutable>; - let store: HostListStore; - let getState: HostListStore['getState']; - let dispatch: HostListStore['dispatch']; + type EndpointListStore = Store, Immutable>; + let store: EndpointListStore; + let getState: EndpointListStore['getState']; + let dispatch: EndpointListStore['dispatch']; let waitForAction: MiddlewareActionSpyHelper['waitForAction']; let actionSpyMiddleware; let history: History; const getEndpointListApiResponse = (): HostResultList => { - return mockHostResultList({ request_page_size: 1, request_page_index: 1, total: 10 }); + return mockEndpointResultList({ request_page_size: 1, request_page_index: 1, total: 10 }); }; beforeEach(() => { fakeCoreStart = coreMock.createStart({ basePath: '/mock' }); depsStart = depsStartMock(); fakeHttpServices = fakeCoreStart.http as jest.Mocked; - ({ actionSpyMiddleware, waitForAction } = createSpyMiddleware()); + ({ actionSpyMiddleware, waitForAction } = createSpyMiddleware()); store = createStore( - hostListReducer, - applyMiddleware(hostMiddlewareFactory(fakeCoreStart, depsStart), actionSpyMiddleware) + endpointListReducer, + applyMiddleware(endpointMiddlewareFactory(fakeCoreStart, depsStart), actionSpyMiddleware) ); getState = store.getState; dispatch = store.dispatch; @@ -60,10 +60,10 @@ describe('host list middleware', () => { type: 'userChangedUrl', payload: { ...history.location, - pathname: getHostListPath({ name: 'hostList' }), + pathname: getEndpointListPath({ name: 'endpointList' }), }, }); - await waitForAction('serverReturnedHostList'); + await waitForAction('serverReturnedEndpointList'); expect(fakeHttpServices.post).toHaveBeenCalledWith('/api/endpoint/metadata', { body: JSON.stringify({ paging_properties: [{ page_index: '0' }, { page_size: '10' }], diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts index 74bebf211258a..fa2dbe084c1a4 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts @@ -9,14 +9,14 @@ import { HostInfo, HostResultList } from '../../../../../common/endpoint/types'; import { GetPolicyListResponse } from '../../policy/types'; import { ImmutableMiddlewareFactory } from '../../../../common/store'; import { - isOnHostPage, - hasSelectedHost, + isOnEndpointPage, + hasSelectedEndpoint, uiQueryParams, listData, endpointPackageInfo, nonExistingPolicies, } from './selectors'; -import { HostState } from '../types'; +import { EndpointState } from '../types'; import { sendGetEndpointSpecificPackageConfigs, sendGetEndpointSecurityPackage, @@ -24,16 +24,16 @@ import { } from '../../policy/store/policy_list/services/ingest'; import { AGENT_CONFIG_SAVED_OBJECT_TYPE } from '../../../../../../ingest_manager/common'; -export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (coreStart) => { +export const endpointMiddlewareFactory: ImmutableMiddlewareFactory = (coreStart) => { return ({ getState, dispatch }) => (next) => async (action) => { next(action); const state = getState(); - // Host list + // Endpoint list if ( action.type === 'userChangedUrl' && - isOnHostPage(state) && - hasSelectedHost(state) !== true + isOnEndpointPage(state) && + hasSelectedEndpoint(state) !== true ) { if (!endpointPackageInfo(state)) { sendGetEndpointSecurityPackage(coreStart.http) @@ -50,30 +50,30 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor } const { page_index: pageIndex, page_size: pageSize } = uiQueryParams(state); - let hostResponse; + let endpointResponse; try { - hostResponse = await coreStart.http.post('/api/endpoint/metadata', { + endpointResponse = await coreStart.http.post('/api/endpoint/metadata', { body: JSON.stringify({ paging_properties: [{ page_index: pageIndex }, { page_size: pageSize }], }), }); - hostResponse.request_page_index = Number(pageIndex); + endpointResponse.request_page_index = Number(pageIndex); dispatch({ - type: 'serverReturnedHostList', - payload: hostResponse, + type: 'serverReturnedEndpointList', + payload: endpointResponse, }); - getNonExistingPoliciesForHostsList( + getNonExistingPoliciesForEndpointsList( coreStart.http, - hostResponse.hosts, + endpointResponse.hosts, nonExistingPolicies(state) ) .then((missingPolicies) => { if (missingPolicies !== undefined) { dispatch({ - type: 'serverReturnedHostNonExistingPolicies', + type: 'serverReturnedEndpointNonExistingPolicies', payload: missingPolicies, }); } @@ -83,24 +83,24 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor .catch((error) => console.error(error)); } catch (error) { dispatch({ - type: 'serverFailedToReturnHostList', + type: 'serverFailedToReturnEndpointList', payload: error, }); } - // No hosts, so we should check to see if there are policies for onboarding - if (hostResponse && hostResponse.hosts.length === 0) { + // No endpoints, so we should check to see if there are policies for onboarding + if (endpointResponse && endpointResponse.hosts.length === 0) { const http = coreStart.http; // The original query to the list could have had an invalid param (ex. invalid page_size), - // so we check first if hosts actually do exist before pulling in data for the onboarding + // so we check first if endpoints actually do exist before pulling in data for the onboarding // messages. - if (await doHostsExist(http)) { + if (await doEndpointsExist(http)) { return; } dispatch({ - type: 'serverReturnedHostExistValue', + type: 'serverReturnedEndpointExistValue', payload: false, }); @@ -135,13 +135,13 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor } } - // Host Details - if (action.type === 'userChangedUrl' && hasSelectedHost(state) === true) { + // Endpoint Details + if (action.type === 'userChangedUrl' && hasSelectedEndpoint(state) === true) { dispatch({ type: 'serverCancelledPolicyItemsLoading', }); - // If user navigated directly to a host details page, load the host list + // If user navigated directly to a endpoint details page, load the endpoint list if (listData(state).length === 0) { const { page_index: pageIndex, page_size: pageSize } = uiQueryParams(state); try { @@ -152,11 +152,11 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor }); response.request_page_index = Number(pageIndex); dispatch({ - type: 'serverReturnedHostList', + type: 'serverReturnedEndpointList', payload: response, }); - getNonExistingPoliciesForHostsList( + getNonExistingPoliciesForEndpointsList( coreStart.http, response.hosts, nonExistingPolicies(state) @@ -164,7 +164,7 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor .then((missingPolicies) => { if (missingPolicies !== undefined) { dispatch({ - type: 'serverReturnedHostNonExistingPolicies', + type: 'serverReturnedEndpointNonExistingPolicies', payload: missingPolicies, }); } @@ -174,31 +174,35 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor .catch((error) => console.error(error)); } catch (error) { dispatch({ - type: 'serverFailedToReturnHostList', + type: 'serverFailedToReturnEndpointList', payload: error, }); } } else { dispatch({ - type: 'serverCancelledHostListLoading', + type: 'serverCancelledEndpointListLoading', }); } - // call the host details api - const { selected_host: selectedHost } = uiQueryParams(state); + // call the endpoint details api + const { selected_endpoint: selectedEndpoint } = uiQueryParams(state); try { const response = await coreStart.http.get( - `/api/endpoint/metadata/${selectedHost}` + `/api/endpoint/metadata/${selectedEndpoint}` ); dispatch({ - type: 'serverReturnedHostDetails', + type: 'serverReturnedEndpointDetails', payload: response, }); - getNonExistingPoliciesForHostsList(coreStart.http, [response], nonExistingPolicies(state)) + getNonExistingPoliciesForEndpointsList( + coreStart.http, + [response], + nonExistingPolicies(state) + ) .then((missingPolicies) => { if (missingPolicies !== undefined) { dispatch({ - type: 'serverReturnedHostNonExistingPolicies', + type: 'serverReturnedEndpointNonExistingPolicies', payload: missingPolicies, }); } @@ -208,7 +212,7 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor .catch((error) => console.error(error)); } catch (error) { dispatch({ - type: 'serverFailedToReturnHostDetails', + type: 'serverFailedToReturnEndpointDetails', payload: error, }); } @@ -216,15 +220,15 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor // call the policy response api try { const policyResponse = await coreStart.http.get(`/api/endpoint/policy_response`, { - query: { hostId: selectedHost }, + query: { hostId: selectedEndpoint }, }); dispatch({ - type: 'serverReturnedHostPolicyResponse', + type: 'serverReturnedEndpointPolicyResponse', payload: policyResponse, }); } catch (error) { dispatch({ - type: 'serverFailedToReturnHostPolicyResponse', + type: 'serverFailedToReturnEndpointPolicyResponse', payload: error, }); } @@ -232,11 +236,11 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor }; }; -const getNonExistingPoliciesForHostsList = async ( +const getNonExistingPoliciesForEndpointsList = async ( http: HttpStart, hosts: HostResultList['hosts'], - currentNonExistingPolicies: HostState['nonExistingPolicies'] -): Promise => { + currentNonExistingPolicies: EndpointState['nonExistingPolicies'] +): Promise => { if (hosts.length === 0) { return; } @@ -266,14 +270,14 @@ const getNonExistingPoliciesForHostsList = async ( )})`, }, }) - ).items.reduce((list, agentConfig) => { + ).items.reduce((list, agentConfig) => { (agentConfig.package_configs as string[]).forEach((packageConfig) => { list[packageConfig as string] = true; }); return list; }, {}); - const nonExisting = policyIdsToCheck.reduce( + const nonExisting = policyIdsToCheck.reduce( (list, policyId) => { if (policiesFound[policyId]) { return list; @@ -291,7 +295,7 @@ const getNonExistingPoliciesForHostsList = async ( return nonExisting; }; -const doHostsExist = async (http: HttpStart): Promise => { +const doEndpointsExist = async (http: HttpStart): Promise => { try { return ( ( @@ -304,7 +308,7 @@ const doHostsExist = async (http: HttpStart): Promise => { ); } catch (error) { // eslint-disable-next-line no-console - console.error(`error while trying to check if hosts exist`); + console.error(`error while trying to check if endpoints exist`); // eslint-disable-next-line no-console console.error(error); } diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_host_result_list.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_endpoint_result_list.ts similarity index 79% rename from x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_host_result_list.ts rename to x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_endpoint_result_list.ts index b69e5c5cd0e65..2f0b66624f379 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_host_result_list.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_endpoint_result_list.ts @@ -26,7 +26,7 @@ import { GetPolicyListResponse } from '../../policy/types'; const generator = new EndpointDocGenerator('seed'); -export const mockHostResultList: (options?: { +export const mockEndpointResultList: (options?: { total?: number; request_page_size?: number; request_page_index?: number; @@ -62,7 +62,7 @@ export const mockHostResultList: (options?: { /** * returns a mocked API response for retrieving a single host metadata */ -export const mockHostDetailsApiResult = (): HostInfo => { +export const mockEndpointDetailsApiResult = (): HostInfo => { return { metadata: generator.generateHostMetadata(), host_status: HostStatus.ERROR, @@ -73,14 +73,14 @@ export const mockHostDetailsApiResult = (): HostInfo => { * Mock API handlers used by the Endpoint Host list. It also sets up a list of * API handlers for Host details based on a list of Host results. */ -const hostListApiPathHandlerMocks = ({ - hostsResults = mockHostResultList({ total: 3 }).hosts, +const endpointListApiPathHandlerMocks = ({ + endpointsResults = mockEndpointResultList({ total: 3 }).hosts, epmPackages = [generator.generateEpmPackage()], endpointPackageConfigs = [], policyResponse = generator.generatePolicyResponse(), }: { /** route handlers will be setup for each individual host in this array */ - hostsResults?: HostResultList['hosts']; + endpointsResults?: HostResultList['hosts']; epmPackages?: GetPackagesResponse['response']; endpointPackageConfigs?: GetPolicyListResponse['items']; policyResponse?: HostPolicyResponse; @@ -94,17 +94,17 @@ const hostListApiPathHandlerMocks = ({ }; }, - // host list + // endpoint list '/api/endpoint/metadata': (): HostResultList => { return { - hosts: hostsResults, + hosts: endpointsResults, request_page_size: 10, request_page_index: 0, - total: hostsResults?.length || 0, + total: endpointsResults?.length || 0, }; }, - // Do policies referenced in host list exist + // Do policies referenced in endpoint list exist // just returns 1 single agent config that includes all of the packageConfig IDs provided [INGEST_API_AGENT_CONFIGS]: (): GetAgentConfigsResponse => { const agentConfig = generator.generateAgentConfig(); @@ -137,9 +137,9 @@ const hostListApiPathHandlerMocks = ({ }, }; - // Build a GET route handler for each host details based on the list of Hosts passed on input - if (hostsResults) { - hostsResults.forEach((host) => { + // Build a GET route handler for each endpoint details based on the list of Endpoints passed on input + if (endpointsResults) { + endpointsResults.forEach((host) => { // @ts-expect-error apiHandlers[`/api/endpoint/metadata/${host.metadata.host.id}`] = () => host; }); @@ -149,33 +149,36 @@ const hostListApiPathHandlerMocks = ({ }; /** - * Sets up mock impelementations in support of the Hosts list view + * Sets up mock impelementations in support of the Endpoints list view * * @param mockedHttpService - * @param hostsResults + * @param endpointsResults * @param pathHandlersOptions */ -export const setHostListApiMockImplementation: ( +export const setEndpointListApiMockImplementation: ( mockedHttpService: jest.Mocked, - apiResponses?: Parameters[0] + apiResponses?: Parameters[0] ) => void = ( mockedHttpService, - { hostsResults = mockHostResultList({ total: 3 }).hosts, ...pathHandlersOptions } = {} + { endpointsResults = mockEndpointResultList({ total: 3 }).hosts, ...pathHandlersOptions } = {} ) => { - const apiHandlers = hostListApiPathHandlerMocks({ ...pathHandlersOptions, hostsResults }); + const apiHandlers = endpointListApiPathHandlerMocks({ + ...pathHandlersOptions, + endpointsResults, + }); mockedHttpService.post .mockImplementation(async (...args) => { throw new Error(`un-expected call to http.post: ${args}`); }) - // First time called, return list of hosts + // First time called, return list of endpoints .mockImplementationOnce(async () => { return apiHandlers['/api/endpoint/metadata'](); }); - // If the hosts list results is zero, then mock the second call to `/metadata` to return - // empty list - indicating there are no hosts currently present on the system - if (!hostsResults.length) { + // If the endpoints list results is zero, then mock the second call to `/metadata` to return + // empty list - indicating there are no endpoints currently present on the system + if (!endpointsResults.length) { mockedHttpService.post.mockImplementationOnce(async () => { return apiHandlers['/api/endpoint/metadata'](); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts index e54f7df4d4f75..d4fe3310eac0a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts @@ -4,13 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { isOnHostPage, hasSelectedHost } from './selectors'; -import { HostState } from '../types'; +import { isOnEndpointPage, hasSelectedEndpoint } from './selectors'; +import { EndpointState } from '../types'; import { AppAction } from '../../../../common/store/actions'; import { ImmutableReducer } from '../../../../common/store'; import { Immutable } from '../../../../../common/endpoint/types'; -export const initialHostListState: Immutable = { +export const initialEndpointListState: Immutable = { hosts: [], pageSize: 10, pageIndex: 0, @@ -29,15 +29,15 @@ export const initialHostListState: Immutable = { policyItemsLoading: false, endpointPackageInfo: undefined, nonExistingPolicies: {}, - hostsExist: true, + endpointsExist: true, }; /* eslint-disable-next-line complexity */ -export const hostListReducer: ImmutableReducer = ( - state = initialHostListState, +export const endpointListReducer: ImmutableReducer = ( + state = initialEndpointListState, action ) => { - if (action.type === 'serverReturnedHostList') { + if (action.type === 'serverReturnedEndpointList') { const { hosts, total, @@ -53,13 +53,13 @@ export const hostListReducer: ImmutableReducer = ( loading: false, error: undefined, }; - } else if (action.type === 'serverFailedToReturnHostList') { + } else if (action.type === 'serverFailedToReturnEndpointList') { return { ...state, error: action.payload, loading: false, }; - } else if (action.type === 'serverReturnedHostNonExistingPolicies') { + } else if (action.type === 'serverReturnedEndpointNonExistingPolicies') { return { ...state, nonExistingPolicies: { @@ -67,14 +67,14 @@ export const hostListReducer: ImmutableReducer = ( ...action.payload, }, }; - } else if (action.type === 'serverReturnedHostDetails') { + } else if (action.type === 'serverReturnedEndpointDetails') { return { ...state, details: action.payload.metadata, detailsLoading: false, detailsError: undefined, }; - } else if (action.type === 'serverFailedToReturnHostDetails') { + } else if (action.type === 'serverFailedToReturnEndpointDetails') { return { ...state, detailsError: action.payload, @@ -92,14 +92,14 @@ export const hostListReducer: ImmutableReducer = ( error: action.payload, policyItemsLoading: false, }; - } else if (action.type === 'serverReturnedHostPolicyResponse') { + } else if (action.type === 'serverReturnedEndpointPolicyResponse') { return { ...state, policyResponse: action.payload.policy_response, policyResponseLoading: false, policyResponseError: undefined, }; - } else if (action.type === 'serverFailedToReturnHostPolicyResponse') { + } else if (action.type === 'serverFailedToReturnEndpointPolicyResponse') { return { ...state, policyResponseError: action.payload, @@ -111,7 +111,7 @@ export const hostListReducer: ImmutableReducer = ( selectedPolicyId: action.payload.selectedPolicyId, policyResponseLoading: false, }; - } else if (action.type === 'serverCancelledHostListLoading') { + } else if (action.type === 'serverCancelledEndpointListLoading') { return { ...state, loading: false, @@ -126,22 +126,22 @@ export const hostListReducer: ImmutableReducer = ( ...state, endpointPackageInfo: action.payload, }; - } else if (action.type === 'serverReturnedHostExistValue') { + } else if (action.type === 'serverReturnedEndpointExistValue') { return { ...state, - hostsExist: action.payload, + endpointsExist: action.payload, }; } else if (action.type === 'userChangedUrl') { - const newState: Immutable = { + const newState: Immutable = { ...state, location: action.payload, }; - const isCurrentlyOnListPage = isOnHostPage(newState) && !hasSelectedHost(newState); - const wasPreviouslyOnListPage = isOnHostPage(state) && !hasSelectedHost(state); - const isCurrentlyOnDetailsPage = isOnHostPage(newState) && hasSelectedHost(newState); - const wasPreviouslyOnDetailsPage = isOnHostPage(state) && hasSelectedHost(state); + const isCurrentlyOnListPage = isOnEndpointPage(newState) && !hasSelectedEndpoint(newState); + const wasPreviouslyOnListPage = isOnEndpointPage(state) && !hasSelectedEndpoint(state); + const isCurrentlyOnDetailsPage = isOnEndpointPage(newState) && hasSelectedEndpoint(newState); + const wasPreviouslyOnDetailsPage = isOnEndpointPage(state) && hasSelectedEndpoint(state); - // if on the host list page for the first time, return new location and load list + // if on the endpoint list page for the first time, return new location and load list if (isCurrentlyOnListPage) { if (!wasPreviouslyOnListPage) { return { @@ -154,7 +154,7 @@ export const hostListReducer: ImmutableReducer = ( }; } } else if (isCurrentlyOnDetailsPage) { - // if previous page was the list or another host details page, load host details only + // if previous page was the list or another endpoint details page, load endpoint details only if (wasPreviouslyOnDetailsPage || wasPreviouslyOnListPage) { return { ...state, @@ -166,7 +166,7 @@ export const hostListReducer: ImmutableReducer = ( policyResponseError: undefined, }; } else { - // if previous page was not host list or host details, load both list and details + // if previous page was not endpoint list or endpoint details, load both list and details return { ...state, location: action.payload, @@ -180,14 +180,14 @@ export const hostListReducer: ImmutableReducer = ( }; } } - // otherwise we are not on a host list or details page + // otherwise we are not on a endpoint list or details page return { ...state, location: action.payload, error: undefined, detailsError: undefined, policyResponseError: undefined, - hostsExist: true, + endpointsExist: true, }; } return state; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts index ca006f21c29ac..2c6fc6d5a75e1 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts @@ -14,36 +14,36 @@ import { HostPolicyResponseConfiguration, HostPolicyResponseActionStatus, } from '../../../../../common/endpoint/types'; -import { HostState, HostIndexUIQueryParams } from '../types'; -import { MANAGEMENT_ROUTING_HOSTS_PATH } from '../../../common/constants'; +import { EndpointState, EndpointIndexUIQueryParams } from '../types'; +import { MANAGEMENT_ROUTING_ENDPOINTS_PATH } from '../../../common/constants'; const PAGE_SIZES = Object.freeze([10, 20, 50]); -export const listData = (state: Immutable) => state.hosts; +export const listData = (state: Immutable) => state.hosts; -export const pageIndex = (state: Immutable): number => state.pageIndex; +export const pageIndex = (state: Immutable): number => state.pageIndex; -export const pageSize = (state: Immutable): number => state.pageSize; +export const pageSize = (state: Immutable): number => state.pageSize; -export const totalHits = (state: Immutable): number => state.total; +export const totalHits = (state: Immutable): number => state.total; -export const listLoading = (state: Immutable): boolean => state.loading; +export const listLoading = (state: Immutable): boolean => state.loading; -export const listError = (state: Immutable) => state.error; +export const listError = (state: Immutable) => state.error; -export const detailsData = (state: Immutable) => state.details; +export const detailsData = (state: Immutable) => state.details; -export const detailsLoading = (state: Immutable): boolean => state.detailsLoading; +export const detailsLoading = (state: Immutable): boolean => state.detailsLoading; -export const detailsError = (state: Immutable) => state.detailsError; +export const detailsError = (state: Immutable) => state.detailsError; -export const policyItems = (state: Immutable) => state.policyItems; +export const policyItems = (state: Immutable) => state.policyItems; -export const policyItemsLoading = (state: Immutable) => state.policyItemsLoading; +export const policyItemsLoading = (state: Immutable) => state.policyItemsLoading; -export const selectedPolicyId = (state: Immutable) => state.selectedPolicyId; +export const selectedPolicyId = (state: Immutable) => state.selectedPolicyId; -export const endpointPackageInfo = (state: Immutable) => state.endpointPackageInfo; +export const endpointPackageInfo = (state: Immutable) => state.endpointPackageInfo; export const endpointPackageVersion = createSelector( endpointPackageInfo, @@ -53,14 +53,14 @@ export const endpointPackageVersion = createSelector( /** * Returns the full policy response from the endpoint after a user modifies a policy. */ -const detailsPolicyAppliedResponse = (state: Immutable) => +const detailsPolicyAppliedResponse = (state: Immutable) => state.policyResponse && state.policyResponse.Endpoint.policy.applied; /** * Returns the response configurations from the endpoint after a user modifies a policy. */ export const policyResponseConfigurations: ( - state: Immutable + state: Immutable ) => undefined | Immutable = createSelector( detailsPolicyAppliedResponse, (applied) => { @@ -72,7 +72,7 @@ export const policyResponseConfigurations: ( * Returns a map of the number of failed and warning policy response actions per configuration. */ export const policyResponseFailedOrWarningActionCount: ( - state: Immutable + state: Immutable ) => Map = createSelector(detailsPolicyAppliedResponse, (applied) => { const failureOrWarningByConfigType = new Map(); if (applied?.response?.configurations !== undefined && applied?.actions !== undefined) { @@ -98,7 +98,7 @@ export const policyResponseFailedOrWarningActionCount: ( * Returns the actions taken by the endpoint for each response configuration after a user modifies a policy. */ export const policyResponseActions: ( - state: Immutable + state: Immutable ) => undefined | Immutable = createSelector( detailsPolicyAppliedResponse, (applied) => { @@ -106,32 +106,32 @@ export const policyResponseActions: ( } ); -export const policyResponseLoading = (state: Immutable): boolean => +export const policyResponseLoading = (state: Immutable): boolean => state.policyResponseLoading; -export const policyResponseError = (state: Immutable) => state.policyResponseError; +export const policyResponseError = (state: Immutable) => state.policyResponseError; -export const isOnHostPage = (state: Immutable) => { +export const isOnEndpointPage = (state: Immutable) => { return ( matchPath(state.location?.pathname ?? '', { - path: MANAGEMENT_ROUTING_HOSTS_PATH, + path: MANAGEMENT_ROUTING_ENDPOINTS_PATH, exact: true, }) !== null ); }; export const uiQueryParams: ( - state: Immutable -) => Immutable = createSelector( - (state: Immutable) => state.location, - (location: Immutable['location']) => { - const data: HostIndexUIQueryParams = { page_index: '0', page_size: '10' }; + state: Immutable +) => Immutable = createSelector( + (state: Immutable) => state.location, + (location: Immutable['location']) => { + const data: EndpointIndexUIQueryParams = { page_index: '0', page_size: '10' }; if (location) { // Removes the `?` from the beginning of query string if it exists const query = querystring.parse(location.search.slice(1)); - const keys: Array = [ - 'selected_host', + const keys: Array = [ + 'selected_endpoint', 'page_size', 'page_index', 'show', @@ -171,15 +171,15 @@ export const uiQueryParams: ( } ); -export const hasSelectedHost: (state: Immutable) => boolean = createSelector( +export const hasSelectedEndpoint: (state: Immutable) => boolean = createSelector( uiQueryParams, - ({ selected_host: selectedHost }) => { - return selectedHost !== undefined; + ({ selected_endpoint: selectedEndpoint }) => { + return selectedEndpoint !== undefined; } ); /** What policy details panel view to show */ -export const showView: (state: HostState) => 'policy_response' | 'details' = createSelector( +export const showView: (state: EndpointState) => 'policy_response' | 'details' = createSelector( uiQueryParams, (searchParams) => { return searchParams.show === 'policy_response' ? 'policy_response' : 'details'; @@ -189,7 +189,7 @@ export const showView: (state: HostState) => 'policy_response' | 'details' = cre /** * Returns the Policy Response overall status */ -export const policyResponseStatus: (state: Immutable) => string = createSelector( +export const policyResponseStatus: (state: Immutable) => string = createSelector( (state) => state.policyResponse, (policyResponse) => { return (policyResponse && policyResponse?.Endpoint?.policy?.applied?.status) || ''; @@ -197,15 +197,16 @@ export const policyResponseStatus: (state: Immutable) => string = cre ); /** - * returns the list of known non-existing polices that may have been in the Host API response. + * returns the list of known non-existing polices that may have been in the Endpoint API response. * @param state */ export const nonExistingPolicies: ( - state: Immutable -) => Immutable = (state) => state.nonExistingPolicies; + state: Immutable +) => Immutable = (state) => state.nonExistingPolicies; /** - * Return boolean that indicates whether hosts exist + * Return boolean that indicates whether endpoints exist * @param state */ -export const hostsExist: (state: Immutable) => boolean = (state) => state.hostsExist; +export const endpointsExist: (state: Immutable) => boolean = (state) => + state.endpointsExist; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts index 6c949e9700b9a..7e75285560bd3 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts @@ -15,7 +15,7 @@ import { import { ServerApiError } from '../../../common/types'; import { GetPackagesResponse } from '../../../../../ingest_manager/common'; -export interface HostState { +export interface EndpointState { /** list of host **/ hosts: HostInfo[]; /** number of items per page */ @@ -53,15 +53,15 @@ export interface HostState { /** tracks the list of policies IDs used in Host metadata that may no longer exist */ nonExistingPolicies: Record; /** Tracks whether hosts exist and helps control if onboarding should be visible */ - hostsExist: boolean; + endpointsExist: boolean; } /** * Query params on the host page parsed from the URL */ -export interface HostIndexUIQueryParams { - /** Selected host id shows host details flyout */ - selected_host?: string; +export interface EndpointIndexUIQueryParams { + /** Selected endpoint id shows host details flyout */ + selected_endpoint?: string; /** How many items to show in list */ page_size?: string; /** Which page to show */ diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/host_policy_link.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_policy_link.tsx similarity index 89% rename from x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/host_policy_link.tsx rename to x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_policy_link.tsx index ec4d7e87b721d..2b6132aca4108 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/host_policy_link.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_policy_link.tsx @@ -6,7 +6,7 @@ import React, { memo, useMemo } from 'react'; import { EuiLink, EuiLinkAnchorProps } from '@elastic/eui'; -import { useHostSelector } from '../hooks'; +import { useEndpointSelector } from '../hooks'; import { nonExistingPolicies } from '../../store/selectors'; import { getPolicyDetailPath } from '../../../../common/routing'; import { useFormatUrl } from '../../../../../common/components/link_to'; @@ -18,12 +18,12 @@ import { useNavigateByRouterEventHandler } from '../../../../../common/hooks/end * the `nonExistingPolicies` value in the store. If it does not exist, then regular * text is returned. */ -export const HostPolicyLink = memo< +export const EndpointPolicyLink = memo< Omit & { policyId: string; } >(({ policyId, children, onClick, ...otherProps }) => { - const missingPolicies = useHostSelector(nonExistingPolicies); + const missingPolicies = useEndpointSelector(nonExistingPolicies); const { formatUrl } = useFormatUrl(SecurityPageName.administration); const { toRoutePath, toRouteUrl } = useMemo(() => { const toPath = getPolicyDetailPath(policyId); @@ -50,4 +50,4 @@ export const HostPolicyLink = memo< ); }); -HostPolicyLink.displayName = 'HostPolicyLink'; +EndpointPolicyLink.displayName = 'EndpointPolicyLink'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx similarity index 76% rename from x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx rename to x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx index 6a0a0cbb1014e..bd499ee6abb24 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx @@ -19,18 +19,18 @@ import React, { memo, useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { HostMetadata } from '../../../../../../common/endpoint/types'; -import { useHostSelector, useAgentDetailsIngestUrl } from '../hooks'; +import { useEndpointSelector, useAgentDetailsIngestUrl } from '../hooks'; import { useNavigateToAppEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; import { policyResponseStatus, uiQueryParams } from '../../store/selectors'; import { POLICY_STATUS_TO_HEALTH_COLOR } from '../host_constants'; import { FormattedDateAndTime } from '../../../../../common/components/endpoint/formatted_date_time'; import { useNavigateByRouterEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_by_router_event_handler'; import { LinkToApp } from '../../../../../common/components/endpoint/link_to_app'; -import { getHostDetailsPath } from '../../../../common/routing'; +import { getEndpointDetailsPath } from '../../../../common/routing'; import { SecurityPageName } from '../../../../../app/types'; import { useFormatUrl } from '../../../../../common/components/link_to'; import { AgentDetailsReassignConfigAction } from '../../../../../../../ingest_manager/public'; -import { HostPolicyLink } from '../components/host_policy_link'; +import { EndpointPolicyLink } from '../components/endpoint_policy_link'; const HostIds = styled(EuiListGroupItem)` margin-top: 0; @@ -51,15 +51,15 @@ const LinkToExternalApp = styled.div` const openReassignFlyoutSearch = '?openReassignFlyout=true'; -export const HostDetails = memo(({ details }: { details: HostMetadata }) => { +export const EndpointDetails = memo(({ details }: { details: HostMetadata }) => { const agentId = details.elastic.agent.id; const { url: agentDetailsUrl, appId: ingestAppId, appPath: agentDetailsAppPath, } = useAgentDetailsIngestUrl(agentId); - const queryParams = useHostSelector(uiQueryParams); - const policyStatus = useHostSelector( + const queryParams = useEndpointSelector(uiQueryParams); + const policyStatus = useEndpointSelector( policyResponseStatus ) as keyof typeof POLICY_STATUS_TO_HEALTH_COLOR; const { formatUrl } = useFormatUrl(SecurityPageName.administration); @@ -67,13 +67,13 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { const detailsResultsUpper = useMemo(() => { return [ { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.os', { + title: i18n.translate('xpack.securitySolution.endpoint.details.os', { defaultMessage: 'OS', }), description: details.host.os.full, }, { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.lastSeen', { + title: i18n.translate('xpack.securitySolution.endpoint.details.lastSeen', { defaultMessage: 'Last Seen', }), description: , @@ -83,19 +83,19 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { const [policyResponseUri, policyResponseRoutePath] = useMemo(() => { // eslint-disable-next-line @typescript-eslint/naming-convention - const { selected_host, show, ...currentUrlParams } = queryParams; + const { selected_endpoint, show, ...currentUrlParams } = queryParams; return [ formatUrl( - getHostDetailsPath({ - name: 'hostPolicyResponse', + getEndpointDetailsPath({ + name: 'endpointPolicyResponse', ...currentUrlParams, - selected_host: details.host.id, + selected_endpoint: details.host.id, }) ), - getHostDetailsPath({ - name: 'hostPolicyResponse', + getEndpointDetailsPath({ + name: 'endpointPolicyResponse', ...currentUrlParams, - selected_host: details.host.id, + selected_endpoint: details.host.id, }), ]; }, [details.host.id, formatUrl, queryParams]); @@ -110,7 +110,10 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { onDoneNavigateTo: [ 'securitySolution:administration', { - path: getHostDetailsPath({ name: 'hostDetails', selected_host: details.host.id }), + path: getEndpointDetailsPath({ + name: 'endpointDetails', + selected_endpoint: details.host.id, + }), }, ], }, @@ -121,22 +124,22 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { const detailsResultsPolicy = useMemo(() => { return [ { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.policy', { + title: i18n.translate('xpack.securitySolution.endpoint.details.policy', { defaultMessage: 'Integration', }), description: ( <> - {details.Endpoint.policy.applied.name} - + ), }, { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.policyStatus', { + title: i18n.translate('xpack.securitySolution.endpoint.details.policyStatus', { defaultMessage: 'Configuration response', }), description: ( @@ -152,7 +155,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { > @@ -166,7 +169,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { const detailsResultsLower = useMemo(() => { return [ { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.ipAddress', { + title: i18n.translate('xpack.securitySolution.endpoint.details.ipAddress', { defaultMessage: 'IP Address', }), description: ( @@ -178,13 +181,13 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { ), }, { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.hostname', { + title: i18n.translate('xpack.securitySolution.endpoint.details.hostname', { defaultMessage: 'Hostname', }), description: details.host.hostname, }, { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.endpointVersion', { + title: i18n.translate('xpack.securitySolution.endpoint.details.endpointVersion', { defaultMessage: 'Endpoint Version', }), description: details.agent.version, @@ -197,13 +200,13 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { { appPath={agentDetailsWithFlyoutPath} href={agentDetailsWithFlyoutUrl} onClick={handleReassignEndpointsClick} - data-test-subj="hostDetailsLinkToIngest" + data-test-subj="endpointDetailsLinkToIngest" > @@ -225,10 +228,10 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { ); }); -HostDetails.displayName = 'HostDetails'; +EndpointDetails.displayName = 'EndpointDetails'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx index 69dabeeb616a0..40227ec24a9e4 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx @@ -19,7 +19,7 @@ import { useHistory } from 'react-router-dom'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { useToasts } from '../../../../../common/lib/kibana'; -import { useHostSelector } from '../hooks'; +import { useEndpointSelector } from '../hooks'; import { urlFromQueryParams } from '../url_from_query_params'; import { uiQueryParams, @@ -33,36 +33,39 @@ import { policyResponseError, policyResponseLoading, } from '../../store/selectors'; -import { HostDetails } from './host_details'; +import { EndpointDetails } from './endpoint_details'; import { PolicyResponse } from './policy_response'; import { HostMetadata } from '../../../../../../common/endpoint/types'; import { FlyoutSubHeader, FlyoutSubHeaderProps } from './components/flyout_sub_header'; import { useNavigateByRouterEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_by_router_event_handler'; -import { getHostListPath } from '../../../../common/routing'; +import { getEndpointListPath } from '../../../../common/routing'; import { SecurityPageName } from '../../../../../app/types'; import { useFormatUrl } from '../../../../../common/components/link_to'; -export const HostDetailsFlyout = memo(() => { +export const EndpointDetailsFlyout = memo(() => { const history = useHistory(); const toasts = useToasts(); - const queryParams = useHostSelector(uiQueryParams); - const { selected_host: selectedHost, ...queryParamsWithoutSelectedHost } = queryParams; - const details = useHostSelector(detailsData); - const loading = useHostSelector(detailsLoading); - const error = useHostSelector(detailsError); - const show = useHostSelector(showView); + const queryParams = useEndpointSelector(uiQueryParams); + const { + selected_endpoint: selectedEndpoint, + ...queryParamsWithoutSelectedEndpoint + } = queryParams; + const details = useEndpointSelector(detailsData); + const loading = useEndpointSelector(detailsLoading); + const error = useEndpointSelector(detailsError); + const show = useEndpointSelector(showView); const handleFlyoutClose = useCallback(() => { - history.push(urlFromQueryParams(queryParamsWithoutSelectedHost)); - }, [history, queryParamsWithoutSelectedHost]); + history.push(urlFromQueryParams(queryParamsWithoutSelectedEndpoint)); + }, [history, queryParamsWithoutSelectedEndpoint]); useEffect(() => { if (error !== undefined) { toasts.addDanger({ - title: i18n.translate('xpack.securitySolution.endpoint.host.details.errorTitle', { + title: i18n.translate('xpack.securitySolution.endpoint.details.errorTitle', { defaultMessage: 'Could not find host', }), - text: i18n.translate('xpack.securitySolution.endpoint.host.details.errorBody', { + text: i18n.translate('xpack.securitySolution.endpoint.details.errorBody', { defaultMessage: 'Please exit the flyout and select an available host.', }), }); @@ -73,12 +76,12 @@ export const HostDetailsFlyout = memo(() => { -

    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%0DBr^L@;|Mva)8!pvfM5Ihy7d<-r%n) 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¨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 AjQ{`u literal 0 HcmV?d00001 diff --git a/docs/visualize/images/timelion-copy-expression.png b/docs/visualize/images/timelion-copy-expression.png new file mode 100644 index 0000000000000000000000000000000000000000..376bf7919166e25fab2416b03096ca9fc64775e0 GIT binary patch literal 228148 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

    -`; diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/empty_state/empty_state.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/empty_state/empty_state.tsx deleted file mode 100644 index 43c3bf79026fe..0000000000000 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/empty_state/empty_state.tsx +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; - -import { EuiCallOut, EuiTextColor, EuiLink, EuiButton } from '@elastic/eui'; - -import { FormattedMessage } from '@kbn/i18n/react'; -import { IBasePath } from 'kibana/public'; - -export const EmptyState = ({ - onRefresh, - prependBasePath, -}: { - onRefresh: () => void; - prependBasePath: IBasePath['prepend']; -}) => ( -
    - - } - > -

    - - - - ), - learnHowLink: ( - - - - ), - getStartedLink: ( - - - - ), - }} - /> -

    - - - - -
    -
    -); diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/header/__snapshots__/header.test.tsx.snap b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/header/__snapshots__/header.test.tsx.snap index c4f735558b1f2..851e5cc4c2a76 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/header/__snapshots__/header.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/header/__snapshots__/header.test.tsx.snap @@ -7,7 +7,7 @@ exports[`Header should mark the input as invalid 1`] = ` >

    @@ -119,7 +119,7 @@ exports[`Header should render normally 1`] = ` >

    diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/header/header.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/header/header.tsx index f1bf0d54a1cbf..8efa44decf3c6 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/header/header.tsx +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/header/header.tsx @@ -66,7 +66,7 @@ export const Header: React.FC = ({

    @@ -127,6 +127,7 @@ export const Header: React.FC = ({ id="checkboxShowSystemIndices" checked={isIncludingSystemIndices} onChange={onChangeIncludingSystemIndices} + data-test-subj="showSystemAndHiddenIndices" /> ) : null} diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/indices_list/__snapshots__/indices_list.test.tsx.snap b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/indices_list/__snapshots__/indices_list.test.tsx.snap index 598de4d90e893..6631a9bbd1d02 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/indices_list/__snapshots__/indices_list.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/indices_list/__snapshots__/indices_list.test.tsx.snap @@ -2,7 +2,10 @@ exports[`IndicesList should change pages 1`] = `
    - + - + - + - + - + - + {rows} diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/loading_indices/__snapshots__/loading_indices.test.tsx.snap b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/loading_indices/__snapshots__/loading_indices.test.tsx.snap index 9d67ca913d415..a5517f6d4b616 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/loading_indices/__snapshots__/loading_indices.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/loading_indices/__snapshots__/loading_indices.test.tsx.snap @@ -3,47 +3,33 @@ exports[`LoadingIndices should render normally 1`] = ` - - - - - - - - - - - - +

    + + + + `; diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/loading_indices/loading_indices.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/loading_indices/loading_indices.tsx index 16e8d1a9f3e98..82603fd598596 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/loading_indices/loading_indices.tsx +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/loading_indices/loading_indices.tsx @@ -19,34 +19,30 @@ import React from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiText, EuiTextColor, EuiLoadingSpinner } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiTitle, EuiLoadingSpinner } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; export const LoadingIndices = ({ ...rest }) => ( - + - - - - - - + +

    - - - - - - - - +

    +
    +
    + +
    ); diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/status_message/status_message.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/status_message/status_message.tsx index 22b75071b93bb..c2c4c84b51683 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/status_message/status_message.tsx +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/components/status_message/status_message.tsx @@ -132,7 +132,7 @@ export const StatusMessage: React.FC = ({ /> ); - } else if (allIndicesLength) { + } else { statusIcon = undefined; statusColor = 'warning'; statusMessage = ( diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.tsx index fab638509313d..d8555d71d6ec0 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.tsx +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.tsx @@ -159,7 +159,7 @@ export class StepIndexPattern extends Component indexPatternCreationType.getIndexTags(indexName), query, this.state.isIncludingSystemIndices ) @@ -175,13 +175,13 @@ export class StepIndexPattern extends Component indexPatternCreationType.getIndexTags(indexName), `${query}*`, this.state.isIncludingSystemIndices ), getIndices( this.context.services.http, - indexPatternCreationType, + (indexName: string) => indexPatternCreationType.getIndexTags(indexName), query, this.state.isIncludingSystemIndices ), @@ -227,7 +227,13 @@ export class StepIndexPattern extends Component; + return ( + <> + + + + + ); } renderStatusMessage(matchedIndices: { diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/advanced_options/__snapshots__/advanced_options.test.tsx.snap b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/advanced_options/__snapshots__/advanced_options.test.tsx.snap index d1b10fb532020..a2d2023ea0601 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/advanced_options/__snapshots__/advanced_options.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/advanced_options/__snapshots__/advanced_options.test.tsx.snap @@ -7,7 +7,7 @@ exports[`AdvancedOptions should hide if not showing 1`] = ` onClick={[Function]} > @@ -25,7 +25,7 @@ exports[`AdvancedOptions should render normally 1`] = ` onClick={[Function]} > diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/advanced_options/advanced_options.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/advanced_options/advanced_options.tsx index b8f34095743ba..752fcbcd42b5c 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/advanced_options/advanced_options.tsx +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/advanced_options/advanced_options.tsx @@ -45,12 +45,12 @@ export const AdvancedOptions: React.FC = ({ {isVisible ? ( ) : ( )} diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/header/__snapshots__/header.test.tsx.snap b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/header/__snapshots__/header.test.tsx.snap index 2ac243780b31d..9efda4fdac7f9 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/header/__snapshots__/header.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/header/__snapshots__/header.test.tsx.snap @@ -17,9 +17,18 @@ exports[`Header should render normally 1`] = ` size="m" /> - - ki* - + + ki* + , + "indexPatternName": "ki*", + } + } + />

    `; diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/header/header.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/header/header.tsx index c17b356e159f6..530d0688b61ca 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/header/header.tsx +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/header/header.tsx @@ -40,7 +40,14 @@ export const Header: React.FC = ({ indexPattern, indexPatternName } - {indexPattern} + {indexPattern}, + indexPatternName, + }} + />

    Made with NaturalEarth | Elastic Maps Service

    ); diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/time_field/time_field.scss b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/time_field/time_field.scss deleted file mode 100644 index 5bd60e8b76afc..0000000000000 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/time_field/time_field.scss +++ /dev/null @@ -1,7 +0,0 @@ -/** - * 1. Bring the line-height down or else this link expands its container when it becomes visible. - */ - -.timeFieldRefreshButton { - line-height: 1 !important; /* 1 */ -} diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/time_field/time_field.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/time_field/time_field.tsx index 7a3d72551f464..1eae1055ac5ef 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/time_field/time_field.tsx +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_time_field/components/time_field/time_field.tsx @@ -17,8 +17,6 @@ * under the License. */ -import './time_field.scss'; - import React from 'react'; import { diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/create_index_pattern_wizard.test.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/create_index_pattern_wizard.test.tsx index b14cd526d7e27..af5618424bbc0 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/create_index_pattern_wizard.test.tsx +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/create_index_pattern_wizard.test.tsx @@ -27,7 +27,6 @@ jest.mock('./components/step_index_pattern', () => ({ StepIndexPattern: 'StepInd jest.mock('./components/step_time_field', () => ({ StepTimeField: 'StepTimeField' })); jest.mock('./components/header', () => ({ Header: 'Header' })); jest.mock('./components/loading_state', () => ({ LoadingState: 'LoadingState' })); -jest.mock('./components/empty_state', () => ({ EmptyState: 'EmptyState' })); jest.mock('./lib/get_indices', () => ({ getIndices: () => { return [{ name: 'kibana' }]; diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/create_index_pattern_wizard.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/create_index_pattern_wizard.tsx index cd76ca09ccb74..a789ebbfadbce 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/create_index_pattern_wizard.tsx +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/create_index_pattern_wizard.tsx @@ -33,7 +33,6 @@ import { StepIndexPattern } from './components/step_index_pattern'; import { StepTimeField } from './components/step_time_field'; import { Header } from './components/header'; import { LoadingState } from './components/loading_state'; -import { EmptyState } from './components/empty_state'; import { context as contextType } from '../../../../kibana_react/public'; import { getCreateBreadcrumbs } from '../breadcrumbs'; @@ -125,7 +124,13 @@ export class CreateIndexPatternWizard extends Component< // query local and remote indices, updating state independently ensureMinimumTime( this.catchAndWarn( - getIndices(this.context.services.http, this.state.indexPatternCreationType, `*`, false), + getIndices( + this.context.services.http, + (indexName: string) => this.state.indexPatternCreationType.getIndexTags(indexName), + `*`, + false + ), + [], indicesFailMsg ) @@ -136,7 +141,13 @@ export class CreateIndexPatternWizard extends Component< this.catchAndWarn( // if we get an error from remote cluster query, supply fallback value that allows user entry. // ['a'] is fallback value - getIndices(this.context.services.http, this.state.indexPatternCreationType, `*:*`, false), + getIndices( + this.context.services.http, + (indexName: string) => this.state.indexPatternCreationType.getIndexTags(indexName), + `*:*`, + false + ), + ['a'], clustersFailMsg ).then((remoteIndices: string[] | MatchedItem[]) => @@ -200,39 +211,24 @@ export class CreateIndexPatternWizard extends Component< }; renderHeader() { + const { docLinks, indexPatternCreationType } = this.state; return (
    ); } renderContent() { - const { - allIndices, - isInitiallyLoadingIndices, - step, - indexPattern, - remoteClustersExist, - } = this.state; + const { allIndices, isInitiallyLoadingIndices, step, indexPattern } = this.state; if (isInitiallyLoadingIndices) { return ; } - const hasDataIndices = allIndices.some(({ name }: MatchedItem) => !name.startsWith('.')); - if (!hasDataIndices && !remoteClustersExist) { - return ( - - ); - } - const header = this.renderHeader(); if (step === 1) { diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.test.ts b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.test.ts index 4cd28090420a7..8f3765b7b5dcc 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.test.ts +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.test.ts @@ -37,7 +37,7 @@ describe('extractTimeFields', () => { expect(extractTimeFields(fields)).toEqual([ { display: '@timestamp', fieldName: '@timestamp' }, { isDisabled: true, display: '───', fieldName: '' }, - { display: `I don't want to use the Time Filter`, fieldName: undefined }, + { display: `I don't want to use the time filter`, fieldName: undefined }, ]); }); }); diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts index b7056ad17343a..efac21245c257 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts @@ -45,7 +45,7 @@ export function extractTimeFields(fields: IFieldType[]) { const noTimeFieldLabel = i18n.translate( 'indexPatternManagement.createIndexPattern.stepTime.noTimeFieldOptionLabel', { - defaultMessage: "I don't want to use the Time Filter", + defaultMessage: "I don't want to use the time filter", } ); const noTimeFieldOption = { diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/get_indices.test.ts b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/get_indices.test.ts index 8e4dd37284333..44a2d1a3be0d0 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/get_indices.test.ts +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/get_indices.test.ts @@ -18,7 +18,6 @@ */ import { getIndices, responseToItemArray } from './get_indices'; -import { IndexPatternCreationConfig } from '../../../../../index_pattern_management/public'; import { httpServiceMock } from '../../../../../../core/public/mocks'; import { ResolveIndexResponseItemIndexAttrs } from '../types'; @@ -44,33 +43,27 @@ export const successfulResponse = { ], }; -const mockIndexPatternCreationType = new IndexPatternCreationConfig({ - type: 'default', - name: 'name', - showSystemIndices: false, - httpClient: {}, - isBeta: false, -}); +const mockGetTags = () => []; const http = httpServiceMock.createStartContract(); http.get.mockResolvedValue(successfulResponse); describe('getIndices', () => { it('should work in a basic case', async () => { - const result = await getIndices(http, mockIndexPatternCreationType, 'kibana', false); + const result = await getIndices(http, mockGetTags, 'kibana', false); expect(result.length).toBe(3); expect(result[0].name).toBe('f-alias'); expect(result[1].name).toBe('foo'); }); it('should ignore ccs query-all', async () => { - expect((await getIndices(http, mockIndexPatternCreationType, '*:', false)).length).toBe(0); + expect((await getIndices(http, mockGetTags, '*:', false)).length).toBe(0); }); it('should ignore a single comma', async () => { - expect((await getIndices(http, mockIndexPatternCreationType, ',', false)).length).toBe(0); - expect((await getIndices(http, mockIndexPatternCreationType, ',*', false)).length).toBe(0); - expect((await getIndices(http, mockIndexPatternCreationType, ',foobar', false)).length).toBe(0); + expect((await getIndices(http, mockGetTags, ',', false)).length).toBe(0); + expect((await getIndices(http, mockGetTags, ',*', false)).length).toBe(0); + expect((await getIndices(http, mockGetTags, ',foobar', false)).length).toBe(0); }); it('response object to item array', () => { @@ -98,8 +91,8 @@ describe('getIndices', () => { }, ], }; - expect(responseToItemArray(result, mockIndexPatternCreationType)).toMatchSnapshot(); - expect(responseToItemArray({}, mockIndexPatternCreationType)).toEqual([]); + expect(responseToItemArray(result, mockGetTags)).toMatchSnapshot(); + expect(responseToItemArray({}, mockGetTags)).toEqual([]); }); describe('errors', () => { @@ -107,7 +100,7 @@ describe('getIndices', () => { http.get.mockImplementationOnce(() => { throw new Error('Test error'); }); - const result = await getIndices(http, mockIndexPatternCreationType, 'kibana', false); + const result = await getIndices(http, mockGetTags, 'kibana', false); expect(result.length).toBe(0); }); }); diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/get_indices.ts b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/get_indices.ts index c6a11de1bc4fc..6844e90316e22 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/get_indices.ts +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/get_indices.ts @@ -38,7 +38,7 @@ const frozenLabel = i18n.translate('indexPatternManagement.frozenLabel', { export async function getIndices( http: HttpStart, - indexPatternCreationType: IndexPatternCreationConfig, + getIndexTags: IndexPatternCreationConfig['getIndexTags'], rawPattern: string, showAllIndices: boolean ): Promise { @@ -73,7 +73,7 @@ export async function getIndices( return []; } - return responseToItemArray(response, indexPatternCreationType); + return responseToItemArray(response, getIndexTags); } catch { return []; } @@ -81,7 +81,7 @@ export async function getIndices( export const responseToItemArray = ( response: ResolveIndexResponse, - indexPatternCreationType: IndexPatternCreationConfig + getIndexTags: IndexPatternCreationConfig['getIndexTags'] ): MatchedItem[] => { const source: MatchedItem[] = []; @@ -89,7 +89,7 @@ export const responseToItemArray = ( const tags: MatchedItem['tags'] = [{ key: 'index', name: indexLabel, color: 'default' }]; const isFrozen = (index.attributes || []).includes(ResolveIndexResponseItemIndexAttrs.FROZEN); - tags.push(...indexPatternCreationType.getIndexTags(index.name)); + tags.push(...getIndexTags(index.name)); if (isFrozen) { tags.push({ name: frozenLabel, key: 'frozen', color: 'danger' }); } diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx index 4b538af7c5fe7..987e8f0dae3a0 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx @@ -27,7 +27,6 @@ import { EuiBadge, EuiText, EuiLink, - EuiIcon, EuiCallOut, EuiPanel, } from '@elastic/eui'; @@ -162,7 +161,7 @@ export const EditIndexPattern = withRouter( const timeFilterHeader = i18n.translate( 'indexPatternManagement.editIndexPattern.timeFilterHeader', { - defaultMessage: "Time Filter field name: '{timeFieldName}'", + defaultMessage: "Time field: '{timeFieldName}'", values: { timeFieldName: indexPattern.timeFieldName }, } ); @@ -187,62 +186,55 @@ export const EditIndexPattern = withRouter( return (
    - - - - - {showTagsSection && ( - - {Boolean(indexPattern.timeFieldName) && ( - - {timeFilterHeader} - - )} - {tags.map((tag: any) => ( - - {tag.name} - - ))} - + + + {showTagsSection && ( + + {Boolean(indexPattern.timeFieldName) && ( + + {timeFilterHeader} + )} - - -

    - {indexPattern.title} }} - />{' '} - - {mappingAPILink} - - -

    -
    - {conflictedFields.length > 0 && ( - -

    {mappingConflictLabel}

    -
    - )} -
    - - - -
    + {tags.map((tag: any) => ( + + {tag.name} + + ))} + + )} + + +

    + {indexPattern.title} }} + />{' '} + + {mappingAPILink} + +

    +
    + {conflictedFields.length > 0 && ( + <> + + +

    {mappingConflictLabel}

    +
    + + )} + +
    ); diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx index 4cf43d63d5839..8ca8c6453c7e9 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx @@ -19,14 +19,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { - EuiFlexGroup, - EuiToolTip, - EuiFlexItem, - EuiIcon, - EuiTitle, - EuiButtonIcon, -} from '@elastic/eui'; +import { EuiFlexGroup, EuiToolTip, EuiFlexItem, EuiTitle, EuiButtonIcon } from '@elastic/eui'; import { IIndexPattern } from 'src/plugins/data/public'; interface IndexHeaderProps { @@ -77,22 +70,13 @@ export function IndexHeader({ return ( - - {defaultIndex === indexPattern.id && ( - - - - )} - - -

    {indexPattern.title}

    -
    -
    -
    + +

    {indexPattern.title}

    +
    - - {setDefault && ( + + {defaultIndex !== indexPattern.id && setDefault && ( setFieldFilter(e.target.value)} diff --git a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.scss b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.scss index 34e8a60d07074..ca230711827dc 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.scss +++ b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.scss @@ -1,5 +1,5 @@ .testScript__searchBar { - .globalQueryBar { + .globalQueryBar { padding: $euiSize 0 0; } } diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/__snapshots__/empty_index_pattern_prompt.test.tsx.snap b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/__snapshots__/empty_index_pattern_prompt.test.tsx.snap new file mode 100644 index 0000000000000..c5e6d1220d8bf --- /dev/null +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/__snapshots__/empty_index_pattern_prompt.test.tsx.snap @@ -0,0 +1,99 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`EmptyIndexPatternPrompt should render normally 1`] = ` + + + + + + + +

    + +
    + +

    +

    + +

    + + + +
    +
    +
    + + + + + + + + + + + +
    +`; diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/assets/index_pattern_illustration.scss b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/assets/index_pattern_illustration.scss new file mode 100644 index 0000000000000..cd0477aba7adf --- /dev/null +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/assets/index_pattern_illustration.scss @@ -0,0 +1,9 @@ +.indexPatternIllustration { + &__verticalStripes { + fill: $euiColorFullShade; + } + + &__dots { + fill: $euiColorLightShade; + } +} diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/assets/index_pattern_illustration.tsx b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/assets/index_pattern_illustration.tsx new file mode 100644 index 0000000000000..2461c0f5df919 --- /dev/null +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/assets/index_pattern_illustration.tsx @@ -0,0 +1,551 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import './index_pattern_illustration.scss'; +import React from 'react'; + +const IndexPatternIllustration = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export const Illustration = IndexPatternIllustration; diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.scss b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.scss new file mode 100644 index 0000000000000..11ac55b098a57 --- /dev/null +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.scss @@ -0,0 +1,31 @@ +@import '../../../variables'; +@import '../../../templates'; + +.inpEmptyIndexPatternPrompt { + // override EUI specificity + max-width: $inpEmptyStateMaxWidth !important; // sass-lint:disable-line no-important +} + +.inpEmptyIndexPatternPrompt__footer { + @extend %inp-empty-state-footer; + // override EUI specificity + align-items: baseline !important; // sass-lint:disable-line no-important +} + +.inpEmptyIndexPatternPrompt__title { + // override EUI specificity + width: auto !important; // sass-lint:disable-line no-important +} + +@include euiBreakpoint('xs', 's') { + .inpEmptyIndexPatternPrompt__illustration > svg { + width: $euiSize * 12; + height: auto; + margin: 0 auto; + } + + .inpEmptyIndexPatternPrompt__text { + text-align: center; + align-items: center; + } +} diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/empty_state/empty_state.test.tsx b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.test.tsx similarity index 57% rename from src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/empty_state/empty_state.test.tsx rename to src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.test.tsx index 7fa39363e3ef7..83eb803333afc 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/empty_state/empty_state.test.tsx +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.test.tsx @@ -18,30 +18,20 @@ */ import React from 'react'; -import { EmptyState } from '../empty_state'; -import { shallow } from 'enzyme'; -import sinon from 'sinon'; +import { EmptyIndexPatternPrompt } from '../empty_index_pattern_prompt'; +import { shallowWithI18nProvider } from 'test_utils/enzyme_helpers'; -describe('EmptyState', () => { +describe('EmptyIndexPatternPrompt', () => { it('should render normally', () => { - const component = shallow( {}} prependBasePath={(x) => x} />); + const component = shallowWithI18nProvider( + {} }]} + docLinksIndexPatternIntro={'testUrl'} + setBreadcrumbs={() => {}} + /> + ); expect(component).toMatchSnapshot(); }); - - describe('props', () => { - describe('onRefresh', () => { - it('is called when refresh button is clicked', () => { - const onRefreshHandler = sinon.stub(); - - const component = shallow( - x} /> - ); - - component.find('[data-test-subj="refreshIndicesButton"]').simulate('click'); - - sinon.assert.calledOnce(onRefreshHandler); - }); - }); - }); }); diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.tsx b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.tsx new file mode 100644 index 0000000000000..de389097fd4ba --- /dev/null +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/empty_index_pattern_prompt.tsx @@ -0,0 +1,111 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import './empty_index_pattern_prompt.scss'; + +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { EuiPageContent, EuiSpacer, EuiText, EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; +import { EuiDescriptionListTitle } from '@elastic/eui'; +import { EuiDescriptionListDescription, EuiDescriptionList } from '@elastic/eui'; +import { EuiLink } from '@elastic/eui'; +import { getListBreadcrumbs } from '../../breadcrumbs'; +import { IndexPatternCreationOption } from '../../types'; +import { CreateButton } from '../../create_button'; +import { Illustration } from './assets/index_pattern_illustration'; +import { ManagementAppMountParams } from '../../../../../management/public'; + +interface Props { + canSave: boolean; + creationOptions: IndexPatternCreationOption[]; + docLinksIndexPatternIntro: string; + setBreadcrumbs: ManagementAppMountParams['setBreadcrumbs']; +} + +export const EmptyIndexPatternPrompt = ({ + canSave, + creationOptions, + docLinksIndexPatternIntro, + setBreadcrumbs, +}: Props) => { + setBreadcrumbs(getListBreadcrumbs()); + + return ( + + + + + + + +

    + +
    + +

    +

    + +

    + {canSave && ( + + + + )} +
    +
    +
    + + + + + + + + + + + +
    + ); +}; diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/index.tsx b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/index.tsx new file mode 100644 index 0000000000000..239bb272b23ab --- /dev/null +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_index_pattern_prompt/index.tsx @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { EmptyIndexPatternPrompt } from './empty_index_pattern_prompt'; diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/__snapshots__/empty_state.test.tsx.snap b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/__snapshots__/empty_state.test.tsx.snap new file mode 100644 index 0000000000000..645694371f905 --- /dev/null +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/__snapshots__/empty_state.test.tsx.snap @@ -0,0 +1,216 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`EmptyState should render normally 1`] = ` + + + + + +

    + +

    +
    +
    +
    + + + + + + } + icon={ + + } + onClick={[Function]} + title={ + + } + /> + + + + } + icon={ + + } + isDisabled={false} + onClick={[Function]} + title={ + + } + /> + + + + } + icon={ + + } + onClick={[Function]} + title={ + + } + /> + + + +
    + + + + + , + "title": , + }, + ] + } + /> + + + + + + + , + "title": , + }, + ] + } + /> + + +
    +
    +
    + + + + + , + } + } + /> + +
    +`; diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.scss b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.scss new file mode 100644 index 0000000000000..37889b9d7c483 --- /dev/null +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.scss @@ -0,0 +1,23 @@ +@import '../../../variables'; +@import '../../../templates'; + +.inpEmptyState { + // override EUI specificity + max-width: $inpEmptyStateMaxWidth !important; // sass-lint:disable-line no-important +} + +.inpEmptyState__cardGrid { + justify-content: center; +} + +.inpEmptyState__card { + min-width: $euiSizeXL * 6; +} + +.inpEmptyState__footer { + @extend %inp-empty-state-footer; +} + +.inpEmptyState__footerFlexItem { + min-width: $euiSizeXL * 7; +} diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.test.tsx b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.test.tsx new file mode 100644 index 0000000000000..7b2cc0f4c3c60 --- /dev/null +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.test.tsx @@ -0,0 +1,74 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { EmptyState } from '../empty_state'; +import { shallow } from 'enzyme'; +import sinon from 'sinon'; +// @ts-expect-error +import { findTestSubject } from '@elastic/eui/lib/test'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { docLinksServiceMock } from '../../../../../../core/public/mocks'; +import { MlCardState } from '../../../types'; + +const docLinks = docLinksServiceMock.createStartContract(); + +jest.mock('react-router-dom', () => ({ + useHistory: () => ({ + createHref: jest.fn(), + }), +})); + +describe('EmptyState', () => { + it('should render normally', () => { + const component = shallow( + {}} + navigateToApp={async () => {}} + getMlCardState={() => MlCardState.ENABLED} + canSave={true} + /> + ); + + expect(component).toMatchSnapshot(); + }); + + describe('props', () => { + describe('onRefresh', () => { + it('is called when refresh button is clicked', () => { + const onRefreshHandler = sinon.stub(); + + const component = mountWithIntl( + {}} + getMlCardState={() => MlCardState.ENABLED} + canSave={true} + /> + ); + + findTestSubject(component, 'refreshIndicesButton').simulate('click'); + + sinon.assert.calledOnce(onRefreshHandler); + }); + }); + }); +}); diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.tsx b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.tsx new file mode 100644 index 0000000000000..e758184f0f14b --- /dev/null +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.tsx @@ -0,0 +1,234 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import './empty_state.scss'; +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { DocLinksStart, ApplicationStart } from 'kibana/public'; +import { + EuiPageContentHeader, + EuiPageContentHeaderSection, + EuiTitle, + EuiPageContentBody, + EuiPageContent, + EuiIcon, + EuiSpacer, + EuiFlexItem, + EuiDescriptionList, + EuiFlexGrid, + EuiCard, + EuiLink, + EuiText, +} from '@elastic/eui'; +import { useHistory } from 'react-router-dom'; +import { reactRouterNavigate } from '../../../../../../plugins/kibana_react/public'; +import { MlCardState } from '../../../types'; + +export const EmptyState = ({ + onRefresh, + navigateToApp, + docLinks, + getMlCardState, + canSave, +}: { + onRefresh: () => void; + navigateToApp: ApplicationStart['navigateToApp']; + docLinks: DocLinksStart; + getMlCardState: () => MlCardState; + canSave: boolean; +}) => { + const mlCard = ( + + navigateToApp('ml', { path: '#/filedatavisualizer' })} + className="inpEmptyState__card" + betaBadgeLabel={ + getMlCardState() === MlCardState.ENABLED + ? undefined + : i18n.translate( + 'indexPatternManagement.createIndexPattern.emptyState.basicLicenseLabel', + { + defaultMessage: 'Basic', + } + ) + } + betaBadgeTooltipContent={i18n.translate( + 'indexPatternManagement.createIndexPattern.emptyState.basicLicenseDescription', + { + defaultMessage: 'This feature requires a Basic license.', + } + )} + isDisabled={getMlCardState() === MlCardState.DISABLED} + icon={} + title={ + + } + description={ + + } + /> + + ); + + const createAnyway = ( + + + + + ), + }} + /> + + ); + + return ( + <> + + + + +

    + +

    +
    +
    +
    + + + + + navigateToApp('home', { path: '#/tutorial_directory' })} + icon={} + title={ + + } + description={ + + } + /> + + {getMlCardState() !== MlCardState.HIDDEN ? mlCard : <>} + + navigateToApp('home', { path: '#/tutorial_directory/sampleData' })} + icon={} + title={ + + } + description={ + + } + /> + + + +
    + + + + ), + description: ( + + + + ), + }, + ]} + /> + + + + ), + description: ( + + {' '} + + + ), + }, + ]} + /> + + +
    +
    +
    + + {canSave && createAnyway} + + ); +}; diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/empty_state/index.ts b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/index.ts similarity index 100% rename from src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/empty_state/index.ts rename to src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/index.ts diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/index_pattern_table.tsx b/src/plugins/index_pattern_management/public/components/index_pattern_table/index_pattern_table.tsx index 947882b8df495..2768314a75860 100644 --- a/src/plugins/index_pattern_management/public/components/index_pattern_table/index_pattern_table.tsx +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/index_pattern_table.tsx @@ -20,14 +20,14 @@ import { EuiBadge, EuiButtonEmpty, - EuiButtonIcon, EuiFlexGroup, EuiFlexItem, EuiInMemoryTable, - EuiPanel, EuiSpacer, EuiText, EuiBadgeGroup, + EuiPageContent, + EuiTitle, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { withRouter, RouteComponentProps } from 'react-router-dom'; @@ -36,10 +36,13 @@ import { i18n } from '@kbn/i18n'; import { reactRouterNavigate, useKibana } from '../../../../../plugins/kibana_react/public'; import { IndexPatternManagmentContext } from '../../types'; import { CreateButton } from '../create_button'; -import { CreateIndexPatternPrompt } from '../create_index_pattern_prompt'; import { IndexPatternTableItem, IndexPatternCreationOption } from '../types'; import { getIndexPatterns } from '../utils'; import { getListBreadcrumbs } from '../breadcrumbs'; +import { EmptyState } from './empty_state'; +import { MatchedItem, ResolveIndexResponseItemAlias } from '../create_index_pattern_wizard/types'; +import { EmptyIndexPatternPrompt } from './empty_index_pattern_prompt'; +import { getIndices } from '../create_index_pattern_wizard/lib'; const pagination = { initialPageSize: 10, @@ -81,13 +84,19 @@ export const IndexPatternTable = ({ canSave, history }: Props) => { uiSettings, indexPatternManagementStart, chrome, + docLinks, + application, + http, + getMlCardState, } = useKibana().services; - const [showFlyout, setShowFlyout] = useState(false); const [indexPatterns, setIndexPatterns] = useState([]); const [creationOptions, setCreationOptions] = useState([]); + const [sources, setSources] = useState([]); + const [remoteClustersExist, setRemoteClustersExist] = useState(false); + const [isLoadingSources, setIsLoadingSources] = useState(true); + const [isLoadingIndexPatterns, setIsLoadingIndexPatterns] = useState(true); setBreadcrumbs(getListBreadcrumbs()); - useEffect(() => { (async function () { const options = await indexPatternManagementStart.creation.getIndexPatternCreationOptions( @@ -98,9 +107,9 @@ export const IndexPatternTable = ({ canSave, history }: Props) => { uiSettings.get('defaultIndex'), indexPatternManagementStart ); + setIsLoadingIndexPatterns(false); setCreationOptions(options); setIndexPatterns(gettedIndexPatterns); - setShowFlyout(gettedIndexPatterns.length === 0); })(); }, [ history.push, @@ -110,6 +119,28 @@ export const IndexPatternTable = ({ canSave, history }: Props) => { savedObjects.client, ]); + const removeAliases = (item: MatchedItem) => + !((item as unknown) as ResolveIndexResponseItemAlias).indices; + + const loadSources = () => { + getIndices(http, () => [], '*', false).then((dataSources) => + setSources(dataSources.filter(removeAliases)) + ); + getIndices(http, () => [], '*:*', false).then((dataSources) => + setRemoteClustersExist(!!dataSources.filter(removeAliases).length) + ); + }; + + useEffect(() => { + getIndices(http, () => [], '*', false).then((dataSources) => { + setSources(dataSources.filter(removeAliases)); + setIsLoadingSources(false); + }); + getIndices(http, () => [], '*:*', false).then((dataSources) => + setRemoteClustersExist(!!dataSources.filter(removeAliases).length) + ); + }, [http, creationOptions]); + chrome.docTitle.change(title); const columns = [ @@ -130,12 +161,11 @@ export const IndexPatternTable = ({ canSave, history }: Props) => { {name} +   {index.tags && index.tags.map(({ key: tagKey, name: tagName }) => ( - - {tagName} - + {tagName} ))} @@ -156,31 +186,51 @@ export const IndexPatternTable = ({ canSave, history }: Props) => { <> ); + if (isLoadingSources || isLoadingIndexPatterns) { + return <>; + } + + const hasDataIndices = sources.some(({ name }: MatchedItem) => !name.startsWith('.')); + + if (!indexPatterns.length) { + if (!hasDataIndices && !remoteClustersExist) { + return ( + + ); + } else { + return ( + + ); + } + } + return ( - - {showFlyout && setShowFlyout(false)} />} + - - - - -

    {title}

    -
    -
    - - setShowFlyout(true)} - aria-label="Help" + + +

    {title}

    +
    + + +

    + - - +

    +
    {createButton}
    @@ -195,7 +245,7 @@ export const IndexPatternTable = ({ canSave, history }: Props) => { sorting={sorting} search={search} /> -
    + ); }; diff --git a/src/plugins/index_pattern_management/public/index.ts b/src/plugins/index_pattern_management/public/index.ts index 2d6db13757eea..9a0fd39fb4fd9 100644 --- a/src/plugins/index_pattern_management/public/index.ts +++ b/src/plugins/index_pattern_management/public/index.ts @@ -41,3 +41,5 @@ export { IndexPatternCreationOption, IndexPatternListConfig, } from './service'; + +export { MlCardState } from './types'; diff --git a/src/plugins/index_pattern_management/public/management_app/mount_management_section.tsx b/src/plugins/index_pattern_management/public/management_app/mount_management_section.tsx index bcabd55c87975..add45a07e0c5f 100644 --- a/src/plugins/index_pattern_management/public/management_app/mount_management_section.tsx +++ b/src/plugins/index_pattern_management/public/management_app/mount_management_section.tsx @@ -34,7 +34,7 @@ import { CreateIndexPatternWizardWithRouter, } from '../components'; import { IndexPatternManagementStartDependencies, IndexPatternManagementStart } from '../plugin'; -import { IndexPatternManagmentContext } from '../types'; +import { IndexPatternManagmentContext, MlCardState } from '../types'; const readOnlyBadge = { text: i18n.translate('indexPatternManagement.indexPatterns.badge.readOnly.text', { @@ -48,7 +48,8 @@ const readOnlyBadge = { export async function mountManagementSection( getStartServices: StartServicesAccessor, - params: ManagementAppMountParams + params: ManagementAppMountParams, + getMlCardState: () => MlCardState ) { const [ { chrome, application, savedObjects, uiSettings, notifications, overlays, http, docLinks }, @@ -73,6 +74,7 @@ export async function mountManagementSection( data, indexPatternManagementStart: indexPatternManagementStart as IndexPatternManagementStart, setBreadcrumbs: params.setBreadcrumbs, + getMlCardState, }; ReactDOM.render( diff --git a/src/plugins/index_pattern_management/public/mocks.ts b/src/plugins/index_pattern_management/public/mocks.ts index ec8100db42085..6a9ef23e3732e 100644 --- a/src/plugins/index_pattern_management/public/mocks.ts +++ b/src/plugins/index_pattern_management/public/mocks.ts @@ -39,6 +39,9 @@ const createSetupContract = (): IndexPatternManagementSetup => ({ getAll: jest.fn(), getById: jest.fn(), } as any, + environment: { + update: jest.fn(), + }, }); const createStartContract = (): IndexPatternManagementStart => ({ diff --git a/src/plugins/index_pattern_management/public/plugin.ts b/src/plugins/index_pattern_management/public/plugin.ts index fe680eff8657e..ee1e00fcafd98 100644 --- a/src/plugins/index_pattern_management/public/plugin.ts +++ b/src/plugins/index_pattern_management/public/plugin.ts @@ -86,7 +86,9 @@ export class IndexPatternManagementPlugin mount: async (params) => { const { mountManagementSection } = await import('./management_app'); - return mountManagementSection(core.getStartServices, params); + return mountManagementSection(core.getStartServices, params, () => + this.indexPatternManagementService.environmentService.getEnvironment().ml() + ); }, }); diff --git a/src/plugins/index_pattern_management/public/service/environment/environment.mock.ts b/src/plugins/index_pattern_management/public/service/environment/environment.mock.ts new file mode 100644 index 0000000000000..2c2c68b8ead2d --- /dev/null +++ b/src/plugins/index_pattern_management/public/service/environment/environment.mock.ts @@ -0,0 +1,44 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { EnvironmentService, EnvironmentServiceSetup } from './environment'; +import { MlCardState } from '../../types'; + +const createSetupMock = (): jest.Mocked => { + const setup = { + update: jest.fn(), + }; + return setup; +}; + +const createMock = (): jest.Mocked> => { + const service = { + setup: jest.fn(), + getEnvironment: jest.fn(() => ({ + ml: () => MlCardState.ENABLED, + })), + }; + service.setup.mockImplementation(createSetupMock); + return service; +}; + +export const environmentServiceMock = { + createSetup: createSetupMock, + create: createMock, +}; diff --git a/src/plugins/index_pattern_management/public/service/environment/environment.test.ts b/src/plugins/index_pattern_management/public/service/environment/environment.test.ts new file mode 100644 index 0000000000000..1aa67ba751b81 --- /dev/null +++ b/src/plugins/index_pattern_management/public/service/environment/environment.test.ts @@ -0,0 +1,49 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { EnvironmentService } from './environment'; +import { MlCardState } from '../../types'; + +describe('EnvironmentService', () => { + describe('setup', () => { + test('allows multiple update calls', () => { + const setup = new EnvironmentService().setup(); + expect(() => { + setup.update({ ml: () => MlCardState.ENABLED }); + }).not.toThrow(); + }); + }); + + describe('getEnvironment', () => { + test('returns default values', () => { + const service = new EnvironmentService(); + expect(service.getEnvironment().ml()).toEqual(MlCardState.DISABLED); + }); + + test('returns last state of update calls', () => { + let cardState = MlCardState.DISABLED; + const service = new EnvironmentService(); + const setup = service.setup(); + setup.update({ ml: () => cardState }); + expect(service.getEnvironment().ml()).toEqual(MlCardState.DISABLED); + cardState = MlCardState.ENABLED; + expect(service.getEnvironment().ml()).toEqual(MlCardState.ENABLED); + }); + }); +}); diff --git a/src/plugins/index_pattern_management/public/service/environment/environment.ts b/src/plugins/index_pattern_management/public/service/environment/environment.ts new file mode 100644 index 0000000000000..f40ce3589fa76 --- /dev/null +++ b/src/plugins/index_pattern_management/public/service/environment/environment.ts @@ -0,0 +1,52 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { MlCardState } from '../../types'; + +/** @public */ +export interface Environment { + /** + * Flag whether ml features should be advertised + */ + readonly ml: () => MlCardState; +} + +export class EnvironmentService { + private environment = { + ml: () => MlCardState.DISABLED, + }; + + public setup() { + return { + /** + * Update the environment to influence how available features are presented. + * @param update + */ + update: (update: Partial) => { + this.environment = Object.assign({}, this.environment, update); + }, + }; + } + + public getEnvironment() { + return this.environment; + } +} + +export type EnvironmentServiceSetup = ReturnType; diff --git a/src/plugins/index_pattern_management/public/service/environment/index.ts b/src/plugins/index_pattern_management/public/service/environment/index.ts new file mode 100644 index 0000000000000..91d14c358e7db --- /dev/null +++ b/src/plugins/index_pattern_management/public/service/environment/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { EnvironmentService, Environment, EnvironmentServiceSetup } from './environment'; diff --git a/src/plugins/index_pattern_management/public/service/index_pattern_management_service.ts b/src/plugins/index_pattern_management/public/service/index_pattern_management_service.ts index d4cc9c95e76a7..06b9b83b1b601 100644 --- a/src/plugins/index_pattern_management/public/service/index_pattern_management_service.ts +++ b/src/plugins/index_pattern_management/public/service/index_pattern_management_service.ts @@ -21,6 +21,7 @@ import { HttpSetup } from '../../../../core/public'; import { IndexPatternCreationManager, IndexPatternCreationConfig } from './creation'; import { IndexPatternListManager, IndexPatternListConfig } from './list'; import { FieldFormatEditors } from './field_format_editors'; +import { EnvironmentService } from './environment'; import { BytesFormatEditor, @@ -49,11 +50,13 @@ export class IndexPatternManagementService { indexPatternCreationManager: IndexPatternCreationManager; indexPatternListConfig: IndexPatternListManager; fieldFormatEditors: FieldFormatEditors; + environmentService: EnvironmentService; constructor() { this.indexPatternCreationManager = new IndexPatternCreationManager(); this.indexPatternListConfig = new IndexPatternListManager(); this.fieldFormatEditors = new FieldFormatEditors(); + this.environmentService = new EnvironmentService(); } public setup({ httpClient }: SetupDependencies) { @@ -83,6 +86,7 @@ export class IndexPatternManagementService { creation: creationManagerSetup, list: indexPatternListConfigSetup, fieldFormatEditors: fieldFormatEditorsSetup, + environment: this.environmentService.setup(), }; } diff --git a/src/plugins/index_pattern_management/public/types.ts b/src/plugins/index_pattern_management/public/types.ts index 97941687e652d..2876bd6227350 100644 --- a/src/plugins/index_pattern_management/public/types.ts +++ b/src/plugins/index_pattern_management/public/types.ts @@ -44,8 +44,15 @@ export interface IndexPatternManagmentContext { data: DataPublicPluginStart; indexPatternManagementStart: IndexPatternManagementStart; setBreadcrumbs: ManagementAppMountParams['setBreadcrumbs']; + getMlCardState: () => MlCardState; } export type IndexPatternManagmentContextValue = KibanaReactContextValue< IndexPatternManagmentContext >; + +export enum MlCardState { + HIDDEN, + DISABLED, + ENABLED, +} diff --git a/test/functional/apps/management/_index_patterns_empty.ts b/test/functional/apps/management/_index_patterns_empty.ts new file mode 100644 index 0000000000000..4ae2e7836ac37 --- /dev/null +++ b/test/functional/apps/management/_index_patterns_empty.ts @@ -0,0 +1,66 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects(['common', 'settings']); + const testSubjects = getService('testSubjects'); + const globalNav = getService('globalNav'); + const es = getService('legacyEs'); + + describe('index pattern empty view', () => { + before(async () => { + await esArchiver.load('empty_kibana'); + await kibanaServer.uiSettings.replace({}); + await PageObjects.settings.navigateTo(); + }); + + after(async () => { + await esArchiver.unload('empty_kibana'); + await esArchiver.loadIfNeeded('makelogs'); + }); + + // create index pattern and return to verify list + it(`shows empty views`, async () => { + // @ts-expect-error + await es.transport.request({ + path: '/_all', + method: 'DELETE', + }); + await PageObjects.settings.clickKibanaIndexPatterns(); + await testSubjects.existOrFail('createAnyway'); + // @ts-expect-error + await es.transport.request({ + path: '/logstash-a/_doc', + method: 'POST', + body: { user: 'matt', message: 20 }, + }); + await testSubjects.click('refreshIndicesButton'); + await testSubjects.existOrFail('createIndexPatternButton', { timeout: 5000 }); + await PageObjects.settings.createIndexPattern('logstash-*', ''); + }); + + it(`doesn't show read-only badge`, async () => { + await globalNav.badgeMissingOrFail(); + }); + }); +} diff --git a/test/functional/apps/management/_kibana_settings.js b/test/functional/apps/management/_kibana_settings.js index 2a488a94c6889..e2b20bacc0b39 100644 --- a/test/functional/apps/management/_kibana_settings.js +++ b/test/functional/apps/management/_kibana_settings.js @@ -28,7 +28,7 @@ export default function ({ getService, getPageObjects }) { before(async function () { // delete .kibana index and then wait for Kibana to re-create it await kibanaServer.uiSettings.replace({}); - await PageObjects.settings.createIndexPattern(); + await PageObjects.settings.createIndexPattern('logstash-*'); await PageObjects.settings.navigateTo(); }); diff --git a/test/functional/apps/management/index.js b/test/functional/apps/management/index.js index 97e7314f9678e..d5f0c286af7a5 100644 --- a/test/functional/apps/management/index.js +++ b/test/functional/apps/management/index.js @@ -43,6 +43,7 @@ export default function ({ getService, loadTestFile }) { loadTestFile(require.resolve('./_scripted_fields')); loadTestFile(require.resolve('./_scripted_fields_preview')); loadTestFile(require.resolve('./_mgmt_import_saved_objects')); + loadTestFile(require.resolve('./_index_patterns_empty')); }); describe('', function () { diff --git a/test/functional/page_objects/settings_page.ts b/test/functional/page_objects/settings_page.ts index 4b80647c8749d..a4285a5f94d51 100644 --- a/test/functional/page_objects/settings_page.ts +++ b/test/functional/page_objects/settings_page.ts @@ -55,15 +55,6 @@ export function SettingsPageProvider({ getService, getPageObjects }: FtrProvider await testSubjects.click('indexPatterns'); await PageObjects.header.waitUntilLoadingHasFinished(); - - // check for the index pattern info flyout that covers the - // create index pattern button on smaller screens - // @ts-ignore - await retry.waitFor('index pattern info flyout', async () => { - if (await testSubjects.exists('CreateIndexPatternPrompt')) { - await testSubjects.click('CreateIndexPatternPrompt > euiFlyoutCloseButton'); - } else return true; - }); } async getAdvancedSettings(propertyName: string) { @@ -311,9 +302,7 @@ export function SettingsPageProvider({ getService, getPageObjects }: FtrProvider } async isIndexPatternListEmpty() { - await testSubjects.existOrFail('indexPatternTable', { timeout: 5000 }); - const indexPatternList = await this.getIndexPatternList(); - return indexPatternList.length === 0; + return !(await testSubjects.exists('indexPatternTable', { timeout: 5000 })); } async removeLogstashIndexPatternIfExist() { diff --git a/x-pack/plugins/ml/kibana.json b/x-pack/plugins/ml/kibana.json index c61db9fb1ad8d..7b4ea5458f4a6 100644 --- a/x-pack/plugins/ml/kibana.json +++ b/x-pack/plugins/ml/kibana.json @@ -16,7 +16,8 @@ "share", "embeddable", "uiActions", - "kibanaLegacy" + "kibanaLegacy", + "indexPatternManagement" ], "optionalPlugins": [ "security", diff --git a/x-pack/plugins/ml/public/application/app.tsx b/x-pack/plugins/ml/public/application/app.tsx index 42c462fa9d869..c281dc4e9ae05 100644 --- a/x-pack/plugins/ml/public/application/app.tsx +++ b/x-pack/plugins/ml/public/application/app.tsx @@ -21,7 +21,8 @@ import { MlRouter } from './routing'; import { mlApiServicesProvider } from './services/ml_api_service'; import { HttpService } from './services/http_service'; -export type MlDependencies = Omit & MlStartDependencies; +export type MlDependencies = Omit & + MlStartDependencies; interface AppProps { coreStart: CoreStart; diff --git a/x-pack/plugins/ml/public/plugin.ts b/x-pack/plugins/ml/public/plugin.ts index aa6163379f9c0..ff59d46de758d 100644 --- a/x-pack/plugins/ml/public/plugin.ts +++ b/x-pack/plugins/ml/public/plugin.ts @@ -20,8 +20,10 @@ import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; import { DataPublicPluginStart } from 'src/plugins/data/public'; import { HomePublicPluginSetup } from 'src/plugins/home/public'; +import { IndexPatternManagementSetup } from 'src/plugins/index_pattern_management/public'; import { EmbeddableSetup } from 'src/plugins/embeddable/public'; import { AppStatus, AppUpdater, DEFAULT_APP_CATEGORIES } from '../../../../src/core/public'; +import { MlCardState } from '../../../../src/plugins/index_pattern_management/public'; import { SecurityPluginSetup } from '../../security/public'; import { LicensingPluginSetup } from '../../licensing/public'; import { registerManagementSection } from './application/management'; @@ -53,6 +55,7 @@ export interface MlSetupDependencies { uiActions: UiActionsSetup; kibanaVersion: string; share: SharePluginSetup; + indexPatternManagement: IndexPatternManagementSetup; } export type MlCoreSetup = CoreSetup; @@ -104,11 +107,20 @@ export class MlPlugin implements Plugin { }); const licensing = pluginsSetup.licensing.license$.pipe(take(1)); - licensing.subscribe((license) => { + licensing.subscribe(async (license) => { + const [coreStart] = await core.getStartServices(); if (isMlEnabled(license)) { // add ML to home page registerFeature(pluginsSetup.home); + // register ML for the index pattern management no data screen. + pluginsSetup.indexPatternManagement.environment.update({ + ml: () => + coreStart.application.capabilities.ml.canFindFileStructure + ? MlCardState.ENABLED + : MlCardState.HIDDEN, + }); + // register various ML plugin features which require a full license if (isFullLicense(license)) { registerManagementSection(pluginsSetup.management, core); diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index e5cd46b330ca8..55d1953247a93 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2388,11 +2388,6 @@ "indexPatternManagement.createIndexPattern.description": "インデックスパターンは、{single}または{multiple}データソース、{star}と一致します。", "indexPatternManagement.createIndexPattern.documentation": "ドキュメンテーションを表示", "indexPatternManagement.createIndexPattern.emptyState.checkDataButton": "新規データを確認", - "indexPatternManagement.createIndexPattern.emptyStateHeader": "Elasticsearchデータが見つかりませんでした", - "indexPatternManagement.createIndexPattern.emptyStateLabel.emptyStateDetail": "{needToIndex} {learnHowLink}または{getStartedLink}", - "indexPatternManagement.createIndexPattern.emptyStateLabel.getStartedLink": "サンプルデータで始めましょう。", - "indexPatternManagement.createIndexPattern.emptyStateLabel.learnHowLink": "方法を学習", - "indexPatternManagement.createIndexPattern.emptyStateLabel.needToIndexLabel": "インデックスパターンを作成する前に、Elasticsearchへのデータのインデックスが必要です。", "indexPatternManagement.createIndexPattern.includeSystemIndicesToggleSwitchLabel": "システムと非表示のインデックスを含める", "indexPatternManagement.createIndexPattern.loadClustersFailMsg": "リモートクラスターの読み込みに失敗", "indexPatternManagement.createIndexPattern.loadIndicesFailMsg": "インデックスの読み込みに失敗", @@ -2403,7 +2398,6 @@ "indexPatternManagement.createIndexPattern.step.indexPatternPlaceholder": "index-name-*", "indexPatternManagement.createIndexPattern.step.invalidCharactersErrorMessage": "{indexPatternName}にはスペースや{characterList}は使えません。", "indexPatternManagement.createIndexPattern.step.loadingHeader": "一致するインデックスを検索中…", - "indexPatternManagement.createIndexPattern.step.loadingLabel": "お待ちください…", "indexPatternManagement.createIndexPattern.step.nextStepButton": "次のステップ", "indexPatternManagement.createIndexPattern.step.pagingLabel": "ページごとの行数: {perPage}", "indexPatternManagement.createIndexPattern.step.status.matchAnyLabel.matchAnyDetail": "インデックスパターンは、{sourceCount, plural, one {個のソース} other {個のソース} }と一致します。", @@ -2553,15 +2547,6 @@ "indexPatternManagement.indexPattern.sectionsHeader": "インデックスパターン", "indexPatternManagement.indexPattern.titleExistsLabel": "「{title}」というタイトルのインデックスパターンがすでに存在します。", "indexPatternManagement.indexPatternList.createButton.betaLabel": "ベータ", - "indexPatternManagement.indexPatternPrompt.exampleOne": "チャートを作成したりコンテンツを素早くクエリできるように log-west-001 という名前の単一のデータソースをインデックスします。", - "indexPatternManagement.indexPatternPrompt.exampleOneTitle": "単一のデータソース", - "indexPatternManagement.indexPatternPrompt.examplesTitle": "インデックスパターンの例", - "indexPatternManagement.indexPatternPrompt.exampleThree": "比較目的に履歴の動向を集約できるよう、これらのログのアーカイブされた月々のロールアップメトリックスを指定どおりに別々のインデックスパターンにグループ分けします。", - "indexPatternManagement.indexPatternPrompt.exampleThreeTitle": "カスタムグルーピング", - "indexPatternManagement.indexPatternPrompt.exampleTwo": "すべての西海岸のサーバーログに対してクエリを実行できるように、頭に「log-west」の付いたすべての受信データソースをグループ化します。", - "indexPatternManagement.indexPatternPrompt.exampleTwoTitle": "複数データソース", - "indexPatternManagement.indexPatternPrompt.subtitle": "インデックスパターンは、Kibanaで共有フィールドにクエリを実行できるよう、種類の異なるデータソースをバケットにまとめることができます。", - "indexPatternManagement.indexPatternPrompt.title": "インデックスパターンについて", "indexPatternManagement.indexPatterns.badge.readOnly.text": "読み取り専用", "indexPatternManagement.indexPatterns.badge.readOnly.tooltip": "インデックスパターンを保存できません", "indexPatternManagement.indexPatterns.createBreadcrumb": "インデックスパターンを作成", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index b273f6cc81baf..40f4c9c5897d8 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2389,11 +2389,6 @@ "indexPatternManagement.createIndexPattern.description": "索引模式可以匹配单个源,例如 {single} 或 {multiple} 个数据源、{star}。", "indexPatternManagement.createIndexPattern.documentation": "阅读文档", "indexPatternManagement.createIndexPattern.emptyState.checkDataButton": "检查新数据", - "indexPatternManagement.createIndexPattern.emptyStateHeader": "找不到任何 Elasticsearch 数据", - "indexPatternManagement.createIndexPattern.emptyStateLabel.emptyStateDetail": "{needToIndex}{learnHowLink}或{getStartedLink}", - "indexPatternManagement.createIndexPattern.emptyStateLabel.getStartedLink": "开始使用一些样例数据集。", - "indexPatternManagement.createIndexPattern.emptyStateLabel.learnHowLink": "了解操作方法", - "indexPatternManagement.createIndexPattern.emptyStateLabel.needToIndexLabel": "您需要在 Elasticsearch 中索引一些数据后,才能创建索引模式。", "indexPatternManagement.createIndexPattern.includeSystemIndicesToggleSwitchLabel": "包括系统和隐藏索引", "indexPatternManagement.createIndexPattern.loadClustersFailMsg": "无法加载远程集群", "indexPatternManagement.createIndexPattern.loadIndicesFailMsg": "无法加载索引", @@ -2404,7 +2399,6 @@ "indexPatternManagement.createIndexPattern.step.indexPatternPlaceholder": "index-name-*", "indexPatternManagement.createIndexPattern.step.invalidCharactersErrorMessage": "{indexPatternName} 不能包含空格或字符:{characterList}", "indexPatternManagement.createIndexPattern.step.loadingHeader": "正在寻找匹配的索引......", - "indexPatternManagement.createIndexPattern.step.loadingLabel": "请稍候......", "indexPatternManagement.createIndexPattern.step.nextStepButton": "下一步", "indexPatternManagement.createIndexPattern.step.pagingLabel": "每页行数:{perPage}", "indexPatternManagement.createIndexPattern.step.status.matchAnyLabel.matchAnyDetail": "您的索引模式可以匹配{sourceCount, plural, one {您的 # 个源} other {您的 # 个源中的任何一个} }。", @@ -2554,15 +2548,6 @@ "indexPatternManagement.indexPattern.sectionsHeader": "索引模式", "indexPatternManagement.indexPattern.titleExistsLabel": "具有标题“{title}”的索引模式已存在。", "indexPatternManagement.indexPatternList.createButton.betaLabel": "公测版", - "indexPatternManagement.indexPatternPrompt.exampleOne": "索引单个称作 log-west-001 的数据源,以便可以快速地构建图表或查询其内容。", - "indexPatternManagement.indexPatternPrompt.exampleOneTitle": "单数据源", - "indexPatternManagement.indexPatternPrompt.examplesTitle": "索引模式示例", - "indexPatternManagement.indexPatternPrompt.exampleThree": "具体而言,将这些日志每月存档的汇总/打包指标分组成不同的索引模式,从而可以聚合历史趋势以进行比较。", - "indexPatternManagement.indexPatternPrompt.exampleThreeTitle": "定制分组", - "indexPatternManagement.indexPatternPrompt.exampleTwo": "分组以 log-west* 开头的所有传入数据源,以便可以查询所有西海岸服务器日志。", - "indexPatternManagement.indexPatternPrompt.exampleTwoTitle": "多数据源", - "indexPatternManagement.indexPatternPrompt.subtitle": "索引模式允许您将异类的数据源一起装入存储桶,从而可以在 Kibana 中查询它们共享的字段。", - "indexPatternManagement.indexPatternPrompt.title": "关于索引模式", "indexPatternManagement.indexPatterns.badge.readOnly.text": "只读", "indexPatternManagement.indexPatterns.badge.readOnly.tooltip": "无法保存索引模式", "indexPatternManagement.indexPatterns.createBreadcrumb": "创建索引模式", diff --git a/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts b/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts index bc36f70df3641..cedd96f147c2b 100644 --- a/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts +++ b/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts @@ -130,7 +130,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it(`index pattern listing doesn't show create button`, async () => { await PageObjects.settings.clickKibanaIndexPatterns(); - await testSubjects.existOrFail('indexPatternTable'); + await testSubjects.existOrFail('emptyIndexPatternPrompt'); await testSubjects.missingOrFail('createIndexPatternButton'); }); From 124bd126f88b6ebb785ee7ef37d4e4c93e1f61c0 Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Wed, 12 Aug 2020 14:08:02 -0700 Subject: [PATCH 085/113] Migrated last pieces of legacy fixture code (#74470) * Migrated last pieces of legacy fixture code * Implemented own server for webhook simulator * Fixed type checks. Moved slack simulator to own server * close server after tests run * Fixed due to comments * fixed failing tests --- x-pack/package.json | 4 +- .../actions/builtin_action_types/slack.ts | 25 ++-- .../actions/builtin_action_types/webhook.ts | 25 ++-- .../actions_simulators/server/plugin.ts | 11 ++ .../server/slack_simulation.ts | 69 +++++++++++ .../server/webhook_simulation.ts | 88 ++++++++++++++ .../actions_simulators_legacy/index.ts | 26 ---- .../actions_simulators_legacy/package.json | 7 -- .../slack_simulation.ts | 74 ------------ .../webhook_simulation.ts | 112 ------------------ .../actions/builtin_action_types/slack.ts | 25 ++-- .../actions/builtin_action_types/webhook.ts | 53 +++++++-- .../actions/builtin_action_types/webhook.ts | 30 ++--- yarn.lock | 2 +- 14 files changed, 269 insertions(+), 282 deletions(-) create mode 100644 x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/slack_simulation.ts create mode 100644 x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/webhook_simulation.ts delete mode 100644 x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/index.ts delete mode 100644 x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/package.json delete mode 100644 x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/slack_simulation.ts delete mode 100644 x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/webhook_simulation.ts diff --git a/x-pack/package.json b/x-pack/package.json index b426e790c2d47..2b52646e0f748 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -255,8 +255,8 @@ "cronstrue": "^1.51.0", "cytoscape": "^3.10.0", "d3": "3.5.17", - "d3-scale": "1.0.7", "d3-array": "1.2.4", + "d3-scale": "1.0.7", "dedent": "^0.7.0", "del": "^5.1.0", "dragselect": "1.13.1", @@ -267,7 +267,7 @@ "font-awesome": "4.7.0", "formsy-react": "^1.1.5", "fp-ts": "^2.3.1", - "get-port": "4.2.0", + "get-port": "^4.2.0", "getos": "^3.1.0", "git-url-parse": "11.1.2", "github-markdown-css": "^2.10.0", diff --git a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts index 90660cc99507d..91511b508aca6 100644 --- a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts +++ b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts @@ -4,26 +4,25 @@ * you may not use this file except in compliance with the Elastic License. */ +import http from 'http'; +import getPort from 'get-port'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; -import { - getExternalServiceSimulatorPath, - ExternalServiceSimulator, -} from '../../../../common/fixtures/plugins/actions_simulators/server/plugin'; +import { getSlackServer } from '../../../../common/fixtures/plugins/actions_simulators/server/plugin'; // eslint-disable-next-line import/no-default-export export default function slackTest({ getService }: FtrProviderContext) { const supertest = getService('supertest'); - const kibanaServer = getService('kibanaServer'); describe('slack action', () => { - let slackSimulatorURL: string = ''; + let slackSimulatorURL: string = ''; + let slackServer: http.Server; - // need to wait for kibanaServer to settle ... - before(() => { - slackSimulatorURL = kibanaServer.resolveUrl( - getExternalServiceSimulatorPath(ExternalServiceSimulator.SLACK) - ); + before(async () => { + slackServer = await getSlackServer(); + const availablePort = await getPort({ port: 9000 }); + slackServer.listen(availablePort); + slackSimulatorURL = `http://localhost:${availablePort}`; }); it('should return 403 when creating a slack action', async () => { @@ -44,5 +43,9 @@ export default function slackTest({ getService }: FtrProviderContext) { 'Action type .slack is disabled because your basic license does not support it. Please upgrade your license.', }); }); + + after(() => { + slackServer.close(); + }); }); } diff --git a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts index af1d413ff3c46..039f1d4dd3275 100644 --- a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts +++ b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts @@ -4,25 +4,24 @@ * you may not use this file except in compliance with the Elastic License. */ +import http from 'http'; +import getPort from 'get-port'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; -import { - getExternalServiceSimulatorPath, - ExternalServiceSimulator, -} from '../../../../common/fixtures/plugins/actions_simulators/server/plugin'; +import { getWebhookServer } from '../../../../common/fixtures/plugins/actions_simulators/server/plugin'; // eslint-disable-next-line import/no-default-export export default function webhookTest({ getService }: FtrProviderContext) { const supertest = getService('supertest'); - const kibanaServer = getService('kibanaServer'); describe('webhook action', () => { - let webhookSimulatorURL: string = ''; - + let webhookSimulatorURL: string = ''; + let webhookServer: http.Server; // need to wait for kibanaServer to settle ... - before(() => { - webhookSimulatorURL = kibanaServer.resolveUrl( - getExternalServiceSimulatorPath(ExternalServiceSimulator.WEBHOOK) - ); + before(async () => { + webhookServer = await getWebhookServer(); + const availablePort = await getPort({ port: 9000 }); + webhookServer.listen(availablePort); + webhookSimulatorURL = `http://localhost:${availablePort}`; }); it('should return 403 when creating a webhook action', async () => { @@ -47,5 +46,9 @@ export default function webhookTest({ getService }: FtrProviderContext) { 'Action type .webhook is disabled because your basic license does not support it. Please upgrade your license.', }); }); + + after(() => { + webhookServer.close(); + }); }); } diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/plugin.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/plugin.ts index cb1271494c294..0f7acf5ead1a1 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/plugin.ts +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/plugin.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import http from 'http'; import { Plugin, CoreSetup, IRouter } from 'kibana/server'; import { EncryptedSavedObjectsPluginStart } from '../../../../../../../plugins/encrypted_saved_objects/server'; import { PluginSetupContract as FeaturesPluginSetup } from '../../../../../../../plugins/features/server'; @@ -13,6 +14,8 @@ import { initPlugin as initPagerduty } from './pagerduty_simulation'; import { initPlugin as initServiceNow } from './servicenow_simulation'; import { initPlugin as initJira } from './jira_simulation'; import { initPlugin as initResilient } from './resilient_simulation'; +import { initPlugin as initSlack } from './slack_simulation'; +import { initPlugin as initWebhook } from './webhook_simulation'; export const NAME = 'actions-FTS-external-service-simulators'; @@ -39,6 +42,14 @@ export function getAllExternalServiceSimulatorPaths(): string[] { return allPaths; } +export async function getWebhookServer(): Promise { + return await initWebhook(); +} + +export async function getSlackServer(): Promise { + return await initSlack(); +} + interface FixtureSetupDeps { actions: ActionsPluginSetupContract; features: FeaturesPluginSetup; diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/slack_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/slack_simulation.ts new file mode 100644 index 0000000000000..5032112e702e2 --- /dev/null +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/slack_simulation.ts @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import http from 'http'; + +export async function initPlugin() { + return http.createServer((request, response) => { + if (request.method === 'POST') { + let data = ''; + request.on('data', (chunk) => { + data += chunk; + }); + request.on('end', () => { + const body = JSON.parse(data); + const text = body && body.text; + + if (text == null) { + response.statusCode = 400; + response.end('bad request to slack simulator'); + return; + } + + switch (text) { + case 'success': { + response.statusCode = 200; + response.end('ok'); + return; + } + case 'no_text': + response.statusCode = 400; + response.end('no_text'); + return; + + case 'invalid_payload': + response.statusCode = 400; + response.end('invalid_payload'); + return; + + case 'invalid_token': + response.statusCode = 403; + response.end('invalid_token'); + return; + + case 'status_500': + response.statusCode = 500; + response.end('simulated slack 500 response'); + return; + + case 'rate_limit': + const res = { + retry_after: 1, + ok: false, + error: 'rate_limited', + }; + + response.writeHead(429, { 'Content-Type': 'application/json', 'Retry-After': '1' }); + response.write(JSON.stringify(res)); + response.end(); + return; + } + response.statusCode = 400; + response.end('unknown request to slack simulator'); + }); + } + }); +} diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/webhook_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/webhook_simulation.ts new file mode 100644 index 0000000000000..44d8ea0c2da20 --- /dev/null +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/webhook_simulation.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import expect from '@kbn/expect'; +import http from 'http'; +import { fromNullable, map, filter, getOrElse } from 'fp-ts/lib/Option'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { constant } from 'fp-ts/lib/function'; + +export async function initPlugin() { + return http.createServer((request, response) => { + const credentials = pipe( + fromNullable(request.headers.authorization), + map((authorization) => authorization.split(/\s+/)), + filter((parts) => parts.length > 1), + map((parts) => Buffer.from(parts[1], 'base64').toString()), + filter((credentialsPart) => credentialsPart.indexOf(':') !== -1), + map((credentialsPart) => { + const [username, password] = credentialsPart.split(':'); + return { username, password }; + }), + getOrElse(constant({ username: '', password: '' })) + ); + + if (request.method === 'POST' || request.method === 'PUT') { + let data = ''; + request.on('data', (chunk) => { + data += chunk; + }); + request.on('end', () => { + switch (data) { + case 'success': + response.statusCode = 200; + response.end('OK'); + return; + case 'authenticate': + return validateAuthentication(credentials, response); + case 'success_post_method': + return validateRequestUsesMethod(request.method ?? '', 'post', response); + case 'success_put_method': + return validateRequestUsesMethod(request.method ?? '', 'put', response); + case 'failure': + response.statusCode = 500; + response.end('Error'); + return; + } + response.statusCode = 400; + response.end( + `unknown request to webhook simulator [${data ? `content: ${data}` : `no content`}]` + ); + return; + }); + } else { + request.on('end', () => { + response.statusCode = 400; + response.end('unknown request to webhook simulator [no content]'); + return; + }); + } + }); +} + +function validateAuthentication(credentials: any, res: any) { + try { + expect(credentials).to.eql({ + username: 'elastic', + password: 'changeme', + }); + res.statusCode = 200; + res.end('OK'); + } catch (ex) { + res.statusCode = 403; + res.end(`the validateAuthentication operation failed. ${ex.message}`); + } +} + +function validateRequestUsesMethod(requestMethod: string, method: string, res: any) { + try { + expect(requestMethod.toLowerCase()).to.eql(method); + res.statusCode = 200; + res.end('OK'); + } catch (ex) { + res.statusCode = 403; + res.end(`the validateAuthentication operation failed. ${ex.message}`); + } +} diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/index.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/index.ts deleted file mode 100644 index 43e6a73673556..0000000000000 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import Hapi from 'hapi'; -import { - getExternalServiceSimulatorPath, - NAME, - ExternalServiceSimulator, -} from '../actions_simulators/server/plugin'; - -import { initPlugin as initWebhook } from './webhook_simulation'; -import { initPlugin as initSlack } from './slack_simulation'; - -// eslint-disable-next-line import/no-default-export -export default function (kibana: any) { - return new kibana.Plugin({ - require: ['xpack_main'], - name: `${NAME}-legacy`, - init: (server: Hapi.Server) => { - initWebhook(server, getExternalServiceSimulatorPath(ExternalServiceSimulator.WEBHOOK)); - initSlack(server, getExternalServiceSimulatorPath(ExternalServiceSimulator.SLACK)); - }, - }); -} diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/package.json b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/package.json deleted file mode 100644 index 644cd77d3be75..0000000000000 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "actions-fixtures-legacy", - "version": "0.0.0", - "kibana": { - "version": "kibana" - } -} diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/slack_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/slack_simulation.ts deleted file mode 100644 index b914386b136cc..0000000000000 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/slack_simulation.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; -import Hapi from 'hapi'; - -interface SlackRequest extends Hapi.Request { - payload: { - text: string; - }; -} -export function initPlugin(server: Hapi.Server, path: string) { - server.route({ - method: 'POST', - path, - options: { - auth: false, - validate: { - options: { abortEarly: false }, - payload: Joi.object().keys({ - text: Joi.string(), - }), - }, - }, - handler: slackHandler as Hapi.Lifecycle.Method, - }); -} -// Slack simulator: create a slack action pointing here, and you can get -// different responses based on the message posted. See the README.md for -// more info. - -function slackHandler(request: SlackRequest, h: any) { - const body = request.payload; - const text = body && body.text; - - if (text == null) { - return htmlResponse(h, 400, 'bad request to slack simulator'); - } - - switch (text) { - case 'success': - return htmlResponse(h, 200, 'ok'); - - case 'no_text': - return htmlResponse(h, 400, 'no_text'); - - case 'invalid_payload': - return htmlResponse(h, 400, 'invalid_payload'); - - case 'invalid_token': - return htmlResponse(h, 403, 'invalid_token'); - - case 'status_500': - return htmlResponse(h, 500, 'simulated slack 500 response'); - - case 'rate_limit': - const response = { - retry_after: 1, - ok: false, - error: 'rate_limited', - }; - - return h.response(response).type('application/json').header('retry-after', '1').code(429); - } - - return htmlResponse(h, 400, 'unknown request to slack simulator'); -} - -function htmlResponse(h: any, code: number, text: string) { - return h.response(text).type('text/html').code(code); -} diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/webhook_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/webhook_simulation.ts deleted file mode 100644 index 44e1aff162c92..0000000000000 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators_legacy/webhook_simulation.ts +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import expect from '@kbn/expect'; -import Joi from 'joi'; -import Hapi, { Util } from 'hapi'; -import { fromNullable, map, filter, getOrElse } from 'fp-ts/lib/Option'; -import { pipe } from 'fp-ts/lib/pipeable'; -import { constant } from 'fp-ts/lib/function'; - -interface WebhookRequest extends Hapi.Request { - payload: string; -} - -export async function initPlugin(server: Hapi.Server, path: string) { - server.auth.scheme('identifyCredentialsIfPresent', function identifyCredentialsIfPresent( - s: Hapi.Server, - options?: Hapi.ServerAuthSchemeOptions - ) { - const scheme = { - async authenticate(request: Hapi.Request, h: Hapi.ResponseToolkit) { - const credentials = pipe( - fromNullable(request.headers.authorization), - map((authorization) => authorization.split(/\s+/)), - filter((parts) => parts.length > 1), - map((parts) => Buffer.from(parts[1], 'base64').toString()), - filter((credentialsPart) => credentialsPart.indexOf(':') !== -1), - map((credentialsPart) => { - const [username, password] = credentialsPart.split(':'); - return { username, password }; - }), - getOrElse(constant({ username: '', password: '' })) - ); - - return h.authenticated({ credentials }); - }, - }; - - return scheme; - }); - server.auth.strategy('simple', 'identifyCredentialsIfPresent'); - - server.route({ - method: ['POST', 'PUT'], - path, - options: { - auth: 'simple', - validate: { - options: { abortEarly: false }, - payload: Joi.string(), - }, - }, - handler: webhookHandler as Hapi.Lifecycle.Method, - }); -} - -function webhookHandler(request: WebhookRequest, h: any) { - const body = request.payload; - - switch (body) { - case 'success': - return htmlResponse(h, 200, `OK`); - case 'authenticate': - return validateAuthentication(request, h); - case 'success_post_method': - return validateRequestUsesMethod(request, h, 'post'); - case 'success_put_method': - return validateRequestUsesMethod(request, h, 'put'); - case 'failure': - return htmlResponse(h, 500, `Error`); - } - - return htmlResponse( - h, - 400, - `unknown request to webhook simulator [${body ? `content: ${body}` : `no content`}]` - ); -} - -function validateAuthentication(request: WebhookRequest, h: any) { - const { - auth: { credentials }, - } = request; - try { - expect(credentials).to.eql({ - username: 'elastic', - password: 'changeme', - }); - return htmlResponse(h, 200, `OK`); - } catch (ex) { - return htmlResponse(h, 403, `the validateAuthentication operation failed. ${ex.message}`); - } -} - -function validateRequestUsesMethod( - request: WebhookRequest, - h: any, - method: Util.HTTP_METHODS_PARTIAL -) { - try { - expect(request.method).to.eql(method); - return htmlResponse(h, 200, `OK`); - } catch (ex) { - return htmlResponse(h, 403, `the validateAuthentication operation failed. ${ex.message}`); - } -} - -function htmlResponse(h: any, code: number, text: string) { - return h.response(text).type('text/html').code(code); -} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts index f21bc8edeef1e..c68bcaa0ad4e8 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts @@ -5,28 +5,27 @@ */ import expect from '@kbn/expect'; - +import http from 'http'; +import getPort from 'get-port'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; -import { - getExternalServiceSimulatorPath, - ExternalServiceSimulator, -} from '../../../../common/fixtures/plugins/actions_simulators/server/plugin'; +import { getSlackServer } from '../../../../common/fixtures/plugins/actions_simulators/server/plugin'; // eslint-disable-next-line import/no-default-export export default function slackTest({ getService }: FtrProviderContext) { const supertest = getService('supertest'); - const kibanaServer = getService('kibanaServer'); describe('slack action', () => { let simulatedActionId = ''; - let slackSimulatorURL: string = ''; + let slackSimulatorURL: string = ''; + let slackServer: http.Server; // need to wait for kibanaServer to settle ... - before(() => { - slackSimulatorURL = kibanaServer.resolveUrl( - getExternalServiceSimulatorPath(ExternalServiceSimulator.SLACK) - ); + before(async () => { + slackServer = await getSlackServer(); + const availablePort = await getPort({ port: 9000 }); + slackServer.listen(availablePort); + slackSimulatorURL = `http://localhost:${availablePort}`; }); it('should return 200 when creating a slack action successfully', async () => { @@ -220,5 +219,9 @@ export default function slackTest({ getService }: FtrProviderContext) { expect(result.message).to.match(/error posting a slack message, retry later/); expect(result.retry).to.equal(true); }); + + after(() => { + slackServer.close(); + }); }); } diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts index 7eba753d7e98b..8f17ab54184b5 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts @@ -4,12 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ +import http from 'http'; +import getPort from 'get-port'; import expect from '@kbn/expect'; import { URL, format as formatUrl } from 'url'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; import { getExternalServiceSimulatorPath, ExternalServiceSimulator, + getWebhookServer, } from '../../../../common/fixtures/plugins/actions_simulators/server/plugin'; const defaultValues: Record = { @@ -30,11 +33,13 @@ export default function webhookTest({ getService }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); async function createWebhookAction( - urlWithCreds: string, - config: Record> = {} + webhookSimulatorURL: string, + config: Record> = {}, + kibanaUrlWithCreds: string ): Promise { - const { url: fullUrl, user, password } = extractCredentialsFromUrl(urlWithCreds); - const url = config.url && typeof config.url === 'object' ? parsePort(config.url) : fullUrl; + const { user, password } = extractCredentialsFromUrl(kibanaUrlWithCreds); + const url = + config.url && typeof config.url === 'object' ? parsePort(config.url) : webhookSimulatorURL; const composedConfig = { headers: { 'Content-Type': 'text/plain', @@ -61,11 +66,17 @@ export default function webhookTest({ getService }: FtrProviderContext) { } describe('webhook action', () => { - let webhookSimulatorURL: string = ''; - + let webhookSimulatorURL: string = ''; + let webhookServer: http.Server; + let kibanaURL: string = ''; // need to wait for kibanaServer to settle ... - before(() => { - webhookSimulatorURL = kibanaServer.resolveUrl( + before(async () => { + webhookServer = await getWebhookServer(); + const availablePort = await getPort({ port: 9000 }); + webhookServer.listen(availablePort); + webhookSimulatorURL = `http://localhost:${availablePort}`; + + kibanaURL = kibanaServer.resolveUrl( getExternalServiceSimulatorPath(ExternalServiceSimulator.WEBHOOK) ); }); @@ -117,7 +128,7 @@ export default function webhookTest({ getService }: FtrProviderContext) { }); it('should send authentication to the webhook target', async () => { - const webhookActionId = await createWebhookAction(webhookSimulatorURL); + const webhookActionId = await createWebhookAction(webhookSimulatorURL, {}, kibanaURL); const { body: result } = await supertest .post(`/api/actions/action/${webhookActionId}/_execute`) .set('kbn-xsrf', 'test') @@ -132,7 +143,11 @@ export default function webhookTest({ getService }: FtrProviderContext) { }); it('should support the POST method against webhook target', async () => { - const webhookActionId = await createWebhookAction(webhookSimulatorURL, { method: 'post' }); + const webhookActionId = await createWebhookAction( + webhookSimulatorURL, + { method: 'post' }, + kibanaURL + ); const { body: result } = await supertest .post(`/api/actions/action/${webhookActionId}/_execute`) .set('kbn-xsrf', 'test') @@ -147,7 +162,11 @@ export default function webhookTest({ getService }: FtrProviderContext) { }); it('should support the PUT method against webhook target', async () => { - const webhookActionId = await createWebhookAction(webhookSimulatorURL, { method: 'put' }); + const webhookActionId = await createWebhookAction( + webhookSimulatorURL, + { method: 'put' }, + kibanaURL + ); const { body: result } = await supertest .post(`/api/actions/action/${webhookActionId}/_execute`) .set('kbn-xsrf', 'test') @@ -183,7 +202,11 @@ export default function webhookTest({ getService }: FtrProviderContext) { }); it('should handle unreachable webhook targets', async () => { - const webhookActionId = await createWebhookAction('http://some.non.existent.com/endpoint'); + const webhookActionId = await createWebhookAction( + 'http://some.non.existent.com/endpoint', + {}, + kibanaURL + ); const { body: result } = await supertest .post(`/api/actions/action/${webhookActionId}/_execute`) .set('kbn-xsrf', 'test') @@ -199,7 +222,7 @@ export default function webhookTest({ getService }: FtrProviderContext) { }); it('should handle failing webhook targets', async () => { - const webhookActionId = await createWebhookAction(webhookSimulatorURL); + const webhookActionId = await createWebhookAction(webhookSimulatorURL, {}, kibanaURL); const { body: result } = await supertest .post(`/api/actions/action/${webhookActionId}/_execute`) .set('kbn-xsrf', 'test') @@ -214,6 +237,10 @@ export default function webhookTest({ getService }: FtrProviderContext) { expect(result.message).to.match(/error calling webhook, retry later/); expect(result.serviceMessage).to.eql('[500] Internal Server Error'); }); + + after(() => { + webhookServer.close(); + }); }); } diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts index b3572978cee70..acfbad007d722 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts @@ -4,24 +4,22 @@ * you may not use this file except in compliance with the Elastic License. */ +import http from 'http'; +import getPort from 'get-port'; import expect from '@kbn/expect'; import { URL, format as formatUrl } from 'url'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; -import { - getExternalServiceSimulatorPath, - ExternalServiceSimulator, -} from '../../../../common/fixtures/plugins/actions_simulators/server/plugin'; +import { getWebhookServer } from '../../../../common/fixtures/plugins/actions_simulators/server/plugin'; // eslint-disable-next-line import/no-default-export export default function webhookTest({ getService }: FtrProviderContext) { const supertest = getService('supertest'); - const kibanaServer = getService('kibanaServer'); async function createWebhookAction( - urlWithCreds: string, + webhookSimulatorURL: string, config: Record> = {} ): Promise { - const url = formatUrl(new URL(urlWithCreds), { auth: false }); + const url = formatUrl(new URL(webhookSimulatorURL), { auth: false }); const composedConfig = { headers: { 'Content-Type': 'text/plain', @@ -45,13 +43,13 @@ export default function webhookTest({ getService }: FtrProviderContext) { } describe('webhook action', () => { - let webhookSimulatorURL: string = ''; - - // need to wait for kibanaServer to settle ... - before(() => { - webhookSimulatorURL = kibanaServer.resolveUrl( - getExternalServiceSimulatorPath(ExternalServiceSimulator.WEBHOOK) - ); + let webhookSimulatorURL: string = ''; + let webhookServer: http.Server; + before(async () => { + webhookServer = await getWebhookServer(); + const availablePort = await getPort({ port: 9000 }); + webhookServer.listen(availablePort); + webhookSimulatorURL = `http://localhost:${availablePort}`; }); it('webhook can be executed without username and password', async () => { @@ -68,5 +66,9 @@ export default function webhookTest({ getService }: FtrProviderContext) { expect(result.status).to.eql('ok'); }); + + after(() => { + webhookServer.close(); + }); }); } diff --git a/yarn.lock b/yarn.lock index 4eac262ddfd2f..332215a59e788 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14099,7 +14099,7 @@ get-own-enumerable-property-symbols@^3.0.0: resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203" integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg== -get-port@4.2.0: +get-port@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== From 0eee111cf3969d706812f3e00d123a8dcf091e1a Mon Sep 17 00:00:00 2001 From: Josh Dover Date: Wed, 12 Aug 2020 15:24:29 -0600 Subject: [PATCH 086/113] [reporting] Pass along generic parameters in high-order route handler (#74892) --- .../plugins/reporting/server/routes/jobs.ts | 19 +++++-------------- .../routes/lib/authorized_user_pre_routing.ts | 4 ++-- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/reporting/server/routes/jobs.ts b/x-pack/plugins/reporting/server/routes/jobs.ts index e8eac9e577beb..db62c0cc403fc 100644 --- a/x-pack/plugins/reporting/server/routes/jobs.ts +++ b/x-pack/plugins/reporting/server/routes/jobs.ts @@ -15,11 +15,6 @@ import { downloadJobResponseHandlerFactory, } from './lib/job_response_handler'; -interface ListQuery { - page: string; - size: string; - ids?: string; // optional field forbids us from extending RequestQuery -} const MAIN_ENTRY = `${API_BASE_URL}/jobs`; const handleUnavailable = (res: any) => { @@ -52,11 +47,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); - const { - page: queryPage = '0', - size: querySize = '10', - ids: queryIds = null, - } = req.query as ListQuery; // NOTE: type inference is not working here. userHandler breaks it? + const { page: queryPage = '0', size: querySize = '10', ids: queryIds = null } = req.query; const page = parseInt(queryPage, 10) || 0; const size = Math.min(100, parseInt(querySize, 10) || 10); const jobIds = queryIds ? queryIds.split(',') : null; @@ -116,7 +107,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return handleUnavailable(res); } - const { docId } = req.params as { docId: string }; + const { docId } = req.params; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); @@ -161,7 +152,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return res.custom({ statusCode: 503 }); } - const { docId } = req.params as { docId: string }; + const { docId } = req.params; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); @@ -213,7 +204,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return handleUnavailable(res); } - const { docId } = req.params as { docId: string }; + const { docId } = req.params; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); @@ -239,7 +230,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { return handleUnavailable(res); } - const { docId } = req.params as { docId: string }; + const { docId } = req.params; const { management: { jobTypes = [] }, } = await reporting.getLicenseInfo(); diff --git a/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts b/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts index 3758eafc6d718..e2f393aad57d2 100644 --- a/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts +++ b/x-pack/plugins/reporting/server/routes/lib/authorized_user_pre_routing.ts @@ -12,7 +12,7 @@ import { getUserFactory } from './get_user'; type ReportingUser = AuthenticatedUser | null; const superuserRole = 'superuser'; -export type RequestHandlerUser = RequestHandler extends (...a: infer U) => infer R +export type RequestHandlerUser = RequestHandler extends (...a: infer U) => infer R ? (user: ReportingUser, ...a: U) => R : never; @@ -21,7 +21,7 @@ export const authorizedUserPreRoutingFactory = function authorizedUserPreRouting ) { const setupDeps = reporting.getPluginSetupDeps(); const getUser = getUserFactory(setupDeps.security); - return (handler: RequestHandlerUser): RequestHandler => { + return (handler: RequestHandlerUser): RequestHandler => { return (context, req, res) => { let user: ReportingUser = null; if (setupDeps.security && setupDeps.security.license.isEnabled()) { From 981fdda966d55295893e0cdf7cbe9384fab1fedb Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Wed, 12 Aug 2020 18:31:30 -0500 Subject: [PATCH 087/113] Reduce number of indexed fields in index pattern saved object (#74817) * reduce number of indexed fields in index pattern saved object --- src/plugins/data/server/saved_objects/index_patterns.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/plugins/data/server/saved_objects/index_patterns.ts b/src/plugins/data/server/saved_objects/index_patterns.ts index 44d2813f6e3e8..6aabcdf7c1c01 100644 --- a/src/plugins/data/server/saved_objects/index_patterns.ts +++ b/src/plugins/data/server/saved_objects/index_patterns.ts @@ -42,16 +42,10 @@ export const indexPatternSavedObjectType: SavedObjectsType = { }, }, mappings: { + dynamic: false, properties: { - fieldFormatMap: { type: 'text' }, - fields: { type: 'text' }, - intervalName: { type: 'keyword' }, - notExpandable: { type: 'boolean' }, - sourceFilters: { type: 'text' }, - timeFieldName: { type: 'keyword' }, title: { type: 'text' }, type: { type: 'keyword' }, - typeMeta: { type: 'keyword' }, }, }, migrations: indexPatternSavedObjectTypeMigrations as any, From a735a9f8259a30a790d07936caaf279e922ceb3b Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 12 Aug 2020 16:38:08 -0700 Subject: [PATCH 088/113] [bin/kibana-plugin] support KP plugins instead (#74604) * [cli/kibana-plugin] support KP plugins instead * fix some Logger imports from cli/kibana_keystore Co-authored-by: spalger Co-authored-by: Elastic Machine --- package.json | 1 - packages/kbn-pm/dist/index.js | 72 ----- packages/kbn-pm/src/index.ts | 2 +- packages/kbn-pm/src/production/index.ts | 1 - .../prepare_project_dependencies.test.ts | 40 --- .../prepare_project_dependencies.ts | 59 ---- src/cli_keystore/add.js | 2 +- src/cli_keystore/add.test.js | 2 +- src/cli_keystore/create.js | 2 +- src/cli_keystore/create.test.js | 2 +- src/cli_keystore/get_keystore.js | 2 +- src/cli_keystore/get_keystore.test.js | 2 +- src/cli_keystore/list.js | 2 +- src/cli_keystore/list.test.js | 2 +- src/cli_plugin/cli.js | 15 +- .../__fixtures__/replies/invalid_name.zip | Bin 2333 -> 1295 bytes .../replies/package.no_version.json | 3 - .../__fixtures__/replies/test_plugin.zip | Bin 2988 -> 5382 bytes .../replies/test_plugin_different_version.zip | Bin 2326 -> 2951 bytes .../__fixtures__/replies/test_plugin_many.zip | Bin 421587 -> 413276 bytes src/cli_plugin/install/cleanup.js | 1 - src/cli_plugin/install/cleanup.test.js | 2 +- src/cli_plugin/install/download.js | 7 +- src/cli_plugin/install/download.test.js | 10 +- src/cli_plugin/install/downloaders/file.js | 5 +- src/cli_plugin/install/downloaders/http.js | 8 +- src/cli_plugin/install/index.js | 18 +- src/cli_plugin/install/index.test.js | 13 +- src/cli_plugin/install/install.js | 16 +- src/cli_plugin/install/kibana.js | 11 +- src/cli_plugin/install/kibana.test.js | 27 +- src/cli_plugin/install/pack.js | 19 +- src/cli_plugin/install/pack.test.js | 202 ++++++-------- src/cli_plugin/install/progress.js | 2 +- src/cli_plugin/install/progress.test.js | 5 +- src/cli_plugin/install/rename.js | 9 +- src/cli_plugin/install/rename.test.js | 3 +- src/cli_plugin/install/settings.js | 13 +- src/cli_plugin/install/settings.test.js | 261 +++++------------- src/cli_plugin/install/zip.js | 89 +++--- src/cli_plugin/install/zip.test.js | 106 +++---- src/cli_plugin/lib/error_if_x_pack.js | 6 +- src/cli_plugin/lib/is_oss.js | 2 +- src/cli_plugin/lib/is_oss.test.js | 4 +- src/cli_plugin/lib/log_warnings.js | 2 +- src/cli_plugin/lib/logger.js | 2 +- src/cli_plugin/lib/logger.test.js | 3 +- .../lib/warn_if_plugin_dir_option.js | 27 -- src/cli_plugin/list/index.js | 39 +-- src/cli_plugin/list/list.js | 17 +- src/cli_plugin/list/list.test.js | 91 +++--- src/cli_plugin/list/settings.js | 26 -- src/cli_plugin/list/settings.test.js | 50 ---- src/cli_plugin/remove/index.js | 24 +- src/cli_plugin/remove/remove.js | 5 +- src/cli_plugin/remove/remove.test.js | 10 +- src/cli_plugin/remove/settings.js | 4 +- src/cli_plugin/remove/settings.test.js | 116 +++----- yarn.lock | 12 - 59 files changed, 481 insertions(+), 995 deletions(-) delete mode 100644 packages/kbn-pm/src/production/prepare_project_dependencies.test.ts delete mode 100644 packages/kbn-pm/src/production/prepare_project_dependencies.ts delete mode 100644 src/cli_plugin/install/__fixtures__/replies/package.no_version.json delete mode 100644 src/cli_plugin/lib/warn_if_plugin_dir_option.js delete mode 100644 src/cli_plugin/list/settings.js delete mode 100644 src/cli_plugin/list/settings.test.js diff --git a/package.json b/package.json index becd670e4ddcf..200aa41743f51 100644 --- a/package.json +++ b/package.json @@ -276,7 +276,6 @@ "url-loader": "2.2.0", "uuid": "3.3.2", "val-loader": "^1.1.1", - "validate-npm-package-name": "2.2.2", "vega": "^5.13.0", "vega-lite": "^4.13.1", "vega-schema-url-parser": "^1.1.0", diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 9427cc57805e6..e411dcd472768 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -97,8 +97,6 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(511); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["buildProductionProjects"]; }); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); - /* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getProjects", function() { return _utils_projects__WEBPACK_IMPORTED_MODULE_2__["getProjects"]; }); @@ -59477,9 +59475,6 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(512); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _build_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildProductionProjects"]; }); -/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(748); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); - /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -59500,7 +59495,6 @@ __webpack_require__.r(__webpack_exports__); */ - /***/ }), /* 512 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -90331,71 +90325,5 @@ NestedError.prototype.name = 'NestedError'; module.exports = NestedError; -/***/ }), -/* 748 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return prepareExternalProjectDependencies; }); -/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(164); -/* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(163); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -/** - * All external projects are located within `./plugins/{plugin}` relative - * to the Kibana root directory or `../kibana-extra/{plugin}` relative - * to Kibana itself. - */ - -const isKibanaDep = depVersion => // For ../kibana-extra/ directory (legacy only) -depVersion.includes('../../kibana/packages/') || // For plugins/ directory -depVersion.includes('../../packages/'); -/** - * This prepares the dependencies for an _external_ project. - */ - - -async function prepareExternalProjectDependencies(projectPath) { - const project = await _utils_project__WEBPACK_IMPORTED_MODULE_1__["Project"].fromPath(projectPath); - - if (!project.hasDependencies()) { - return; - } - - const deps = project.allDependencies; - - for (const depName of Object.keys(deps)) { - const depVersion = deps[depName]; // Kibana currently only supports `link:` dependencies on Kibana's own - // packages, as these are packaged into the `node_modules` folder when - // Kibana is built, so we don't need to take any action to enable - // `require(...)` to resolve for these packages. - - if (Object(_utils_package_json__WEBPACK_IMPORTED_MODULE_0__["isLinkDependency"])(depVersion) && !isKibanaDep(depVersion)) { - // For non-Kibana packages we need to set up symlinks during the - // installation process, but this is not something we support yet. - throw new Error('This plugin is using `link:` dependencies for non-Kibana packages'); - } - } -} - /***/ }) /******/ ]); \ No newline at end of file diff --git a/packages/kbn-pm/src/index.ts b/packages/kbn-pm/src/index.ts index 0aa58adb4382f..27ce0a417fdeb 100644 --- a/packages/kbn-pm/src/index.ts +++ b/packages/kbn-pm/src/index.ts @@ -18,7 +18,7 @@ */ export { run } from './cli'; -export { buildProductionProjects, prepareExternalProjectDependencies } from './production'; +export { buildProductionProjects } from './production'; export { getProjects } from './utils/projects'; export { Project } from './utils/project'; export { copyWorkspacePackages } from './utils/workspaces'; diff --git a/packages/kbn-pm/src/production/index.ts b/packages/kbn-pm/src/production/index.ts index 493af2beb648d..f74ab8a4484f1 100644 --- a/packages/kbn-pm/src/production/index.ts +++ b/packages/kbn-pm/src/production/index.ts @@ -18,4 +18,3 @@ */ export { buildProductionProjects } from './build_production_projects'; -export { prepareExternalProjectDependencies } from './prepare_project_dependencies'; diff --git a/packages/kbn-pm/src/production/prepare_project_dependencies.test.ts b/packages/kbn-pm/src/production/prepare_project_dependencies.test.ts deleted file mode 100644 index 13ab8d56e0190..0000000000000 --- a/packages/kbn-pm/src/production/prepare_project_dependencies.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { join, resolve } from 'path'; - -import { prepareExternalProjectDependencies } from './prepare_project_dependencies'; - -const packagesFixtures = resolve(__dirname, '__fixtures__/external_packages'); - -test('does nothing when Kibana `link:` dependencies', async () => { - const projectPath = join(packagesFixtures, 'with_kibana_link_deps'); - - // We're checking for undefined, but we don't really care about what's - // returned, we only care about it resolving. - await expect(prepareExternalProjectDependencies(projectPath)).resolves.toBeUndefined(); -}); - -test('throws if non-Kibana `link` dependencies', async () => { - const projectPath = join(packagesFixtures, 'with_other_link_deps'); - - await expect(prepareExternalProjectDependencies(projectPath)).rejects.toThrow( - 'This plugin is using `link:` dependencies for non-Kibana packages' - ); -}); diff --git a/packages/kbn-pm/src/production/prepare_project_dependencies.ts b/packages/kbn-pm/src/production/prepare_project_dependencies.ts deleted file mode 100644 index 9817770166480..0000000000000 --- a/packages/kbn-pm/src/production/prepare_project_dependencies.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { isLinkDependency } from '../utils/package_json'; -import { Project } from '../utils/project'; - -/** - * All external projects are located within `./plugins/{plugin}` relative - * to the Kibana root directory or `../kibana-extra/{plugin}` relative - * to Kibana itself. - */ -const isKibanaDep = (depVersion: string) => - // For ../kibana-extra/ directory (legacy only) - depVersion.includes('../../kibana/packages/') || - // For plugins/ directory - depVersion.includes('../../packages/'); - -/** - * This prepares the dependencies for an _external_ project. - */ -export async function prepareExternalProjectDependencies(projectPath: string) { - const project = await Project.fromPath(projectPath); - - if (!project.hasDependencies()) { - return; - } - - const deps = project.allDependencies; - - for (const depName of Object.keys(deps)) { - const depVersion = deps[depName]; - - // Kibana currently only supports `link:` dependencies on Kibana's own - // packages, as these are packaged into the `node_modules` folder when - // Kibana is built, so we don't need to take any action to enable - // `require(...)` to resolve for these packages. - if (isLinkDependency(depVersion) && !isKibanaDep(depVersion)) { - // For non-Kibana packages we need to set up symlinks during the - // installation process, but this is not something we support yet. - throw new Error('This plugin is using `link:` dependencies for non-Kibana packages'); - } - } -} diff --git a/src/cli_keystore/add.js b/src/cli_keystore/add.js index 87266702a26cc..44737e387c2d2 100644 --- a/src/cli_keystore/add.js +++ b/src/cli_keystore/add.js @@ -17,7 +17,7 @@ * under the License. */ -import Logger from '../cli_plugin/lib/logger'; +import { Logger } from '../cli_plugin/lib/logger'; import { confirm, question } from '../legacy/server/utils'; import { createPromiseFromStreams, createConcatStream } from '../legacy/utils'; diff --git a/src/cli_keystore/add.test.js b/src/cli_keystore/add.test.js index 320581b470c2b..b5d5009667eb4 100644 --- a/src/cli_keystore/add.test.js +++ b/src/cli_keystore/add.test.js @@ -41,7 +41,7 @@ import { PassThrough } from 'stream'; import { Keystore } from '../legacy/server/keystore'; import { add } from './add'; -import Logger from '../cli_plugin/lib/logger'; +import { Logger } from '../cli_plugin/lib/logger'; import * as prompt from '../legacy/server/utils/prompt'; describe('Kibana keystore', () => { diff --git a/src/cli_keystore/create.js b/src/cli_keystore/create.js index 1af0959821f80..8be1eb36882f1 100644 --- a/src/cli_keystore/create.js +++ b/src/cli_keystore/create.js @@ -17,7 +17,7 @@ * under the License. */ -import Logger from '../cli_plugin/lib/logger'; +import { Logger } from '../cli_plugin/lib/logger'; import { confirm } from '../legacy/server/utils'; export async function create(keystore, command, options) { diff --git a/src/cli_keystore/create.test.js b/src/cli_keystore/create.test.js index 33b5aa4bd07d8..f48b3775ddfff 100644 --- a/src/cli_keystore/create.test.js +++ b/src/cli_keystore/create.test.js @@ -40,7 +40,7 @@ import sinon from 'sinon'; import { Keystore } from '../legacy/server/keystore'; import { create } from './create'; -import Logger from '../cli_plugin/lib/logger'; +import { Logger } from '../cli_plugin/lib/logger'; import * as prompt from '../legacy/server/utils/prompt'; describe('Kibana keystore', () => { diff --git a/src/cli_keystore/get_keystore.js b/src/cli_keystore/get_keystore.js index c8ff2555563ad..e181efe9196b8 100644 --- a/src/cli_keystore/get_keystore.js +++ b/src/cli_keystore/get_keystore.js @@ -20,7 +20,7 @@ import { existsSync } from 'fs'; import { join } from 'path'; -import Logger from '../cli_plugin/lib/logger'; +import { Logger } from '../cli_plugin/lib/logger'; import { getConfigDirectory, getDataPath } from '../core/server/path'; export function getKeystore() { diff --git a/src/cli_keystore/get_keystore.test.js b/src/cli_keystore/get_keystore.test.js index 88102b8f51d57..b1c42fca2f73c 100644 --- a/src/cli_keystore/get_keystore.test.js +++ b/src/cli_keystore/get_keystore.test.js @@ -18,7 +18,7 @@ */ import { getKeystore } from './get_keystore'; -import Logger from '../cli_plugin/lib/logger'; +import { Logger } from '../cli_plugin/lib/logger'; import fs from 'fs'; import sinon from 'sinon'; diff --git a/src/cli_keystore/list.js b/src/cli_keystore/list.js index e9158735a214f..4a99de271bc6a 100644 --- a/src/cli_keystore/list.js +++ b/src/cli_keystore/list.js @@ -17,7 +17,7 @@ * under the License. */ -import Logger from '../cli_plugin/lib/logger'; +import { Logger } from '../cli_plugin/lib/logger'; export function list(keystore, command, options = {}) { const logger = new Logger(options); diff --git a/src/cli_keystore/list.test.js b/src/cli_keystore/list.test.js index 857991b5ae3b9..11c474f908216 100644 --- a/src/cli_keystore/list.test.js +++ b/src/cli_keystore/list.test.js @@ -38,7 +38,7 @@ jest.mock('fs', () => ({ import sinon from 'sinon'; import { Keystore } from '../legacy/server/keystore'; import { list } from './list'; -import Logger from '../cli_plugin/lib/logger'; +import { Logger } from '../cli_plugin/lib/logger'; describe('Kibana keystore', () => { describe('list', () => { diff --git a/src/cli_plugin/cli.js b/src/cli_plugin/cli.js index da1068b54b4b5..e483385b5b9e8 100644 --- a/src/cli_plugin/cli.js +++ b/src/cli_plugin/cli.js @@ -17,12 +17,11 @@ * under the License. */ -import _ from 'lodash'; import { pkg } from '../core/server/utils'; import Command from '../cli/command'; -import listCommand from './list'; -import installCommand from './install'; -import removeCommand from './remove'; +import { listCommand } from './list'; +import { installCommand } from './install'; +import { removeCommand } from './remove'; const argv = process.env.kbnWorkerArgv ? JSON.parse(process.env.kbnWorkerArgv) @@ -44,8 +43,12 @@ program .command('help ') .description('get the help for a specific command') .action(function (cmdName) { - const cmd = _.find(program.commands, { _name: cmdName }); - if (!cmd) return program.error(`unknown command ${cmdName}`); + const cmd = program.commands.find((c) => c._name === cmdName); + + if (!cmd) { + return program.error(`unknown command ${cmdName}`); + } + cmd.help(); }); diff --git a/src/cli_plugin/install/__fixtures__/replies/invalid_name.zip b/src/cli_plugin/install/__fixtures__/replies/invalid_name.zip index 5de9a0677b6cb6681b890ca59cae3988cca1afd4..4d77ba0d389a699887e9706c134b82e7e98f1bba 100644 GIT binary patch literal 1295 zcmWIWW@Zs#0D*>Bwm>igO0Y91Fl1*YCFUjShlcPnuowF4#8(0_h%T+*W?*Fb%E-U~ z)*Jvgq!-N)5riR`d1Z+?nJKz?iMgo|6T5&W!7x@6IT$!loW&x+z#xDyQO_kfKDZ>m zC>8ELklV1h@9hk0zC#8AF6qu)9sxU+d|}nt(b)QcC8oh&V*-;1$E%Pz-HRulIPA{F zvBJT?KWeYi?y^f2dl?g&WACxcH1J%sc%Ub_*wHDvC##pq`^k&M-j{#3N?qAHcU4wz zZD?`y{zFRl&voBS3%=3a&8gTT@JKUfb>#2O>lIsmIKBFO@N%Qx;@n8nK$ZDzat&8*cN+i!ZpSGxxC^z%dc$VSczTGaeWB)?Yr?39mA3FRqp5x=;2rC(W z_8mMdyszS3ubyG>yh5+0K+xk6|6#p#l_33VPd5n6f4~yp&Ca2Fvx@H_Fz!Hs1c?yz z;Hv=2N&|y0KHk^S**`c!9~!-S@t7ew2N;qdj217+38KmA2}ubbe0{<`@P~B-G%!t& zU{)89X51(((ELNx;S59YLxlqk%oc4eERHip4Psw_T*J=6-EqLe6lg!l4G7mwL`p7( zKpA;N@MdHZVaA;wfJ(sNts{scI(Hxp z#g;!HMlvwGb#z4-isF5+pJ6!#M5Fl`=4@DmBPRt=eu04{jnfe}V8%I)+=Fg9a#Vtn z6AUbAyvE2tN#a7b2$V9AV+NEmU|>mO2@^c@Q38sDbQ0jr$_6r!6$oDg-Oa}g;sF3w CgHP1} literal 2333 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 O10N7d0^L>%<^cdfumkS^ diff --git a/src/cli_plugin/install/__fixtures__/replies/test_plugin_different_version.zip b/src/cli_plugin/install/__fixtures__/replies/test_plugin_different_version.zip index 12baa165fdb566d22237d72a9b0afb7d9c965219..b84473cebf954a4f5b186b8d92db55d7ad9da975 100644 GIT binary patch literal 2951 zcmWIWW@Zs#0D;Z1Y=K|~l#pXkU?@o~E{QM5DNWDJi%-c+OG_AzvQnIe;J4m1?t3?R&X;gvV3J^U;vvL05+S0frH^d9KviC2?hprf@bTv1jh%L zc{{_9>yU$h>;EGPjI(uhzjNJ75VUO+H^@?E3+|}ZI{);d&yDqL zlN!Rh{;?m{HrhPf#M+uM;q&J_HVX#HMTL&~l8c?4qI;@(l|S9hjLtc==|%i%=V0q& zjMX_4w!eORl(j{`iQ}VK&c>ThHm_G~`QbF{^TErF>lXE%7q-g1YHA1N%C!m zKl`q(XA4th?0T%F)kTW8EI%AQU+2hugRUaq|M5u$|HPgC7);X(>$a3*c5GjE{g>6X zGdu5bv+FT={zkd*Mj*C*@)e^^IA1JeWvW_1B+#*NYf%|ApP z&M*W&R5;MUY|+-j;y6>(Aoc~wk?b7Y9S1B-fzARs4dQ4Z10?}~_^JdGKz3$QVqPL7 zjlrTGM5DPAd$@o?OpjPAFvA39ADUfnXV`+0TI>BIBH*OPBnC-q0=*pqApyTb=AB+V zbHjQ0j>ZVhUv@KUT+`G%H}4i^FtdBAe1P$UK(BG!Btt2cEk{>W@oaQ&6ux$2&%3J& z*1dh)A(08_^3#qcZP#9ttgQ%4b0rPZ+1LKR$>vbpH=(NbL&<{E8IS+A_|4Cf zdHd2~`o&{=TKr!2lxp%J}KN5B3o>5D_!`{U9 zHSYE58OG0xv~w&uR6e#pWazg6CfS~Ai4Gn91+1XhbN*GDb{`l&_>-I^@ktIEjRTkR z)}s|`hQuZdP*&1~lzos?cp6yBT_;r19YQMUynz8}LymQjK-0@A&d&oEe`lb@ABaXv zldGQv1q7V(3EUJEpyjEn$9Y22_xzdQON^bI7aoO0H)ncwR(2+G zSOzbcvrs5pR~(#Mvl}+qTLYa5aw;M#A$wv2P{y6)_(l#qy?AW?A-UWslm(VM(h?m^ zeTs^X0csw{nH0nvf)8~FO!qo>{;Ic*#tF}>r#*G_GE~5#4cEEh+MXVYC{-U z(g<=Le!GY+uwWj9S&CdXgQ^V}SkkzHk%0!42+V$vJ;+S}5Fb>xT#9B#};06_$FtDUinuX}#CcOYf4s~p$AIuql9j^nOfj_B1ZAZ?| z;FONHEJVZrs31WuVnC%K3~Xt1Vd bAIKp>QUMp>%?h-Pfq@eUOM&742h0NiMn!Wx literal 2326 zcmWIWW@Zs#0D)}@J|18Ol;8u>sX2+oC7H>^sfk6&8TtWmwTji6p2%w1ft>8jq{O^L zBt_C_ii8o0N>YnUbPIAy(=+qH8o0oQeagP!wv=su2M>@3!m`*k=%r_tWTxlk7p3Oq zr=-T`=BJeAq!xo52QkLGt z%%2<#AQxF2dulruXv8}pmd0*WW?o8agQ=!+K3^&dkqu-EN!D>OYtO^;0$Wn^Gr zWny5E$L_0w#N_P6^i-g~^7CQ??&cj*5ZO1+|KN^7Z;|?4Gtcba+aBrk($hQD!J@=B zx#qj4&bW1R=k1QI5&apgE1JH2JhVmD zO)b)BbM@!I>6g5M=A`NON6w$J_2ClB^hAdD0q){$DrzkoEPmLmyf*QY(G}Lo6V%-H z$FHr@ILX|^5`1X~_i_oYzFSFC)T-C6ZqRK!J9YC59*)Pawlgn}mQ8untIMIh-b-76#23#i@?h!ybaODre=Mh5G_gS-t20xSpihpy3I z$fo@x&Inz8!vh7CD)1HZQm_?|U3UL$nu zc7d6_%X8Irm&LEkBeD!Aov+d7*A@cW55h9o-4W#K=;G_Dmz(0LkeI8Gr~t~w3Xp7! z2#cL)huXsM>uT;Fqh-@%=Yzs3W8ytu*7`d23 zw&dbhWlNAHFnVQK)mD&iAeP`N3}Kci04-?3ZV94jM7ECMOEbfobr%>bXF&V{qmiw{ zEHsg=JBi&o+(jsg^^4uUHUfiCbC=;nkS}30B1o|nw8++r01GN;TppY()ypE(M@nC3x+E6fnp(!jevOG{hztjhu8a3lC%)|6sQfUX)<7 z&5svi8;nK{OU&X0W*aChJy?(m8)Tzh!;|KN5+6Dp;LXYg)W^ULgcE_9^MROw0RX19 BoUi}@ diff --git a/src/cli_plugin/install/__fixtures__/replies/test_plugin_many.zip b/src/cli_plugin/install/__fixtures__/replies/test_plugin_many.zip index e4fc8d73feef86f0f34073e0597c6c2351dc4d05..bc58c2bdb9dd7e108ef80ddf6f7c189dc4b92e97 100644 GIT binary patch delta 296290 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 ~%N`^ZJW#&H|R=s50E81?f{-bBH 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%0D{BxmKwG=BV)UvKoc7uRR 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%0AL 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

    }$Ej$&^%9{5_hU;1 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 yeX)LL*6atv{b*(X@I(%r7EjZZiL diff --git a/src/cli_plugin/install/cleanup.js b/src/cli_plugin/install/cleanup.js index f31e028226c27..38354bac4a3df 100644 --- a/src/cli_plugin/install/cleanup.js +++ b/src/cli_plugin/install/cleanup.js @@ -45,6 +45,5 @@ export function cleanArtifacts(settings) { // At this point we're bailing, so swallow any errors on delete. try { del.sync(settings.workingPath); - del.sync(settings.plugins[0].path); } catch (e) {} // eslint-disable-line no-empty } diff --git a/src/cli_plugin/install/cleanup.test.js b/src/cli_plugin/install/cleanup.test.js index 46089f61d5e83..1a4cabbc82b5d 100644 --- a/src/cli_plugin/install/cleanup.test.js +++ b/src/cli_plugin/install/cleanup.test.js @@ -22,7 +22,7 @@ import fs from 'fs'; import del from 'del'; import { cleanPrevious, cleanArtifacts } from './cleanup'; -import Logger from '../lib/logger'; +import { Logger } from '../lib/logger'; describe('kibana cli', function () { describe('plugin installer', function () { diff --git a/src/cli_plugin/install/download.js b/src/cli_plugin/install/download.js index 10d20367c1b7b..b7f5fbec46edc 100644 --- a/src/cli_plugin/install/download.js +++ b/src/cli_plugin/install/download.js @@ -17,11 +17,12 @@ * under the License. */ -import downloadHttpFile from './downloaders/http'; -import downloadLocalFile from './downloaders/file'; -import { UnsupportedProtocolError } from '../lib/errors'; import { parse } from 'url'; +import { UnsupportedProtocolError } from '../lib/errors'; +import { downloadHttpFile } from './downloaders/http'; +import { downloadLocalFile } from './downloaders/file'; + function _isWindows() { return /^win/.test(process.platform); } diff --git a/src/cli_plugin/install/download.test.js b/src/cli_plugin/install/download.test.js index 93e5e414fed74..ae926b77f7d58 100644 --- a/src/cli_plugin/install/download.test.js +++ b/src/cli_plugin/install/download.test.js @@ -17,16 +17,18 @@ * under the License. */ +import Fs from 'fs'; +import { join } from 'path'; +import http from 'http'; + import sinon from 'sinon'; import nock from 'nock'; import glob from 'glob-all'; import del from 'del'; -import Fs from 'fs'; -import Logger from '../lib/logger'; + +import { Logger } from '../lib/logger'; import { UnsupportedProtocolError } from '../lib/errors'; import { download, _downloadSingle, _getFilePath, _checkFilePathDeprecation } from './download'; -import { join } from 'path'; -import http from 'http'; describe('kibana cli', function () { describe('plugin downloader', function () { diff --git a/src/cli_plugin/install/downloaders/file.js b/src/cli_plugin/install/downloaders/file.js index 56f83b03d5a90..c262f1010bbc8 100644 --- a/src/cli_plugin/install/downloaders/file.js +++ b/src/cli_plugin/install/downloaders/file.js @@ -17,9 +17,10 @@ * under the License. */ -import Progress from '../progress'; import { createWriteStream, createReadStream, statSync } from 'fs'; +import { Progress } from '../progress'; + function openSourceFile({ sourcePath }) { try { const fileInfo = statSync(sourcePath); @@ -58,7 +59,7 @@ async function copyFile({ readStream, writeStream, progress }) { /* // Responsible for managing local file transfers */ -export default async function copyLocalFile(logger, sourcePath, targetPath) { +export async function downloadLocalFile(logger, sourcePath, targetPath) { try { const { readStream, fileInfo } = openSourceFile({ sourcePath }); const writeStream = createWriteStream(targetPath); diff --git a/src/cli_plugin/install/downloaders/http.js b/src/cli_plugin/install/downloaders/http.js index 0fc01453f2b4c..e9eafe3737ccb 100644 --- a/src/cli_plugin/install/downloaders/http.js +++ b/src/cli_plugin/install/downloaders/http.js @@ -17,13 +17,15 @@ * under the License. */ -import Wreck from '@hapi/wreck'; -import Progress from '../progress'; import { createWriteStream } from 'fs'; + +import Wreck from '@hapi/wreck'; import HttpProxyAgent from 'http-proxy-agent'; import HttpsProxyAgent from 'https-proxy-agent'; import { getProxyForUrl } from 'proxy-from-env'; +import { Progress } from '../progress'; + function getProxyAgent(sourceUrl, logger) { const proxy = getProxyForUrl(sourceUrl); @@ -91,7 +93,7 @@ function downloadResponse({ resp, targetPath, progress }) { /* Responsible for managing http transfers */ -export default async function downloadUrl(logger, sourceUrl, targetPath, timeout) { +export async function downloadHttpFile(logger, sourceUrl, targetPath, timeout) { try { const { req, resp } = await sendRequest({ sourceUrl, timeout }, logger); diff --git a/src/cli_plugin/install/index.js b/src/cli_plugin/install/index.js index e3c465ea7a3f5..bc7e95b8489f0 100644 --- a/src/cli_plugin/install/index.js +++ b/src/cli_plugin/install/index.js @@ -17,13 +17,12 @@ * under the License. */ -import { fromRoot, pkg } from '../../core/server/utils'; -import install from './install'; -import Logger from '../lib/logger'; +import { pkg } from '../../core/server/utils'; +import { install } from './install'; +import { Logger } from '../lib/logger'; import { getConfigPath } from '../../core/server/path'; import { parse, parseMilliseconds } from './settings'; -import logWarnings from '../lib/log_warnings'; -import { warnIfUsingPluginDirOption } from '../lib/warn_if_plugin_dir_option'; +import { logWarnings } from '../lib/log_warnings'; function processCommand(command, options) { let settings; @@ -37,12 +36,11 @@ function processCommand(command, options) { const logger = new Logger(settings); - warnIfUsingPluginDirOption(settings, fromRoot('plugins'), logger); logWarnings(settings, logger); install(settings, logger); } -export default function pluginInstall(program) { +export function installCommand(program) { program .command('install ') .option('-q, --quiet', 'disable all process messaging except errors') @@ -53,15 +51,9 @@ export default function pluginInstall(program) { 'length of time before failing; 0 for never fail', parseMilliseconds ) - .option( - '-d, --plugin-dir ', - 'path to the directory where plugins are stored (DEPRECATED, known to not work for all plugins)', - fromRoot('plugins') - ) .description( 'install a plugin', `Common examples: - install x-pack install file:///Path/to/my/x-pack.zip install https://path.to/my/x-pack.zip` ) diff --git a/src/cli_plugin/install/index.test.js b/src/cli_plugin/install/index.test.js index 39352f52f20fd..657ca0904041a 100644 --- a/src/cli_plugin/install/index.test.js +++ b/src/cli_plugin/install/index.test.js @@ -18,7 +18,8 @@ */ import sinon from 'sinon'; -import index from './index'; + +import { installCommand } from './index'; describe('kibana cli', function () { describe('plugin installer', function () { @@ -41,7 +42,7 @@ describe('kibana cli', function () { it('should define the command', function () { sinon.spy(program, 'command'); - index(program); + installCommand(program); expect(program.command.calledWith('install ')).toBe(true); program.command.restore(); @@ -50,7 +51,7 @@ describe('kibana cli', function () { it('should define the description', function () { sinon.spy(program, 'description'); - index(program); + installCommand(program); expect(program.description.calledWith('install a plugin')).toBe(true); program.description.restore(); @@ -59,9 +60,9 @@ describe('kibana cli', function () { it('should define the command line options', function () { const spy = sinon.spy(program, 'option'); - const options = [/-q/, /-s/, /-c/, /-t/, /-d/]; + const options = [/-q/, /-s/, /-c/, /-t/]; - index(program); + installCommand(program); for (let i = 0; i < spy.callCount; i++) { const call = spy.getCall(i); @@ -80,7 +81,7 @@ describe('kibana cli', function () { it('should call the action function', function () { sinon.spy(program, 'action'); - index(program); + installCommand(program); expect(program.action.calledOnce).toBe(true); program.action.restore(); diff --git a/src/cli_plugin/install/install.js b/src/cli_plugin/install/install.js index 92be2ac250320..b74b589459112 100644 --- a/src/cli_plugin/install/install.js +++ b/src/cli_plugin/install/install.js @@ -19,20 +19,20 @@ import Fs from 'fs'; import { promisify } from 'util'; +import path from 'path'; + +import del from 'del'; import { download } from './download'; -import path from 'path'; import { cleanPrevious, cleanArtifacts } from './cleanup'; import { extract, getPackData } from './pack'; import { renamePlugin } from './rename'; -import del from 'del'; import { errorIfXPackInstall } from '../lib/error_if_x_pack'; import { existingInstall, assertVersion } from './kibana'; -import { prepareExternalProjectDependencies } from '@kbn/pm'; const mkdir = promisify(Fs.mkdir); -export default async function install(settings, logger) { +export async function install(settings, logger) { try { errorIfXPackInstall(settings, logger); @@ -52,12 +52,8 @@ export default async function install(settings, logger) { assertVersion(settings); - await prepareExternalProjectDependencies(settings.workingPath); - - await renamePlugin( - settings.workingPath, - path.join(settings.pluginDir, settings.plugins[0].name) - ); + const targetDir = path.join(settings.pluginDir, settings.plugins[0].id); + await renamePlugin(settings.workingPath, targetDir); logger.log('Plugin installation complete'); } catch (err) { diff --git a/src/cli_plugin/install/kibana.js b/src/cli_plugin/install/kibana.js index edbcef3e7fed0..f093c1eee3db0 100644 --- a/src/cli_plugin/install/kibana.js +++ b/src/cli_plugin/install/kibana.js @@ -18,15 +18,16 @@ */ import path from 'path'; -import { versionSatisfies, cleanVersion } from '../../legacy/utils/version'; import { statSync } from 'fs'; +import { versionSatisfies, cleanVersion } from '../../legacy/utils/version'; + export function existingInstall(settings, logger) { try { - statSync(path.join(settings.pluginDir, settings.plugins[0].name)); + statSync(path.join(settings.pluginDir, settings.plugins[0].id)); logger.error( - `Plugin ${settings.plugins[0].name} already exists, please remove before installing a new version` + `Plugin ${settings.plugins[0].id} already exists, please remove before installing a new version` ); process.exit(70); } catch (e) { @@ -37,7 +38,7 @@ export function existingInstall(settings, logger) { export function assertVersion(settings) { if (!settings.plugins[0].kibanaVersion) { throw new Error( - `Plugin package.json is missing both a version property (required) and a kibana.version property (optional).` + `Plugin kibana.json is missing both a version property (required) and a kibanaVersion property (optional).` ); } @@ -45,7 +46,7 @@ export function assertVersion(settings) { const expected = cleanVersion(settings.version); if (!versionSatisfies(actual, expected)) { throw new Error( - `Plugin ${settings.plugins[0].name} [${actual}] is incompatible with Kibana [${expected}]` + `Plugin ${settings.plugins[0].id} [${actual}] is incompatible with Kibana [${expected}]` ); } } diff --git a/src/cli_plugin/install/kibana.test.js b/src/cli_plugin/install/kibana.test.js index 8c5dd00d09953..ef3400be73069 100644 --- a/src/cli_plugin/install/kibana.test.js +++ b/src/cli_plugin/install/kibana.test.js @@ -17,12 +17,14 @@ * under the License. */ -import sinon from 'sinon'; -import Logger from '../lib/logger'; import { join } from 'path'; -import del from 'del'; import fs from 'fs'; + +import sinon from 'sinon'; +import del from 'del'; + import { existingInstall, assertVersion } from './kibana'; +import { Logger } from '../lib/logger'; jest.spyOn(fs, 'statSync'); @@ -42,7 +44,7 @@ describe('kibana cli', function () { tempArchiveFile: tempArchiveFilePath, plugin: 'test-plugin', version: '1.0.0', - plugins: [{ name: 'foo' }], + plugins: [{ id: 'foo' }], pluginDir, }; @@ -69,7 +71,10 @@ describe('kibana cli', function () { plugin: 'test-plugin', version: '5.0.0-SNAPSHOT', plugins: [ - { name: 'foo', path: join(testWorkingPath, 'foo'), kibanaVersion: '5.0.0-SNAPSHOT' }, + { + id: 'foo', + kibanaVersion: '5.0.0-SNAPSHOT', + }, ], }; @@ -77,15 +82,17 @@ describe('kibana cli', function () { }); it('should throw an error if plugin is missing a kibana version.', function () { - expect(() => assertVersion(settings)).toThrow( - /plugin package\.json is missing both a version property/i + expect(() => assertVersion(settings)).toThrowErrorMatchingInlineSnapshot( + `"Plugin kibana.json is missing both a version property (required) and a kibanaVersion property (optional)."` ); }); it('should throw an error if plugin kibanaVersion does not match kibana version', function () { settings.plugins[0].kibanaVersion = '1.2.3.4'; - expect(() => assertVersion(settings)).toThrow(/incompatible with Kibana/i); + expect(() => assertVersion(settings)).toThrowErrorMatchingInlineSnapshot( + `"Plugin foo [1.2.3] is incompatible with Kibana [1.0.0]"` + ); }); it('should not throw an error if plugin kibanaVersion matches kibana version', function () { @@ -103,7 +110,9 @@ describe('kibana cli', function () { it('should ignore version info after the dash in checks on invalid version', function () { settings.plugins[0].kibanaVersion = '2.0.0-foo-bar-version-1.2.3'; - expect(() => assertVersion(settings)).toThrow(/incompatible with Kibana/i); + expect(() => assertVersion(settings)).toThrowErrorMatchingInlineSnapshot( + `"Plugin foo [2.0.0] is incompatible with Kibana [1.0.0]"` + ); }); }); diff --git a/src/cli_plugin/install/pack.js b/src/cli_plugin/install/pack.js index 87c94fce2b677..56d7be78e44bc 100644 --- a/src/cli_plugin/install/pack.js +++ b/src/cli_plugin/install/pack.js @@ -18,7 +18,11 @@ */ import { analyzeArchive, extractArchive } from './zip'; -import validate from 'validate-npm-package-name'; + +const CAMEL_CASE_REG_EXP = /^[a-z]{1}([a-zA-Z0-9]{1,})$/; +export function isCamelCase(candidate) { + return CAMEL_CASE_REG_EXP.test(candidate); +} /** * Checks the plugin name. Will throw an exception if it does not meet @@ -27,9 +31,10 @@ import validate from 'validate-npm-package-name'; * @param {object} plugin - a package object from listPackages() */ function assertValidPackageName(plugin) { - const validation = validate(plugin.name); - if (!validation.validForNewPackages) { - throw new Error(`Invalid plugin name [${plugin.name}] in package.json`); + if (!isCamelCase(plugin.id)) { + throw new Error( + `Invalid plugin name [${plugin.id}] in kibana.json, expected it to be valid camelCase` + ); } } @@ -60,17 +65,13 @@ export async function getPackData(settings, logger) { /** * Extracts files from a zip archive to a file path using a filter function - * - * @param {string} archive - file path to a zip archive - * @param {string} targetDir - directory path to where the files should - * extracted */ export async function extract(settings, logger) { try { const plugin = settings.plugins[0]; logger.log('Extracting plugin archive'); - await extractArchive(settings.tempArchiveFile, settings.workingPath, plugin.archivePath); + await extractArchive(settings.tempArchiveFile, settings.workingPath, plugin.stripPrefix); logger.log('Extraction complete'); } catch (err) { logger.error(err.stack); diff --git a/src/cli_plugin/install/pack.test.js b/src/cli_plugin/install/pack.test.js index 05a60107f80ff..c31437e61bebf 100644 --- a/src/cli_plugin/install/pack.test.js +++ b/src/cli_plugin/install/pack.test.js @@ -18,14 +18,15 @@ */ import Fs from 'fs'; +import { join } from 'path'; import sinon from 'sinon'; import glob from 'glob-all'; import del from 'del'; -import Logger from '../lib/logger'; + +import { Logger } from '../lib/logger'; import { extract, getPackData } from './pack'; import { _downloadSingle } from './download'; -import { join } from 'path'; describe('kibana cli', function () { describe('pack', function () { @@ -73,133 +74,104 @@ describe('kibana cli', function () { return _downloadSingle(settings, logger, sourceUrl); } - function shouldReject() { - throw new Error('expected the promise to reject'); - } - describe('extract', function () { - //Also only extracts the content from the kibana folder. - //Ignores the others. - it('successfully extract a valid zip', function () { - return copyReplyFile('test_plugin.zip') - .then(() => { - return getPackData(settings, logger); - }) - .then(() => { - return extract(settings, logger); - }) - .then(() => { - const files = glob.sync('**/*', { cwd: testWorkingPath }); - const expected = [ - 'archive.part', - 'README.md', - 'index.js', - 'package.json', - 'public', - 'public/app.js', - 'extra file only in zip.txt', - ]; - expect(files.sort()).toEqual(expected.sort()); - }); + // Also only extracts the content from the kibana folder. + // Ignores the others. + it('successfully extract a valid zip', async () => { + await copyReplyFile('test_plugin.zip'); + await getPackData(settings, logger); + await extract(settings, logger); + + expect(glob.sync('**/*', { cwd: testWorkingPath })).toMatchInlineSnapshot(` + Array [ + "archive.part", + "bin", + "bin/executable", + "bin/not-executable", + "kibana.json", + "node_modules", + "node_modules/some-package", + "node_modules/some-package/index.js", + "node_modules/some-package/package.json", + "public", + "public/index.js", + ] + `); }); }); - describe('getPackData', function () { - it('populate settings.plugins', function () { - return copyReplyFile('test_plugin.zip') - .then(() => { - return getPackData(settings, logger); - }) - .then(() => { - expect(settings.plugins[0].name).toBe('test-plugin'); - expect(settings.plugins[0].archivePath).toBe('kibana/test-plugin'); - expect(settings.plugins[0].version).toBe('1.0.0'); - expect(settings.plugins[0].kibanaVersion).toBe('1.0.0'); - }); - }); - - it('populate settings.plugin.kibanaVersion', function () { - //kibana.version is defined in this package.json and is different than plugin version - return copyReplyFile('test_plugin_different_version.zip') - .then(() => { - return getPackData(settings, logger); - }) - .then(() => { - expect(settings.plugins[0].kibanaVersion).toBe('5.0.1'); - }); + describe('getPackData', () => { + it('populate settings.plugins', async () => { + await copyReplyFile('test_plugin.zip'); + await getPackData(settings, logger); + expect(settings.plugins).toMatchInlineSnapshot(` + Array [ + Object { + "id": "testPlugin", + "kibanaVersion": "1.0.0", + "stripPrefix": "kibana/test-plugin", + }, + ] + `); }); - it('populate settings.plugin.kibanaVersion (default to plugin version)', function () { - //kibana.version is not defined in this package.json, defaults to plugin version - return copyReplyFile('test_plugin.zip') - .then(() => { - return getPackData(settings, logger); - }) - .then(() => { - expect(settings.plugins[0].kibanaVersion).toBe('1.0.0'); - }); + it('populate settings.plugin.kibanaVersion', async () => { + await copyReplyFile('test_plugin_different_version.zip'); + await getPackData(settings, logger); + expect(settings.plugins).toMatchInlineSnapshot(` + Array [ + Object { + "id": "testPlugin", + "kibanaVersion": "5.0.1", + "stripPrefix": "kibana/test-plugin", + }, + ] + `); }); - it('populate settings.plugins with multiple plugins', function () { - return copyReplyFile('test_plugin_many.zip') - .then(() => { - return getPackData(settings, logger); - }) - .then(() => { - expect(settings.plugins[0].name).toBe('funger-plugin'); - expect(settings.plugins[0].archivePath).toBe('kibana/funger-plugin'); - expect(settings.plugins[0].version).toBe('1.0.0'); - - expect(settings.plugins[1].name).toBe('pdf'); - expect(settings.plugins[1].archivePath).toBe('kibana/pdf-linux'); - expect(settings.plugins[1].version).toBe('1.0.0'); - - expect(settings.plugins[2].name).toBe('pdf'); - expect(settings.plugins[2].archivePath).toBe('kibana/pdf-win32'); - expect(settings.plugins[2].version).toBe('1.0.0'); - - expect(settings.plugins[3].name).toBe('pdf'); - expect(settings.plugins[3].archivePath).toBe('kibana/pdf-win64'); - expect(settings.plugins[3].version).toBe('1.0.0'); - - expect(settings.plugins[4].name).toBe('pdf'); - expect(settings.plugins[4].archivePath).toBe('kibana/pdf'); - expect(settings.plugins[4].version).toBe('1.0.0'); - - expect(settings.plugins[5].name).toBe('test-plugin'); - expect(settings.plugins[5].archivePath).toBe('kibana/test-plugin'); - expect(settings.plugins[5].version).toBe('1.0.0'); - }); + it('populate settings.plugins with multiple plugins', async () => { + await copyReplyFile('test_plugin_many.zip'); + await getPackData(settings, logger); + expect(settings.plugins).toMatchInlineSnapshot(` + Array [ + Object { + "id": "fungerPlugin", + "kibanaVersion": "1.0.0", + "stripPrefix": "kibana/funger-plugin", + }, + Object { + "id": "pdf", + "kibanaVersion": "1.0.0", + "stripPrefix": "kibana/pdf", + }, + Object { + "id": "testPlugin", + "kibanaVersion": "1.0.0", + "stripPrefix": "kibana/test-plugin", + }, + ] + `); }); - it('throw an error if there is no kibana plugin', function () { - return copyReplyFile('test_plugin_no_kibana.zip') - .then(() => { - return getPackData(settings, logger); - }) - .then(shouldReject, (err) => { - expect(err.message).toMatch(/No kibana plugins found in archive/i); - }); + it('throw an error if there is no kibana plugin', async () => { + await copyReplyFile('test_plugin_no_kibana.zip'); + await expect(getPackData(settings, logger)).rejects.toThrowErrorMatchingInlineSnapshot( + `"No kibana plugins found in archive"` + ); }); - it('throw an error with a corrupt zip', function () { - return copyReplyFile('corrupt.zip') - .then(() => { - return getPackData(settings, logger); - }) - .then(shouldReject, (err) => { - expect(err.message).toMatch(/error retrieving/i); - }); + it('throw an error with a corrupt zip', async () => { + await copyReplyFile('corrupt.zip'); + await expect(getPackData(settings, logger)).rejects.toThrowErrorMatchingInlineSnapshot( + `"Error retrieving metadata from plugin archive"` + ); }); - it('throw an error if there an invalid plugin name', function () { - return copyReplyFile('invalid_name.zip') - .then(() => { - return getPackData(settings, logger); - }) - .then(shouldReject, (err) => { - expect(err.message).toMatch(/invalid plugin name/i); - }); + it('throw an error if there an invalid plugin name', async () => { + await copyReplyFile('invalid_name.zip'); + await expect(getPackData(settings, logger)).rejects.toThrowErrorMatchingInlineSnapshot( + `"Invalid plugin name [invalid name] in kibana.json, expected it to be valid camelCase"` + ); }); }); }); diff --git a/src/cli_plugin/install/progress.js b/src/cli_plugin/install/progress.js index e58e4472150b9..5c7d5074603dc 100644 --- a/src/cli_plugin/install/progress.js +++ b/src/cli_plugin/install/progress.js @@ -20,7 +20,7 @@ /** * Generates file transfer progress messages */ -export default class Progress { +export class Progress { constructor(logger) { const self = this; diff --git a/src/cli_plugin/install/progress.test.js b/src/cli_plugin/install/progress.test.js index 3b66e8b3dc86c..ef948bafca836 100644 --- a/src/cli_plugin/install/progress.test.js +++ b/src/cli_plugin/install/progress.test.js @@ -18,8 +18,9 @@ */ import sinon from 'sinon'; -import Progress from './progress'; -import Logger from '../lib/logger'; + +import { Progress } from './progress'; +import { Logger } from '../lib/logger'; describe('kibana cli', function () { describe('plugin installer', function () { diff --git a/src/cli_plugin/install/rename.js b/src/cli_plugin/install/rename.js index 1e5d94d474375..897222a579a4a 100644 --- a/src/cli_plugin/install/rename.js +++ b/src/cli_plugin/install/rename.js @@ -18,6 +18,7 @@ */ import { rename } from 'fs'; + import { delay } from 'lodash'; export function renamePlugin(workingPath, finalPath) { @@ -31,8 +32,12 @@ export function renamePlugin(workingPath, finalPath) { // Retry for up to retryTime seconds const windowsEPERM = process.platform === 'win32' && err.code === 'EPERM'; const retryAvailable = Date.now() - start < retryTime; - if (windowsEPERM && retryAvailable) - return delay(rename, retryDelay, workingPath, finalPath, retry); + + if (windowsEPERM && retryAvailable) { + delay(rename, retryDelay, workingPath, finalPath, retry); + return; + } + reject(err); } resolve(); diff --git a/src/cli_plugin/install/rename.test.js b/src/cli_plugin/install/rename.test.js index 40df75adc5efa..8525c367540f8 100644 --- a/src/cli_plugin/install/rename.test.js +++ b/src/cli_plugin/install/rename.test.js @@ -17,9 +17,10 @@ * under the License. */ -import sinon from 'sinon'; import fs from 'fs'; +import sinon from 'sinon'; + import { renamePlugin } from './rename'; describe('plugin folder rename', function () { diff --git a/src/cli_plugin/install/settings.js b/src/cli_plugin/install/settings.js index 40c845fc37a9e..20a11479321ee 100644 --- a/src/cli_plugin/install/settings.js +++ b/src/cli_plugin/install/settings.js @@ -17,9 +17,12 @@ * under the License. */ -import expiry from 'expiry-js'; import { resolve } from 'path'; +import expiry from 'expiry-js'; + +import { fromRoot } from '../../core/server/utils'; + function generateUrls({ version, plugin }) { return [ plugin, @@ -46,20 +49,14 @@ export function parse(command, options, kbnPackage) { quiet: options.quiet || false, silent: options.silent || false, config: options.config || '', - optimize: options.optimize, plugin: command, version: kbnPackage.version, - pluginDir: options.pluginDir || '', + pluginDir: fromRoot('plugins'), }; settings.urls = generateUrls(settings); settings.workingPath = resolve(settings.pluginDir, '.plugin.installing'); settings.tempArchiveFile = resolve(settings.workingPath, 'archive.part'); - settings.tempPackageFile = resolve(settings.workingPath, 'package.json'); - settings.setPlugin = function (plugin) { - settings.plugin = plugin; - settings.pluginPath = resolve(settings.pluginDir, settings.plugin.name); - }; return settings; } diff --git a/src/cli_plugin/install/settings.test.js b/src/cli_plugin/install/settings.test.js index 39ca07405ade2..54ad453de9ef8 100644 --- a/src/cli_plugin/install/settings.test.js +++ b/src/cli_plugin/install/settings.test.js @@ -17,199 +17,82 @@ * under the License. */ +import { createAbsolutePathSerializer } from '@kbn/dev-utils'; + import { fromRoot } from '../../core/server/utils'; -import { resolve } from 'path'; import { parseMilliseconds, parse } from './settings'; -describe('kibana cli', function () { - describe('plugin installer', function () { - describe('command line option parsing', function () { - describe('parseMilliseconds function', function () { - it('should return 0 for an empty string', function () { - const value = ''; - const result = parseMilliseconds(value); - - expect(result).toBe(0); - }); - - it('should return 0 for a number with an invalid unit of measure', function () { - const result = parseMilliseconds('1gigablasts'); - expect(result).toBe(0); - }); - - it('should assume a number with no unit of measure is specified as milliseconds', function () { - const result = parseMilliseconds(1); - expect(result).toBe(1); - - const result2 = parseMilliseconds('1'); - expect(result2).toBe(1); - }); - - it('should interpret a number with "s" as the unit of measure as seconds', function () { - const result = parseMilliseconds('5s'); - expect(result).toBe(5 * 1000); - }); - - it('should interpret a number with "second" as the unit of measure as seconds', function () { - const result = parseMilliseconds('5second'); - expect(result).toBe(5 * 1000); - }); - - it('should interpret a number with "seconds" as the unit of measure as seconds', function () { - const result = parseMilliseconds('5seconds'); - expect(result).toBe(5 * 1000); - }); - - it('should interpret a number with "m" as the unit of measure as minutes', function () { - const result = parseMilliseconds('9m'); - expect(result).toBe(9 * 1000 * 60); - }); - - it('should interpret a number with "minute" as the unit of measure as minutes', function () { - const result = parseMilliseconds('9minute'); - expect(result).toBe(9 * 1000 * 60); - }); - - it('should interpret a number with "minutes" as the unit of measure as minutes', function () { - const result = parseMilliseconds('9minutes'); - expect(result).toBe(9 * 1000 * 60); - }); - }); - - describe('parse function', function () { - const command = 'plugin name'; - let options = {}; - const kbnPackage = { version: 1234 }; - beforeEach(function () { - options = { pluginDir: fromRoot('plugins') }; - }); - - describe('timeout option', function () { - it('should default to 0 (milliseconds)', function () { - const settings = parse(command, options, kbnPackage); - - expect(settings.timeout).toBe(0); - }); - - it('should set settings.timeout property', function () { - options.timeout = 1234; - const settings = parse(command, options, kbnPackage); - - expect(settings.timeout).toBe(1234); - }); - }); - - describe('quiet option', function () { - it('should default to false', function () { - const settings = parse(command, options, kbnPackage); - - expect(settings.quiet).toBe(false); - }); - - it('should set settings.quiet property to true', function () { - options.quiet = true; - const settings = parse(command, options, kbnPackage); - - expect(settings.quiet).toBe(true); - }); - }); - - describe('silent option', function () { - it('should default to false', function () { - const settings = parse(command, options, kbnPackage); - - expect(settings.silent).toBe(false); - }); - - it('should set settings.silent property to true', function () { - options.silent = true; - const settings = parse(command, options, kbnPackage); - - expect(settings.silent).toBe(true); - }); - }); - - describe('config option', function () { - it('should default to ZLS', function () { - const settings = parse(command, options, kbnPackage); - - expect(settings.config).toBe(''); - }); - - it('should set settings.config property', function () { - options.config = 'foo bar baz'; - const settings = parse(command, options, kbnPackage); - - expect(settings.config).toBe('foo bar baz'); - }); - }); - - describe('pluginDir option', function () { - it('should default to plugins', function () { - const settings = parse(command, options, kbnPackage); - - expect(settings.pluginDir).toBe(fromRoot('plugins')); - }); - - it('should set settings.config property', function () { - options.pluginDir = 'foo bar baz'; - const settings = parse(command, options, kbnPackage); - - expect(settings.pluginDir).toBe('foo bar baz'); - }); - }); - - describe('command value', function () { - it('should set settings.plugin property', function () { - const settings = parse(command, options, kbnPackage); - - expect(settings.plugin).toBe(command); - }); - }); - - describe('urls collection', function () { - it('should populate the settings.urls property', function () { - const settings = parse(command, options, kbnPackage); - - const expected = [ - command, - `https://artifacts.elastic.co/downloads/kibana-plugins/${command}/${command}-1234.zip`, - ]; - - expect(settings.urls).toEqual(expected); - }); - }); - - describe('workingPath value', function () { - it('should set settings.workingPath property', function () { - options.pluginDir = 'foo/bar/baz'; - const settings = parse(command, options, kbnPackage); - const expected = resolve('foo/bar/baz', '.plugin.installing'); - - expect(settings.workingPath).toBe(expected); - }); - }); - - describe('tempArchiveFile value', function () { - it('should set settings.tempArchiveFile property', function () { - options.pluginDir = 'foo/bar/baz'; - const settings = parse(command, options, kbnPackage); - const expected = resolve('foo/bar/baz', '.plugin.installing', 'archive.part'); - - expect(settings.tempArchiveFile).toBe(expected); - }); - }); +const SECOND = 1000; +const MINUTE = SECOND * 60; + +expect.addSnapshotSerializer(createAbsolutePathSerializer()); + +describe('parseMilliseconds function', function () { + it.each([ + ['', 0], + ['1gigablasts', 0], + [1, 1], + ['1', 1], + ['5s', 5 * SECOND], + ['5second', 5 * SECOND], + ['5seconds', 5 * SECOND], + ['9m', 9 * MINUTE], + ['9minute', 9 * MINUTE], + ['9minutes', 9 * MINUTE], + ])('should parse %j to %j', (input, result) => { + expect(parseMilliseconds(input)).toBe(result); + }); +}); - describe('tempPackageFile value', function () { - it('should set settings.tempPackageFile property', function () { - options.pluginDir = 'foo/bar/baz'; - const settings = parse(command, options, kbnPackage); - const expected = resolve('foo/bar/baz', '.plugin.installing', 'package.json'); +describe('parse function', function () { + const command = 'plugin name'; + const defaultOptions = { pluginDir: fromRoot('plugins') }; + const kbnPackage = { version: 1234 }; + + it('produces expected defaults', function () { + expect(parse(command, { ...defaultOptions }, kbnPackage)).toMatchInlineSnapshot(` + Object { + "config": "", + "plugin": "plugin name", + "pluginDir": /plugins, + "quiet": false, + "silent": false, + "tempArchiveFile": /plugins/.plugin.installing/archive.part, + "timeout": 0, + "urls": Array [ + "plugin name", + "https://artifacts.elastic.co/downloads/kibana-plugins/plugin name/plugin name-1234.zip", + ], + "version": 1234, + "workingPath": /plugins/.plugin.installing, + } + `); + }); - expect(settings.tempPackageFile).toBe(expected); - }); - }); - }); - }); + it('consumes overrides', function () { + const options = { + quiet: true, + silent: true, + config: 'foo bar baz', + ...defaultOptions, + }; + + expect(parse(command, options, kbnPackage)).toMatchInlineSnapshot(` + Object { + "config": "foo bar baz", + "plugin": "plugin name", + "pluginDir": /plugins, + "quiet": true, + "silent": true, + "tempArchiveFile": /plugins/.plugin.installing/archive.part, + "timeout": 0, + "urls": Array [ + "plugin name", + "https://artifacts.elastic.co/downloads/kibana-plugins/plugin name/plugin name-1234.zip", + ], + "version": 1234, + "workingPath": /plugins/.plugin.installing, + } + `); }); }); diff --git a/src/cli_plugin/install/zip.js b/src/cli_plugin/install/zip.js index 52eba2ea239a2..b906dd59a302b 100644 --- a/src/cli_plugin/install/zip.js +++ b/src/cli_plugin/install/zip.js @@ -17,21 +17,24 @@ * under the License. */ -import yauzl from 'yauzl'; import path from 'path'; import { createWriteStream, mkdir } from 'fs'; -import { get } from 'lodash'; + +import yauzl from 'yauzl'; + +const isDirectoryRegex = /(\/|\\)$/; +function isDirectory(filename) { + return isDirectoryRegex.test(filename); +} /** * Returns an array of package objects. There will be one for each of - * package.json files in the archive - * - * @param {string} archive - path to plugin archive zip file + * package.json files in the archive */ export function analyzeArchive(archive) { const plugins = []; - const regExp = new RegExp('(kibana[\\\\/][^\\\\/]+)[\\\\/]package.json', 'i'); + const regExp = new RegExp('(kibana[\\\\/][^\\\\/]+)[\\\\/]kibana.json', 'i'); return new Promise((resolve, reject) => { yauzl.open(archive, { lazyEntries: true }, function (err, zipfile) { @@ -47,31 +50,32 @@ export function analyzeArchive(archive) { return zipfile.readEntry(); } - zipfile.openReadStream(entry, function (err, readable) { + zipfile.openReadStream(entry, function (error, readable) { const chunks = []; - if (err) { - return reject(err); + if (error) { + return reject(error); } readable.on('data', (chunk) => chunks.push(chunk)); readable.on('end', function () { - const contents = Buffer.concat(chunks).toString(); - const pkg = JSON.parse(contents); - - plugins.push( - Object.assign(pkg, { - archivePath: match[1], - archive: archive, - - // Plugins must specify their version, and by default that version should match - // the version of kibana down to the patch level. If these two versions need - // to diverge, they can specify a kibana.version to indicate the version of - // kibana the plugin is intended to work with. - kibanaVersion: get(pkg, 'kibana.version', pkg.version), - }) - ); + const manifestJson = Buffer.concat(chunks).toString(); + const manifest = JSON.parse(manifestJson); + + plugins.push({ + id: manifest.id, + stripPrefix: match[1], + + // Plugins must specify their version, and by default that version in the plugin + // manifest should match the version of kibana down to the patch level. If these + // two versions need plugins can specify a kibanaVersion to indicate the version + // of kibana the plugin is intended to work with. + kibanaVersion: + typeof manifest.kibanaVersion === 'string' && manifest.kibanaVersion + ? manifest.kibanaVersion + : manifest.version, + }); zipfile.readEntry(); }); @@ -85,12 +89,7 @@ export function analyzeArchive(archive) { }); } -const isDirectoryRegex = /(\/|\\)$/; -export function _isDirectory(filename) { - return isDirectoryRegex.test(filename); -} - -export function extractArchive(archive, targetDir, extractPath) { +export function extractArchive(archive, targetDir, stripPrefix) { return new Promise((resolve, reject) => { yauzl.open(archive, { lazyEntries: true }, function (err, zipfile) { if (err) { @@ -102,8 +101,8 @@ export function extractArchive(archive, targetDir, extractPath) { zipfile.on('entry', function (entry) { let fileName = entry.fileName; - if (extractPath && fileName.startsWith(extractPath)) { - fileName = fileName.substring(extractPath.length); + if (stripPrefix && fileName.startsWith(stripPrefix)) { + fileName = fileName.substring(stripPrefix.length); } else { return zipfile.readEntry(); } @@ -112,30 +111,34 @@ export function extractArchive(archive, targetDir, extractPath) { fileName = path.join(targetDir, fileName); } - if (_isDirectory(fileName)) { - mkdir(fileName, { recursive: true }, function (err) { - if (err) { - return reject(err); + if (isDirectory(fileName)) { + mkdir(fileName, { recursive: true }, function (error) { + if (error) { + return reject(error); } zipfile.readEntry(); }); } else { // file entry - zipfile.openReadStream(entry, function (err, readStream) { - if (err) { - return reject(err); + zipfile.openReadStream(entry, function (error, readStream) { + if (error) { + return reject(error); } // ensure parent directory exists - mkdir(path.dirname(fileName), { recursive: true }, function (err) { - if (err) { - return reject(err); + mkdir(path.dirname(fileName), { recursive: true }, function (error2) { + if (error2) { + return reject(error2); } readStream.pipe( - createWriteStream(fileName, { mode: entry.externalFileAttributes >>> 16 }) + createWriteStream(fileName, { + // eslint-disable-next-line no-bitwise + mode: entry.externalFileAttributes >>> 16, + }) ); + readStream.on('end', function () { zipfile.readEntry(); }); diff --git a/src/cli_plugin/install/zip.test.js b/src/cli_plugin/install/zip.test.js index 28367e9e24453..0f56c0d0322aa 100644 --- a/src/cli_plugin/install/zip.test.js +++ b/src/cli_plugin/install/zip.test.js @@ -17,12 +17,16 @@ * under the License. */ -import del from 'del'; import path from 'path'; import os from 'os'; -import glob from 'glob'; import fs from 'fs'; -import { analyzeArchive, extractArchive, _isDirectory } from './zip'; + +import del from 'del'; +import glob from 'glob'; + +import { analyzeArchive, extractArchive } from './zip'; + +const getMode = (path) => (fs.statSync(path).mode & parseInt('777', 8)).toString(8); describe('kibana cli', function () { describe('zip', function () { @@ -43,32 +47,37 @@ describe('kibana cli', function () { describe('analyzeArchive', function () { it('returns array of plugins', async () => { const packages = await analyzeArchive(archivePath); - const plugin = packages[0]; - - expect(packages).toBeInstanceOf(Array); - expect(plugin.name).toBe('test-plugin'); - expect(plugin.archivePath).toBe('kibana/test-plugin'); - expect(plugin.archive).toBe(archivePath); - expect(plugin.kibanaVersion).toBe('1.0.0'); + expect(packages).toMatchInlineSnapshot(` + Array [ + Object { + "id": "testPlugin", + "kibanaVersion": "1.0.0", + "stripPrefix": "kibana/test-plugin", + }, + ] + `); }); }); describe('extractArchive', () => { it('extracts files using the extractPath filter', async () => { - const archive = path.resolve(repliesPath, 'test_plugin_many.zip'); - + const archive = path.resolve(repliesPath, 'test_plugin.zip'); await extractArchive(archive, tempPath, 'kibana/test-plugin'); - const files = await glob.sync('**/*', { cwd: tempPath }); - - const expected = [ - 'extra file only in zip.txt', - 'index.js', - 'package.json', - 'public', - 'public/app.js', - 'README.md', - ]; - expect(files.sort()).toEqual(expected.sort()); + + expect(glob.sync('**/*', { cwd: tempPath })).toMatchInlineSnapshot(` + Array [ + "bin", + "bin/executable", + "bin/not-executable", + "kibana.json", + "node_modules", + "node_modules/some-package", + "node_modules/some-package/index.js", + "node_modules/some-package/package.json", + "public", + "public/index.js", + ] + `); }); }); @@ -76,49 +85,26 @@ describe('kibana cli', function () { it('verify consistency of modes of files', async () => { const archivePath = path.resolve(repliesPath, 'test_plugin.zip'); - await extractArchive(archivePath, tempPath, 'kibana/libs'); - const files = await glob.sync('**/*', { cwd: tempPath }); - - const expected = ['executable', 'unexecutable']; - expect(files.sort()).toEqual(expected.sort()); + await extractArchive(archivePath, tempPath, 'kibana/test-plugin/bin'); - const executableMode = - '0' + - (fs.statSync(path.resolve(tempPath, 'executable')).mode & parseInt('777', 8)).toString(8); - const unExecutableMode = - '0' + - (fs.statSync(path.resolve(tempPath, 'unexecutable')).mode & parseInt('777', 8)).toString( - 8 - ); + expect(glob.sync('**/*', { cwd: tempPath })).toMatchInlineSnapshot(` + Array [ + "executable", + "not-executable", + ] + `); - expect(executableMode).toEqual('0755'); - expect(unExecutableMode).toEqual('0644'); + expect(getMode(path.resolve(tempPath, 'executable'))).toEqual('755'); + expect(getMode(path.resolve(tempPath, 'not-executable'))).toEqual('644'); }); }); it('handles a corrupt zip archive', async () => { - try { - await extractArchive(path.resolve(repliesPath, 'corrupt.zip')); - throw new Error('This should have failed'); - } catch (e) { - return; - } - }); - }); - - describe('_isDirectory', () => { - it('should check for a forward slash', () => { - expect(_isDirectory('/foo/bar/')).toBe(true); - }); - - it('should check for a backslash', () => { - expect(_isDirectory('\\foo\\bar\\')).toBe(true); - }); - - it('should return false for files', () => { - expect(_isDirectory('foo.txt')).toBe(false); - expect(_isDirectory('\\path\\to\\foo.txt')).toBe(false); - expect(_isDirectory('/path/to/foo.txt')).toBe(false); + await expect( + extractArchive(path.resolve(repliesPath, 'corrupt.zip')) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"end of central directory record signature not found"` + ); }); }); }); diff --git a/src/cli_plugin/lib/error_if_x_pack.js b/src/cli_plugin/lib/error_if_x_pack.js index d6624f5308ec0..4ea7ceb37478e 100644 --- a/src/cli_plugin/lib/error_if_x_pack.js +++ b/src/cli_plugin/lib/error_if_x_pack.js @@ -17,7 +17,7 @@ * under the License. */ -import { isOSS } from './is_oss'; +import { isOss } from './is_oss'; function isXPack(plugin) { return /x-pack/.test(plugin); @@ -25,7 +25,7 @@ function isXPack(plugin) { export function errorIfXPackInstall(settings) { if (isXPack(settings.plugin)) { - if (isOSS()) { + if (isOss()) { throw new Error( 'You are using the OSS-only distribution of Kibana. ' + 'As of version 6.3+ X-Pack is bundled in the standard distribution of this software by default; ' + @@ -40,7 +40,7 @@ export function errorIfXPackInstall(settings) { } export function errorIfXPackRemove(settings) { - if (isXPack(settings.plugin) && !isOSS()) { + if (isXPack(settings.plugin) && !isOss()) { throw new Error( 'You are using the standard distribution of Kibana. Please install the OSS-only distribution to remove X-Pack features.' ); diff --git a/src/cli_plugin/lib/is_oss.js b/src/cli_plugin/lib/is_oss.js index 3f2190d8346ec..53f19a41228d6 100644 --- a/src/cli_plugin/lib/is_oss.js +++ b/src/cli_plugin/lib/is_oss.js @@ -20,6 +20,6 @@ import fs from 'fs'; import path from 'path'; -export function isOSS() { +export function isOss() { return !fs.existsSync(path.resolve(__dirname, '../../../x-pack')); } diff --git a/src/cli_plugin/lib/is_oss.test.js b/src/cli_plugin/lib/is_oss.test.js index a4673710c63ce..636e1616e7d3c 100644 --- a/src/cli_plugin/lib/is_oss.test.js +++ b/src/cli_plugin/lib/is_oss.test.js @@ -17,12 +17,12 @@ * under the License. */ -import { isOSS } from './is_oss'; +import { isOss } from './is_oss'; describe('is_oss', () => { describe('x-pack installed', () => { it('should return false', () => { - expect(isOSS()).toEqual(false); + expect(isOss()).toEqual(false); }); }); }); diff --git a/src/cli_plugin/lib/log_warnings.js b/src/cli_plugin/lib/log_warnings.js index b4542acecb305..f31c3d4bd2e9a 100644 --- a/src/cli_plugin/lib/log_warnings.js +++ b/src/cli_plugin/lib/log_warnings.js @@ -17,7 +17,7 @@ * under the License. */ -export default function (settings, logger) { +export function logWarnings(logger) { process.on('warning', (warning) => { // deprecation warnings do no reflect a current problem for // the user and therefor should be filtered out. diff --git a/src/cli_plugin/lib/logger.js b/src/cli_plugin/lib/logger.js index efd6130322c38..592618fbecfc8 100644 --- a/src/cli_plugin/lib/logger.js +++ b/src/cli_plugin/lib/logger.js @@ -20,7 +20,7 @@ /** * Logs messages and errors */ -export default class Logger { +export class Logger { constructor(settings = {}) { this.previousLineEnded = true; this.silent = !!settings.silent; diff --git a/src/cli_plugin/lib/logger.test.js b/src/cli_plugin/lib/logger.test.js index 00cad1a9bbb11..7ff683ea50c95 100644 --- a/src/cli_plugin/lib/logger.test.js +++ b/src/cli_plugin/lib/logger.test.js @@ -18,7 +18,8 @@ */ import sinon from 'sinon'; -import Logger from './logger'; + +import { Logger } from './logger'; describe('kibana cli', function () { describe('plugin installer', function () { diff --git a/src/cli_plugin/lib/warn_if_plugin_dir_option.js b/src/cli_plugin/lib/warn_if_plugin_dir_option.js deleted file mode 100644 index eb85ba063c3c9..0000000000000 --- a/src/cli_plugin/lib/warn_if_plugin_dir_option.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -export function warnIfUsingPluginDirOption(options, defaultValue, logger) { - if (options && options.pluginDir !== defaultValue) { - logger.log( - 'Warning: Using the -d, --plugin-dir option is deprecated, and is ' + - 'known to not work for all plugins, including X-Pack.' - ); - } -} diff --git a/src/cli_plugin/list/index.js b/src/cli_plugin/list/index.js index c0f708b8ccf83..a3cf1a54a8a62 100644 --- a/src/cli_plugin/list/index.js +++ b/src/cli_plugin/list/index.js @@ -18,37 +18,16 @@ */ import { fromRoot } from '../../core/server/utils'; -import list from './list'; -import Logger from '../lib/logger'; -import { parse } from './settings'; -import logWarnings from '../lib/log_warnings'; -import { warnIfUsingPluginDirOption } from '../lib/warn_if_plugin_dir_option'; +import { list } from './list'; +import { Logger } from '../lib/logger'; +import { logWarnings } from '../lib/log_warnings'; -function processCommand(command, options) { - let settings; - try { - settings = parse(command, options); - } catch (ex) { - //The logger has not yet been initialized. - console.error(ex.message); - process.exit(64); // eslint-disable-line no-process-exit - } - - const logger = new Logger(settings); - - warnIfUsingPluginDirOption(settings, fromRoot('plugins'), logger); - logWarnings(settings, logger); - list(settings, logger); +function processCommand() { + const logger = new Logger(); + logWarnings(logger); + list(fromRoot('plugins'), logger); } -export default function pluginList(program) { - program - .command('list') - .option( - '-d, --plugin-dir ', - 'path to the directory where plugins are stored (DEPRECATED, known to not work for all plugins)', - fromRoot('plugins') - ) - .description('list installed plugins') - .action(processCommand); +export function listCommand(program) { + program.command('list').description('list installed plugins').action(processCommand); } diff --git a/src/cli_plugin/list/list.js b/src/cli_plugin/list/list.js index b34631e5dfd08..bf6a082a91878 100644 --- a/src/cli_plugin/list/list.js +++ b/src/cli_plugin/list/list.js @@ -20,19 +20,20 @@ import { statSync, readdirSync, readFileSync } from 'fs'; import { join } from 'path'; -export default function list(settings, logger) { - readdirSync(settings.pluginDir).forEach((filename) => { - const stat = statSync(join(settings.pluginDir, filename)); +export function list(pluginDir, logger) { + readdirSync(pluginDir).forEach((name) => { + const stat = statSync(join(pluginDir, name)); - if (stat.isDirectory() && filename[0] !== '.') { + if (stat.isDirectory() && name[0] !== '.') { try { - const packagePath = join(settings.pluginDir, filename, 'package.json'); - const { version } = JSON.parse(readFileSync(packagePath, 'utf8')); - logger.log(filename + '@' + version); + const packagePath = join(pluginDir, name, 'kibana.json'); + const pkg = JSON.parse(readFileSync(packagePath, 'utf8')); + logger.log(pkg.id + '@' + pkg.version); } catch (e) { - throw new Error('Unable to read package.json file for plugin ' + filename); + throw new Error('Unable to read kibana.json file for plugin ' + name); } } }); + logger.log(''); //intentional blank line for aesthetics } diff --git a/src/cli_plugin/list/list.test.js b/src/cli_plugin/list/list.test.js index 071a253fa87fe..b1b5d1cde6a35 100644 --- a/src/cli_plugin/list/list.test.js +++ b/src/cli_plugin/list/list.test.js @@ -17,78 +17,67 @@ * under the License. */ -import sinon from 'sinon'; -import del from 'del'; -import Logger from '../lib/logger'; -import list from './list'; import { join } from 'path'; -import { writeFileSync, appendFileSync, mkdirSync } from 'fs'; +import { writeFileSync, mkdirSync } from 'fs'; + +import del from 'del'; + +import { list } from './list'; function createPlugin(name, version, pluginBaseDir) { const pluginDir = join(pluginBaseDir, name); mkdirSync(pluginDir, { recursive: true }); - appendFileSync(join(pluginDir, 'package.json'), '{"version": "' + version + '"}'); + writeFileSync( + join(pluginDir, 'kibana.json'), + JSON.stringify({ + id: name, + version, + }) + ); } +const logger = { + messages: [], + log(msg) { + this.messages.push(`log: ${msg}`); + }, + error(msg) { + this.messages.push(`error: ${msg}`); + }, +}; + describe('kibana cli', function () { describe('plugin lister', function () { const pluginDir = join(__dirname, '.test.data.list'); - let logger; - - const settings = { - pluginDir: pluginDir, - }; beforeEach(function () { - logger = new Logger(settings); - sinon.stub(logger, 'log'); - sinon.stub(logger, 'error'); + logger.messages.length = 0; del.sync(pluginDir); mkdirSync(pluginDir, { recursive: true }); }); afterEach(function () { - logger.log.restore(); - logger.error.restore(); del.sync(pluginDir); }); - it('list all of the folders in the plugin folder', function () { - createPlugin('plugin1', '5.0.0-alpha2', pluginDir); - createPlugin('plugin2', '3.2.1', pluginDir); - createPlugin('plugin3', '1.2.3', pluginDir); - - list(settings, logger); - - expect(logger.log.calledWith('plugin1@5.0.0-alpha2')).toBe(true); - expect(logger.log.calledWith('plugin2@3.2.1')).toBe(true); - expect(logger.log.calledWith('plugin3@1.2.3')).toBe(true); - }); - - it('ignore folders that start with a period', function () { + it('list all of the folders in the plugin folder, ignoring dot prefixed plugins and regular files', function () { createPlugin('.foo', '1.0.0', pluginDir); createPlugin('plugin1', '5.0.0-alpha2', pluginDir); createPlugin('plugin2', '3.2.1', pluginDir); createPlugin('plugin3', '1.2.3', pluginDir); createPlugin('.bar', '1.0.0', pluginDir); - - list(settings, logger); - - expect(logger.log.calledWith('.foo@1.0.0')).toBe(false); - expect(logger.log.calledWith('.bar@1.0.0')).toBe(false); - }); - - it('list should only list folders', function () { - createPlugin('plugin1', '1.0.0', pluginDir); - createPlugin('plugin2', '1.0.0', pluginDir); - createPlugin('plugin3', '1.0.0', pluginDir); writeFileSync(join(pluginDir, 'plugin4'), 'This is a file, and not a folder.'); - list(settings, logger); + list(pluginDir, logger); - expect(logger.log.calledWith('plugin1@1.0.0')).toBe(true); - expect(logger.log.calledWith('plugin2@1.0.0')).toBe(true); - expect(logger.log.calledWith('plugin3@1.0.0')).toBe(true); + expect(logger.messages).toMatchInlineSnapshot(` + Array [ + "log: plugin1@5.0.0-alpha2", + "log: plugin2@3.2.1", + "log: plugin3@1.2.3", + "log: ", + ] + `); }); it('list should throw an exception if a plugin does not have a package.json', function () { @@ -96,19 +85,23 @@ describe('kibana cli', function () { mkdirSync(join(pluginDir, 'empty-plugin'), { recursive: true }); expect(function () { - list(settings, logger); - }).toThrowError('Unable to read package.json file for plugin empty-plugin'); + list(pluginDir, logger); + }).toThrowErrorMatchingInlineSnapshot( + `"Unable to read kibana.json file for plugin empty-plugin"` + ); }); it('list should throw an exception if a plugin have an empty package.json', function () { createPlugin('plugin1', '1.0.0', pluginDir); const invalidPluginDir = join(pluginDir, 'invalid-plugin'); mkdirSync(invalidPluginDir, { recursive: true }); - appendFileSync(join(invalidPluginDir, 'package.json'), ''); + writeFileSync(join(invalidPluginDir, 'package.json'), ''); expect(function () { - list(settings, logger); - }).toThrowError('Unable to read package.json file for plugin invalid-plugin'); + list(pluginDir, logger); + }).toThrowErrorMatchingInlineSnapshot( + `"Unable to read kibana.json file for plugin invalid-plugin"` + ); }); }); }); diff --git a/src/cli_plugin/list/settings.js b/src/cli_plugin/list/settings.js deleted file mode 100644 index d17ce5deaec30..0000000000000 --- a/src/cli_plugin/list/settings.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -export function parse(command) { - const settings = { - pluginDir: command.pluginDir || '', - }; - - return settings; -} diff --git a/src/cli_plugin/list/settings.test.js b/src/cli_plugin/list/settings.test.js deleted file mode 100644 index 85e6cb88e82fd..0000000000000 --- a/src/cli_plugin/list/settings.test.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { fromRoot } from '../../core/server/utils'; -import { parse } from './settings'; - -describe('kibana cli', function () { - describe('plugin installer', function () { - describe('command line option parsing', function () { - describe('parse function', function () { - let command; - const options = {}; - beforeEach(function () { - command = { pluginDir: fromRoot('plugins') }; - }); - - describe('pluginDir option', function () { - it('should default to plugins', function () { - const settings = parse(command, options); - - expect(settings.pluginDir).toBe(fromRoot('plugins')); - }); - - it('should set settings.config property', function () { - command.pluginDir = 'foo bar baz'; - const settings = parse(command, options); - - expect(settings.pluginDir).toBe('foo bar baz'); - }); - }); - }); - }); - }); -}); diff --git a/src/cli_plugin/remove/index.js b/src/cli_plugin/remove/index.js index 9ff06e0e760bf..c3bd96086db9b 100644 --- a/src/cli_plugin/remove/index.js +++ b/src/cli_plugin/remove/index.js @@ -17,46 +17,34 @@ * under the License. */ -import { fromRoot } from '../../core/server/utils'; -import remove from './remove'; -import Logger from '../lib/logger'; +import { remove } from './remove'; +import { Logger } from '../lib/logger'; import { parse } from './settings'; import { getConfigPath } from '../../core/server/path'; -import logWarnings from '../lib/log_warnings'; -import { warnIfUsingPluginDirOption } from '../lib/warn_if_plugin_dir_option'; +import { logWarnings } from '../lib/log_warnings'; function processCommand(command, options) { let settings; try { settings = parse(command, options); } catch (ex) { - //The logger has not yet been initialized. + // The logger has not yet been initialized. console.error(ex.message); process.exit(64); // eslint-disable-line no-process-exit } const logger = new Logger(settings); - warnIfUsingPluginDirOption(settings, fromRoot('plugins'), logger); logWarnings(settings, logger); remove(settings, logger); } -export default function pluginRemove(program) { +export function removeCommand(program) { program .command('remove ') .option('-q, --quiet', 'disable all process messaging except errors') .option('-s, --silent', 'disable all process messaging') .option('-c, --config ', 'path to the config file', getConfigPath()) - .option( - '-d, --plugin-dir ', - 'path to the directory where plugins are stored (DEPRECATED, known to not work for all plugins)', - fromRoot('plugins') - ) - .description( - 'remove a plugin', - `common examples: - remove x-pack` - ) + .description('remove a plugin') .action(processCommand); } diff --git a/src/cli_plugin/remove/remove.js b/src/cli_plugin/remove/remove.js index 353e592390ff4..0c218301242be 100644 --- a/src/cli_plugin/remove/remove.js +++ b/src/cli_plugin/remove/remove.js @@ -18,11 +18,12 @@ */ import { statSync } from 'fs'; -import { errorIfXPackRemove } from '../lib/error_if_x_pack'; import del from 'del'; -export default function remove(settings, logger) { +import { errorIfXPackRemove } from '../lib/error_if_x_pack'; + +export function remove(settings, logger) { try { let stat; try { diff --git a/src/cli_plugin/remove/remove.test.js b/src/cli_plugin/remove/remove.test.js index 4bf061820aa05..44c66468bbb55 100644 --- a/src/cli_plugin/remove/remove.test.js +++ b/src/cli_plugin/remove/remove.test.js @@ -17,13 +17,15 @@ * under the License. */ +import { join } from 'path'; +import { writeFileSync, existsSync, mkdirSync } from 'fs'; + import sinon from 'sinon'; import glob from 'glob-all'; import del from 'del'; -import Logger from '../lib/logger'; -import remove from './remove'; -import { join } from 'path'; -import { writeFileSync, existsSync, mkdirSync } from 'fs'; + +import { Logger } from '../lib/logger'; +import { remove } from './remove'; describe('kibana cli', function () { describe('plugin remover', function () { diff --git a/src/cli_plugin/remove/settings.js b/src/cli_plugin/remove/settings.js index dc8d3c87e6eab..8a7d41b35ae57 100644 --- a/src/cli_plugin/remove/settings.js +++ b/src/cli_plugin/remove/settings.js @@ -19,12 +19,14 @@ import { resolve } from 'path'; +import { fromRoot } from '../../core/server/utils'; + export function parse(command, options) { const settings = { quiet: options.quiet || false, silent: options.silent || false, config: options.config || '', - pluginDir: options.pluginDir || '', + pluginDir: fromRoot('plugins'), plugin: command, }; diff --git a/src/cli_plugin/remove/settings.test.js b/src/cli_plugin/remove/settings.test.js index b3110e1ff0499..9ae555d79cd1a 100644 --- a/src/cli_plugin/remove/settings.test.js +++ b/src/cli_plugin/remove/settings.test.js @@ -17,88 +17,42 @@ * under the License. */ -import { fromRoot } from '../../core/server/utils'; -import { parse } from './settings'; - -describe('kibana cli', function () { - describe('plugin installer', function () { - describe('command line option parsing', function () { - describe('parse function', function () { - const command = 'plugin name'; - let options = {}; - const kbnPackage = { version: 1234 }; - beforeEach(function () { - options = { pluginDir: fromRoot('plugins') }; - }); - - describe('quiet option', function () { - it('should default to false', function () { - const settings = parse(command, options, kbnPackage); - - expect(settings.quiet).toBe(false); - }); - - it('should set settings.quiet property to true', function () { - options.quiet = true; - const settings = parse(command, options, kbnPackage); - - expect(settings.quiet).toBe(true); - }); - }); - - describe('silent option', function () { - it('should default to false', function () { - const settings = parse(command, options, kbnPackage); - - expect(settings.silent).toBe(false); - }); - - it('should set settings.silent property to true', function () { - options.silent = true; - const settings = parse(command, options, kbnPackage); - - expect(settings.silent).toBe(true); - }); - }); +import { createAbsolutePathSerializer } from '@kbn/dev-utils'; - describe('config option', function () { - it('should default to ZLS', function () { - const settings = parse(command, options, kbnPackage); - - expect(settings.config).toBe(''); - }); - - it('should set settings.config property', function () { - options.config = 'foo bar baz'; - const settings = parse(command, options, kbnPackage); - - expect(settings.config).toBe('foo bar baz'); - }); - }); - - describe('pluginDir option', function () { - it('should default to plugins', function () { - const settings = parse(command, options, kbnPackage); - - expect(settings.pluginDir).toBe(fromRoot('plugins')); - }); - - it('should set settings.config property', function () { - options.pluginDir = 'foo bar baz'; - const settings = parse(command, options, kbnPackage); - - expect(settings.pluginDir).toBe('foo bar baz'); - }); - }); +import { parse } from './settings'; - describe('command value', function () { - it('should set settings.plugin property', function () { - const settings = parse(command, options, kbnPackage); +const command = 'plugin name'; + +expect.addSnapshotSerializer(createAbsolutePathSerializer()); + +it('produces the defaults', () => { + expect(parse(command, {})).toMatchInlineSnapshot(` + Object { + "config": "", + "plugin": "plugin name", + "pluginDir": /plugins, + "pluginPath": /plugins/plugin name, + "quiet": false, + "silent": false, + } + `); +}); - expect(settings.plugin).toBe(command); - }); - }); - }); - }); - }); +it('overrides the defaults with the parsed cli options', () => { + expect( + parse(command, { + quiet: true, + silent: true, + config: 'foo/bar', + }) + ).toMatchInlineSnapshot(` + Object { + "config": "foo/bar", + "plugin": "plugin name", + "pluginDir": /plugins, + "pluginPath": /plugins/plugin name, + "quiet": true, + "silent": true, + } + `); }); diff --git a/yarn.lock b/yarn.lock index 332215a59e788..42c4b800e6b0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7878,11 +7878,6 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= -builtins@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a" - integrity sha1-NVIZzWzxjb58Acx/0tznZc/cVJo= - bytes@1: version "1.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" @@ -29959,13 +29954,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" -validate-npm-package-name@2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-2.2.2.tgz#f65695b22f7324442019a3c7fa39a6e7fd299085" - integrity sha1-9laVsi9zJEQgGaPH+jmm5/0pkIU= - dependencies: - builtins "0.0.7" - validator@^10.11.0: version "10.11.0" resolved "https://registry.yarnpkg.com/validator/-/validator-10.11.0.tgz#003108ea6e9a9874d31ccc9e5006856ccd76b228" From 4ca52e678a86bc4c9ffef02a9886f6242fdb2273 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Wed, 12 Aug 2020 19:26:06 -0500 Subject: [PATCH 089/113] [Security Solution][Detections] Refactor ML calls for newest ML permissions (#74582) ## Summary Addresses https://github.com/elastic/kibana/issues/73567. ML Users (role: `machine_learning_user`) were previously able to invoke the ML Recognizer API, which we use to get not-yet-installed ML Jobs relevant to our index patterns. As of https://github.com/elastic/kibana/pull/64662 this is not true, and so we receive errors from components using the underlying hook, `useSiemJobs`. To solve this I've created two separate hooks to replace `useSiemJobs`: * `useSecurityJobs` * used on ML Popover * includes uninstalled ML Jobs * checks (and returns) `isMlAdmin` before fetching data * `useInstalledSecurityJobs` * used on ML Jobs Dropdown and Anomalies Table * includes only installed ML Jobs * checks (and returns) `isMlUser` before fetching data Note that we while we now receive the knowledge to do so, we do not always inform the user in the case of invalid permissions, and instead have the following behaviors: #### User has insufficient license * ML Popover: shows an upgrade CTA * Anomalies Tables: show no data * Rule Creation: ML Rule option is disabled, shows upgrade CTA * Rule Details: ML Job Id is displayed as text #### User is ML User * ML Popover: not shown * Anomalies Tables: show no data * Rule Creation: ML Rule option is disabled * Rule Details: ML Job Id is displayed as text #### User is ML Admin * ML Popover: shown * Anomalies Tables: show data __for installed ML Jobs__ * This is the same as previous logic, but worth calling out that you can't view historical anomalies * Rule Creation: ML Rule option is enabled, all ML Jobs available * Rule Details: ML Job Id is displayed as hyperlink, job status badge shown ### Checklist - [x] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process) --- .../anomaly_detection_jobs/summary_job.ts | 4 +- x-pack/plugins/ml/public/shared.ts | 1 + .../machine_learning/has_ml_license.test.ts | 20 ++++ .../common/machine_learning/has_ml_license.ts | 10 ++ .../machine_learning/is_security_job.ts | 3 +- .../ml/anomaly/use_anomalies_table_data.ts | 28 ++--- .../components/ml/api/get_jobs_summary.ts | 35 ++++++ .../components/ml/api/get_ml_capabilities.ts | 13 ++- .../ml/hooks/use_get_jobs_summary.ts | 12 ++ .../ml/hooks/use_get_ml_capabilities.ts | 12 ++ .../hooks/use_installed_security_jobs.test.ts | 99 ++++++++++++++++ .../ml/hooks/use_installed_security_jobs.ts | 63 ++++++++++ .../hooks/use_ml_capabilities.ts} | 2 +- .../permissions/ml_capabilities_provider.tsx | 47 +++----- .../ml/tables/anomalies_host_table.tsx | 2 +- .../ml/tables/anomalies_network_table.tsx | 2 +- .../{ml_popover/hooks => ml}/translations.ts | 0 .../{__mocks__/api.tsx => api.mock.ts} | 12 +- .../components/ml_popover/{api.tsx => api.ts} | 19 --- .../components/ml_popover/helpers.test.tsx | 12 +- .../common/components/ml_popover/helpers.tsx | 8 +- .../hooks/use_security_jobs.test.ts | 110 ++++++++++++++++++ .../ml_popover/hooks/use_security_jobs.ts | 95 +++++++++++++++ ...tsx => use_security_jobs_helpers.test.tsx} | 28 ++--- ...pers.tsx => use_security_jobs_helpers.tsx} | 71 +++++------ .../ml_popover/hooks/use_siem_jobs.tsx | 81 ------------- .../jobs_table_filters.test.tsx.snap | 2 +- .../filters/groups_filter_popover.test.tsx | 15 ++- .../filters/groups_filter_popover.tsx | 14 +-- .../filters/jobs_table_filters.test.tsx | 18 +-- .../jobs_table/filters/jobs_table_filters.tsx | 16 ++- .../ml_popover/jobs_table/job_switch.test.tsx | 24 ++-- .../ml_popover/jobs_table/job_switch.tsx | 12 +- .../ml_popover/jobs_table/jobs_table.test.tsx | 24 ++-- .../ml_popover/jobs_table/jobs_table.tsx | 27 +++-- .../components/ml_popover/ml_popover.tsx | 29 +++-- .../common/components/ml_popover/types.ts | 30 +---- .../anomalies_query_tab_body/index.tsx | 6 +- .../anomalies_query_tab_body/utils.ts | 9 +- .../common/hooks/use_app_toasts.mock.ts | 14 +++ .../common/lib/kibana/__mocks__/index.ts | 1 + .../public/common/mock/kibana_core.ts | 2 + .../public/common/mock/kibana_react.ts | 18 --- .../rules/description_step/index.tsx | 6 +- .../ml_job_description.test.tsx | 25 +--- .../description_step/ml_job_description.tsx | 14 +-- .../rules/ml_job_select/index.test.tsx | 6 +- .../components/rules/ml_job_select/index.tsx | 12 +- .../rules/step_define_rule/index.tsx | 5 +- .../detection_engine/rules/all/index.tsx | 6 +- .../detection_engine/rules/details/index.tsx | 6 +- .../public/hosts/pages/details/index.tsx | 2 +- .../public/hosts/pages/hosts.tsx | 2 +- .../network/components/ip_overview/index.tsx | 2 +- .../public/network/pages/index.tsx | 2 +- .../components/host_overview/index.tsx | 2 +- 56 files changed, 733 insertions(+), 407 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/machine_learning/has_ml_license.test.ts create mode 100644 x-pack/plugins/security_solution/common/machine_learning/has_ml_license.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/api/get_jobs_summary.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_jobs_summary.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_ml_capabilities.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.test.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.ts rename x-pack/plugins/security_solution/public/common/components/{ml_popover/hooks/use_ml_capabilities.tsx => ml/hooks/use_ml_capabilities.ts} (80%) rename x-pack/plugins/security_solution/public/common/components/{ml_popover/hooks => ml}/translations.ts (100%) rename x-pack/plugins/security_solution/public/common/components/ml_popover/{__mocks__/api.tsx => api.mock.ts} (99%) rename x-pack/plugins/security_solution/public/common/components/ml_popover/{api.tsx => api.ts} (89%) create mode 100644 x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.test.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.ts rename x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/{use_siem_jobs_helpers.test.tsx => use_security_jobs_helpers.test.tsx} (83%) rename x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/{use_siem_jobs_helpers.tsx => use_security_jobs_helpers.tsx} (59%) delete mode 100644 x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx create mode 100644 x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.mock.ts diff --git a/x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts b/x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts index 2102673060273..d0bce8508e82e 100644 --- a/x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts +++ b/x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts @@ -36,8 +36,8 @@ export interface MlSummaryJob { export interface AuditMessage { job_id: string; msgTime: number; - level: number; - highestLevel: number; + level: string; + highestLevel: string; highestLevelText: string; text: string; } diff --git a/x-pack/plugins/ml/public/shared.ts b/x-pack/plugins/ml/public/shared.ts index 4b1d7ee733dcf..ec884bfac5351 100644 --- a/x-pack/plugins/ml/public/shared.ts +++ b/x-pack/plugins/ml/public/shared.ts @@ -9,6 +9,7 @@ export * from '../common/constants/anomalies'; export * from '../common/types/data_recognizer'; export * from '../common/types/capabilities'; export * from '../common/types/anomalies'; +export * from '../common/types/anomaly_detection_jobs'; export * from '../common/types/modules'; export * from '../common/types/audit_message'; diff --git a/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.test.ts b/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.test.ts new file mode 100644 index 0000000000000..1ffc2e16b78f7 --- /dev/null +++ b/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.test.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { emptyMlCapabilities } from './empty_ml_capabilities'; +import { hasMlLicense } from './has_ml_license'; + +describe('hasMlLicense', () => { + test('it returns false when license is not platinum or trial', () => { + const capabilities = { ...emptyMlCapabilities, isPlatinumOrTrialLicense: false }; + expect(hasMlLicense(capabilities)).toEqual(false); + }); + + test('it returns true when license is platinum or trial', () => { + const capabilities = { ...emptyMlCapabilities, isPlatinumOrTrialLicense: true }; + expect(hasMlLicense(capabilities)).toEqual(true); + }); +}); diff --git a/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.ts b/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.ts new file mode 100644 index 0000000000000..c0b6862ac30fe --- /dev/null +++ b/x-pack/plugins/security_solution/common/machine_learning/has_ml_license.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { MlCapabilitiesResponse } from '../../../ml/common/types/capabilities'; + +export const hasMlLicense = (capabilities: MlCapabilitiesResponse): boolean => + capabilities.isPlatinumOrTrialLicense; diff --git a/x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts b/x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts index 43cfa4ad59964..f5783fc9b3973 100644 --- a/x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts +++ b/x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MlSummaryJob } from '../../../ml/common/types/anomaly_detection_jobs'; import { ML_GROUP_IDS } from '../constants'; -export const isSecurityJob = (job: MlSummaryJob): boolean => +export const isSecurityJob = (job: { groups: string[] }): boolean => job.groups.some((group) => ML_GROUP_IDS.includes(group)); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts index 6fbb308672e5d..e6597de892bff 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts @@ -9,13 +9,11 @@ import { useState, useEffect, useMemo } from 'react'; import { DEFAULT_ANOMALY_SCORE } from '../../../../../common/constants'; import { anomaliesTableData } from '../api/anomalies_table_data'; import { InfluencerInput, Anomalies, CriteriaFields } from '../types'; -import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; -import { useSiemJobs } from '../../ml_popover/hooks/use_siem_jobs'; -import { useMlCapabilities } from '../../ml_popover/hooks/use_ml_capabilities'; -import { useStateToaster, errorToToaster } from '../../toasters'; import * as i18n from './translations'; import { useTimeZone, useUiSetting$ } from '../../../lib/kibana'; +import { useAppToasts } from '../../../hooks/use_app_toasts'; +import { useInstalledSecurityJobs } from '../hooks/use_installed_security_jobs'; interface Args { influencers?: InfluencerInput[]; @@ -58,15 +56,13 @@ export const useAnomaliesTableData = ({ skip = false, }: Args): Return => { const [tableData, setTableData] = useState(null); - const [, siemJobs] = useSiemJobs(true); + const { isMlUser, jobs } = useInstalledSecurityJobs(); const [loading, setLoading] = useState(true); - const capabilities = useMlCapabilities(); - const userPermissions = hasMlUserPermissions(capabilities); - const [, dispatchToaster] = useStateToaster(); + const { addError } = useAppToasts(); const timeZone = useTimeZone(); const [anomalyScore] = useUiSetting$(DEFAULT_ANOMALY_SCORE); - const siemJobIds = siemJobs.filter((job) => job.isInstalled).map((job) => job.id); + const jobIds = jobs.map((job) => job.id); const startDateMs = useMemo(() => new Date(startDate).getTime(), [startDate]); const endDateMs = useMemo(() => new Date(endDate).getTime(), [endDate]); @@ -81,11 +77,11 @@ export const useAnomaliesTableData = ({ earliestMs: number, latestMs: number ) { - if (userPermissions && !skip && siemJobIds.length > 0) { + if (isMlUser && !skip && jobIds.length > 0) { try { const data = await anomaliesTableData( { - jobIds: siemJobIds, + jobIds, criteriaFields: criteriaFieldsInput, aggregationInterval: 'auto', threshold: getThreshold(anomalyScore, threshold), @@ -104,13 +100,13 @@ export const useAnomaliesTableData = ({ } } catch (error) { if (isSubscribed) { - errorToToaster({ title: i18n.SIEM_TABLE_FETCH_FAILURE, error, dispatchToaster }); + addError(error, { title: i18n.SIEM_TABLE_FETCH_FAILURE }); setLoading(false); } } - } else if (!userPermissions && isSubscribed) { + } else if (!isMlUser && isSubscribed) { setLoading(false); - } else if (siemJobIds.length === 0 && isSubscribed) { + } else if (jobIds.length === 0 && isSubscribed) { setLoading(false); } else if (isSubscribed) { setTableData(null); @@ -132,9 +128,9 @@ export const useAnomaliesTableData = ({ startDateMs, endDateMs, skip, - userPermissions, + isMlUser, // eslint-disable-next-line react-hooks/exhaustive-deps - siemJobIds.sort().join(), + jobIds.sort().join(), ]); return [loading, tableData]; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/api/get_jobs_summary.ts b/x-pack/plugins/security_solution/public/common/components/ml/api/get_jobs_summary.ts new file mode 100644 index 0000000000000..15f823814d7fc --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/api/get_jobs_summary.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { HttpSetup } from '../../../../../../../../src/core/public'; +import { MlSummaryJob } from '../../../../../../ml/public'; + +export interface GetJobsSummaryArgs { + http: HttpSetup; + jobIds?: string[]; + signal: AbortSignal; +} + +/** + * Fetches a summary of all ML jobs currently installed + * + * @param http HTTP Service + * @param jobIds Array of job IDs to filter against + * @param signal to cancel request + * + * @throws An error if response is not OK + */ +export const getJobsSummary = async ({ + http, + jobIds, + signal, +}: GetJobsSummaryArgs): Promise => + http.fetch('/api/ml/jobs/jobs_summary', { + method: 'POST', + body: JSON.stringify({ jobIds: jobIds ?? [] }), + asSystemRequest: true, + signal, + }); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/api/get_ml_capabilities.ts b/x-pack/plugins/security_solution/public/common/components/ml/api/get_ml_capabilities.ts index 32f6f888ab8d7..8ee765c1dea47 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/api/get_ml_capabilities.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/api/get_ml_capabilities.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +import { HttpSetup } from '../../../../../../../../src/core/public'; import { MlCapabilitiesResponse } from '../../../../../../ml/public'; -import { KibanaServices } from '../../../lib/kibana'; import { InfluencerInput } from '../types'; export interface Body { @@ -21,10 +21,15 @@ export interface Body { maxExamples: number; } -export const getMlCapabilities = async (signal: AbortSignal): Promise => { - return KibanaServices.get().http.fetch('/api/ml/ml_capabilities', { +export const getMlCapabilities = async ({ + http, + signal, +}: { + http: HttpSetup; + signal: AbortSignal; +}): Promise => + http.fetch('/api/ml/ml_capabilities', { method: 'GET', asSystemRequest: true, signal, }); -}; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_jobs_summary.ts b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_jobs_summary.ts new file mode 100644 index 0000000000000..a80bfb59649cb --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_jobs_summary.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useAsync, withOptionalSignal } from '../../../../shared_imports'; +import { getJobsSummary } from '../api/get_jobs_summary'; + +const _getJobsSummary = withOptionalSignal(getJobsSummary); + +export const useGetJobsSummary = () => useAsync(_getJobsSummary); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_ml_capabilities.ts b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_ml_capabilities.ts new file mode 100644 index 0000000000000..aabd8c7b62e85 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_get_ml_capabilities.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getMlCapabilities } from '../api/get_ml_capabilities'; +import { useAsync, withOptionalSignal } from '../../../../shared_imports'; + +const _getMlCapabilities = withOptionalSignal(getMlCapabilities); + +export const useGetMlCapabilities = () => useAsync(_getMlCapabilities); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.test.ts new file mode 100644 index 0000000000000..72690a1773926 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.test.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { renderHook } from '@testing-library/react-hooks'; + +import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; +import { hasMlLicense } from '../../../../../common/machine_learning/has_ml_license'; +import { isSecurityJob } from '../../../../../common/machine_learning/is_security_job'; +import { useAppToasts } from '../../../hooks/use_app_toasts'; +import { useAppToastsMock } from '../../../hooks/use_app_toasts.mock'; +import { mockJobsSummaryResponse } from '../../ml_popover/api.mock'; +import { getJobsSummary } from '../api/get_jobs_summary'; +import { useInstalledSecurityJobs } from './use_installed_security_jobs'; + +jest.mock('../../../../../common/machine_learning/has_ml_user_permissions'); +jest.mock('../../../../../common/machine_learning/has_ml_license'); +jest.mock('../../../hooks/use_app_toasts'); +jest.mock('../api/get_jobs_summary'); + +describe('useInstalledSecurityJobs', () => { + let appToastsMock: jest.Mocked>; + + beforeEach(() => { + appToastsMock = useAppToastsMock.create(); + (useAppToasts as jest.Mock).mockReturnValue(appToastsMock); + (getJobsSummary as jest.Mock).mockResolvedValue(mockJobsSummaryResponse); + }); + + describe('when the user has permissions', () => { + beforeEach(() => { + (hasMlUserPermissions as jest.Mock).mockReturnValue(true); + (hasMlLicense as jest.Mock).mockReturnValue(true); + }); + + it('returns jobs and permissions', async () => { + const { result, waitForNextUpdate } = renderHook(() => useInstalledSecurityJobs()); + await waitForNextUpdate(); + + expect(result.current.jobs).toHaveLength(3); + expect(result.current.jobs).toEqual( + expect.arrayContaining([ + { + datafeedId: 'datafeed-siem-api-rare_process_linux_ecs', + datafeedIndices: ['auditbeat-*'], + datafeedState: 'stopped', + description: 'SIEM Auditbeat: Detect unusually rare processes on Linux (beta)', + earliestTimestampMs: 1557353420495, + groups: ['siem'], + hasDatafeed: true, + id: 'siem-api-rare_process_linux_ecs', + isSingleMetricViewerJob: true, + jobState: 'closed', + latestTimestampMs: 1557434782207, + memory_status: 'hard_limit', + processed_record_count: 582251, + }, + ]) + ); + expect(result.current.isMlUser).toEqual(true); + expect(result.current.isLicensed).toEqual(true); + }); + + it('filters out non-security jobs', async () => { + const { result, waitForNextUpdate } = renderHook(() => useInstalledSecurityJobs()); + await waitForNextUpdate(); + + expect(result.current.jobs.length).toBeGreaterThan(0); + expect(result.current.jobs.every(isSecurityJob)).toEqual(true); + }); + + it('renders a toast error if the ML call fails', async () => { + (getJobsSummary as jest.Mock).mockRejectedValue('whoops'); + const { waitForNextUpdate } = renderHook(() => useInstalledSecurityJobs()); + await waitForNextUpdate(); + + expect(appToastsMock.addError).toHaveBeenCalledWith('whoops', { + title: 'Security job fetch failure', + }); + }); + }); + + describe('when the user does not have valid permissions', () => { + beforeEach(() => { + (hasMlUserPermissions as jest.Mock).mockReturnValue(false); + (hasMlLicense as jest.Mock).mockReturnValue(false); + }); + + it('returns empty jobs and false predicates', () => { + const { result } = renderHook(() => useInstalledSecurityJobs()); + + expect(result.current.jobs).toEqual([]); + expect(result.current.isMlUser).toEqual(false); + expect(result.current.isLicensed).toEqual(false); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.ts b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.ts new file mode 100644 index 0000000000000..a9a728f81cc6c --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_installed_security_jobs.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useEffect, useState } from 'react'; + +import { MlSummaryJob } from '../../../../../../ml/public'; +import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; +import { hasMlLicense } from '../../../../../common/machine_learning/has_ml_license'; +import { isSecurityJob } from '../../../../../common/machine_learning/is_security_job'; +import { useAppToasts } from '../../../hooks/use_app_toasts'; +import { useHttp } from '../../../lib/kibana'; +import { useMlCapabilities } from './use_ml_capabilities'; +import * as i18n from '../translations'; +import { useGetJobsSummary } from './use_get_jobs_summary'; + +export interface UseInstalledSecurityJobsReturn { + loading: boolean; + jobs: MlSummaryJob[]; + isMlUser: boolean; + isLicensed: boolean; +} + +/** + * Returns a collection of installed ML jobs (MlSummaryJob) relevant to + * Security Solution, i.e. all installed jobs in the `security` ML group. + * Use the corresponding helper functions to filter the job list as + * necessary (running jobs, etc). + * + */ +export const useInstalledSecurityJobs = (): UseInstalledSecurityJobsReturn => { + const [jobs, setJobs] = useState([]); + const { addError } = useAppToasts(); + const mlCapabilities = useMlCapabilities(); + const http = useHttp(); + const { error, loading, result, start } = useGetJobsSummary(); + + const isMlUser = hasMlUserPermissions(mlCapabilities); + const isLicensed = hasMlLicense(mlCapabilities); + + useEffect(() => { + if (isMlUser && isLicensed) { + start({ http }); + } + }, [http, isMlUser, isLicensed, start]); + + useEffect(() => { + if (result) { + const securityJobs = result.filter(isSecurityJob); + setJobs(securityJobs); + } + }, [result]); + + useEffect(() => { + if (error) { + addError(error, { title: i18n.SIEM_JOB_FETCH_FAILURE }); + } + }, [addError, error]); + + return { isLicensed, isMlUser, jobs, loading }; +}; diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_ml_capabilities.tsx b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_ml_capabilities.ts similarity index 80% rename from x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_ml_capabilities.tsx rename to x-pack/plugins/security_solution/public/common/components/ml/hooks/use_ml_capabilities.ts index d897b2554b4fd..4f804a355e4b5 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_ml_capabilities.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/hooks/use_ml_capabilities.ts @@ -6,6 +6,6 @@ import { useContext } from 'react'; -import { MlCapabilitiesContext } from '../../ml/permissions/ml_capabilities_provider'; +import { MlCapabilitiesContext } from '../permissions/ml_capabilities_provider'; export const useMlCapabilities = () => useContext(MlCapabilitiesContext); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx b/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx index c83271a56be5a..c12c8d78da714 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx @@ -8,9 +8,9 @@ import React, { useState, useEffect } from 'react'; import { MlCapabilitiesResponse } from '../../../../../../ml/public'; import { emptyMlCapabilities } from '../../../../../common/machine_learning/empty_ml_capabilities'; -import { getMlCapabilities } from '../api/get_ml_capabilities'; -import { errorToToaster, useStateToaster } from '../../toasters'; - +import { useAppToasts } from '../../../hooks/use_app_toasts'; +import { useHttp } from '../../../lib/kibana'; +import { useGetMlCapabilities } from '../hooks/use_get_ml_capabilities'; import * as i18n from './translations'; interface MlCapabilitiesProvider extends MlCapabilitiesResponse { @@ -32,36 +32,27 @@ export const MlCapabilitiesProvider = React.memo<{ children: JSX.Element }>(({ c const [capabilities, setCapabilities] = useState( emptyMlCapabilitiesProvider ); - const [, dispatchToaster] = useStateToaster(); + const http = useHttp(); + const { addError } = useAppToasts(); + const { start, result, error } = useGetMlCapabilities(); useEffect(() => { - let isSubscribed = true; - const abortCtrl = new AbortController(); + start({ http }); + }, [http, start]); - async function fetchMlCapabilities() { - try { - const mlCapabilities = await getMlCapabilities(abortCtrl.signal); - if (isSubscribed) { - setCapabilities({ ...mlCapabilities, capabilitiesFetched: true }); - } - } catch (error) { - if (isSubscribed) { - errorToToaster({ - title: i18n.MACHINE_LEARNING_PERMISSIONS_FAILURE, - error, - dispatchToaster, - }); - } - } + useEffect(() => { + if (result) { + setCapabilities({ ...result, capabilitiesFetched: true }); } + }, [result]); - fetchMlCapabilities(); - return () => { - isSubscribed = false; - abortCtrl.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + useEffect(() => { + if (error) { + addError(error, { + title: i18n.MACHINE_LEARNING_PERMISSIONS_FAILURE, + }); + } + }, [addError, error]); return ( {children} diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx index 9bfae686b1a59..7fdf41e6b6500 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_host_table.tsx @@ -16,7 +16,7 @@ import { convertAnomaliesToHosts } from './convert_anomalies_to_hosts'; import { Loader } from '../../loader'; import { getIntervalFromAnomalies } from '../anomaly/get_interval_from_anomalies'; import { AnomaliesHostTableProps } from '../types'; -import { useMlCapabilities } from '../../ml_popover/hooks/use_ml_capabilities'; +import { useMlCapabilities } from '../hooks/use_ml_capabilities'; import { BasicTable } from './basic_table'; import { hostEquality } from './host_equality'; import { getCriteriaFromHostType } from '../criteria/get_criteria_from_host_type'; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_network_table.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_network_table.tsx index af27d411b990d..124d8d9a794c1 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_network_table.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/anomalies_network_table.tsx @@ -14,7 +14,7 @@ import { convertAnomaliesToNetwork } from './convert_anomalies_to_network'; import { Loader } from '../../loader'; import { AnomaliesNetworkTableProps } from '../types'; import { getAnomaliesNetworkTableColumnsCurated } from './get_anomalies_network_table_columns'; -import { useMlCapabilities } from '../../ml_popover/hooks/use_ml_capabilities'; +import { useMlCapabilities } from '../hooks/use_ml_capabilities'; import { BasicTable } from './basic_table'; import { networkEquality } from './network_equality'; import { getCriteriaFromNetworkType } from '../criteria/get_criteria_from_network_type'; diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/translations.ts b/x-pack/plugins/security_solution/public/common/components/ml/translations.ts similarity index 100% rename from x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/translations.ts rename to x-pack/plugins/security_solution/public/common/components/ml/translations.ts diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/__mocks__/api.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.mock.ts similarity index 99% rename from x-pack/plugins/security_solution/public/common/components/ml_popover/__mocks__/api.tsx rename to x-pack/plugins/security_solution/public/common/components/ml_popover/api.mock.ts index 54bb0a96207e1..0e8f033ff0cf3 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/__mocks__/api.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.mock.ts @@ -4,16 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ +import { MlSummaryJob } from '../../../../../ml/public'; import { Group, - JobSummary, Module, RecognizerModule, SetupMlResponse, - SiemJob, + SecurityJob, StartDatafeedResponse, StopDatafeedResponse, -} from '../types'; +} from './types'; export const mockGroupsResponse: Group[] = [ { @@ -31,7 +31,7 @@ export const mockGroupsResponse: Group[] = [ { id: 'suricata', jobIds: ['suricata_alert_rate'], calendarIds: [] }, ]; -export const mockOpenedJob: JobSummary = { +export const mockOpenedJob: MlSummaryJob = { datafeedId: 'datafeed-siem-api-rare_process_linux_ecs', datafeedIndices: ['auditbeat-*'], datafeedState: 'started', @@ -48,7 +48,7 @@ export const mockOpenedJob: JobSummary = { processed_record_count: 3425264, }; -export const mockJobsSummaryResponse: JobSummary[] = [ +export const mockJobsSummaryResponse: MlSummaryJob[] = [ { id: 'rc-rare-process-windows-5', description: @@ -491,7 +491,7 @@ export const mockStopDatafeedsSuccess: StopDatafeedResponse = { 'datafeed-linux_anomalous_network_service': { stopped: true }, }; -export const mockSiemJobs: SiemJob[] = [ +export const mockSecurityJobs: SecurityJob[] = [ { id: 'linux_anomalous_network_activity_ecs', description: diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/api.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.ts similarity index 89% rename from x-pack/plugins/security_solution/public/common/components/ml_popover/api.tsx rename to x-pack/plugins/security_solution/public/common/components/ml_popover/api.ts index 7c72098209a06..dd0fb33fd2bc6 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/api.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.ts @@ -9,7 +9,6 @@ import { CloseJobsResponse, ErrorResponse, GetModulesProps, - JobSummary, MlSetupArgs, Module, RecognizerModule, @@ -165,21 +164,3 @@ export const stopDatafeeds = async ({ return [stopDatafeedsResponse, closeJobsResponse]; }; - -/** - * Fetches a summary of all ML jobs currently installed - * - * NOTE: If not sending jobIds in the body, you must at least send an empty body or the server will - * return a 500 - * - * @param signal to cancel request - * - * @throws An error if response is not OK - */ -export const getJobsSummary = async (signal: AbortSignal): Promise => - KibanaServices.get().http.fetch('/api/ml/jobs/jobs_summary', { - method: 'POST', - body: JSON.stringify({}), - asSystemRequest: true, - signal, - }); diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.test.tsx index 0b8da6be57e1b..2a2db46d42307 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.test.tsx @@ -4,14 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import { mockSiemJobs } from './__mocks__/api'; +import { mockSecurityJobs } from './api.mock'; import { filterJobs, getStablePatternTitles, searchFilter } from './helpers'; describe('helpers', () => { describe('filterJobs', () => { test('returns all jobs when no filter is suplied', () => { const filteredJobs = filterJobs({ - jobs: mockSiemJobs, + jobs: mockSecurityJobs, selectedGroups: [], showCustomJobs: false, showElasticJobs: false, @@ -23,17 +23,17 @@ describe('helpers', () => { describe('searchFilter', () => { test('returns all jobs when nullfilterQuery is provided', () => { - const jobsToDisplay = searchFilter(mockSiemJobs); - expect(jobsToDisplay.length).toEqual(mockSiemJobs.length); + const jobsToDisplay = searchFilter(mockSecurityJobs); + expect(jobsToDisplay.length).toEqual(mockSecurityJobs.length); }); test('returns correct DisplayJobs when filterQuery matches job.id', () => { - const jobsToDisplay = searchFilter(mockSiemJobs, 'rare_process'); + const jobsToDisplay = searchFilter(mockSecurityJobs, 'rare_process'); expect(jobsToDisplay.length).toEqual(2); }); test('returns correct DisplayJobs when filterQuery matches job.description', () => { - const jobsToDisplay = searchFilter(mockSiemJobs, 'Detect unusually'); + const jobsToDisplay = searchFilter(mockSecurityJobs, 'Detect unusually'); expect(jobsToDisplay.length).toEqual(2); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.tsx index 5989d052f7cd2..daf9da855c0f9 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/helpers.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { SiemJob } from './types'; +import { SecurityJob } from './types'; /** * Returns a filtered array of Jobs according to JobsTableFilters selections @@ -22,12 +22,12 @@ export const filterJobs = ({ showElasticJobs, filterQuery, }: { - jobs: SiemJob[]; + jobs: SecurityJob[]; selectedGroups: string[]; showCustomJobs: boolean; showElasticJobs: boolean; filterQuery: string; -}): SiemJob[] => +}): SecurityJob[] => searchFilter( jobs .filter((job) => !showCustomJobs || (showCustomJobs && !job.isElasticJob)) @@ -44,7 +44,7 @@ export const filterJobs = ({ * @param jobs to filter * @param filterQuery user-provided search string to filter for occurrence in job names/description */ -export const searchFilter = (jobs: SiemJob[], filterQuery?: string): SiemJob[] => +export const searchFilter = (jobs: SecurityJob[], filterQuery?: string): SecurityJob[] => jobs.filter((job) => filterQuery == null ? true diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.test.ts b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.test.ts new file mode 100644 index 0000000000000..80f50912a84f2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.test.ts @@ -0,0 +1,110 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { renderHook } from '@testing-library/react-hooks'; + +import { hasMlAdminPermissions } from '../../../../../common/machine_learning/has_ml_admin_permissions'; +import { hasMlLicense } from '../../../../../common/machine_learning/has_ml_license'; +import { useAppToasts } from '../../../hooks/use_app_toasts'; +import { useAppToastsMock } from '../../../hooks/use_app_toasts.mock'; +import { getJobsSummary } from '../../ml/api/get_jobs_summary'; +import { checkRecognizer, getModules } from '../api'; +import { SecurityJob } from '../types'; +import { + mockJobsSummaryResponse, + mockGetModuleResponse, + checkRecognizerSuccess, +} from '../api.mock'; +import { useSecurityJobs } from './use_security_jobs'; + +jest.mock('../../../../../common/machine_learning/has_ml_admin_permissions'); +jest.mock('../../../../../common/machine_learning/has_ml_license'); +jest.mock('../../../lib/kibana'); +jest.mock('../../../hooks/use_app_toasts'); +jest.mock('../../ml/hooks/use_ml_capabilities'); +jest.mock('../../ml/api/get_jobs_summary'); +jest.mock('../api'); + +describe('useSecurityJobs', () => { + let appToastsMock: jest.Mocked>; + + beforeEach(() => { + appToastsMock = useAppToastsMock.create(); + (useAppToasts as jest.Mock).mockReturnValue(appToastsMock); + }); + + describe('when user has valid permissions', () => { + beforeEach(() => { + (hasMlAdminPermissions as jest.Mock).mockReturnValue(true); + (hasMlLicense as jest.Mock).mockReturnValue(true); + (getJobsSummary as jest.Mock).mockResolvedValue(mockJobsSummaryResponse); + (getModules as jest.Mock).mockResolvedValue(mockGetModuleResponse); + (checkRecognizer as jest.Mock).mockResolvedValue(checkRecognizerSuccess); + }); + + it('combines multiple ML calls into an array of SecurityJobs', async () => { + const expectedSecurityJob: SecurityJob = { + datafeedId: 'datafeed-siem-api-rare_process_linux_ecs', + datafeedIndices: ['auditbeat-*'], + datafeedState: 'stopped', + defaultIndexPattern: '', + description: 'SIEM Auditbeat: Detect unusually rare processes on Linux (beta)', + earliestTimestampMs: 1557353420495, + groups: ['siem'], + hasDatafeed: true, + id: 'siem-api-rare_process_linux_ecs', + isCompatible: true, + isElasticJob: false, + isInstalled: true, + isSingleMetricViewerJob: true, + jobState: 'closed', + latestTimestampMs: 1557434782207, + memory_status: 'hard_limit', + moduleId: '', + processed_record_count: 582251, + }; + + const { result, waitForNextUpdate } = renderHook(() => useSecurityJobs(false)); + await waitForNextUpdate(); + + expect(result.current.jobs).toHaveLength(6); + expect(result.current.jobs).toEqual(expect.arrayContaining([expectedSecurityJob])); + }); + + it('returns those permissions', async () => { + const { result, waitForNextUpdate } = renderHook(() => useSecurityJobs(false)); + await waitForNextUpdate(); + + expect(result.current.isMlAdmin).toEqual(true); + expect(result.current.isLicensed).toEqual(true); + }); + + it('renders a toast error if an ML call fails', async () => { + (getModules as jest.Mock).mockRejectedValue('whoops'); + const { waitForNextUpdate } = renderHook(() => useSecurityJobs(false)); + await waitForNextUpdate(); + + expect(appToastsMock.addError).toHaveBeenCalledWith('whoops', { + title: 'Security job fetch failure', + }); + }); + }); + + describe('when the user does not have valid permissions', () => { + beforeEach(() => { + (hasMlAdminPermissions as jest.Mock).mockReturnValue(false); + (hasMlLicense as jest.Mock).mockReturnValue(false); + }); + + it('returns empty jobs and false predicates', () => { + const { result } = renderHook(() => useSecurityJobs(false)); + + expect(result.current.jobs).toEqual([]); + expect(result.current.isMlAdmin).toEqual(false); + expect(result.current.isLicensed).toEqual(false); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.ts b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.ts new file mode 100644 index 0000000000000..e8809e8366eed --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs.ts @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useEffect, useState } from 'react'; + +import { DEFAULT_INDEX_KEY } from '../../../../../common/constants'; +import { hasMlAdminPermissions } from '../../../../../common/machine_learning/has_ml_admin_permissions'; +import { hasMlLicense } from '../../../../../common/machine_learning/has_ml_license'; +import { useAppToasts } from '../../../hooks/use_app_toasts'; +import { useUiSetting$, useHttp } from '../../../lib/kibana'; +import { checkRecognizer, getModules } from '../api'; +import { SecurityJob } from '../types'; +import { createSecurityJobs } from './use_security_jobs_helpers'; +import { useMlCapabilities } from '../../ml/hooks/use_ml_capabilities'; +import * as i18n from '../../ml/translations'; +import { getJobsSummary } from '../../ml/api/get_jobs_summary'; + +export interface UseSecurityJobsReturn { + loading: boolean; + jobs: SecurityJob[]; + isMlAdmin: boolean; + isLicensed: boolean; +} + +/** + * Compiles a collection of SecurityJobs, which are a list of all jobs relevant to the Security Solution App. This + * includes all installed jobs in the `Security` ML group, and all jobs within ML Modules defined in + * ml_module (whether installed or not). Use the corresponding helper functions to filter the job + * list as necessary. E.g. installed jobs, running jobs, etc. + * + * NOTE: If the user is not an ml admin, jobs will be empty and isMlAdmin will be false. + * + * @param refetchData + */ +export const useSecurityJobs = (refetchData: boolean): UseSecurityJobsReturn => { + const [jobs, setJobs] = useState([]); + const [loading, setLoading] = useState(true); + const mlCapabilities = useMlCapabilities(); + const [siemDefaultIndex] = useUiSetting$(DEFAULT_INDEX_KEY); + const http = useHttp(); + const { addError } = useAppToasts(); + + const isMlAdmin = hasMlAdminPermissions(mlCapabilities); + const isLicensed = hasMlLicense(mlCapabilities); + + useEffect(() => { + let isSubscribed = true; + const abortCtrl = new AbortController(); + setLoading(true); + + async function fetchSecurityJobIdsFromGroupsData() { + if (isMlAdmin && isLicensed) { + try { + // Batch fetch all installed jobs, ML modules, and check which modules are compatible with siemDefaultIndex + const [jobSummaryData, modulesData, compatibleModules] = await Promise.all([ + getJobsSummary({ http, signal: abortCtrl.signal }), + getModules({ signal: abortCtrl.signal }), + checkRecognizer({ + indexPatternName: siemDefaultIndex, + signal: abortCtrl.signal, + }), + ]); + + const compositeSecurityJobs = createSecurityJobs( + jobSummaryData, + modulesData, + compatibleModules + ); + + if (isSubscribed) { + setJobs(compositeSecurityJobs); + } + } catch (error) { + if (isSubscribed) { + addError(error, { title: i18n.SIEM_JOB_FETCH_FAILURE }); + } + } + } + if (isSubscribed) { + setLoading(false); + } + } + + fetchSecurityJobIdsFromGroupsData(); + return () => { + isSubscribed = false; + abortCtrl.abort(); + }; + }, [refetchData, isMlAdmin, isLicensed, siemDefaultIndex, addError, http]); + + return { isLicensed, isMlAdmin, jobs, loading }; +}; diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.test.tsx similarity index 83% rename from x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.test.tsx rename to x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.test.tsx index fc9f369a305aa..7fb4e6f59d9f7 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.test.tsx @@ -6,29 +6,29 @@ import { composeModuleAndInstalledJobs, - createSiemJobs, + createSecurityJobs, getAugmentedFields, getInstalledJobs, getModuleJobs, - moduleToSiemJob, -} from './use_siem_jobs_helpers'; + moduleToSecurityJob, +} from './use_security_jobs_helpers'; import { checkRecognizerSuccess, mockGetModuleResponse, mockJobsSummaryResponse, -} from '../__mocks__/api'; +} from '../api.mock'; // TODO: Expand test coverage -describe('useSiemJobsHelpers', () => { - describe('moduleToSiemJob', () => { - test('correctly converts module to SiemJob', () => { - const siemJob = moduleToSiemJob( +describe('useSecurityJobsHelpers', () => { + describe('moduleToSecurityJob', () => { + test('correctly converts module to SecurityJob', () => { + const securityJob = moduleToSecurityJob( mockGetModuleResponse[0], mockGetModuleResponse[0].jobs[0], false ); - expect(siemJob).toEqual({ + expect(securityJob).toEqual({ datafeedId: '', datafeedIndices: [], datafeedState: '', @@ -86,19 +86,19 @@ describe('useSiemJobsHelpers', () => { const installedJobs = getInstalledJobs(mockJobsSummaryResponse, moduleJobs, [ 'siem_auditbeat', ]); - const siemJobs = composeModuleAndInstalledJobs(installedJobs, moduleJobs); - expect(siemJobs.length).toEqual(6); + const securityJobs = composeModuleAndInstalledJobs(installedJobs, moduleJobs); + expect(securityJobs.length).toEqual(6); }); }); - describe('createSiemJobs', () => { + describe('createSecurityJobs', () => { test('returns correct number of jobs when creating jobs with successful responses', () => { - const siemJobs = createSiemJobs( + const securityJobs = createSecurityJobs( mockJobsSummaryResponse, mockGetModuleResponse, checkRecognizerSuccess ); - expect(siemJobs.length).toEqual(6); + expect(securityJobs.length).toEqual(6); }); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.tsx similarity index 59% rename from x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx rename to x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.tsx index adbd712ffeb3e..d0109fd29b5fb 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_security_jobs_helpers.tsx @@ -5,26 +5,26 @@ */ import { - AugmentedSiemJobFields, - JobSummary, + AugmentedSecurityJobFields, Module, ModuleJob, RecognizerModule, - SiemJob, + SecurityJob, } from '../types'; import { mlModules } from '../ml_modules'; +import { MlSummaryJob } from '../../../../../../ml/public'; /** - * Helper function for converting from ModuleJob -> SiemJob + * Helper function for converting from ModuleJob -> SecurityJob * @param module * @param moduleJob * @param isCompatible */ -export const moduleToSiemJob = ( +export const moduleToSecurityJob = ( module: Module, moduleJob: ModuleJob, isCompatible: boolean -): SiemJob => { +): SecurityJob => { return { datafeedId: '', datafeedIndices: [], @@ -46,7 +46,7 @@ export const moduleToSiemJob = ( }; /** - * Returns fields necessary to augment a ModuleJob to a SiemJob + * Returns fields necessary to augment a ModuleJob to a SecurityJob * * @param jobId * @param moduleJobs @@ -54,9 +54,9 @@ export const moduleToSiemJob = ( */ export const getAugmentedFields = ( jobId: string, - moduleJobs: SiemJob[], + moduleJobs: SecurityJob[], compatibleModuleIds: string[] -): AugmentedSiemJobFields => { +): AugmentedSecurityJobFields => { const moduleJob = moduleJobs.find((mj) => mj.id === jobId); return moduleJob !== undefined ? { @@ -74,24 +74,27 @@ export const getAugmentedFields = ( }; /** - * Process Modules[] from the `get_module` ML API into SiemJobs[] by filtering to SIEM specific + * Process Modules[] from the `get_module` ML API into SecurityJobs[] by filtering to Security specific * modules and unpacking jobs from each module * * @param modulesData * @param compatibleModuleIds */ -export const getModuleJobs = (modulesData: Module[], compatibleModuleIds: string[]): SiemJob[] => +export const getModuleJobs = ( + modulesData: Module[], + compatibleModuleIds: string[] +): SecurityJob[] => modulesData .filter((module) => mlModules.includes(module.id)) .map((module) => [ ...module.jobs.map((moduleJob) => - moduleToSiemJob(module, moduleJob, compatibleModuleIds.includes(module.id)) + moduleToSecurityJob(module, moduleJob, compatibleModuleIds.includes(module.id)) ), ]) .flat(); /** - * Process JobSummary[] from the `jobs_summary` ML API into SiemJobs[] by filtering to to SIEM jobs + * Process data from the `jobs_summary` ML API into SecurityJobs[] by filtering to Security jobs * and augmenting with moduleId/defaultIndexPattern/isCompatible * * @param jobSummaryData @@ -99,57 +102,57 @@ export const getModuleJobs = (modulesData: Module[], compatibleModuleIds: string * @param compatibleModuleIds */ export const getInstalledJobs = ( - jobSummaryData: JobSummary[], - moduleJobs: SiemJob[], + jobSummaryData: MlSummaryJob[], + moduleJobs: SecurityJob[], compatibleModuleIds: string[] -): SiemJob[] => +): SecurityJob[] => jobSummaryData .filter(({ groups }) => groups.includes('siem') || groups.includes('security')) - .map((jobSummary) => ({ + .map((jobSummary) => ({ ...jobSummary, ...getAugmentedFields(jobSummary.id, moduleJobs, compatibleModuleIds), isInstalled: true, })); /** - * Combines installed jobs + moduleSiemJobs that don't overlap and sorts by name asc + * Combines installed jobs + moduleSecurityJobs that don't overlap and sorts by name asc * * @param installedJobs - * @param moduleSiemJobs + * @param moduleSecurityJobs */ export const composeModuleAndInstalledJobs = ( - installedJobs: SiemJob[], - moduleSiemJobs: SiemJob[] -): SiemJob[] => { + installedJobs: SecurityJob[], + moduleSecurityJobs: SecurityJob[] +): SecurityJob[] => { const installedJobsIds = installedJobs.map((installedJob) => installedJob.id); return [ ...installedJobs, - ...moduleSiemJobs.filter((mj) => !installedJobsIds.includes(mj.id)), + ...moduleSecurityJobs.filter((mj) => !installedJobsIds.includes(mj.id)), ].sort((a, b) => a.id.localeCompare(b.id)); }; /** - * Creates a list of SiemJobs by composing JobSummary jobs (installed jobs) and Module - * jobs (pre-packaged SIEM jobs) into a single job object that can be used throughout the SIEM app + * Creates a list of SecurityJobs by composing jobs summaries (installed jobs) and Module + * jobs (pre-packaged Security jobs) into a single job object that can be used throughout the Security app * * @param jobSummaryData * @param modulesData * @param compatibleModules */ -export const createSiemJobs = ( - jobSummaryData: JobSummary[], +export const createSecurityJobs = ( + jobSummaryData: MlSummaryJob[], modulesData: Module[], compatibleModules: RecognizerModule[] -): SiemJob[] => { +): SecurityJob[] => { // Create lookup of compatible modules const compatibleModuleIds = compatibleModules.map((module) => module.id); - // Process modulesData: Filter to SIEM specific modules, and unpack jobs from modules - const moduleSiemJobs = getModuleJobs(modulesData, compatibleModuleIds); + // Process modulesData: Filter to Security specific modules, and unpack jobs from modules + const moduleSecurityJobs = getModuleJobs(modulesData, compatibleModuleIds); - // Process jobSummaryData: Filter to SIEM jobs, and augment with moduleId/defaultIndexPattern/isCompatible - const installedJobs = getInstalledJobs(jobSummaryData, moduleSiemJobs, compatibleModuleIds); + // Process jobSummaryData: Filter to Security jobs, and augment with moduleId/defaultIndexPattern/isCompatible + const installedJobs = getInstalledJobs(jobSummaryData, moduleSecurityJobs, compatibleModuleIds); - // Combine installed jobs + moduleSiemJobs that don't overlap, and sort by name asc - return composeModuleAndInstalledJobs(installedJobs, moduleSiemJobs); + // Combine installed jobs + moduleSecurityJobs that don't overlap, and sort by name asc + return composeModuleAndInstalledJobs(installedJobs, moduleSecurityJobs); }; diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx deleted file mode 100644 index 7f0a8dea1913e..0000000000000 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { useEffect, useState } from 'react'; - -import { DEFAULT_INDEX_KEY } from '../../../../../common/constants'; -import { checkRecognizer, getJobsSummary, getModules } from '../api'; -import { SiemJob } from '../types'; -import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; -import { errorToToaster, useStateToaster } from '../../toasters'; -import { useUiSetting$ } from '../../../lib/kibana'; - -import * as i18n from './translations'; -import { createSiemJobs } from './use_siem_jobs_helpers'; -import { useMlCapabilities } from './use_ml_capabilities'; - -type Return = [boolean, SiemJob[]]; - -/** - * Compiles a collection of SiemJobs, which are a list of all jobs relevant to the SIEM App. This - * includes all installed jobs in the `SIEM` ML group, and all jobs within ML Modules defined in - * ml_module (whether installed or not). Use the corresponding helper functions to filter the job - * list as necessary. E.g. installed jobs, running jobs, etc. - * - * @param refetchData - */ -export const useSiemJobs = (refetchData: boolean): Return => { - const [siemJobs, setSiemJobs] = useState([]); - const [loading, setLoading] = useState(true); - const mlCapabilities = useMlCapabilities(); - const userPermissions = hasMlUserPermissions(mlCapabilities); - const [siemDefaultIndex] = useUiSetting$(DEFAULT_INDEX_KEY); - const [, dispatchToaster] = useStateToaster(); - - useEffect(() => { - let isSubscribed = true; - const abortCtrl = new AbortController(); - setLoading(true); - - async function fetchSiemJobIdsFromGroupsData() { - if (userPermissions) { - try { - // Batch fetch all installed jobs, ML modules, and check which modules are compatible with siemDefaultIndex - const [jobSummaryData, modulesData, compatibleModules] = await Promise.all([ - getJobsSummary(abortCtrl.signal), - getModules({ signal: abortCtrl.signal }), - checkRecognizer({ - indexPatternName: siemDefaultIndex, - signal: abortCtrl.signal, - }), - ]); - - const compositeSiemJobs = createSiemJobs(jobSummaryData, modulesData, compatibleModules); - - if (isSubscribed) { - setSiemJobs(compositeSiemJobs); - } - } catch (error) { - if (isSubscribed) { - errorToToaster({ title: i18n.SIEM_JOB_FETCH_FAILURE, error, dispatchToaster }); - } - } - } - if (isSubscribed) { - setLoading(false); - } - } - - fetchSiemJobIdsFromGroupsData(); - return () => { - isSubscribed = false; - abortCtrl.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [refetchData, userPermissions]); - - return [loading, siemJobs]; -}; diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap index 747ac63551b55..9bee321e9fbde 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap @@ -25,7 +25,7 @@ exports[`JobsTableFilters renders correctly against snapshot 1`] = ` { - let siemJobs: SiemJob[]; + let securityJobs: SecurityJob[]; beforeEach(() => { - siemJobs = cloneDeep(mockSiemJobs); + securityJobs = cloneDeep(mockSecurityJobs); }); test('renders correctly against snapshot', () => { const wrapper = shallow( - + ); expect(wrapper).toMatchSnapshot(); }); @@ -29,7 +32,7 @@ describe('GroupsFilterPopover', () => { const mockOnSelectedGroupsChanged = jest.fn(); const wrapper = mount( ); diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx index d879942b8b101..362fb94dc1ec4 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx @@ -15,30 +15,30 @@ import { EuiSpacer, } from '@elastic/eui'; import * as i18n from './translations'; -import { SiemJob } from '../../types'; +import { SecurityJob } from '../../types'; import { toggleSelectedGroup } from './toggle_selected_group'; interface GroupsFilterPopoverProps { - siemJobs: SiemJob[]; + securityJobs: SecurityJob[]; onSelectedGroupsChanged: Dispatch>; } /** - * Popover for selecting which SiemJob groups to filter on. Component extracts unique groups and - * their counts from the provided SiemJobs. The 'siem' & 'security' groups are filtered out as all jobs will be + * Popover for selecting which SecurityJob groups to filter on. Component extracts unique groups and + * their counts from the provided SecurityJobs. The 'siem' & 'security' groups are filtered out as all jobs will be * siem/security jobs * - * @param siemJobs jobs to fetch groups from to display for filtering + * @param securityJobs jobs to fetch groups from to display for filtering * @param onSelectedGroupsChanged change listener to be notified when group selection changes */ export const GroupsFilterPopoverComponent = ({ - siemJobs, + securityJobs, onSelectedGroupsChanged, }: GroupsFilterPopoverProps) => { const [isGroupPopoverOpen, setIsGroupPopoverOpen] = useState(false); const [selectedGroups, setSelectedGroups] = useState([]); - const groups = siemJobs + const groups = securityJobs .map((j) => j.groups) .flat() .filter((g) => g !== 'siem' && g !== 'security'); diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx index 5b656adc3e581..6b7699d57aedf 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx @@ -7,20 +7,20 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; import { JobsTableFiltersComponent } from './jobs_table_filters'; -import { SiemJob } from '../../types'; +import { SecurityJob } from '../../types'; import { cloneDeep } from 'lodash/fp'; -import { mockSiemJobs } from '../../__mocks__/api'; +import { mockSecurityJobs } from '../../api.mock'; describe('JobsTableFilters', () => { - let siemJobs: SiemJob[]; + let securityJobs: SecurityJob[]; beforeEach(() => { - siemJobs = cloneDeep(mockSiemJobs); + securityJobs = cloneDeep(mockSecurityJobs); }); test('renders correctly against snapshot', () => { const wrapper = shallow( - + ); expect(wrapper).toMatchSnapshot(); }); @@ -28,7 +28,7 @@ describe('JobsTableFilters', () => { test('when you click Elastic Jobs filter, state is updated and it is selected', () => { const onFilterChanged = jest.fn(); const wrapper = mount( - + ); wrapper.find('[data-test-subj="show-elastic-jobs-filter-button"]').first().simulate('click'); @@ -45,7 +45,7 @@ describe('JobsTableFilters', () => { test('when you click Custom Jobs filter, state is updated and it is selected', () => { const onFilterChanged = jest.fn(); const wrapper = mount( - + ); wrapper.find('[data-test-subj="show-custom-jobs-filter-button"]').first().simulate('click'); @@ -62,7 +62,7 @@ describe('JobsTableFilters', () => { test('when you click Custom Jobs filter once, then Elastic Jobs filter, state is updated and selected changed', () => { const onFilterChanged = jest.fn(); const wrapper = mount( - + ); wrapper.find('[data-test-subj="show-custom-jobs-filter-button"]').first().simulate('click'); @@ -88,7 +88,7 @@ describe('JobsTableFilters', () => { test('when you click Custom Jobs filter twice, state is updated and it is revert', () => { const onFilterChanged = jest.fn(); const wrapper = mount( - + ); wrapper.find('[data-test-subj="show-custom-jobs-filter-button"]').first().simulate('click'); diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx index 4cfb7f8ad2b5b..f25ea667b3411 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx @@ -15,11 +15,11 @@ import { } from '@elastic/eui'; import { EuiSearchBarQuery } from '../../../../../timelines/components/open_timeline/types'; import * as i18n from './translations'; -import { JobsFilters, SiemJob } from '../../types'; +import { JobsFilters, SecurityJob } from '../../types'; import { GroupsFilterPopover } from './groups_filter_popover'; interface JobsTableFiltersProps { - siemJobs: SiemJob[]; + securityJobs: SecurityJob[]; onFilterChanged: Dispatch>; } @@ -27,10 +27,13 @@ interface JobsTableFiltersProps { * Collection of filters for filtering data within the JobsTable. Contains search bar, Elastic/Custom * Jobs filter button toggle, and groups selection * - * @param siemJobs jobs to fetch groups from to display for filtering + * @param securityJobs jobs to fetch groups from to display for filtering * @param onFilterChanged change listener to be notified on filter changes */ -export const JobsTableFiltersComponent = ({ siemJobs, onFilterChanged }: JobsTableFiltersProps) => { +export const JobsTableFiltersComponent = ({ + securityJobs, + onFilterChanged, +}: JobsTableFiltersProps) => { const [filterQuery, setFilterQuery] = useState(''); const [selectedGroups, setSelectedGroups] = useState([]); const [showCustomJobs, setShowCustomJobs] = useState(false); @@ -71,7 +74,10 @@ export const JobsTableFiltersComponent = ({ siemJobs, onFilterChanged }: JobsTab - + diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.test.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.test.tsx index ade8c6fe80525..e58d76bd1dde0 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.test.tsx @@ -9,22 +9,22 @@ import React from 'react'; import { JobSwitchComponent } from './job_switch'; import { cloneDeep } from 'lodash/fp'; -import { mockSiemJobs } from '../__mocks__/api'; -import { SiemJob } from '../types'; +import { mockSecurityJobs } from '../api.mock'; +import { SecurityJob } from '../types'; describe('JobSwitch', () => { - let siemJobs: SiemJob[]; + let securityJobs: SecurityJob[]; let onJobStateChangeMock = jest.fn(); beforeEach(() => { - siemJobs = cloneDeep(mockSiemJobs); + securityJobs = cloneDeep(mockSecurityJobs); onJobStateChangeMock = jest.fn(); }); test('renders correctly against snapshot', () => { const wrapper = shallow( ); @@ -34,8 +34,8 @@ describe('JobSwitch', () => { test('should call onJobStateChange when the switch is clicked to be true/open', () => { const wrapper = mount( ); @@ -57,8 +57,8 @@ describe('JobSwitch', () => { test('should have a switch when it is not in the loading state', () => { const wrapper = mount( ); @@ -68,8 +68,8 @@ describe('JobSwitch', () => { test('should not have a switch when it is in the loading state', () => { const wrapper = mount( ); diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.tsx index d370d475bd6e5..3ad71ee6b6919 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/job_switch.tsx @@ -12,7 +12,7 @@ import { isJobFailed, isJobStarted, } from '../../../../../common/machine_learning/helpers'; -import { SiemJob } from '../types'; +import { SecurityJob } from '../types'; const StaticSwitch = styled(EuiSwitch)` .euiSwitch__thumb, @@ -24,14 +24,14 @@ const StaticSwitch = styled(EuiSwitch)` StaticSwitch.displayName = 'StaticSwitch'; export interface JobSwitchProps { - job: SiemJob; - isSiemJobsLoading: boolean; - onJobStateChange: (job: SiemJob, latestTimestampMs: number, enable: boolean) => Promise; + job: SecurityJob; + isSecurityJobsLoading: boolean; + onJobStateChange: (job: SecurityJob, latestTimestampMs: number, enable: boolean) => Promise; } export const JobSwitchComponent = ({ job, - isSiemJobsLoading, + isSecurityJobsLoading, onJobStateChange, }: JobSwitchProps) => { const [isLoading, setIsLoading] = useState(false); @@ -47,7 +47,7 @@ export const JobSwitchComponent = ({ return ( - {isSiemJobsLoading || isLoading || isJobLoading(job.jobState, job.datafeedState) ? ( + {isSecurityJobsLoading || isLoading || isJobLoading(job.jobState, job.datafeedState) ? ( ) : ( { - let siemJobs: SiemJob[]; + let securityJobs: SecurityJob[]; let onJobStateChangeMock = jest.fn(); beforeEach(() => { - siemJobs = cloneDeep(mockSiemJobs); + securityJobs = cloneDeep(mockSecurityJobs); onJobStateChangeMock = jest.fn(); }); @@ -25,7 +25,7 @@ describe('JobsTableComponent', () => { const wrapper = shallow( ); @@ -36,7 +36,7 @@ describe('JobsTableComponent', () => { const wrapper = mount( ); @@ -46,11 +46,11 @@ describe('JobsTableComponent', () => { }); test('should render the hyperlink with URI encodings which points specifically to the job id', () => { - siemJobs[0].id = 'job id with spaces'; + securityJobs[0].id = 'job id with spaces'; const wrapper = mount( ); @@ -63,7 +63,7 @@ describe('JobsTableComponent', () => { const wrapper = mount( ); @@ -73,14 +73,14 @@ describe('JobsTableComponent', () => { .simulate('click', { target: { checked: true }, }); - expect(onJobStateChangeMock.mock.calls[0]).toEqual([siemJobs[0], 1571022859393, true]); + expect(onJobStateChangeMock.mock.calls[0]).toEqual([securityJobs[0], 1571022859393, true]); }); test('should have a switch when it is not in the loading state', () => { const wrapper = mount( ); @@ -91,7 +91,7 @@ describe('JobsTableComponent', () => { const wrapper = mount( ); diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/jobs_table.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/jobs_table.tsx index f28a99c9947d5..be911a1cd8537 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/jobs_table.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/jobs_table.tsx @@ -25,7 +25,7 @@ import styled from 'styled-components'; import { useBasePath } from '../../../lib/kibana'; import * as i18n from './translations'; import { JobSwitch } from './job_switch'; -import { SiemJob } from '../types'; +import { SecurityJob } from '../types'; const JobNameWrapper = styled.div` margin: 5px 0; @@ -38,12 +38,12 @@ const truncateThreshold = 200; const getJobsTableColumns = ( isLoading: boolean, - onJobStateChange: (job: SiemJob, latestTimestampMs: number, enable: boolean) => Promise, + onJobStateChange: (job: SecurityJob, latestTimestampMs: number, enable: boolean) => Promise, basePath: string ) => [ { name: i18n.COLUMN_JOB_NAME, - render: ({ id, description }: SiemJob) => ( + render: ({ id, description }: SecurityJob) => ( ( + render: ({ groups }: SecurityJob) => ( {groups.map((group) => ( @@ -76,9 +76,13 @@ const getJobsTableColumns = ( { name: i18n.COLUMN_RUN_JOB, - render: (job: SiemJob) => + render: (job: SecurityJob) => job.isCompatible ? ( - + ) : ( ), @@ -87,13 +91,16 @@ const getJobsTableColumns = ( } as const, ]; -const getPaginatedItems = (items: SiemJob[], pageIndex: number, pageSize: number): SiemJob[] => - items.slice(pageIndex * pageSize, pageIndex * pageSize + pageSize); +const getPaginatedItems = ( + items: SecurityJob[], + pageIndex: number, + pageSize: number +): SecurityJob[] => items.slice(pageIndex * pageSize, pageIndex * pageSize + pageSize); export interface JobTableProps { isLoading: boolean; - jobs: SiemJob[]; - onJobStateChange: (job: SiemJob, latestTimestampMs: number, enable: boolean) => Promise; + jobs: SecurityJob[]; + onJobStateChange: (job: SecurityJob, latestTimestampMs: number, enable: boolean) => Promise; } export const JobsTableComponent = ({ isLoading, jobs, onJobStateChange }: JobTableProps) => { diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_popover.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_popover.tsx index 0ebf367471848..f2bf2273c4b3f 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_popover.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_popover.tsx @@ -12,19 +12,17 @@ import styled from 'styled-components'; import { useKibana } from '../../lib/kibana'; import { METRIC_TYPE, TELEMETRY_EVENT, track } from '../../lib/telemetry'; -import { hasMlAdminPermissions } from '../../../../common/machine_learning/has_ml_admin_permissions'; import { errorToToaster, useStateToaster, ActionToaster } from '../toasters'; import { setupMlJob, startDatafeeds, stopDatafeeds } from './api'; import { filterJobs } from './helpers'; -import { useSiemJobs } from './hooks/use_siem_jobs'; import { JobsTableFilters } from './jobs_table/filters/jobs_table_filters'; import { JobsTable } from './jobs_table/jobs_table'; import { ShowingCount } from './jobs_table/showing_count'; import { PopoverDescription } from './popover_description'; import * as i18n from './translations'; -import { JobsFilters, SiemJob } from './types'; +import { JobsFilters, SecurityJob } from './types'; import { UpgradeContents } from './upgrade_contents'; -import { useMlCapabilities } from './hooks/use_ml_capabilities'; +import { useSecurityJobs } from './hooks/use_security_jobs'; const PopoverContentsDiv = styled.div` max-width: 684px; @@ -87,24 +85,25 @@ export const MlPopover = React.memo(() => { const [isPopoverOpen, setIsPopoverOpen] = useState(false); const [filterProperties, setFilterProperties] = useState(defaultFilterProps); - const [isLoadingSiemJobs, siemJobs] = useSiemJobs(refreshToggle); + const { isMlAdmin, isLicensed, loading: isLoadingSecurityJobs, jobs } = useSecurityJobs( + refreshToggle + ); const [, dispatchToaster] = useStateToaster(); - const capabilities = useMlCapabilities(); const docLinks = useKibana().services.docLinks; const handleJobStateChange = useCallback( - (job: SiemJob, latestTimestampMs: number, enable: boolean) => + (job: SecurityJob, latestTimestampMs: number, enable: boolean) => enableDatafeed(job, latestTimestampMs, enable, dispatch, dispatchToaster), [dispatch, dispatchToaster] ); const filteredJobs = filterJobs({ - jobs: siemJobs, + jobs, ...filterProperties, }); - const incompatibleJobCount = siemJobs.filter((j) => !j.isCompatible).length; + const incompatibleJobCount = jobs.filter((j) => !j.isCompatible).length; - if (!capabilities.isPlatinumOrTrialLicense) { + if (!isLicensed) { // If the user does not have platinum show upgrade UI return ( { ); - } else if (hasMlAdminPermissions(capabilities)) { + } else if (isMlAdmin) { // If the user has Platinum License & ML Admin Permissions, show Anomaly Detection button & full config UI return ( { - + @@ -194,7 +193,7 @@ export const MlPopover = React.memo(() => { )} @@ -209,7 +208,7 @@ export const MlPopover = React.memo(() => { // Enable/Disable Job & Datafeed -- passed to JobsTable for use as callback on JobSwitch const enableDatafeed = async ( - job: SiemJob, + job: SecurityJob, latestTimestampMs: number, enable: boolean, dispatch: Dispatch, @@ -257,7 +256,7 @@ const enableDatafeed = async ( dispatch({ type: 'refresh' }); }; -const submitTelemetry = (job: SiemJob, enabled: boolean) => { +const submitTelemetry = (job: SecurityJob, enabled: boolean) => { // Report type of job enabled/disabled track( METRIC_TYPE.COUNT, diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/types.ts b/x-pack/plugins/security_solution/public/common/components/ml_popover/types.ts index f39daa0b9a7fb..c839f5110fe7f 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/types.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AuditMessageBase } from '../../../../../ml/public'; import { MlError } from '../ml/types'; +import { MlSummaryJob } from '../../../../../ml/public'; export interface Group { id: string; @@ -98,28 +98,6 @@ export interface MlSetupArgs { prefix?: string; } -/** - * Representation of an ML Job as returned from the `ml/jobs/jobs_summary` API - */ -export interface JobSummary { - auditMessage?: AuditMessageBase; - datafeedId: string; - datafeedIndices: string[]; - datafeedState: string; - description: string; - earliestTimestampMs?: number; - latestResultsTimestampMs?: number; - groups: string[]; - hasDatafeed: boolean; - id: string; - isSingleMetricViewerJob: boolean; - jobState: string; - latestTimestampMs?: number; - memory_status: string; - nodeName?: string; - processed_record_count: number; -} - export interface Detector { detector_description: string; function: string; @@ -133,10 +111,10 @@ export interface CustomURL { } /** - * Representation of an ML Job as used by the SIEM App -- a composition of ModuleJob and JobSummary + * Representation of an ML Job as used by the SIEM App -- a composition of ModuleJob and MlSummaryJob * that includes necessary metadata like moduleName, defaultIndexPattern, etc. */ -export interface SiemJob extends JobSummary { +export interface SecurityJob extends MlSummaryJob { moduleId: string; defaultIndexPattern: string; isCompatible: boolean; @@ -144,7 +122,7 @@ export interface SiemJob extends JobSummary { isElasticJob: boolean; } -export interface AugmentedSiemJobFields { +export interface AugmentedSecurityJobFields { moduleId: string; defaultIndexPattern: string; isCompatible: boolean; diff --git a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx index 76270a7c08cd6..94019b26c180b 100644 --- a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx @@ -9,7 +9,7 @@ import React, { useEffect } from 'react'; import { DEFAULT_ANOMALY_SCORE } from '../../../../../common/constants'; import { AnomaliesQueryTabBodyProps } from './types'; import { getAnomaliesFilterQuery } from './utils'; -import { useSiemJobs } from '../../../components/ml_popover/hooks/use_siem_jobs'; +import { useInstalledSecurityJobs } from '../../../components/ml/hooks/use_installed_security_jobs'; import { useUiSetting$ } from '../../../lib/kibana'; import { MatrixHistogramContainer } from '../../../components/matrix_histogram'; import { histogramConfigs } from './histogram_configs'; @@ -38,13 +38,13 @@ export const AnomaliesQueryTabBody = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const [, siemJobs] = useSiemJobs(true); + const { jobs } = useInstalledSecurityJobs(); const [anomalyScore] = useUiSetting$(DEFAULT_ANOMALY_SCORE); const mergedFilterQuery = getAnomaliesFilterQuery( filterQuery, anomaliesFilterQuery, - siemJobs, + jobs, anomalyScore, flowTarget, ip diff --git a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts index 10d5d1c60a6c2..5248801d723b6 100644 --- a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts +++ b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts @@ -6,21 +6,20 @@ import deepmerge from 'deepmerge'; +import { MlSummaryJob } from '../../../../../../ml/public'; import { ESTermQuery } from '../../../../../common/typed_json'; import { createFilter } from '../../helpers'; -import { SiemJob } from '../../../components/ml_popover/types'; import { FlowTarget } from '../../../../graphql/types'; export const getAnomaliesFilterQuery = ( filterQuery: string | ESTermQuery | undefined, anomaliesFilterQuery: object = {}, - siemJobs: SiemJob[] = [], + securityJobs: MlSummaryJob[] = [], anomalyScore: number, flowTarget?: FlowTarget, ip?: string ): string => { - const siemJobIds = siemJobs - .filter((job) => job.isInstalled) + const securityJobIds = securityJobs .map((job) => job.id) .map((jobId) => ({ match_phrase: { @@ -38,7 +37,7 @@ export const getAnomaliesFilterQuery = ( filter: [ { bool: { - should: siemJobIds, + should: securityJobIds, minimum_should_match: 1, }, }, diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.mock.ts b/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.mock.ts new file mode 100644 index 0000000000000..1af4ba3ba9233 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/hooks/use_app_toasts.mock.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +const createAppToastsMock = () => ({ + addError: jest.fn(), + addSuccess: jest.fn(), +}); + +export const useAppToastsMock = { + create: createAppToastsMock, +}; diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts index 2c52acd3ec747..5f4285f2747ae 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts @@ -17,6 +17,7 @@ export const KibanaServices = { get: jest.fn(), getKibanaVersion: jest.fn(() => export const useKibana = jest.fn(createUseKibanaMock()); export const useUiSetting = jest.fn(createUseUiSettingMock()); export const useUiSetting$ = jest.fn(createUseUiSetting$Mock()); +export const useHttp = jest.fn(() => useKibana().services.http); export const useTimeZone = jest.fn(); export const useDateFormat = jest.fn(); export const useBasePath = jest.fn(() => '/test/base/path'); diff --git a/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts b/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts index 13b3c4b249bfe..f8eed75cf9bf1 100644 --- a/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts +++ b/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts @@ -6,8 +6,10 @@ import { coreMock } from '../../../../../../src/core/public/mocks'; import { dataPluginMock } from '../../../../../../src/plugins/data/public/mocks'; +import { securityMock } from '../../../../../plugins/security/public/mocks'; export const createKibanaCoreStartMock = () => coreMock.createStart(); export const createKibanaPluginsStartMock = () => ({ data: dataPluginMock.createStartContract(), + security: securityMock.createSetup(), }); diff --git a/x-pack/plugins/security_solution/public/common/mock/kibana_react.ts b/x-pack/plugins/security_solution/public/common/mock/kibana_react.ts index c5d50e1379482..bdb8ca85b0d77 100644 --- a/x-pack/plugins/security_solution/public/common/mock/kibana_react.ts +++ b/x-pack/plugins/security_solution/public/common/mock/kibana_react.ts @@ -96,28 +96,10 @@ export const createUseKibanaMock = () => { export const createStartServices = () => { const core = createKibanaCoreStartMock(); const plugins = createKibanaPluginsStartMock(); - const security = { - authc: { - getCurrentUser: jest.fn(), - areAPIKeysEnabled: jest.fn(), - }, - sessionTimeout: { - start: jest.fn(), - stop: jest.fn(), - extend: jest.fn(), - }, - license: { - isEnabled: jest.fn(), - getFeatures: jest.fn(), - features$: jest.fn(), - }, - __legacyCompat: { logoutUrl: 'logoutUrl', tenant: 'tenant' }, - }; const services = ({ ...core, ...plugins, - security, } as unknown) as StartServices; return services; diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx index 47c12d1934174..00141c9a453d8 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx @@ -38,7 +38,7 @@ import { buildRuleTypeDescription, buildThresholdDescription, } from './helpers'; -import { useSiemJobs } from '../../../../common/components/ml_popover/hooks/use_siem_jobs'; +import { useSecurityJobs } from '../../../../common/components/ml_popover/hooks/use_security_jobs'; import { buildMlJobDescription } from './ml_job_description'; import { buildActionsDescription } from './actions_description'; import { buildThrottleDescription } from './throttle_description'; @@ -67,7 +67,7 @@ export const StepRuleDescriptionComponent: React.FC = }) => { const kibana = useKibana(); const [filterManager] = useState(new FilterManager(kibana.services.uiSettings)); - const [, siemJobs] = useSiemJobs(true); + const { jobs } = useSecurityJobs(false); const keys = Object.keys(schema); const listItems = keys.reduce((acc: ListItems[], key: string) => { @@ -77,7 +77,7 @@ export const StepRuleDescriptionComponent: React.FC = buildMlJobDescription( get(key, data) as string, (get(key, schema) as { label: string }).label, - siemJobs + jobs ), ]; } diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx index c82a465f08c3a..3152fef12c652 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx @@ -7,31 +7,14 @@ import React from 'react'; import { shallow } from 'enzyme'; +import { mockOpenedJob } from '../../../../common/components/ml_popover/api.mock'; import { MlJobDescription, AuditIcon, JobStatusBadge } from './ml_job_description'; -jest.mock('../../../../common/lib/kibana'); -const job = { - moduleId: 'moduleId', - defaultIndexPattern: 'defaultIndexPattern', - isCompatible: true, - isInstalled: true, - isElasticJob: true, - datafeedId: 'datafeedId', - datafeedIndices: [], - datafeedState: 'datafeedState', - description: 'description', - groups: [], - hasDatafeed: true, - id: 'id', - isSingleMetricViewerJob: false, - jobState: 'jobState', - memory_status: 'memory_status', - processed_record_count: 0, -}; +jest.mock('../../../../common/lib/kibana'); describe('MlJobDescription', () => { it('renders correctly', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find('[data-test-subj="machineLearningJobId"]')).toHaveLength(1); }); @@ -47,7 +30,7 @@ describe('AuditIcon', () => { describe('JobStatusBadge', () => { it('renders correctly', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find('EuiBadge')).toHaveLength(1); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx index d7e06511e7937..6baa2abab33d1 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx @@ -8,9 +8,9 @@ import React from 'react'; import styled from 'styled-components'; import { EuiBadge, EuiIcon, EuiLink, EuiToolTip } from '@elastic/eui'; +import { MlSummaryJob } from '../../../../../../ml/public'; import { isJobStarted } from '../../../../../common/machine_learning/helpers'; import { useKibana } from '../../../../common/lib/kibana'; -import { SiemJob } from '../../../../common/components/ml_popover/types'; import { ListItems } from './types'; import { ML_JOB_STARTED, ML_JOB_STOPPED } from './translations'; @@ -21,7 +21,7 @@ enum MessageLevels { } const AuditIconComponent: React.FC<{ - message: SiemJob['auditMessage']; + message: MlSummaryJob['auditMessage']; }> = ({ message }) => { if (!message) { return null; @@ -47,7 +47,7 @@ const AuditIconComponent: React.FC<{ export const AuditIcon = React.memo(AuditIconComponent); -const JobStatusBadgeComponent: React.FC<{ job: SiemJob }> = ({ job }) => { +const JobStatusBadgeComponent: React.FC<{ job: MlSummaryJob }> = ({ job }) => { const isStarted = isJobStarted(job.jobState, job.datafeedState); const color = isStarted ? 'secondary' : 'danger'; const text = isStarted ? ML_JOB_STARTED : ML_JOB_STOPPED; @@ -69,7 +69,7 @@ const Wrapper = styled.div` overflow: hidden; `; -const MlJobDescriptionComponent: React.FC<{ job: SiemJob }> = ({ job }) => { +const MlJobDescriptionComponent: React.FC<{ job: MlSummaryJob }> = ({ job }) => { const jobUrl = useKibana().services.application.getUrlForApp( `ml#/jobs?mlManagement=(jobId:${encodeURI(job.id)})` ); @@ -92,12 +92,12 @@ export const MlJobDescription = React.memo(MlJobDescriptionComponent); export const buildMlJobDescription = ( jobId: string, label: string, - siemJobs: SiemJob[] + jobs: MlSummaryJob[] ): ListItems => { - const siemJob = siemJobs.find((job) => job.id === jobId); + const job = jobs.find(({ id }) => id === jobId); return { title: label, - description: siemJob ? : jobId, + description: job ? : jobId, }; }; diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.test.tsx index 6f6581e4de1c3..4a08adbedab3f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.test.tsx @@ -8,14 +8,14 @@ import React from 'react'; import { shallow } from 'enzyme'; import { MlJobSelect } from './index'; -import { useSiemJobs } from '../../../../common/components/ml_popover/hooks/use_siem_jobs'; +import { useSecurityJobs } from '../../../../common/components/ml_popover/hooks/use_security_jobs'; import { useFormFieldMock } from '../../../../common/mock'; -jest.mock('../../../../common/components/ml_popover/hooks/use_siem_jobs'); +jest.mock('../../../../common/components/ml_popover/hooks/use_security_jobs'); jest.mock('../../../../common/lib/kibana'); describe('MlJobSelect', () => { beforeAll(() => { - (useSiemJobs as jest.Mock).mockReturnValue([false, []]); + (useSecurityJobs as jest.Mock).mockReturnValue({ loading: false, jobs: [] }); }); it('renders correctly', () => { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx index cdfdf4ca6b66b..b0aa0329fe8f4 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx @@ -19,7 +19,7 @@ import { import styled from 'styled-components'; import { isJobStarted } from '../../../../../common/machine_learning/helpers'; import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../shared_imports'; -import { useSiemJobs } from '../../../../common/components/ml_popover/hooks/use_siem_jobs'; +import { useSecurityJobs } from '../../../../common/components/ml_popover/hooks/use_security_jobs'; import { useKibana } from '../../../../common/lib/kibana'; import { ML_JOB_SELECT_PLACEHOLDER_TEXT, @@ -81,7 +81,7 @@ interface MlJobSelectProps { export const MlJobSelect: React.FC = ({ describedByIds = [], field }) => { const jobId = field.value as string; const { isInvalid, errorMessage } = getFieldValidityAndErrorMessage(field); - const [isLoading, siemJobs] = useSiemJobs(false); + const { loading, jobs } = useSecurityJobs(false); const mlUrl = useKibana().services.application.getUrlForApp('ml'); const handleJobChange = useCallback( (machineLearningJobId: string) => { @@ -96,7 +96,7 @@ export const MlJobSelect: React.FC = ({ describedByIds = [], f disabled: true, }; - const jobOptions = siemJobs.map((job) => ({ + const jobOptions = jobs.map((job) => ({ value: job.id, inputDisplay: job.id, dropdownDisplay: , @@ -107,9 +107,9 @@ export const MlJobSelect: React.FC = ({ describedByIds = [], f const isJobRunning = useMemo(() => { // If the selected job is not found in the list, it means the placeholder is selected // and so we don't want to show the warning, thus isJobRunning will be true when 'job == null' - const job = siemJobs.find((j) => j.id === jobId); + const job = jobs.find(({ id }) => id === jobId); return job == null || isJobStarted(job.jobState, job.datafeedState); - }, [siemJobs, jobId]); + }, [jobs, jobId]); return ( @@ -126,7 +126,7 @@ export const MlJobSelect: React.FC = ({ describedByIds = [], f = ({ componentProps={{ describedByIds: ['detectionEngineStepDefineRuleType'], isReadOnly: isUpdateView, - hasValidLicense: mlCapabilities.isPlatinumOrTrialLicense, + hasValidLicense: hasMlLicense(mlCapabilities), isMlAdmin: hasMlAdminPermissions(mlCapabilities), }} /> diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx index 85dce907084e8..110691328b13b 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx @@ -47,8 +47,9 @@ import { getColumns, getMonitoringColumns } from './columns'; import { showRulesTable } from './helpers'; import { allRulesReducer, State } from './reducer'; import { RulesTableFilters } from './rules_table_filters/rules_table_filters'; -import { useMlCapabilities } from '../../../../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { useMlCapabilities } from '../../../../../common/components/ml/hooks/use_ml_capabilities'; import { hasMlAdminPermissions } from '../../../../../../common/machine_learning/has_ml_admin_permissions'; +import { hasMlLicense } from '../../../../../../common/machine_learning/has_ml_license'; import { SecurityPageName } from '../../../../../app/types'; import { useFormatUrl } from '../../../../../common/components/link_to'; @@ -145,8 +146,7 @@ export const AllRules = React.memo( const { formatUrl } = useFormatUrl(SecurityPageName.detections); // TODO: Refactor license check + hasMlAdminPermissions to common check - const hasMlPermissions = - mlCapabilities.isPlatinumOrTrialLicense && hasMlAdminPermissions(mlCapabilities); + const hasMlPermissions = hasMlLicense(mlCapabilities) && hasMlAdminPermissions(mlCapabilities); const setRules = useCallback((newRules: Rule[], newPagination: Partial) => { dispatch({ diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx index 016d0c7c67a9e..8a969a4cf098c 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx @@ -71,8 +71,9 @@ import { RuleActionsOverflow } from '../../../../components/rules/rule_actions_o import { RuleStatusFailedCallOut } from './status_failed_callout'; import { FailureHistory } from './failure_history'; import { RuleStatus } from '../../../../components/rules//rule_status'; -import { useMlCapabilities } from '../../../../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { useMlCapabilities } from '../../../../../common/components/ml/hooks/use_ml_capabilities'; import { hasMlAdminPermissions } from '../../../../../../common/machine_learning/has_ml_admin_permissions'; +import { hasMlLicense } from '../../../../../../common/machine_learning/has_ml_license'; import { SecurityPageName } from '../../../../../app/types'; import { LinkButton } from '../../../../../common/components/links'; import { useFormatUrl } from '../../../../../common/components/link_to'; @@ -161,8 +162,7 @@ export const RuleDetailsPageComponent: FC = ({ const { globalFullScreen } = useFullScreen(); // TODO: Refactor license check + hasMlAdminPermissions to common check - const hasMlPermissions = - mlCapabilities.isPlatinumOrTrialLicense && hasMlAdminPermissions(mlCapabilities); + const hasMlPermissions = hasMlLicense(mlCapabilities) && hasMlAdminPermissions(mlCapabilities); const ruleDetailTabs = getRuleDetailsTabs(rule); // persist rule until refresh is complete diff --git a/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx b/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx index 34840b2826626..67f563e944f42 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx @@ -17,7 +17,7 @@ import { LastEventTime } from '../../../common/components/last_event_time'; import { AnomalyTableProvider } from '../../../common/components/ml/anomaly/anomaly_table_provider'; import { hostToCriteria } from '../../../common/components/ml/criteria/host_to_criteria'; import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; -import { useMlCapabilities } from '../../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { useMlCapabilities } from '../../../common/components/ml/hooks/use_ml_capabilities'; import { scoreIntervalToDateTime } from '../../../common/components/ml/score/score_interval_to_datetime'; import { SiemNavigation } from '../../../common/components/navigation'; import { KpiHostsComponent } from '../../components/kpi_hosts'; diff --git a/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx b/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx index e4e69443c510d..2b19249dc426f 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx @@ -34,7 +34,7 @@ import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from import { SpyRoute } from '../../common/utils/route/spy_routes'; import { esQuery } from '../../../../../../src/plugins/data/public'; -import { useMlCapabilities } from '../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { useMlCapabilities } from '../../common/components/ml/hooks/use_ml_capabilities'; import { OverviewEmpty } from '../../overview/components/overview_empty'; import { Display } from './display'; import { HostsTabs } from './hosts_tabs'; diff --git a/x-pack/plugins/security_solution/public/network/components/ip_overview/index.tsx b/x-pack/plugins/security_solution/public/network/components/ip_overview/index.tsx index cf08b084d2197..d6dfe1769308e 100644 --- a/x-pack/plugins/security_solution/public/network/components/ip_overview/index.tsx +++ b/x-pack/plugins/security_solution/public/network/components/ip_overview/index.tsx @@ -30,7 +30,7 @@ import { DescriptionListStyled, OverviewWrapper } from '../../../common/componen import { Loader } from '../../../common/components/loader'; import { Anomalies, NarrowDateRange } from '../../../common/components/ml/types'; import { AnomalyScores } from '../../../common/components/ml/score/anomaly_scores'; -import { useMlCapabilities } from '../../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { useMlCapabilities } from '../../../common/components/ml/hooks/use_ml_capabilities'; import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; import { InspectButton, InspectButtonContainer } from '../../../common/components/inspect'; diff --git a/x-pack/plugins/security_solution/public/network/pages/index.tsx b/x-pack/plugins/security_solution/public/network/pages/index.tsx index 9ac05cc98bb45..07abe7bc8c209 100644 --- a/x-pack/plugins/security_solution/public/network/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/index.tsx @@ -7,7 +7,7 @@ import React, { useMemo } from 'react'; import { Route, Switch, RouteComponentProps, useHistory } from 'react-router-dom'; -import { useMlCapabilities } from '../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { useMlCapabilities } from '../../common/components/ml/hooks/use_ml_capabilities'; import { hasMlUserPermissions } from '../../../common/machine_learning/has_ml_user_permissions'; import { FlowTarget } from '../../graphql/types'; diff --git a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx index 0a15b039b96af..c7aba6fcc8a5b 100644 --- a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx @@ -23,7 +23,7 @@ import { HostItem } from '../../../graphql/types'; import { Loader } from '../../../common/components/loader'; import { IPDetailsLink } from '../../../common/components/links'; import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; -import { useMlCapabilities } from '../../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { useMlCapabilities } from '../../../common/components/ml/hooks/use_ml_capabilities'; import { AnomalyScores } from '../../../common/components/ml/score/anomaly_scores'; import { Anomalies, NarrowDateRange } from '../../../common/components/ml/types'; import { DescriptionListStyled, OverviewWrapper } from '../../../common/components/page'; From e2ef219a7cd0b1d492e5cb929b3a3891a92e8e2e Mon Sep 17 00:00:00 2001 From: Brent Kimmel Date: Wed, 12 Aug 2020 21:02:00 -0400 Subject: [PATCH 090/113] [Security Solution][Resolver] fix presentation role on edgeline (#74869) Co-authored-by: Elastic Machine --- .../plugins/security_solution/public/resolver/view/edge_line.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/resolver/view/edge_line.tsx b/x-pack/plugins/security_solution/public/resolver/view/edge_line.tsx index 9f310bb1cc0d6..061dfce64b4e4 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/edge_line.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/edge_line.tsx @@ -127,7 +127,6 @@ const EdgeLineComponent = React.memo( return ( Date: Wed, 12 Aug 2020 22:32:05 -0600 Subject: [PATCH 091/113] [Security Solution][lists] Adds tests for exception lists and items part 2 (#74815) ## Summary This is the basics of end to end tests, so there could be a lot more, but this ties to cover the basics of the tests. Test with: ```ts node scripts/functional_tests --config x-pack/test/lists_api_integration/security_and_spaces/config.ts ``` Adds these tests for the route counter parts: * create_exception_list_items.ts * create_exception_lists.ts * delete_exception_list_items.ts * delete_exception_lists.ts * find_exception_list_items.ts * find_exception_lists.ts * read_exception_list_items.ts * read_exception_lists.ts * update_exception_list_items.ts * update_exception_lists.ts Fixes a few minor strings, other tests, but no large bugs found with these tests ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../create_exception_list_item_schema.mock.ts | 24 +++ .../create_exception_list_schema.mock.ts | 20 ++ .../update_exception_list_item_schema.mock.ts | 13 ++ .../update_exception_list_schema.mock.ts | 11 ++ .../exception_list_item_schema.mock.ts | 24 +++ .../response/exception_list_schema.mock.ts | 24 +++ .../create_exception_list_item_route.ts | 2 +- .../routes/find_exception_list_item_route.ts | 2 +- .../update_exception_list_item_route.ts | 69 ++++--- .../routes/update_exception_list_route.ts | 6 +- .../utils/get_error_message_exception_list.ts | 6 +- .../get_error_message_exception_list_item.ts | 6 +- .../tests/create_exception_list_items.ts | 119 ++++++++++++ .../tests/create_exception_lists.ts | 77 ++++++++ .../tests/delete_exception_list_items.ts | 119 ++++++++++++ .../tests/delete_exception_lists.ts | 98 ++++++++++ .../tests/export_list_items.ts | 5 +- .../tests/find_exception_list_items.ts | 105 ++++++++++ .../tests/find_exception_lists.ts | 67 +++++++ .../tests/import_list_items.ts | 2 +- .../security_and_spaces/tests/index.ts | 10 + .../tests/read_exception_list_items.ts | 159 +++++++++++++++ .../tests/read_exception_lists.ts | 112 +++++++++++ .../tests/update_exception_list_items.ts | 168 ++++++++++++++++ .../tests/update_exception_lists.ts | 182 ++++++++++++++++++ x-pack/test/lists_api_integration/utils.ts | 60 +++++- 26 files changed, 1444 insertions(+), 46 deletions(-) create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_lists.ts diff --git a/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.mock.ts index 0450849931b30..da22e33dc7b52 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.mock.ts @@ -8,6 +8,7 @@ import { COMMENTS, DESCRIPTION, ENTRIES, + ITEM_ID, ITEM_TYPE, LIST_ID, META, @@ -32,3 +33,26 @@ export const getCreateExceptionListItemSchemaMock = (): CreateExceptionListItemS tags: TAGS, type: ITEM_TYPE, }); + +/** + * Useful for end to end testing + */ +export const getCreateExceptionListItemMinimalSchemaMock = (): CreateExceptionListItemSchema => ({ + description: DESCRIPTION, + entries: ENTRIES, + item_id: ITEM_ID, + list_id: LIST_ID, + name: NAME, + type: ITEM_TYPE, +}); + +/** + * Useful for end to end testing + */ +export const getCreateExceptionListItemMinimalSchemaMockWithoutId = (): CreateExceptionListItemSchema => ({ + description: DESCRIPTION, + entries: ENTRIES, + list_id: LIST_ID, + name: NAME, + type: ITEM_TYPE, +}); diff --git a/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.mock.ts index d9c0474610369..f8431fcce1bf7 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.mock.ts @@ -7,6 +7,7 @@ import { DESCRIPTION, ENDPOINT_TYPE, + LIST_ID, META, NAME, NAMESPACE_TYPE, @@ -26,3 +27,22 @@ export const getCreateExceptionListSchemaMock = (): CreateExceptionListSchema => type: ENDPOINT_TYPE, version: VERSION, }); + +/** + * Useful for end to end testing + */ +export const getCreateExceptionListMinimalSchemaMock = (): CreateExceptionListSchema => ({ + description: DESCRIPTION, + list_id: LIST_ID, + name: NAME, + type: ENDPOINT_TYPE, +}); + +/** + * Useful for end to end testing + */ +export const getCreateExceptionListMinimalSchemaMockWithoutId = (): CreateExceptionListSchema => ({ + description: DESCRIPTION, + name: NAME, + type: ENDPOINT_TYPE, +}); diff --git a/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_schema.mock.ts index 90d70c273f490..4673c0fe7629d 100644 --- a/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_schema.mock.ts @@ -9,6 +9,7 @@ import { DESCRIPTION, ENTRIES, ID, + ITEM_ID, ITEM_TYPE, LIST_ITEM_ID, META, @@ -34,3 +35,15 @@ export const getUpdateExceptionListItemSchemaMock = (): UpdateExceptionListItemS tags: TAGS, type: ITEM_TYPE, }); + +/** + * Useful for end to end tests and other mechanisms which want to fill in the values + * after doing a get of the structure. + */ +export const getUpdateMinimalExceptionListItemSchemaMock = (): UpdateExceptionListItemSchema => ({ + description: DESCRIPTION, + entries: ENTRIES, + item_id: ITEM_ID, + name: NAME, + type: ITEM_TYPE, +}); diff --git a/x-pack/plugins/lists/common/schemas/request/update_exception_list_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/update_exception_list_schema.mock.ts index 22af29e6af0b7..b7dc2d9e0c948 100644 --- a/x-pack/plugins/lists/common/schemas/request/update_exception_list_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/update_exception_list_schema.mock.ts @@ -20,3 +20,14 @@ export const getUpdateExceptionListSchemaMock = (): UpdateExceptionListSchema => tags: ['malware'], type: 'endpoint', }); + +/** + * Useful for end to end tests and other mechanisms which want to fill in the values + * after doing a get of the structure. + */ +export const getUpdateMinimalExceptionListSchemaMock = (): UpdateExceptionListSchema => ({ + description: DESCRIPTION, + list_id: LIST_ID, + name: NAME, + type: 'endpoint', +}); diff --git a/x-pack/plugins/lists/common/schemas/response/exception_list_item_schema.mock.ts b/x-pack/plugins/lists/common/schemas/response/exception_list_item_schema.mock.ts index c0d04c9823ca3..1a8f21a5232f8 100644 --- a/x-pack/plugins/lists/common/schemas/response/exception_list_item_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/response/exception_list_item_schema.mock.ts @@ -7,8 +7,11 @@ import { COMMENTS, DATE_NOW, DESCRIPTION, + ELASTIC_USER, ENTRIES, + ITEM_ID, ITEM_TYPE, + LIST_ID, META, NAME, NAMESPACE_TYPE, @@ -38,3 +41,24 @@ export const getExceptionListItemSchemaMock = (): ExceptionListItemSchema => ({ updated_at: DATE_NOW, updated_by: USER, }); + +/** + * This is useful for end to end tests where we remove the auto generated parts for comparisons + * such as created_at, updated_at, and id. + */ +export const getExceptionListItemResponseMockWithoutAutoGeneratedValues = (): Partial< + ExceptionListItemSchema +> => ({ + _tags: [], + comments: [], + created_by: ELASTIC_USER, + description: DESCRIPTION, + entries: ENTRIES, + item_id: ITEM_ID, + list_id: LIST_ID, + name: NAME, + namespace_type: 'single', + tags: [], + type: ITEM_TYPE, + updated_by: ELASTIC_USER, +}); diff --git a/x-pack/plugins/lists/common/schemas/response/exception_list_schema.mock.ts b/x-pack/plugins/lists/common/schemas/response/exception_list_schema.mock.ts index 2655b09631b23..e2f0a7c06b400 100644 --- a/x-pack/plugins/lists/common/schemas/response/exception_list_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/response/exception_list_schema.mock.ts @@ -7,9 +7,12 @@ import { DATE_NOW, DESCRIPTION, + ELASTIC_USER, ENDPOINT_TYPE, IMMUTABLE, + LIST_ID, META, + NAME, TIE_BREAKER, USER, VERSION, @@ -18,6 +21,7 @@ import { import { ENDPOINT_LIST_ID } from '../..'; import { ExceptionListSchema } from './exception_list_schema'; + export const getExceptionListSchemaMock = (): ExceptionListSchema => ({ _tags: ['endpoint', 'process', 'malware', 'os:linux'], _version: _VERSION, @@ -37,3 +41,23 @@ export const getExceptionListSchemaMock = (): ExceptionListSchema => ({ updated_by: 'user_name', version: VERSION, }); + +/** + * This is useful for end to end tests where we remove the auto generated parts for comparisons + * such as created_at, updated_at, and id. + */ +export const getExceptionResponseMockWithoutAutoGeneratedValues = (): Partial< + ExceptionListSchema +> => ({ + _tags: [], + created_by: ELASTIC_USER, + description: DESCRIPTION, + immutable: IMMUTABLE, + list_id: LIST_ID, + name: NAME, + namespace_type: 'single', + tags: [], + type: ENDPOINT_TYPE, + updated_by: ELASTIC_USER, + version: VERSION, +}); diff --git a/x-pack/plugins/lists/server/routes/create_exception_list_item_route.ts b/x-pack/plugins/lists/server/routes/create_exception_list_item_route.ts index fc0473b2b3704..f092aec82a8f3 100644 --- a/x-pack/plugins/lists/server/routes/create_exception_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/create_exception_list_item_route.ts @@ -57,7 +57,7 @@ export const createExceptionListItemRoute = (router: IRouter): void => { }); if (exceptionList == null) { return siemResponse.error({ - body: `list id: "${listId}" does not exist`, + body: `exception list id: "${listId}" does not exist`, statusCode: 404, }); } else { diff --git a/x-pack/plugins/lists/server/routes/find_exception_list_item_route.ts b/x-pack/plugins/lists/server/routes/find_exception_list_item_route.ts index 88643e53ff0a7..103cba700013f 100644 --- a/x-pack/plugins/lists/server/routes/find_exception_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/find_exception_list_item_route.ts @@ -62,7 +62,7 @@ export const findExceptionListItemRoute = (router: IRouter): void => { }); if (exceptionListItems == null) { return siemResponse.error({ - body: `list id: "${listId}" does not exist`, + body: `exception list id: "${listId}" does not exist`, statusCode: 404, }); } diff --git a/x-pack/plugins/lists/server/routes/update_exception_list_item_route.ts b/x-pack/plugins/lists/server/routes/update_exception_list_item_route.ts index 7e15f694aee13..745ad0735a174 100644 --- a/x-pack/plugins/lists/server/routes/update_exception_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/update_exception_list_item_route.ts @@ -54,39 +54,46 @@ export const updateExceptionListItemRoute = (router: IRouter): void => { namespace_type: namespaceType, tags, } = request.body; - const exceptionLists = getExceptionListClient(context); - const exceptionListItem = await exceptionLists.updateExceptionListItem({ - _tags, - _version, - comments, - description, - entries, - id, - itemId, - meta, - name, - namespaceType, - tags, - type, - }); - if (exceptionListItem == null) { - if (id != null) { - return siemResponse.error({ - body: `list item id: "${id}" not found`, - statusCode: 404, - }); - } else { - return siemResponse.error({ - body: `list item item_id: "${itemId}" not found`, - statusCode: 404, - }); - } + if (id == null && itemId == null) { + return siemResponse.error({ + body: 'either id or item_id need to be defined', + statusCode: 404, + }); } else { - const [validated, errors] = validate(exceptionListItem, exceptionListItemSchema); - if (errors != null) { - return siemResponse.error({ body: errors, statusCode: 500 }); + const exceptionLists = getExceptionListClient(context); + const exceptionListItem = await exceptionLists.updateExceptionListItem({ + _tags, + _version, + comments, + description, + entries, + id, + itemId, + meta, + name, + namespaceType, + tags, + type, + }); + if (exceptionListItem == null) { + if (id != null) { + return siemResponse.error({ + body: `exception list item id: "${id}" does not exist`, + statusCode: 404, + }); + } else { + return siemResponse.error({ + body: `exception list item item_id: "${itemId}" does not exist`, + statusCode: 404, + }); + } } else { - return response.ok({ body: validated ?? {} }); + const [validated, errors] = validate(exceptionListItem, exceptionListItemSchema); + if (errors != null) { + return siemResponse.error({ body: errors, statusCode: 500 }); + } else { + return response.ok({ body: validated ?? {} }); + } } } } catch (err) { diff --git a/x-pack/plugins/lists/server/routes/update_exception_list_route.ts b/x-pack/plugins/lists/server/routes/update_exception_list_route.ts index 8102210b8430d..1903d0f601d1d 100644 --- a/x-pack/plugins/lists/server/routes/update_exception_list_route.ts +++ b/x-pack/plugins/lists/server/routes/update_exception_list_route.ts @@ -15,7 +15,7 @@ import { updateExceptionListSchema, } from '../../common/schemas'; -import { getExceptionListClient } from './utils'; +import { getErrorMessageExceptionList, getExceptionListClient } from './utils'; export const updateExceptionListRoute = (router: IRouter): void => { router.put( @@ -50,7 +50,7 @@ export const updateExceptionListRoute = (router: IRouter): void => { const exceptionLists = getExceptionListClient(context); if (id == null && listId == null) { return siemResponse.error({ - body: `either id or list_id need to be defined`, + body: 'either id or list_id need to be defined', statusCode: 404, }); } else { @@ -69,7 +69,7 @@ export const updateExceptionListRoute = (router: IRouter): void => { }); if (list == null) { return siemResponse.error({ - body: `exception list id: "${id}" not found`, + body: getErrorMessageExceptionList({ id, listId }), statusCode: 404, }); } else { diff --git a/x-pack/plugins/lists/server/routes/utils/get_error_message_exception_list.ts b/x-pack/plugins/lists/server/routes/utils/get_error_message_exception_list.ts index 665a7540184a0..7db3bedd9ec84 100644 --- a/x-pack/plugins/lists/server/routes/utils/get_error_message_exception_list.ts +++ b/x-pack/plugins/lists/server/routes/utils/get_error_message_exception_list.ts @@ -12,10 +12,10 @@ export const getErrorMessageExceptionList = ({ listId: string | undefined; }): string => { if (id != null) { - return `Exception list id: "${id}" does not exist`; + return `exception list id: "${id}" does not exist`; } else if (listId != null) { - return `Exception list list_id: "${listId}" does not exist`; + return `exception list list_id: "${listId}" does not exist`; } else { - return 'Exception list does not exist'; + return 'exception list does not exist'; } }; diff --git a/x-pack/plugins/lists/server/routes/utils/get_error_message_exception_list_item.ts b/x-pack/plugins/lists/server/routes/utils/get_error_message_exception_list_item.ts index 8e6730ef3db5c..efb6c0e59ade5 100644 --- a/x-pack/plugins/lists/server/routes/utils/get_error_message_exception_list_item.ts +++ b/x-pack/plugins/lists/server/routes/utils/get_error_message_exception_list_item.ts @@ -12,10 +12,10 @@ export const getErrorMessageExceptionListItem = ({ itemId: string | undefined; }): string => { if (id != null) { - return `Exception list item id: "${id}" does not exist`; + return `exception list item id: "${id}" does not exist`; } else if (itemId != null) { - return `Exception list item list_id: "${itemId}" does not exist`; + return `exception list item item_id: "${itemId}" does not exist`; } else { - return 'Exception list item does not exist'; + return 'exception list item does not exist'; } }; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_list_items.ts new file mode 100644 index 0000000000000..6148dbcc7090e --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_list_items.ts @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { ExceptionListItemSchema } from '../../../../plugins/lists/common'; +import { getExceptionListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_item_schema.mock'; +import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock'; +import { + getCreateExceptionListItemMinimalSchemaMock, + getCreateExceptionListItemMinimalSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_exception_list_item_schema.mock'; +import { + EXCEPTION_LIST_ITEM_URL, + EXCEPTION_LIST_URL, +} from '../../../../plugins/lists/common/constants'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +import { + removeListItemServerGeneratedProperties, + removeExceptionListItemServerGeneratedProperties, +} from '../../utils'; + +import { deleteAllExceptions } from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + const es = getService('es'); + + describe('create_exception_list_items', () => { + describe('validation errors', () => { + it('should give a 404 error that the exception list must exist first before being able to add a list item to the exception list', async () => { + const { body } = await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMock()) + .expect(404); + + expect(body).to.eql({ + message: 'exception list id: "some-list-id" does not exist', + status_code: 404, + }); + }); + }); + + describe('creating exception list items', () => { + afterEach(async () => { + await deleteAllExceptions(es); + }); + + it('should create a simple exception list item with a list item id', async () => { + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMock()) + .expect(200); + + const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getExceptionListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should create a simple exception list item without an id', async () => { + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMockWithoutId()) + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + const outputList: Partial = { + ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(), + item_id: body.item_id, + }; + expect(bodyToCompare).to.eql(outputList); + }); + + it('should cause a 409 conflict if we attempt to create the same exception list item twice', async () => { + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMock()) + .expect(409); + + expect(body).to.eql({ + message: 'exception list item id: "some-list-item-id" already exists', + status_code: 409, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_lists.ts new file mode 100644 index 0000000000000..2b654c72ae282 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_lists.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { ExceptionListSchema } from '../../../../plugins/lists/common'; +import { EXCEPTION_LIST_URL } from '../../../../plugins/lists/common/constants'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { getExceptionResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_schema.mock'; +import { + getCreateExceptionListMinimalSchemaMock, + getCreateExceptionListMinimalSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock'; + +import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + const es = getService('es'); + + describe('create_exception_lists', () => { + describe('creating exception lists', () => { + afterEach(async () => { + await deleteAllExceptions(es); + }); + + it('should create a simple exception list', async () => { + const { body } = await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getExceptionResponseMockWithoutAutoGeneratedValues()); + }); + + it('should create a simple exception list without a list_id', async () => { + const { body } = await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMockWithoutId()) + .expect(200); + + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + const outputtedList: Partial = { + ...getExceptionResponseMockWithoutAutoGeneratedValues(), + list_id: bodyToCompare.list_id, + }; + expect(bodyToCompare).to.eql(outputtedList); + }); + + it('should cause a 409 conflict if we attempt to create the same list_id twice', async () => { + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(409); + + expect(body).to.eql({ + message: 'exception list id: "some-list-id" already exists', + status_code: 409, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_list_items.ts new file mode 100644 index 0000000000000..16bdd264dc546 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_list_items.ts @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { ExceptionListItemSchema } from '../../../../plugins/lists/common'; +import { getExceptionListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_item_schema.mock'; +import { + getCreateExceptionListItemMinimalSchemaMock, + getCreateExceptionListItemMinimalSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_exception_list_item_schema.mock'; +import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { + EXCEPTION_LIST_URL, + EXCEPTION_LIST_ITEM_URL, +} from '../../../../plugins/lists/common/constants'; + +import { deleteAllExceptions, removeExceptionListItemServerGeneratedProperties } from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + const es = getService('es'); + + describe('delete_exception_list_items', () => { + describe('delete exception list items', () => { + afterEach(async () => { + await deleteAllExceptions(es); + }); + + it('should delete a single exception list item by its item_id', async () => { + // create an exception list + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // create an exception list item + await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMock()) + .expect(200); + + // delete the exception list item by its item_id + const { body } = await supertest + .delete( + `${EXCEPTION_LIST_ITEM_URL}?item_id=${ + getCreateExceptionListItemMinimalSchemaMock().item_id + }` + ) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getExceptionListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should delete a single exception list item using an auto generated id', async () => { + // create an exception list + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // create an exception list item + const { body: bodyWithCreatedList } = await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMockWithoutId()) + .expect(200); + + // delete that exception list item by its auto-generated id + const { body } = await supertest + .delete(`${EXCEPTION_LIST_ITEM_URL}?id=${bodyWithCreatedList.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + const outputtedList: Partial = { + ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(), + item_id: body.item_id, + }; + + const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputtedList); + }); + + it('should return an error if the id does not exist when trying to delete it', async () => { + const { body } = await supertest + .delete(`${EXCEPTION_LIST_ITEM_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + message: 'exception list item id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + status_code: 404, + }); + }); + + it('should return an error if the item_id does not exist when trying to delete it', async () => { + const { body } = await supertest + .delete(`${EXCEPTION_LIST_ITEM_URL}?item_id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + message: + 'exception list item item_id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + status_code: 404, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_lists.ts new file mode 100644 index 0000000000000..56e4bcd9641cf --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_lists.ts @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { ExceptionListSchema } from '../../../../plugins/lists/common'; +import { getExceptionResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_schema.mock'; +import { + getCreateExceptionListMinimalSchemaMock, + getCreateExceptionListMinimalSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { EXCEPTION_LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + const es = getService('es'); + + describe('delete_exception_lists', () => { + describe('delete exception lists', () => { + afterEach(async () => { + await deleteAllExceptions(es); + }); + + it('should delete a single exception list by its list_id', async () => { + // create an exception list + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // delete the exception list by its list id + const { body } = await supertest + .delete( + `${EXCEPTION_LIST_URL}?list_id=${getCreateExceptionListMinimalSchemaMock().list_id}` + ) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getExceptionResponseMockWithoutAutoGeneratedValues()); + }); + + it('should delete a single exception list using an auto generated id', async () => { + // create an exception list + const { body: bodyWithCreatedList } = await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMockWithoutId()) + .expect(200); + + // delete that list by its auto-generated id + const { body } = await supertest + .delete(`${EXCEPTION_LIST_URL}?id=${bodyWithCreatedList.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const outputtedList: Partial = { + ...getExceptionResponseMockWithoutAutoGeneratedValues(), + list_id: body.list_id, + }; + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputtedList); + }); + + it('should return an error if the id does not exist when trying to delete it', async () => { + const { body } = await supertest + .delete(`${EXCEPTION_LIST_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + message: 'exception list id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + status_code: 404, + }); + }); + + it('should return an error if the list_id does not exist when trying to delete it', async () => { + const { body } = await supertest + .delete(`${EXCEPTION_LIST_URL}?list_id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + message: 'exception list list_id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + status_code: 404, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts index 6fe783fc497f2..74c28f5abdfc1 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts @@ -96,8 +96,9 @@ export default ({ getService }: FtrProviderContext): void => { .set('kbn-xsrf', 'true') .expect(200) .parse(binaryToString); - - expect(body.toString()).to.eql('127.0.0.2\n127.0.0.1\n'); + const bodyString = body.toString(); + expect(bodyString.includes('127.0.0.1')).to.be(true); + expect(bodyString.includes('127.0.0.2')).to.be(true); }); }); }); diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_list_items.ts new file mode 100644 index 0000000000000..a65e9f344986f --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_list_items.ts @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { getExceptionListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_item_schema.mock'; +import { getCreateExceptionListItemMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_item_schema.mock'; +import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { + EXCEPTION_LIST_URL, + EXCEPTION_LIST_ITEM_URL, +} from '../../../../plugins/lists/common/constants'; + +import { deleteAllExceptions, removeExceptionListItemServerGeneratedProperties } from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext): void => { + const supertest = getService('supertest'); + const es = getService('es'); + + describe('find_exception_list_items', () => { + describe('find exception list items', () => { + afterEach(async () => { + await deleteAllExceptions(es); + }); + + it('should return an empty find body correctly if no exception list items are loaded', async () => { + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + const { body } = await supertest + .get( + `${EXCEPTION_LIST_ITEM_URL}/_find?list_id=${ + getCreateExceptionListMinimalSchemaMock().list_id + }` + ) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql({ + data: [], + page: 1, + per_page: 20, + total: 0, + }); + }); + + it('should return 404 if given a list_id that does not exist', async () => { + const { body } = await supertest + .get(`${EXCEPTION_LIST_ITEM_URL}/_find?list_id=non_exist`) + .set('kbn-xsrf', 'true') + .send() + .expect(404); + + expect(body).to.eql({ + message: 'exception list id: "non_exist" does not exist', + status_code: 404, + }); + }); + + it('should return a single exception list item when a single exception list item is loaded from a find with defaults added', async () => { + // add the exception list + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // add a single exception list item + await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMock()) + .expect(200); + + // query the single exception list from _find + const { body } = await supertest + .get( + `${EXCEPTION_LIST_ITEM_URL}/_find?list_id=${ + getCreateExceptionListMinimalSchemaMock().list_id + }` + ) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + body.data = [removeExceptionListItemServerGeneratedProperties(body.data[0])]; + expect(body).to.eql({ + data: [getExceptionListItemResponseMockWithoutAutoGeneratedValues()], + page: 1, + per_page: 20, + total: 1, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_lists.ts new file mode 100644 index 0000000000000..c2328a7d112f4 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_lists.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { getExceptionResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_schema.mock'; +import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { EXCEPTION_LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext): void => { + const supertest = getService('supertest'); + const es = getService('es'); + + describe('find_exception_lists', () => { + describe('find exception lists', () => { + afterEach(async () => { + await deleteAllExceptions(es); + }); + + it('should return an empty find body correctly if no exception lists are loaded', async () => { + const { body } = await supertest + .get(`${EXCEPTION_LIST_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql({ + data: [], + page: 1, + per_page: 20, + total: 0, + }); + }); + + it('should return a single exception list when a single exception list is loaded from a find with defaults added', async () => { + // add a single exception list + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // query the single exception list from _find + const { body } = await supertest + .get(`${EXCEPTION_LIST_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + body.data = [removeExceptionListServerGeneratedProperties(body.data[0])]; + expect(body).to.eql({ + data: [getExceptionResponseMockWithoutAutoGeneratedValues()], + page: 1, + per_page: 20, + total: 1, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts index 4befb6bbaf050..7b7a6173fb408 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts @@ -45,7 +45,7 @@ export default ({ getService }: FtrProviderContext): void => { }); }); - describe('importing rules with an index', () => { + describe('importing lists with an index', () => { beforeEach(async () => { await createListsIndex(supertest); }); diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts index 302877a680aa6..5458b4a9a7db2 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts @@ -23,5 +23,15 @@ export default ({ loadTestFile }: FtrProviderContext): void => { loadTestFile(require.resolve('./find_list_items')); loadTestFile(require.resolve('./import_list_items')); loadTestFile(require.resolve('./export_list_items')); + loadTestFile(require.resolve('./create_exception_lists')); + loadTestFile(require.resolve('./create_exception_list_items')); + loadTestFile(require.resolve('./read_exception_lists')); + loadTestFile(require.resolve('./read_exception_list_items')); + loadTestFile(require.resolve('./update_exception_lists')); + loadTestFile(require.resolve('./update_exception_list_items')); + loadTestFile(require.resolve('./delete_exception_lists')); + loadTestFile(require.resolve('./delete_exception_list_items')); + loadTestFile(require.resolve('./find_exception_lists')); + loadTestFile(require.resolve('./find_exception_list_items')); }); }; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_list_items.ts new file mode 100644 index 0000000000000..26b969e940a2b --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_list_items.ts @@ -0,0 +1,159 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { getExceptionListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_item_schema.mock'; +import { + getCreateExceptionListItemMinimalSchemaMock, + getCreateExceptionListItemMinimalSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_exception_list_item_schema.mock'; +import { ExceptionListItemSchema } from '../../../../plugins/lists/common'; +import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { + EXCEPTION_LIST_URL, + EXCEPTION_LIST_ITEM_URL, +} from '../../../../plugins/lists/common/constants'; + +import { deleteAllExceptions, removeExceptionListItemServerGeneratedProperties } from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + const es = getService('es'); + + describe('read_exception_list_items', () => { + describe('reading exception list items', () => { + afterEach(async () => { + await deleteAllExceptions(es); + }); + + it('should be able to read a single exception list items using item_id', async () => { + // create a simple exception list to read + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMock()) + .expect(200); + + const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getExceptionListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should be able to read a single exception list item using id', async () => { + // create a simple exception list to read + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // create a simple exception list item to read + const { body: createListBody } = await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${EXCEPTION_LIST_ITEM_URL}?id=${createListBody.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getExceptionListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should be able to read a single list item with an auto-generated id', async () => { + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // create a simple exception list item to read + const { body: createListBody } = await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMockWithoutId()) + .expect(200); + + const { body } = await supertest + .get(`${EXCEPTION_LIST_ITEM_URL}?id=${createListBody.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const outputtedList: Partial = { + ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(), + item_id: body.item_id, + }; + + const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputtedList); + }); + + it('should be able to read a single list item with an auto-generated item_id', async () => { + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // create a simple exception list item to read + const { body: createListBody } = await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMockWithoutId()) + .expect(200); + + const { body } = await supertest + .get(`${EXCEPTION_LIST_ITEM_URL}?item_id=${createListBody.item_id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const outputtedList: Partial = { + ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(), + item_id: body.item_id, + }; + + const bodyToCompare = removeExceptionListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputtedList); + }); + + it('should return 404 if given a fake id', async () => { + const { body } = await supertest + .get(`${EXCEPTION_LIST_ITEM_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'exception list item id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + }); + }); + + it('should return 404 if given a fake list_id', async () => { + const { body } = await supertest + .get(`${EXCEPTION_LIST_ITEM_URL}?item_id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: + 'exception list item item_id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_lists.ts new file mode 100644 index 0000000000000..ee6bef3200f5c --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_lists.ts @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { ExceptionListSchema } from '../../../../plugins/lists/common'; +import { getExceptionResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_schema.mock'; +import { + getCreateExceptionListMinimalSchemaMock, + getCreateExceptionListMinimalSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { EXCEPTION_LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + const es = getService('es'); + + describe('read_exception_lists', () => { + describe('reading exception lists', () => { + afterEach(async () => { + await deleteAllExceptions(es); + }); + + it('should be able to read a single exception list using list_id', async () => { + // create a simple exception list to read + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${EXCEPTION_LIST_URL}?list_id=${getCreateExceptionListMinimalSchemaMock().list_id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getExceptionResponseMockWithoutAutoGeneratedValues()); + }); + + it('should be able to read a single exception list using id', async () => { + // create a simple exception list to read + const { body: createListBody } = await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${EXCEPTION_LIST_URL}?id=${createListBody.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getExceptionResponseMockWithoutAutoGeneratedValues()); + }); + + it('should be able to read a single list with an auto-generated list_id', async () => { + // create a simple exception list to read + const { body: createListBody } = await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMockWithoutId()) + .expect(200); + + const { body } = await supertest + .get(`${EXCEPTION_LIST_URL}?list_id=${createListBody.list_id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const outputtedList: Partial = { + ...getExceptionResponseMockWithoutAutoGeneratedValues(), + list_id: body.list_id, + }; + + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputtedList); + }); + + it('should return 404 if given a fake id', async () => { + const { body } = await supertest + .get(`${EXCEPTION_LIST_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'exception list id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + }); + }); + + it('should return 404 if given a fake list_id', async () => { + const { body } = await supertest + .get(`${EXCEPTION_LIST_URL}?list_id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'exception list list_id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_list_items.ts new file mode 100644 index 0000000000000..40fb705620a19 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_list_items.ts @@ -0,0 +1,168 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { getExceptionListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_item_schema.mock'; +import { getCreateExceptionListItemMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_item_schema.mock'; +import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { + EXCEPTION_LIST_URL, + EXCEPTION_LIST_ITEM_URL, +} from '../../../../plugins/lists/common/constants'; + +import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils'; +import { + UpdateExceptionListItemSchema, + ExceptionListItemSchema, +} from '../../../../plugins/lists/common/schemas'; + +import { getUpdateMinimalExceptionListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/update_exception_list_item_schema.mock'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + const es = getService('es'); + + describe('update_exception_list_items', () => { + describe('update exception list items', () => { + afterEach(async () => { + await deleteAllExceptions(es); + }); + + it('should update a single exception list item property of name using an id', async () => { + // create a simple exception list + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // create a simple exception list item + await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListItemMinimalSchemaMock()) + .expect(200); + + // update a exception list item's name + const updatedList: UpdateExceptionListItemSchema = { + ...getUpdateMinimalExceptionListItemSchemaMock(), + name: 'some other name', + }; + + const { body } = await supertest + .put(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(200); + + const outputList: Partial = { + ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(), + name: 'some other name', + }; + + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputList); + }); + + it('should update a single exception list item property of name using an auto-generated item_id', async () => { + // create a simple exception list + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // eslint-disable-next-line @typescript-eslint/naming-convention + const { item_id, ...itemNoId } = getCreateExceptionListItemMinimalSchemaMock(); + + // create a simple exception list item + const { body: createListBody } = await supertest + .post(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(itemNoId) + .expect(200); + + // update a exception list item's name + const updatedList: UpdateExceptionListItemSchema = { + ...getUpdateMinimalExceptionListItemSchemaMock(), + item_id: createListBody.item_id, + name: 'some other name', + }; + + const { body } = await supertest + .put(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(200); + + const outputList: Partial = { + ...getExceptionListItemResponseMockWithoutAutoGeneratedValues(), + name: 'some other name', + item_id: body.item_id, + }; + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputList); + }); + + it('should give a 404 if it is given a fake exception list item id', async () => { + const updatedList: UpdateExceptionListItemSchema = { + ...getUpdateMinimalExceptionListItemSchemaMock(), + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', + }; + delete updatedList.item_id; + + const { body } = await supertest + .put(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'exception list item id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" does not exist', + }); + }); + + it('should give a 404 if it is given a fake item_id', async () => { + const updatedList: UpdateExceptionListItemSchema = { + ...getUpdateMinimalExceptionListItemSchemaMock(), + item_id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', + }; + + const { body } = await supertest + .put(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: + 'exception list item item_id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" does not exist', + }); + }); + + it('should give a 404 if both id and list_id is null', async () => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { item_id, ...listNoId } = getUpdateMinimalExceptionListItemSchemaMock(); + + const { body } = await supertest + .put(EXCEPTION_LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(listNoId) + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'either id or item_id need to be defined', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_lists.ts new file mode 100644 index 0000000000000..bd30dd87963ed --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_lists.ts @@ -0,0 +1,182 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { getExceptionResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/exception_list_schema.mock'; +import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { EXCEPTION_LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } from '../../utils'; +import { + UpdateExceptionListSchema, + ExceptionListSchema, +} from '../../../../plugins/lists/common/schemas'; + +import { getUpdateMinimalExceptionListSchemaMock } from '../../../../plugins/lists/common/schemas/request/update_exception_list_schema.mock'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + const es = getService('es'); + + describe('update_exception_lists', () => { + describe('update exception lists', () => { + afterEach(async () => { + await deleteAllExceptions(es); + }); + + it('should update a single exception list property of name using an id', async () => { + // create a simple exception list + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // update a exception list's name + const updatedList: UpdateExceptionListSchema = { + ...getUpdateMinimalExceptionListSchemaMock(), + name: 'some other name', + }; + + const { body } = await supertest + .put(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(200); + + const outputList: Partial = { + ...getExceptionResponseMockWithoutAutoGeneratedValues(), + name: 'some other name', + version: 2, + }; + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputList); + }); + + it('should update a single exception list property of name using an auto-generated list_id', async () => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { list_id, ...listNoId } = getCreateExceptionListMinimalSchemaMock(); + + // create a simple exception list + const { body: createListBody } = await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(listNoId) + .expect(200); + + // update a exception list's name + const updatedList: UpdateExceptionListSchema = { + ...getUpdateMinimalExceptionListSchemaMock(), + id: createListBody.id, + name: 'some other name', + }; + + const { body } = await supertest + .put(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(200); + + const outputList: Partial = { + ...getExceptionResponseMockWithoutAutoGeneratedValues(), + name: 'some other name', + list_id: body.list_id, + version: 2, + }; + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputList); + }); + + it('should change the version of a list when it updates two properties', async () => { + // create a simple exception list + await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateExceptionListMinimalSchemaMock()) + .expect(200); + + // update a simple exception list property of name and description + // update a exception list's name + const updatedList: UpdateExceptionListSchema = { + ...getUpdateMinimalExceptionListSchemaMock(), + name: 'some other name', + description: 'some other description', + }; + + const { body } = await supertest + .put(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(200); + + const outputList: Partial = { + ...getExceptionResponseMockWithoutAutoGeneratedValues(), + name: 'some other name', + description: 'some other description', + version: 2, + }; + const bodyToCompare = removeExceptionListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputList); + }); + + it('should give a 404 if it is given a fake id', async () => { + const updatedList: UpdateExceptionListSchema = { + ...getUpdateMinimalExceptionListSchemaMock(), + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', + }; + delete updatedList.list_id; + + const { body } = await supertest + .put(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'exception list id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" does not exist', + }); + }); + + it('should give a 404 if it is given a fake list_id', async () => { + const updatedList: UpdateExceptionListSchema = { + ...getUpdateMinimalExceptionListSchemaMock(), + list_id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', + }; + + const { body } = await supertest + .put(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'exception list list_id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" does not exist', + }); + }); + + it('should give a 404 if both id and list_id is null', async () => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { list_id, ...listNoId } = getUpdateMinimalExceptionListSchemaMock(); + + const { body } = await supertest + .put(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(listNoId) + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'either id or list_id need to be defined', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/utils.ts b/x-pack/test/lists_api_integration/utils.ts index 272768fdf50b3..54a13fc027c99 100644 --- a/x-pack/test/lists_api_integration/utils.ts +++ b/x-pack/test/lists_api_integration/utils.ts @@ -6,8 +6,13 @@ import { SuperTest } from 'supertest'; import supertestAsPromised from 'supertest-as-promised'; +import { Client } from '@elastic/elasticsearch'; -import { ListItemSchema } from '../../plugins/lists/common/schemas'; +import { + ListItemSchema, + ExceptionListSchema, + ExceptionListItemSchema, +} from '../../plugins/lists/common/schemas'; import { ListSchema } from '../../plugins/lists/common'; import { LIST_INDEX } from '../../plugins/lists/common/constants'; @@ -83,6 +88,30 @@ export const removeListItemServerGeneratedProperties = ( return removedProperties; }; +/** + * This will remove server generated properties such as date times, etc... + * @param list List to pass in to remove typical server generated properties + */ +export const removeExceptionListItemServerGeneratedProperties = ( + list: Partial +): Partial => { + /* eslint-disable-next-line @typescript-eslint/naming-convention */ + const { created_at, updated_at, id, tie_breaker_id, _version, ...removedProperties } = list; + return removedProperties; +}; + +/** + * This will remove server generated properties such as date times, etc... + * @param list List to pass in to remove typical server generated properties + */ +export const removeExceptionListServerGeneratedProperties = ( + list: Partial +): Partial => { + /* eslint-disable-next-line @typescript-eslint/naming-convention */ + const { created_at, updated_at, id, tie_breaker_id, _version, ...removedProperties } = list; + return removedProperties; +}; + // Similar to ReactJs's waitFor from here: https://testing-library.com/docs/dom-testing-library/api-async#waitfor export const waitFor = async ( functionToTest: () => Promise, @@ -124,3 +153,32 @@ export const binaryToString = (res: any, callback: any): void => { callback(null, Buffer.from(res.data)); }); }; + +/** + * Remove all exceptions from the .kibana index + * This will retry 20 times before giving up and hopefully still not interfere with other tests + * @param es The ElasticSearch handle + */ +export const deleteAllExceptions = async (es: Client, retryCount = 20): Promise => { + if (retryCount > 0) { + try { + await es.deleteByQuery({ + index: '.kibana', + q: 'type:exception-list or type:exception-list-agnostic', + wait_for_completion: true, + refresh: true, + body: {}, + }); + } catch (err) { + // eslint-disable-next-line no-console + console.log( + `Failure trying to deleteAllExceptions, retries left are: ${retryCount - 1}`, + err + ); + await deleteAllExceptions(es, retryCount - 1); + } + } else { + // eslint-disable-next-line no-console + console.log('Could not deleteAllExceptions, no retries are left'); + } +}; From b249af128ee73a1be0669f77a1e5c6c8bbceefc2 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Thu, 13 Aug 2020 09:38:15 +0200 Subject: [PATCH 092/113] Use jest.useFakeTimers instead of hard coded timeout for tooltip tests. (#74642) Refactor to use jest.useFakeTimers(). --- .../field_title_bar/field_title_bar.test.js | 31 +++++++++++++------ .../field_type_icon/field_type_icon.test.js | 19 ++++++++++-- .../configure_cases/button.test.tsx | 18 +++++++---- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/x-pack/plugins/ml/public/application/components/field_title_bar/field_title_bar.test.js b/x-pack/plugins/ml/public/application/components/field_title_bar/field_title_bar.test.js index 1b33d68042295..329863fdc9986 100644 --- a/x-pack/plugins/ml/public/application/components/field_title_bar/field_title_bar.test.js +++ b/x-pack/plugins/ml/public/application/components/field_title_bar/field_title_bar.test.js @@ -62,7 +62,10 @@ describe('FieldTitleBar', () => { expect(hasClassName).toBeTruthy(); }); - test(`tooltip hovering`, (done) => { + test(`tooltip hovering`, () => { + // Use fake timers so we don't have to wait for the EuiToolTip timeout + jest.useFakeTimers(); + const props = { card: { fieldName: 'foo', type: 'bar' } }; const wrapper = mountWithIntl(); const container = wrapper.find({ className: 'field-name' }); @@ -70,14 +73,22 @@ describe('FieldTitleBar', () => { expect(wrapper.find('EuiToolTip').children()).toHaveLength(1); container.simulate('mouseover'); - // EuiToolTip mounts children after a 250ms delay - setTimeout(() => { - wrapper.update(); - expect(wrapper.find('EuiToolTip').children()).toHaveLength(2); - container.simulate('mouseout'); - wrapper.update(); - expect(wrapper.find('EuiToolTip').children()).toHaveLength(1); - done(); - }, 250); + + // Run the timers so the EuiTooltip will be visible + jest.runAllTimers(); + + wrapper.update(); + expect(wrapper.find('EuiToolTip').children()).toHaveLength(2); + + container.simulate('mouseout'); + + // Run the timers so the EuiTooltip will be hidden again + jest.runAllTimers(); + + wrapper.update(); + expect(wrapper.find('EuiToolTip').children()).toHaveLength(1); + + // Clearing all mocks will also reset fake timers. + jest.clearAllMocks(); }); }); diff --git a/x-pack/plugins/ml/public/application/components/field_type_icon/field_type_icon.test.js b/x-pack/plugins/ml/public/application/components/field_type_icon/field_type_icon.test.js index 7e37dc10ade33..d4200c2f8366b 100644 --- a/x-pack/plugins/ml/public/application/components/field_type_icon/field_type_icon.test.js +++ b/x-pack/plugins/ml/public/application/components/field_type_icon/field_type_icon.test.js @@ -27,6 +27,9 @@ describe('FieldTypeIcon', () => { }); test(`render with tooltip and test hovering`, () => { + // Use fake timers so we don't have to wait for the EuiToolTip timeout + jest.useFakeTimers(); + const typeIconComponent = mount( ); @@ -35,11 +38,23 @@ describe('FieldTypeIcon', () => { expect(typeIconComponent.find('EuiToolTip').children()).toHaveLength(1); container.simulate('mouseover'); - // EuiToolTip mounts children after a 250ms delay - setTimeout(() => expect(typeIconComponent.find('EuiToolTip').children()).toHaveLength(2), 250); + + // Run the timers so the EuiTooltip will be visible + jest.runAllTimers(); + + typeIconComponent.update(); + expect(typeIconComponent.find('EuiToolTip').children()).toHaveLength(2); container.simulate('mouseout'); + + // Run the timers so the EuiTooltip will be hidden again + jest.runAllTimers(); + + typeIconComponent.update(); expect(typeIconComponent.find('EuiToolTip').children()).toHaveLength(1); + + // Clearing all mocks will also reset fake timers. + jest.clearAllMocks(); }); test(`update component`, () => { diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx index 6fb693e47560d..56daa9a8364f6 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/button.test.tsx @@ -80,6 +80,9 @@ describe('Configuration button', () => { }); test('it shows the tooltip when hovering the button', () => { + // Use fake timers so we don't have to wait for the EuiToolTip timeout + jest.useFakeTimers(); + const msgTooltip = 'My message tooltip'; const titleTooltip = 'My title'; @@ -96,11 +99,14 @@ describe('Configuration button', () => { ); newWrapper.find('[data-test-subj="configure-case-button"]').first().simulate('mouseOver'); - // EuiToolTip mounts children after a 250ms delay - setTimeout( - () => - expect(newWrapper.find('.euiToolTipPopover').text()).toBe(`${titleTooltip}${msgTooltip}`), - 250 - ); + + // Run the timers so the EuiTooltip will be visible + jest.runAllTimers(); + + newWrapper.update(); + expect(newWrapper.find('.euiToolTipPopover').text()).toBe(`${titleTooltip}${msgTooltip}`); + + // Clearing all mocks will also reset fake timers. + jest.clearAllMocks(); }); }); From 290f9bfde20cc6f689803afd0efbc158fdbbc5d8 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Thu, 13 Aug 2020 11:28:39 +0300 Subject: [PATCH 093/113] Data plugin: Suggested enhance pattern (#74505) * improve test stability * Enhance pattern * fix tests * fix test * Rename enhance to __enhance * Deleted unnecessary attribute * ISearchInterceptor interface * docs * Clean up internal docs * jest Co-authored-by: Elastic Machine --- ...ublic.searchinterceptor.abortcontroller.md | 13 ----- ...blic.searchinterceptor.getpendingcount_.md | 8 ++- ...data-public.searchinterceptor.hidetoast.md | 11 ---- ...blic.searchinterceptor.longrunningtoast.md | 13 ----- ...n-plugins-data-public.searchinterceptor.md | 11 +--- ...a-public.searchinterceptor.pendingcount.md | 13 ----- ...-public.searchinterceptor.pendingcount_.md | 13 ----- ...ns-data-public.searchinterceptor.search.md | 2 +- ...data-public.searchinterceptor.showtoast.md | 11 ---- ....searchinterceptor.timeoutsubscriptions.md | 13 ----- ...-data-public.searchinterceptordeps.http.md | 2 +- ...ugins-data-public.searchinterceptordeps.md | 8 +-- ...ic.searchinterceptordeps.startservices.md} | 6 +-- ...ata-public.searchinterceptordeps.toasts.md | 2 +- ...public.searchinterceptordeps.uisettings.md | 2 +- src/plugins/data/public/mocks.ts | 1 + src/plugins/data/public/plugin.ts | 18 ++++--- src/plugins/data/public/public.api.md | 35 ++++++++----- src/plugins/data/public/search/index.ts | 9 +++- src/plugins/data/public/search/mocks.ts | 2 +- .../public/search/search_interceptor.test.ts | 28 +++++------ .../data/public/search/search_interceptor.ts | 50 ++++++++++++------- .../data/public/search/search_service.test.ts | 2 +- .../data/public/search/search_service.ts | 35 +++++++------ src/plugins/data/public/search/types.ts | 16 ++++-- src/plugins/data/public/types.ts | 10 +++- x-pack/plugins/data_enhanced/public/plugin.ts | 18 ++++--- .../public/search/search_interceptor.test.ts | 48 +++++++++++------- .../public/search/search_interceptor.ts | 7 ++- 29 files changed, 194 insertions(+), 213 deletions(-) delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.abortcontroller.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.hidetoast.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.longrunningtoast.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.showtoast.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md rename docs/development/plugins/data/public/{kibana-plugin-plugins-data-public.searchinterceptordeps.application.md => kibana-plugin-plugins-data-public.searchinterceptordeps.startservices.md} (61%) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.abortcontroller.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.abortcontroller.md deleted file mode 100644 index 0451a2254dc40..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.abortcontroller.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [abortController](./kibana-plugin-plugins-data-public.searchinterceptor.abortcontroller.md) - -## SearchInterceptor.abortController property - -`abortController` used to signal all searches to abort. - -Signature: - -```typescript -protected abortController: AbortController; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md index db2c5d6957ad7..ef36b3f37b0c7 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md @@ -2,12 +2,16 @@ [Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [getPendingCount$](./kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md) -## SearchInterceptor.getPendingCount$ property +## SearchInterceptor.getPendingCount$() method Returns an `Observable` over the current number of pending searches. This could mean that one of the search requests is still in flight, or that it has only received partial responses. Signature: ```typescript -getPendingCount$: () => Observable; +getPendingCount$(): Observable; ``` +Returns: + +`Observable` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.hidetoast.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.hidetoast.md deleted file mode 100644 index 59938a755a99e..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.hidetoast.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [hideToast](./kibana-plugin-plugins-data-public.searchinterceptor.hidetoast.md) - -## SearchInterceptor.hideToast property - -Signature: - -```typescript -protected hideToast: () => void; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.longrunningtoast.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.longrunningtoast.md deleted file mode 100644 index 5799039de91bc..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.longrunningtoast.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [longRunningToast](./kibana-plugin-plugins-data-public.searchinterceptor.longrunningtoast.md) - -## SearchInterceptor.longRunningToast property - -The current long-running toast (if there is one). - -Signature: - -```typescript -protected longRunningToast?: Toast; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md index b3b7da05326d0..32954927504ae 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md @@ -20,22 +20,15 @@ export declare class SearchInterceptor | Property | Modifiers | Type | Description | | --- | --- | --- | --- | -| [abortController](./kibana-plugin-plugins-data-public.searchinterceptor.abortcontroller.md) | | AbortController | abortController used to signal all searches to abort. | | [deps](./kibana-plugin-plugins-data-public.searchinterceptor.deps.md) | | SearchInterceptorDeps | | -| [getPendingCount$](./kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md) | | () => Observable<number> | Returns an Observable over the current number of pending searches. This could mean that one of the search requests is still in flight, or that it has only received partial responses. | -| [hideToast](./kibana-plugin-plugins-data-public.searchinterceptor.hidetoast.md) | | () => void | | -| [longRunningToast](./kibana-plugin-plugins-data-public.searchinterceptor.longrunningtoast.md) | | Toast | The current long-running toast (if there is one). | -| [pendingCount](./kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md) | | number | The number of pending search requests. | -| [pendingCount$](./kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md) | | BehaviorSubject<number> | Observable that emits when the number of pending requests changes. | | [requestTimeout](./kibana-plugin-plugins-data-public.searchinterceptor.requesttimeout.md) | | number | undefined | | -| [showToast](./kibana-plugin-plugins-data-public.searchinterceptor.showtoast.md) | | () => void | | -| [timeoutSubscriptions](./kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md) | | Subscription | The subscriptions from scheduling the automatic timeout for each request. | ## Methods | Method | Modifiers | Description | | --- | --- | --- | +| [getPendingCount$()](./kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md) | | Returns an Observable over the current number of pending searches. This could mean that one of the search requests is still in flight, or that it has only received partial responses. | | [runSearch(request, signal, strategy)](./kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md) | | | -| [search(request, options)](./kibana-plugin-plugins-data-public.searchinterceptor.search.md) | | Searches using the given search method. Overrides the AbortSignal with one that will abort either when cancelPending is called, when the request times out, or when the original AbortSignal is aborted. Updates the pendingCount when the request is started/finalized. | +| [search(request, options)](./kibana-plugin-plugins-data-public.searchinterceptor.search.md) | | Searches using the given search method. Overrides the AbortSignal with one that will abort either when cancelPending is called, when the request times out, or when the original AbortSignal is aborted. Updates pendingCount$ when the request is started/finalized. | | [setupTimers(options)](./kibana-plugin-plugins-data-public.searchinterceptor.setuptimers.md) | | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md deleted file mode 100644 index 7dd2bd3e6703f..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [pendingCount](./kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md) - -## SearchInterceptor.pendingCount property - -The number of pending search requests. - -Signature: - -```typescript -protected pendingCount: number; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md deleted file mode 100644 index dad0fca0bfe08..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [pendingCount$](./kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md) - -## SearchInterceptor.pendingCount$ property - -Observable that emits when the number of pending requests changes. - -Signature: - -```typescript -protected pendingCount$: BehaviorSubject; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.search.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.search.md index 38ddda7b4e184..1752d183a8737 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.search.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.search.md @@ -4,7 +4,7 @@ ## SearchInterceptor.search() method -Searches using the given `search` method. Overrides the `AbortSignal` with one that will abort either when `cancelPending` is called, when the request times out, or when the original `AbortSignal` is aborted. Updates the `pendingCount` when the request is started/finalized. +Searches using the given `search` method. Overrides the `AbortSignal` with one that will abort either when `cancelPending` is called, when the request times out, or when the original `AbortSignal` is aborted. Updates `pendingCount$` when the request is started/finalized. Signature: diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.showtoast.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.showtoast.md deleted file mode 100644 index e495c72b57215..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.showtoast.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [showToast](./kibana-plugin-plugins-data-public.searchinterceptor.showtoast.md) - -## SearchInterceptor.showToast property - -Signature: - -```typescript -protected showToast: () => void; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md deleted file mode 100644 index 12f200e037784..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [timeoutSubscriptions](./kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md) - -## SearchInterceptor.timeoutSubscriptions property - -The subscriptions from scheduling the automatic timeout for each request. - -Signature: - -```typescript -protected timeoutSubscriptions: Subscription; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.http.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.http.md index 1146179c13d63..66c31bb6fcf80 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.http.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.http.md @@ -7,5 +7,5 @@ Signature: ```typescript -http: CoreStart['http']; +http: CoreSetup['http']; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.md index 1291af5359887..63eb67ce48246 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.md @@ -14,9 +14,9 @@ export interface SearchInterceptorDeps | Property | Type | Description | | --- | --- | --- | -| [application](./kibana-plugin-plugins-data-public.searchinterceptordeps.application.md) | ApplicationStart | | -| [http](./kibana-plugin-plugins-data-public.searchinterceptordeps.http.md) | CoreStart['http'] | | -| [toasts](./kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md) | ToastsStart | | -| [uiSettings](./kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md) | CoreStart['uiSettings'] | | +| [http](./kibana-plugin-plugins-data-public.searchinterceptordeps.http.md) | CoreSetup['http'] | | +| [startServices](./kibana-plugin-plugins-data-public.searchinterceptordeps.startservices.md) | Promise<[CoreStart, any, unknown]> | | +| [toasts](./kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md) | ToastsSetup | | +| [uiSettings](./kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md) | CoreSetup['uiSettings'] | | | [usageCollector](./kibana-plugin-plugins-data-public.searchinterceptordeps.usagecollector.md) | SearchUsageCollector | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.application.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.startservices.md similarity index 61% rename from docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.application.md rename to docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.startservices.md index a8cd1b170a595..855d0652058b8 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.application.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.startservices.md @@ -1,11 +1,11 @@ -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptorDeps](./kibana-plugin-plugins-data-public.searchinterceptordeps.md) > [application](./kibana-plugin-plugins-data-public.searchinterceptordeps.application.md) +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptorDeps](./kibana-plugin-plugins-data-public.searchinterceptordeps.md) > [startServices](./kibana-plugin-plugins-data-public.searchinterceptordeps.startservices.md) -## SearchInterceptorDeps.application property +## SearchInterceptorDeps.startServices property Signature: ```typescript -application: ApplicationStart; +startServices: Promise<[CoreStart, any, unknown]>; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md index 0023b34af10c3..1f560dfa5cf7c 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md @@ -7,5 +7,5 @@ Signature: ```typescript -toasts: ToastsStart; +toasts: ToastsSetup; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md index 425e177ec9300..a34d223c34ac2 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md @@ -7,5 +7,5 @@ Signature: ```typescript -uiSettings: CoreStart['uiSettings']; +uiSettings: CoreSetup['uiSettings']; ``` diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 135b6121d1dd5..3fc1e6454829d 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -44,6 +44,7 @@ const createSetupContract = (): Setup => { search: searchServiceMock.createSetupContract(), fieldFormats: fieldFormatsServiceMock.createSetupContract(), query: querySetupMock, + __enhance: jest.fn(), }; }; diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index 68c0f506f121d..e950434b287a7 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -34,6 +34,7 @@ import { DataSetupDependencies, DataStartDependencies, InternalStartServices, + DataPublicPluginEnhancements, } from './types'; import { AutocompleteService } from './autocomplete'; import { SearchService } from './search/search_service'; @@ -156,16 +157,21 @@ export class DataPublicPlugin })) ); + const searchService = this.searchService.setup(core, { + expressions, + usageCollection, + getInternalStartServices, + packageInfo: this.packageInfo, + }); + return { autocomplete: this.autocomplete.setup(core), - search: this.searchService.setup(core, { - expressions, - usageCollection, - getInternalStartServices, - packageInfo: this.packageInfo, - }), + search: searchService, fieldFormats: this.fieldFormatsService.setup(core), query: queryService, + __enhance: (enhancements: DataPublicPluginEnhancements) => { + searchService.__enhance(enhancements.search); + }, }; } diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 6225d74fb1b31..a61334905e9f5 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -8,12 +8,12 @@ import { $Values } from '@kbn/utility-types'; import _ from 'lodash'; import { Action } from 'history'; import { ApiResponse } from '@elastic/elasticsearch/lib/Transport'; -import { ApplicationStart } from 'kibana/public'; import { Assign } from '@kbn/utility-types'; import { BehaviorSubject } from 'rxjs'; import Boom from 'boom'; import { Component } from 'react'; import { CoreSetup } from 'src/core/public'; +import { CoreSetup as CoreSetup_2 } from 'kibana/public'; import { CoreStart } from 'kibana/public'; import { CoreStart as CoreStart_2 } from 'src/core/public'; import { Ensure } from '@kbn/utility-types'; @@ -65,7 +65,7 @@ import { SerializedFieldFormat as SerializedFieldFormat_2 } from 'src/plugins/ex import { Subscription } from 'rxjs'; import { Toast } from 'kibana/public'; import { ToastInputFields } from 'src/core/public/notifications'; -import { ToastsStart } from 'kibana/public'; +import { ToastsSetup } from 'kibana/public'; import { TransportRequestOptions } from '@elastic/elasticsearch/lib/Transport'; import { TransportRequestParams } from '@elastic/elasticsearch/lib/Transport'; import { TransportRequestPromise } from '@elastic/elasticsearch/lib/Transport'; @@ -222,6 +222,10 @@ export type CustomFilter = Filter & { // // @public (undocumented) export interface DataPublicPluginSetup { + // Warning: (ae-forgotten-export) The symbol "DataPublicPluginEnhancements" needs to be exported by the entry point index.d.ts + // + // @internal (undocumented) + __enhance: (enhancements: DataPublicPluginEnhancements) => void; // Warning: (ae-forgotten-export) The symbol "AutocompleteSetup" needs to be exported by the entry point index.d.ts // // (undocumented) @@ -1714,15 +1718,19 @@ export interface SearchError { // @public (undocumented) export class SearchInterceptor { constructor(deps: SearchInterceptorDeps, requestTimeout?: number | undefined); + // @internal protected abortController: AbortController; + // @internal (undocumented) + protected application: CoreStart['application']; // (undocumented) protected readonly deps: SearchInterceptorDeps; - getPendingCount$: () => Observable; - // (undocumented) + getPendingCount$(): Observable; + // @internal (undocumented) protected hideToast: () => void; + // @internal protected longRunningToast?: Toast; + // @internal protected pendingCount$: BehaviorSubject; - protected pendingCount: number; // (undocumented) protected readonly requestTimeout?: number | undefined; // (undocumented) @@ -1733,8 +1741,9 @@ export class SearchInterceptor { combinedSignal: AbortSignal; cleanup: () => void; }; - // (undocumented) + // @internal (undocumented) protected showToast: () => void; + // @internal protected timeoutSubscriptions: Subscription; } @@ -1743,13 +1752,13 @@ export class SearchInterceptor { // @public (undocumented) export interface SearchInterceptorDeps { // (undocumented) - application: ApplicationStart; + http: CoreSetup_2['http']; // (undocumented) - http: CoreStart['http']; + startServices: Promise<[CoreStart, any, unknown]>; // (undocumented) - toasts: ToastsStart; + toasts: ToastsSetup; // (undocumented) - uiSettings: CoreStart['uiSettings']; + uiSettings: CoreSetup_2['uiSettings']; // Warning: (ae-forgotten-export) The symbol "SearchUsageCollector" needs to be exported by the entry point index.d.ts // // (undocumented) @@ -1980,9 +1989,9 @@ export const UI_SETTINGS: { // src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:396:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:45:5 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/types.ts:54:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/types.ts:55:5 - (ae-forgotten-export) The symbol "createFiltersFromRangeSelectAction" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/types.ts:63:5 - (ae-forgotten-export) The symbol "IndexPatternSelectProps" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/types.ts:62:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/types.ts:63:5 - (ae-forgotten-export) The symbol "createFiltersFromRangeSelectAction" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/types.ts:71:5 - (ae-forgotten-export) The symbol "IndexPatternSelectProps" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts index 96445e5367147..ae028df31e401 100644 --- a/src/plugins/data/public/search/index.ts +++ b/src/plugins/data/public/search/index.ts @@ -21,7 +21,14 @@ export * from './aggs'; export * from './expressions'; export * from './tabify'; -export { ISearch, ISearchOptions, ISearchGeneric, ISearchSetup, ISearchStart } from './types'; +export { + ISearch, + ISearchOptions, + ISearchGeneric, + ISearchSetup, + ISearchStart, + SearchEnhancements, +} from './types'; export { IEsSearchResponse, IEsSearchRequest, ES_SEARCH_STRATEGY } from '../../common/search'; diff --git a/src/plugins/data/public/search/mocks.ts b/src/plugins/data/public/search/mocks.ts index c56331baffed2..8ccf46fe7c97d 100644 --- a/src/plugins/data/public/search/mocks.ts +++ b/src/plugins/data/public/search/mocks.ts @@ -26,13 +26,13 @@ export * from './search_source/mocks'; function createSetupContract(): jest.Mocked { return { aggs: searchAggsSetupMock(), + __enhance: jest.fn(), }; } function createStartContract(): jest.Mocked { return { aggs: searchAggsStartMock(), - setInterceptor: jest.fn(), search: jest.fn(), searchSource: searchSourceMock, __LEGACY: { diff --git a/src/plugins/data/public/search/search_interceptor.test.ts b/src/plugins/data/public/search/search_interceptor.test.ts index f4c5de2bcaf31..2eded17bda88c 100644 --- a/src/plugins/data/public/search/search_interceptor.test.ts +++ b/src/plugins/data/public/search/search_interceptor.test.ts @@ -17,27 +17,27 @@ * under the License. */ -import { CoreStart } from '../../../../core/public'; +import { CoreSetup } from '../../../../core/public'; import { coreMock } from '../../../../core/public/mocks'; import { IEsSearchRequest } from '../../common/search'; import { SearchInterceptor } from './search_interceptor'; import { AbortError } from '../../common'; let searchInterceptor: SearchInterceptor; -let mockCoreStart: MockedKeys; +let mockCoreSetup: MockedKeys; const flushPromises = () => new Promise((resolve) => setImmediate(resolve)); jest.useFakeTimers(); describe('SearchInterceptor', () => { beforeEach(() => { - mockCoreStart = coreMock.createStart(); + mockCoreSetup = coreMock.createSetup(); searchInterceptor = new SearchInterceptor( { - toasts: mockCoreStart.notifications.toasts, - application: mockCoreStart.application, - uiSettings: mockCoreStart.uiSettings, - http: mockCoreStart.http, + toasts: mockCoreSetup.notifications.toasts, + startServices: mockCoreSetup.getStartServices(), + uiSettings: mockCoreSetup.uiSettings, + http: mockCoreSetup.http, }, 1000 ); @@ -46,7 +46,7 @@ describe('SearchInterceptor', () => { describe('search', () => { test('Observable should resolve if fetch is successful', async () => { const mockResponse: any = { result: 200 }; - mockCoreStart.http.fetch.mockResolvedValueOnce(mockResponse); + mockCoreSetup.http.fetch.mockResolvedValueOnce(mockResponse); const mockRequest: IEsSearchRequest = { params: {}, }; @@ -58,7 +58,7 @@ describe('SearchInterceptor', () => { test('Observable should fail if fetch has an error', async () => { const mockResponse: any = { result: 500 }; - mockCoreStart.http.fetch.mockRejectedValueOnce(mockResponse); + mockCoreSetup.http.fetch.mockRejectedValueOnce(mockResponse); const mockRequest: IEsSearchRequest = { params: {}, }; @@ -72,7 +72,7 @@ describe('SearchInterceptor', () => { }); test('Observable should fail if fetch times out (test merged signal)', async () => { - mockCoreStart.http.fetch.mockImplementationOnce((options: any) => { + mockCoreSetup.http.fetch.mockImplementationOnce((options: any) => { return new Promise((resolve, reject) => { options.signal.addEventListener('abort', () => { reject(new AbortError()); @@ -100,7 +100,7 @@ describe('SearchInterceptor', () => { test('Observable should fail if user aborts (test merged signal)', async () => { const abortController = new AbortController(); - mockCoreStart.http.fetch.mockImplementationOnce((options: any) => { + mockCoreSetup.http.fetch.mockImplementationOnce((options: any) => { return new Promise((resolve, reject) => { options.signal.addEventListener('abort', () => { reject(new AbortError()); @@ -136,7 +136,7 @@ describe('SearchInterceptor', () => { const error = (e: any) => { expect(e).toBeInstanceOf(AbortError); - expect(mockCoreStart.http.fetch).not.toBeCalled(); + expect(mockCoreSetup.http.fetch).not.toBeCalled(); done(); }; response.subscribe({ error }); @@ -150,7 +150,7 @@ describe('SearchInterceptor', () => { pendingCount$.subscribe(pendingNext); const mockResponse: any = { result: 200 }; - mockCoreStart.http.fetch.mockResolvedValue(mockResponse); + mockCoreSetup.http.fetch.mockResolvedValue(mockResponse); const mockRequest: IEsSearchRequest = { params: {}, }; @@ -169,7 +169,7 @@ describe('SearchInterceptor', () => { pendingCount$.subscribe(pendingNext); const mockResponse: any = { result: 500 }; - mockCoreStart.http.fetch.mockRejectedValue(mockResponse); + mockCoreSetup.http.fetch.mockRejectedValue(mockResponse); const mockRequest: IEsSearchRequest = { params: {}, }; diff --git a/src/plugins/data/public/search/search_interceptor.ts b/src/plugins/data/public/search/search_interceptor.ts index d6fcde8e986f3..99fccda7fddf3 100644 --- a/src/plugins/data/public/search/search_interceptor.ts +++ b/src/plugins/data/public/search/search_interceptor.ts @@ -20,7 +20,7 @@ import { trimEnd } from 'lodash'; import { BehaviorSubject, throwError, timer, Subscription, defer, from, Observable } from 'rxjs'; import { finalize, filter } from 'rxjs/operators'; -import { ApplicationStart, Toast, ToastsStart, CoreStart } from 'kibana/public'; +import { Toast, CoreStart, ToastsSetup, CoreSetup } from 'kibana/public'; import { getCombinedSignal, AbortError } from '../../common/utils'; import { IEsSearchRequest, IEsSearchResponse, ES_SEARCH_STRATEGY } from '../../common/search'; import { ISearchOptions } from './types'; @@ -30,39 +30,43 @@ import { SearchUsageCollector } from './collectors'; const LONG_QUERY_NOTIFICATION_DELAY = 10000; export interface SearchInterceptorDeps { - toasts: ToastsStart; - application: ApplicationStart; - http: CoreStart['http']; - uiSettings: CoreStart['uiSettings']; + toasts: ToastsSetup; + http: CoreSetup['http']; + uiSettings: CoreSetup['uiSettings']; + startServices: Promise<[CoreStart, any, unknown]>; usageCollector?: SearchUsageCollector; } export class SearchInterceptor { /** * `abortController` used to signal all searches to abort. + * @internal */ protected abortController = new AbortController(); - /** - * The number of pending search requests. - */ - protected pendingCount = 0; - /** * Observable that emits when the number of pending requests changes. + * @internal */ - protected pendingCount$ = new BehaviorSubject(this.pendingCount); + protected pendingCount$ = new BehaviorSubject(0); /** * The subscriptions from scheduling the automatic timeout for each request. + * @internal */ protected timeoutSubscriptions: Subscription = new Subscription(); /** * The current long-running toast (if there is one). + * @internal */ protected longRunningToast?: Toast; + /** + * @internal + */ + protected application!: CoreStart['application']; + /** * This class should be instantiated with a `requestTimeout` corresponding with how many ms after * requests are initiated that they should automatically cancel. @@ -76,6 +80,10 @@ export class SearchInterceptor { ) { this.deps.http.addLoadingCountSource(this.pendingCount$); + this.deps.startServices.then(([coreStart]) => { + this.application = coreStart.application; + }); + // When search requests go out, a notification is scheduled allowing users to continue the // request past the timeout. When all search requests complete, we remove the notification. this.getPendingCount$() @@ -87,9 +95,9 @@ export class SearchInterceptor { * Returns an `Observable` over the current number of pending searches. This could mean that one * of the search requests is still in flight, or that it has only received partial responses. */ - public getPendingCount$ = () => { + public getPendingCount$() { return this.pendingCount$.asObservable(); - }; + } protected runSearch( request: IEsSearchRequest, @@ -112,7 +120,7 @@ export class SearchInterceptor { /** * Searches using the given `search` method. Overrides the `AbortSignal` with one that will abort * either when `cancelPending` is called, when the request times out, or when the original - * `AbortSignal` is aborted. Updates the `pendingCount` when the request is started/finalized. + * `AbortSignal` is aborted. Updates `pendingCount$` when the request is started/finalized. */ public search( request: IEsSearchRequest, @@ -125,11 +133,11 @@ export class SearchInterceptor { } const { combinedSignal, cleanup } = this.setupTimers(options); - this.pendingCount$.next(++this.pendingCount); + this.pendingCount$.next(this.pendingCount$.getValue() + 1); return this.runSearch(request, combinedSignal, options?.strategy).pipe( finalize(() => { - this.pendingCount$.next(--this.pendingCount); + this.pendingCount$.next(this.pendingCount$.getValue() - 1); cleanup(); }) ); @@ -173,13 +181,16 @@ export class SearchInterceptor { }; } + /** + * @internal + */ protected showToast = () => { if (this.longRunningToast) return; this.longRunningToast = this.deps.toasts.addInfo( { title: 'Your query is taking a while', text: getLongQueryNotification({ - application: this.deps.application, + application: this.application, }), }, { @@ -188,6 +199,9 @@ export class SearchInterceptor { ); }; + /** + * @internal + */ protected hideToast = () => { if (this.longRunningToast) { this.deps.toasts.remove(this.longRunningToast); @@ -198,3 +212,5 @@ export class SearchInterceptor { } }; } + +export type ISearchInterceptor = PublicMethodsOf; diff --git a/src/plugins/data/public/search/search_service.test.ts b/src/plugins/data/public/search/search_service.test.ts index 55d31db191733..f0a017847e06a 100644 --- a/src/plugins/data/public/search/search_service.test.ts +++ b/src/plugins/data/public/search/search_service.test.ts @@ -41,6 +41,7 @@ describe('Search service', () => { expressions: expressionsPluginMock.createSetupContract(), } as any); expect(setup).toHaveProperty('aggs'); + expect(setup).toHaveProperty('__enhance'); }); }); @@ -49,7 +50,6 @@ describe('Search service', () => { const start = searchService.start(mockCoreStart, { indexPatterns: {}, } as any); - expect(start).toHaveProperty('setInterceptor'); expect(start).toHaveProperty('search'); }); }); diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index 064e16014cb70..4c94925b66d6e 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -18,7 +18,7 @@ */ import { Plugin, CoreSetup, CoreStart, PackageInfo } from '../../../../core/public'; -import { ISearchSetup, ISearchStart } from './types'; +import { ISearchSetup, ISearchStart, SearchEnhancements } from './types'; import { ExpressionsSetup } from '../../../../plugins/expressions/public'; import { createSearchSource, SearchSource, SearchSourceDependencies } from './search_source'; @@ -28,7 +28,7 @@ import { calculateBounds, TimeRange } from '../../common/query'; import { IndexPatternsContract } from '../index_patterns/index_patterns'; import { GetInternalStartServicesFn } from '../types'; -import { SearchInterceptor } from './search_interceptor'; +import { ISearchInterceptor, SearchInterceptor } from './search_interceptor'; import { getAggTypes, getAggTypesFunctions, @@ -54,7 +54,7 @@ interface SearchServiceStartDependencies { export class SearchService implements Plugin { private esClient?: LegacyApiCaller; private readonly aggTypesRegistry = new AggTypesRegistry(); - private searchInterceptor!: SearchInterceptor; + private searchInterceptor!: ISearchInterceptor; private usageCollector?: SearchUsageCollector; /** @@ -91,15 +91,6 @@ export class SearchService implements Plugin { const aggFunctions = getAggTypesFunctions(); aggFunctions.forEach((fn) => expressions.registerFunction(fn)); - return { - aggs: { - calculateAutoTimeExpression: getCalculateAutoTimeExpression(core.uiSettings), - types: aggTypesSetup, - }, - }; - } - - public start(core: CoreStart, dependencies: SearchServiceStartDependencies): ISearchStart { /** * A global object that intercepts all searches and provides convenience methods for cancelling * all pending search requests, as well as getting the number of pending search requests. @@ -109,14 +100,27 @@ export class SearchService implements Plugin { this.searchInterceptor = new SearchInterceptor( { toasts: core.notifications.toasts, - application: core.application, http: core.http, uiSettings: core.uiSettings, + startServices: core.getStartServices(), usageCollector: this.usageCollector!, }, core.injectedMetadata.getInjectedVar('esRequestTimeout') as number ); + return { + usageCollector: this.usageCollector!, + __enhance: (enhancements: SearchEnhancements) => { + this.searchInterceptor = enhancements.searchInterceptor; + }, + aggs: { + calculateAutoTimeExpression: getCalculateAutoTimeExpression(core.uiSettings), + types: aggTypesSetup, + }, + }; + } + + public start(core: CoreStart, dependencies: SearchServiceStartDependencies): ISearchStart { const aggTypesStart = this.aggTypesRegistry.start(); const search: ISearchGeneric = (request, options) => { @@ -145,17 +149,12 @@ export class SearchService implements Plugin { types: aggTypesStart, }, search, - usageCollector: this.usageCollector!, searchSource: { create: createSearchSource(dependencies.indexPatterns, searchSourceDependencies), createEmpty: () => { return new SearchSource({}, searchSourceDependencies); }, }, - setInterceptor: (searchInterceptor: SearchInterceptor) => { - // TODO: should an intercepror have a destroy method? - this.searchInterceptor = searchInterceptor; - }, __LEGACY: legacySearch, }; } diff --git a/src/plugins/data/public/search/types.ts b/src/plugins/data/public/search/types.ts index f80a13d048a68..d85d4c4e5c935 100644 --- a/src/plugins/data/public/search/types.ts +++ b/src/plugins/data/public/search/types.ts @@ -21,7 +21,7 @@ import { Observable } from 'rxjs'; import { PackageInfo } from 'kibana/server'; import { SearchAggsSetup, SearchAggsStart } from './aggs'; import { LegacyApiCaller } from './legacy/es_client'; -import { SearchInterceptor } from './search_interceptor'; +import { ISearchInterceptor } from './search_interceptor'; import { ISearchSource, SearchSourceFields } from './search_source'; import { SearchUsageCollector } from './collectors'; import { @@ -54,23 +54,33 @@ export interface ISearchStartLegacy { esClient: LegacyApiCaller; } +export interface SearchEnhancements { + searchInterceptor: ISearchInterceptor; +} /** * The setup contract exposed by the Search plugin exposes the search strategy extension * point. */ export interface ISearchSetup { aggs: SearchAggsSetup; + usageCollector?: SearchUsageCollector; + /** + * @internal + */ + __enhance: (enhancements: SearchEnhancements) => void; } export interface ISearchStart { aggs: SearchAggsStart; - setInterceptor: (searchInterceptor: SearchInterceptor) => void; search: ISearchGeneric; searchSource: { create: (fields?: SearchSourceFields) => Promise; createEmpty: () => ISearchSource; }; - usageCollector?: SearchUsageCollector; + /** + * @deprecated + * @internal + */ __LEGACY: ISearchStartLegacy; } diff --git a/src/plugins/data/public/types.ts b/src/plugins/data/public/types.ts index 6d67127251424..c39b7d355d495 100644 --- a/src/plugins/data/public/types.ts +++ b/src/plugins/data/public/types.ts @@ -25,13 +25,17 @@ import { UiActionsSetup, UiActionsStart } from 'src/plugins/ui_actions/public'; import { AutocompleteSetup, AutocompleteStart } from './autocomplete'; import { FieldFormatsSetup, FieldFormatsStart } from './field_formats'; import { createFiltersFromRangeSelectAction, createFiltersFromValueClickAction } from './actions'; -import { ISearchSetup, ISearchStart } from './search'; +import { ISearchSetup, ISearchStart, SearchEnhancements } from './search'; import { QuerySetup, QueryStart } from './query'; import { IndexPatternSelectProps } from './ui/index_pattern_select'; import { IndexPatternsContract } from './index_patterns'; import { StatefulSearchBarProps } from './ui/search_bar/create_search_bar'; import { UsageCollectionSetup } from '../../usage_collection/public'; +export interface DataPublicPluginEnhancements { + search: SearchEnhancements; +} + export interface DataSetupDependencies { expressions: ExpressionsSetup; uiActions: UiActionsSetup; @@ -47,6 +51,10 @@ export interface DataPublicPluginSetup { search: ISearchSetup; fieldFormats: FieldFormatsSetup; query: QuerySetup; + /** + * @internal + */ + __enhance: (enhancements: DataPublicPluginEnhancements) => void; } export interface DataPublicPluginStart { diff --git a/x-pack/plugins/data_enhanced/public/plugin.ts b/x-pack/plugins/data_enhanced/public/plugin.ts index bdf3f6a0acf90..7f6e3feac0671 100644 --- a/x-pack/plugins/data_enhanced/public/plugin.ts +++ b/x-pack/plugins/data_enhanced/public/plugin.ts @@ -31,20 +31,26 @@ export class DataEnhancedPlugin KUERY_LANGUAGE_NAME, setupKqlQuerySuggestionProvider(core) ); - } - public start(core: CoreStart, plugins: DataEnhancedStartDependencies) { - setAutocompleteService(plugins.data.autocomplete); const enhancedSearchInterceptor = new EnhancedSearchInterceptor( { toasts: core.notifications.toasts, - application: core.application, http: core.http, uiSettings: core.uiSettings, - usageCollector: plugins.data.search.usageCollector, + startServices: core.getStartServices(), + usageCollector: data.search.usageCollector, }, core.injectedMetadata.getInjectedVar('esRequestTimeout') as number ); - plugins.data.search.setInterceptor(enhancedSearchInterceptor); + + data.__enhance({ + search: { + searchInterceptor: enhancedSearchInterceptor, + }, + }); + } + + public start(core: CoreStart, plugins: DataEnhancedStartDependencies) { + setAutocompleteService(plugins.data.autocomplete); } } diff --git a/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts b/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts index d004511fa4674..fe954f1602cd3 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts @@ -6,7 +6,7 @@ import { coreMock } from '../../../../../src/core/public/mocks'; import { EnhancedSearchInterceptor } from './search_interceptor'; -import { CoreStart } from 'kibana/public'; +import { CoreSetup, CoreStart } from 'kibana/public'; import { AbortError } from '../../../../../src/plugins/data/common'; const timeTravel = (msToRun = 0) => { @@ -19,13 +19,14 @@ const error = jest.fn(); const complete = jest.fn(); let searchInterceptor: EnhancedSearchInterceptor; +let mockCoreSetup: MockedKeys; let mockCoreStart: MockedKeys; jest.useFakeTimers(); function mockFetchImplementation(responses: any[]) { let i = 0; - mockCoreStart.http.fetch.mockImplementation(() => { + mockCoreSetup.http.fetch.mockImplementation(() => { const { time = 0, value = {}, isError = false } = responses[i++]; return new Promise((resolve, reject) => setTimeout(() => { @@ -39,6 +40,7 @@ describe('EnhancedSearchInterceptor', () => { let mockUsageCollector: any; beforeEach(() => { + mockCoreSetup = coreMock.createSetup(); mockCoreStart = coreMock.createStart(); next.mockClear(); @@ -54,12 +56,20 @@ describe('EnhancedSearchInterceptor', () => { trackLongQueryRunBeyondTimeout: jest.fn(), }; + const mockPromise = new Promise((resolve) => { + resolve([ + { + application: mockCoreStart.application, + }, + ]); + }); + searchInterceptor = new EnhancedSearchInterceptor( { - toasts: mockCoreStart.notifications.toasts, - application: mockCoreStart.application, - http: mockCoreStart.http, - uiSettings: mockCoreStart.uiSettings, + toasts: mockCoreSetup.notifications.toasts, + startServices: mockPromise as any, + http: mockCoreSetup.http, + uiSettings: mockCoreSetup.uiSettings, usageCollector: mockUsageCollector, }, 1000 @@ -229,8 +239,8 @@ describe('EnhancedSearchInterceptor', () => { expect(error).toHaveBeenCalled(); expect(error.mock.calls[0][0]).toBeInstanceOf(AbortError); - expect(mockCoreStart.http.fetch).toHaveBeenCalledTimes(2); - expect(mockCoreStart.http.delete).toHaveBeenCalled(); + expect(mockCoreSetup.http.fetch).toHaveBeenCalledTimes(2); + expect(mockCoreSetup.http.delete).toHaveBeenCalled(); }); test('should not DELETE a running async search on async timeout prior to first response', async () => { @@ -253,8 +263,8 @@ describe('EnhancedSearchInterceptor', () => { expect(error).toHaveBeenCalled(); expect(error.mock.calls[0][0]).toBeInstanceOf(AbortError); - expect(mockCoreStart.http.fetch).toHaveBeenCalled(); - expect(mockCoreStart.http.delete).not.toHaveBeenCalled(); + expect(mockCoreSetup.http.fetch).toHaveBeenCalled(); + expect(mockCoreSetup.http.delete).not.toHaveBeenCalled(); }); test('should DELETE a running async search on async timeout after first response', async () => { @@ -285,16 +295,16 @@ describe('EnhancedSearchInterceptor', () => { expect(next).toHaveBeenCalled(); expect(error).not.toHaveBeenCalled(); - expect(mockCoreStart.http.fetch).toHaveBeenCalled(); - expect(mockCoreStart.http.delete).not.toHaveBeenCalled(); + expect(mockCoreSetup.http.fetch).toHaveBeenCalled(); + expect(mockCoreSetup.http.delete).not.toHaveBeenCalled(); // Long enough to reach the timeout but not long enough to reach the next response await timeTravel(1000); expect(error).toHaveBeenCalled(); expect(error.mock.calls[0][0]).toBeInstanceOf(AbortError); - expect(mockCoreStart.http.fetch).toHaveBeenCalledTimes(2); - expect(mockCoreStart.http.delete).toHaveBeenCalled(); + expect(mockCoreSetup.http.fetch).toHaveBeenCalledTimes(2); + expect(mockCoreSetup.http.delete).toHaveBeenCalled(); }); test('should DELETE a running async search on async timeout on error from fetch', async () => { @@ -327,16 +337,16 @@ describe('EnhancedSearchInterceptor', () => { expect(next).toHaveBeenCalled(); expect(error).not.toHaveBeenCalled(); - expect(mockCoreStart.http.fetch).toHaveBeenCalled(); - expect(mockCoreStart.http.delete).not.toHaveBeenCalled(); + expect(mockCoreSetup.http.fetch).toHaveBeenCalled(); + expect(mockCoreSetup.http.delete).not.toHaveBeenCalled(); // Long enough to reach the timeout but not long enough to reach the next response await timeTravel(10); expect(error).toHaveBeenCalled(); expect(error.mock.calls[0][0]).toBe(responses[1].value); - expect(mockCoreStart.http.fetch).toHaveBeenCalledTimes(2); - expect(mockCoreStart.http.delete).toHaveBeenCalled(); + expect(mockCoreSetup.http.fetch).toHaveBeenCalledTimes(2); + expect(mockCoreSetup.http.delete).toHaveBeenCalled(); }); }); @@ -367,7 +377,7 @@ describe('EnhancedSearchInterceptor', () => { await timeTravel(); - const areAllRequestsAborted = mockCoreStart.http.fetch.mock.calls.every( + const areAllRequestsAborted = mockCoreSetup.http.fetch.mock.calls.every( ([{ signal }]) => signal?.aborted ); expect(areAllRequestsAborted).toBe(true); diff --git a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts index bff9e2cb9048c..ae6dddf33536f 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts @@ -20,8 +20,7 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { /** * This class should be instantiated with a `requestTimeout` corresponding with how many ms after * requests are initiated that they should automatically cancel. - * @param toasts The `core.notifications.toasts` service - * @param application The `core.application` service + * @param deps `SearchInterceptorDeps` * @param requestTimeout Usually config value `elasticsearch.requestTimeout` */ constructor(deps: SearchInterceptorDeps, requestTimeout?: number) { @@ -78,7 +77,7 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { const { combinedSignal, cleanup } = this.setupTimers(options); const aborted$ = from(toPromise(combinedSignal)); - this.pendingCount$.next(++this.pendingCount); + this.pendingCount$.next(this.pendingCount$.getValue() + 1); return this.runSearch(request, combinedSignal, options?.strategy).pipe( expand((response) => { @@ -113,7 +112,7 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { }, }), finalize(() => { - this.pendingCount$.next(--this.pendingCount); + this.pendingCount$.next(this.pendingCount$.getValue() - 1); cleanup(); }) ); From 1a09c878b185b62ec72bf790d41f61a6e21f54c0 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Thu, 13 Aug 2020 10:24:40 +0100 Subject: [PATCH 094/113] [Security Solution] Fix the status of timelines' bulk actions (#74560) * fix bulk actions * fix lint error Co-authored-by: Elastic Machine --- .../edit_timeline_batch_actions.tsx | 7 +- .../open_timeline/open_timeline.test.tsx | 83 ++++++++++++++++++- .../open_timeline/open_timeline.tsx | 1 - 3 files changed, 86 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx index 27fda48b69598..cce4251135866 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx @@ -7,7 +7,7 @@ import { EuiContextMenuPanel, EuiContextMenuItem, EuiBasicTable } from '@elastic/eui'; import React, { useCallback, useMemo } from 'react'; -import { TimelineType, TimelineStatus } from '../../../../common/types/timeline'; +import { TimelineType } from '../../../../common/types/timeline'; import * as i18n from './translations'; import { DeleteTimelines, OpenTimelineResult } from './types'; @@ -66,7 +66,7 @@ export const useEditTimelineBatchActions = ({ const getBatchItemsPopoverContent = useCallback( (closePopover: () => void) => { - const disabled = selectedItems?.some((item) => item.status === TimelineStatus.immutable); + const disabled = selectedItems == null || selectedItems.length === 0; return ( <> , ); }, - // eslint-disable-next-line react-hooks/exhaustive-deps [ selectedItems, deleteTimelines, diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx index 9de3242c5e303..3d5c5f60d1d9b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.test.tsx @@ -9,6 +9,7 @@ import { cloneDeep } from 'lodash/fp'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import React from 'react'; import { ThemeProvider } from 'styled-components'; +import { act } from '@testing-library/react'; import '../../../common/mock/match_media'; import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../pages/timelines_page'; @@ -51,7 +52,7 @@ describe('OpenTimeline', () => { title, timelineType: TimelineType.default, timelineStatus: TimelineStatus.active, - templateTimelineFilter: [

    ], + templateTimelineFilter: [
    ,
    ], totalSearchResultsCount: mockSearchResults.length, }); @@ -279,6 +280,86 @@ describe('OpenTimeline', () => { expect(wrapper.find('[data-test-subj="utility-bar-action"]').exists()).toEqual(true); }); + test('it should disable export-timeline if no timeline is selected', async () => { + const defaultProps = { + ...getDefaultTestProps(mockResults), + timelineStatus: null, + selectedItems: [], + }; + const wrapper = mountWithIntl( + + + + ); + + wrapper.find('[data-test-subj="utility-bar-action"]').find('EuiLink').simulate('click'); + await act(async () => { + expect( + wrapper.find('[data-test-subj="export-timeline-action"]').first().prop('disabled') + ).toEqual(true); + }); + }); + + test('it should disable delete timeline if no timeline is selected', async () => { + const defaultProps = { + ...getDefaultTestProps(mockResults), + timelineStatus: null, + selectedItems: [], + }; + const wrapper = mountWithIntl( + + + + ); + + wrapper.find('[data-test-subj="utility-bar-action"]').find('EuiLink').simulate('click'); + await act(async () => { + expect( + wrapper.find('[data-test-subj="delete-timeline-action"]').first().prop('disabled') + ).toEqual(true); + }); + }); + + test('it should enable export-timeline if a timeline is selected', async () => { + const defaultProps = { + ...getDefaultTestProps(mockResults), + timelineStatus: null, + selectedItems: [{}], + }; + const wrapper = mountWithIntl( + + + + ); + + wrapper.find('[data-test-subj="utility-bar-action"]').find('EuiLink').simulate('click'); + await act(async () => { + expect( + wrapper.find('[data-test-subj="export-timeline-action"]').first().prop('disabled') + ).toEqual(false); + }); + }); + + test('it should enable delete timeline if a timeline is selected', async () => { + const defaultProps = { + ...getDefaultTestProps(mockResults), + timelineStatus: null, + selectedItems: [{}], + }; + const wrapper = mountWithIntl( + + + + ); + + wrapper.find('[data-test-subj="utility-bar-action"]').find('EuiLink').simulate('click'); + await act(async () => { + expect( + wrapper.find('[data-test-subj="delete-timeline-action"]').first().prop('disabled') + ).toEqual(false); + }); + }); + test("it should render a selectable timeline table if timelineStatus is active (selecting custom templates' tab)", () => { const defaultProps = { ...getDefaultTestProps(mockResults), diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx index c9495c46d4acf..1f5f0ccca3b70 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx @@ -160,7 +160,6 @@ export const OpenTimeline = React.memo( }, [onDeleteSelected, deleteTimelines, timelineStatus]); const SearchRowContent = useMemo(() => <>{templateTimelineFilter}, [templateTimelineFilter]); - return ( <> Date: Thu, 13 Aug 2020 12:20:38 +0100 Subject: [PATCH 095/113] [Task manager] Prevents edge case where already running tasks are reschedule every polling interval (#74606) Fixes flaky tests in Task Manager and Alerting. The fix in #73244 was correct, but it missed an edge case which causes the already running task to be rescheduled over and over. This prevents that edge case which was effecting both TM in general and Alerting specifically. --- .../task_manager/server/task_store.test.ts | 104 +++++++++++++++++- .../plugins/task_manager/server/task_store.ts | 55 ++++----- .../tests/alerting/update.ts | 3 +- .../task_manager/task_manager_integration.js | 3 +- 4 files changed, 125 insertions(+), 40 deletions(-) diff --git a/x-pack/plugins/task_manager/server/task_store.test.ts b/x-pack/plugins/task_manager/server/task_store.test.ts index d65c39f4f454d..a02123c4a3f8d 100644 --- a/x-pack/plugins/task_manager/server/task_store.test.ts +++ b/x-pack/plugins/task_manager/server/task_store.test.ts @@ -627,7 +627,7 @@ if (doc['task.runAt'].size()!=0) { }); }); - test('it returns task objects', async () => { + test('it filters out running tasks', async () => { const taskManagerId = uuid.v1(); const claimOwnershipUntil = new Date(Date.now()); const runAt = new Date(); @@ -641,7 +641,7 @@ if (doc['task.runAt'].size()!=0) { taskType: 'foo', schedule: undefined, attempts: 0, - status: 'idle', + status: 'claiming', params: '{ "hello": "world" }', state: '{ "baby": "Henhen" }', user: 'jimbo', @@ -715,7 +715,103 @@ if (doc['task.runAt'].size()!=0) { runAt, scope: ['reporting'], state: { baby: 'Henhen' }, - status: 'idle', + status: 'claiming', + taskType: 'foo', + user: 'jimbo', + ownerId: taskManagerId, + }, + ]); + }); + + test('it returns task objects', async () => { + const taskManagerId = uuid.v1(); + const claimOwnershipUntil = new Date(Date.now()); + const runAt = new Date(); + const tasks = [ + { + _id: 'aaa', + _source: { + type: 'task', + task: { + runAt, + taskType: 'foo', + schedule: undefined, + attempts: 0, + status: 'claiming', + params: '{ "hello": "world" }', + state: '{ "baby": "Henhen" }', + user: 'jimbo', + scope: ['reporting'], + ownerId: taskManagerId, + }, + }, + _seq_no: 1, + _primary_term: 2, + sort: ['a', 1], + }, + { + _id: 'bbb', + _source: { + type: 'task', + task: { + runAt, + taskType: 'bar', + schedule: { interval: '5m' }, + attempts: 2, + status: 'claiming', + params: '{ "shazm": 1 }', + state: '{ "henry": "The 8th" }', + user: 'dabo', + scope: ['reporting', 'ceo'], + ownerId: taskManagerId, + }, + }, + _seq_no: 3, + _primary_term: 4, + sort: ['b', 2], + }, + ]; + const { + result: { docs }, + args: { + search: { + body: { query }, + }, + }, + } = await testClaimAvailableTasks({ + opts: { + taskManagerId, + }, + claimingOpts: { + claimOwnershipUntil, + size: 10, + }, + hits: tasks, + }); + + expect(query.bool.must).toContainEqual({ + bool: { + must: [ + { + term: { + 'task.ownerId': taskManagerId, + }, + }, + { term: { 'task.status': 'claiming' } }, + ], + }, + }); + + expect(docs).toMatchObject([ + { + attempts: 0, + id: 'aaa', + schedule: undefined, + params: { hello: 'world' }, + runAt, + scope: ['reporting'], + state: { baby: 'Henhen' }, + status: 'claiming', taskType: 'foo', user: 'jimbo', ownerId: taskManagerId, @@ -728,7 +824,7 @@ if (doc['task.runAt'].size()!=0) { runAt, scope: ['reporting', 'ceo'], state: { henry: 'The 8th' }, - status: 'running', + status: 'claiming', taskType: 'bar', user: 'dabo', ownerId: taskManagerId, diff --git a/x-pack/plugins/task_manager/server/task_store.ts b/x-pack/plugins/task_manager/server/task_store.ts index a18fb57b35b3d..f2da41053e6ab 100644 --- a/x-pack/plugins/task_manager/server/task_store.ts +++ b/x-pack/plugins/task_manager/server/task_store.ts @@ -217,48 +217,39 @@ export class TaskStore { claimTasksByIdWithRawIds, size ); + const docs = numberOfTasksClaimed > 0 ? await this.sweepForClaimedTasks(claimTasksByIdWithRawIds, size) : []; - // emit success/fail events for claimed tasks by id - if (claimTasksById && claimTasksById.length) { - const [documentsReturnedById, documentsClaimedBySchedule] = partition(docs, (doc) => - claimTasksById.includes(doc.id) - ); - - const [documentsClaimedById, documentsRequestedButNotClaimed] = partition( - documentsReturnedById, - // we filter the schduled tasks down by status is 'claiming' in the esearch, - // but we do not apply this limitation on tasks claimed by ID so that we can - // provide more detailed error messages when we fail to claim them - (doc) => doc.status === TaskStatus.Claiming - ); - - const documentsRequestedButNotReturned = difference( - claimTasksById, - map(documentsReturnedById, 'id') - ); + const [documentsReturnedById, documentsClaimedBySchedule] = partition(docs, (doc) => + claimTasksById.includes(doc.id) + ); - this.emitEvents( - [...documentsClaimedById, ...documentsClaimedBySchedule].map((doc) => - asTaskClaimEvent(doc.id, asOk(doc)) - ) - ); + const [documentsClaimedById, documentsRequestedButNotClaimed] = partition( + documentsReturnedById, + // we filter the schduled tasks down by status is 'claiming' in the esearch, + // but we do not apply this limitation on tasks claimed by ID so that we can + // provide more detailed error messages when we fail to claim them + (doc) => doc.status === TaskStatus.Claiming + ); - this.emitEvents( - documentsRequestedButNotClaimed.map((doc) => asTaskClaimEvent(doc.id, asErr(some(doc)))) - ); + const documentsRequestedButNotReturned = difference( + claimTasksById, + map(documentsReturnedById, 'id') + ); - this.emitEvents( - documentsRequestedButNotReturned.map((id) => asTaskClaimEvent(id, asErr(none))) - ); - } + this.emitEvents([ + ...documentsClaimedById.map((doc) => asTaskClaimEvent(doc.id, asOk(doc))), + ...documentsClaimedBySchedule.map((doc) => asTaskClaimEvent(doc.id, asOk(doc))), + ...documentsRequestedButNotClaimed.map((doc) => asTaskClaimEvent(doc.id, asErr(some(doc)))), + ...documentsRequestedButNotReturned.map((id) => asTaskClaimEvent(id, asErr(none))), + ]); return { - claimedTasks: numberOfTasksClaimed, - docs, + claimedTasks: documentsClaimedById.length + documentsClaimedBySchedule.length, + docs: docs.filter((doc) => doc.status === TaskStatus.Claiming), }; }; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/update.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/update.ts index cac6355409ac9..ab3a92d0b3f70 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/update.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/update.ts @@ -31,8 +31,7 @@ export default function createUpdateTests({ getService }: FtrProviderContext) { .then((response: SupertestResponse) => response.body); } - // FLAKY: https://github.com/elastic/kibana/issues/72803 - describe.skip('update', () => { + describe('update', () => { const objectRemover = new ObjectRemover(supertest); after(() => objectRemover.removeAll()); diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js index ea95eb42dd6ff..c87a5039360b8 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js @@ -28,8 +28,7 @@ export default function ({ getService }) { const testHistoryIndex = '.kibana_task_manager_test_result'; const supertest = supertestAsPromised(url.format(config.get('servers.kibana'))); - // FLAKY: https://github.com/elastic/kibana/issues/71390 - describe.skip('scheduling and running tasks', () => { + describe('scheduling and running tasks', () => { beforeEach( async () => await supertest.delete('/api/sample_tasks').set('kbn-xsrf', 'xxx').expect(200) ); From c7a46d583a6f930641aa8ef6cc94fd94f5ab14a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Thu, 13 Aug 2020 12:41:39 +0100 Subject: [PATCH 096/113] [Observability] change ingest manager link (#74928) * chaning ingest manager link * chaning ingest manager link --- .../components/app/ingest_manager_panel/index.tsx | 13 ++++++++----- x-pack/plugins/translations/translations/ja-JP.json | 4 ---- x-pack/plugins/translations/translations/zh-CN.json | 4 ---- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/observability/public/components/app/ingest_manager_panel/index.tsx b/x-pack/plugins/observability/public/components/app/ingest_manager_panel/index.tsx index 1ab9f75632d9d..5d0c8a40ed3de 100644 --- a/x-pack/plugins/observability/public/components/app/ingest_manager_panel/index.tsx +++ b/x-pack/plugins/observability/public/components/app/ingest_manager_panel/index.tsx @@ -11,13 +11,16 @@ import { EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { EuiText } from '@elastic/eui'; import { EuiLink } from '@elastic/eui'; +import { usePluginContext } from '../../../hooks/use_plugin_context'; export function IngestManagerPanel() { + const { core } = usePluginContext(); + return ( @@ -25,7 +28,7 @@ export function IngestManagerPanel() {

    - {i18n.translate('xpack.observability.ingestManafer.title', { + {i18n.translate('xpack.observability.ingestManager.title', { defaultMessage: 'Have you seen our new Ingest Manager?', })}

    @@ -33,15 +36,15 @@ export function IngestManagerPanel() {
    - {i18n.translate('xpack.observability.ingestManafer.text', { + {i18n.translate('xpack.observability.ingestManager.text', { defaultMessage: 'The Elastic Agent provides a simple, unified way to add monitoring for logs, metrics, and other types of data to your hosts. You no longer need to install multiple Beats and other agents, making it easier and faster to deploy configurations across your infrastructure.', })} - - {i18n.translate('xpack.observability.ingestManafer.button', { + + {i18n.translate('xpack.observability.ingestManager.button', { defaultMessage: 'Try Ingest Manager Beta', })} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 55d1953247a93..81c06cf5c381f 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -14047,10 +14047,6 @@ "xpack.observability.home.sectionsubtitle": "ログ、メトリック、トレースを大規模に、1つのスタックにまとめて、環境内のあらゆる場所で生じるイベントの監視、分析、対応を行います。", "xpack.observability.home.sectionTitle": "エコシステム全体の一元的な可視性", "xpack.observability.home.title": "オブザーバビリティ", - "xpack.observability.ingestManafer.beta": "ベータ", - "xpack.observability.ingestManafer.button": "Ingest Managerベータを試す", - "xpack.observability.ingestManafer.text": "Elasticエージェントでは、シンプルかつ統合された方法で、ログ、メトリック、他の種類のデータの監視をホストに追加することができます。複数のBeatsと他のエージェントをインストールする必要はありません。このため、インフラストラクチャ全体での構成のデプロイが簡単で高速になりました。", - "xpack.observability.ingestManafer.title": "新しいIngest Managerをご覧になりましたか?", "xpack.observability.landing.breadcrumb": "はじめて使う", "xpack.observability.news.readFullStory": "詳細なストーリーを読む", "xpack.observability.news.title": "新機能", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 40f4c9c5897d8..af5e68b7e44d7 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -14052,10 +14052,6 @@ "xpack.observability.home.sectionsubtitle": "通过根据需要将日志、指标和跟踪都置于单个堆栈上,来监测、分析和响应环境中任何位置发生的事件。", "xpack.observability.home.sectionTitle": "整个生态系统的统一可见性", "xpack.observability.home.title": "可观测性", - "xpack.observability.ingestManafer.beta": "公测版", - "xpack.observability.ingestManafer.button": "试用采集管理器公测版", - "xpack.observability.ingestManafer.text": "通过 Elastic 代理,您能够以简单统一的方式将日志、指标和其他类型数据的监测添加到主机。不再需要安装多个 Beats 和其他代理,这样在整个基础设施中部署配置会更轻松更快速。", - "xpack.observability.ingestManafer.title": "是否了解我们全新的采集管理器?", "xpack.observability.landing.breadcrumb": "入门", "xpack.observability.news.readFullStory": "详细了解", "xpack.observability.news.title": "最近的新闻", From 50f332867af9078f3b86085e96151b7854ee41d6 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 13 Aug 2020 14:57:04 +0200 Subject: [PATCH 097/113] [Ingest Pipelines] Processor forms for processors A-D (#72849) * First few processors of the first batch - Also refactored options to live in scoped objects to avoid overriding type (important fix!) - Have not polished copy or form layout. * add type to shared imports * Refactors for repeated fields and added forms - date_index_name - dissect - dot_expander - drop Fields refactored: - Field - Ignore missing * Fix broken imports and some other small refactors * added text editor field and updated pattern and if fields * Large copy improvements and updates and other small refactors - Added help text for all fields - Updated layout so that required fields are always on first - Replaced circle radio group with a select drop down * update circle shape type field to select * Added "long" option for convert type * fix path import * fix types and i18n * add validation for dot expander fix append value to be a combobox * fix i18n Co-authored-by: Elastic Machine --- .../field_components/index.ts | 3 +- .../field_components/text_editor.tsx | 38 +++ .../field_components/xjson_editor.tsx | 54 ++-- .../manage_processor_form.container.tsx | 7 +- .../manage_processor_form.tsx | 2 +- .../processor_settings_fields.tsx | 3 +- .../processors/append.tsx | 56 ++++ .../processors/bytes.tsx | 43 ++++ .../processors/circle.tsx | 140 ++++++++++ .../common_fields/common_processor_fields.tsx | 37 ++- .../common_fields/field_name_field.tsx | 58 +++++ .../common_fields/ignore_missing_field.tsx | 37 +++ .../common_fields/processor_type_field.tsx | 27 +- .../processors/convert.tsx | 136 ++++++++++ .../manage_processor_form/processors/csv.tsx | 164 ++++++++++++ .../manage_processor_form/processors/date.tsx | 122 +++++++++ .../processors/date_index_name.tsx | 242 ++++++++++++++++++ .../processors/dissect.tsx | 99 +++++++ .../processors/dot_expander.tsx | 55 ++++ .../manage_processor_form/processors/drop.tsx | 14 + .../manage_processor_form/processors/gsub.tsx | 21 +- .../manage_processor_form/processors/index.ts | 16 ++ .../manage_processor_form/processors/set.tsx | 6 +- .../processors/shared.ts | 16 ++ .../shared/map_processor_type_to_form.tsx | 33 ++- .../ingest_pipelines/public/shared_imports.ts | 5 + 26 files changed, 1347 insertions(+), 87 deletions(-) create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/text_editor.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/append.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/bytes.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/circle.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/field_name_field.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/ignore_missing_field.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/convert.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/csv.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/date.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/date_index_name.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/dissect.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/dot_expander.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/drop.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/index.ts create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/shared.ts diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/index.ts index 6f7b55a3ea4b0..6ce9eefd26445 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/index.ts +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/index.ts @@ -4,4 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -export { OnXJsonEditorUpdateHandler, XJsonEditor } from './xjson_editor'; +export { XJsonEditor } from './xjson_editor'; +export { TextEditor } from './text_editor'; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/text_editor.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/text_editor.tsx new file mode 100644 index 0000000000000..1d0e36c0d526c --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/text_editor.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { EuiPanel } from '@elastic/eui'; +import React, { FunctionComponent } from 'react'; +import { EuiFormRow } from '@elastic/eui'; +import { + CodeEditor, + FieldHook, + getFieldValidityAndErrorMessage, +} from '../../../../../../shared_imports'; + +interface Props { + field: FieldHook; + editorProps: { [key: string]: any }; +} + +export const TextEditor: FunctionComponent = ({ field, editorProps }) => { + const { value, helpText, setValue, label } = field; + const { errorMessage } = getFieldValidityAndErrorMessage(field); + + return ( + + + + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/xjson_editor.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/xjson_editor.tsx index a8456ad0ffd72..228094c0dfac5 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/xjson_editor.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/xjson_editor.tsx @@ -4,25 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiPanel } from '@elastic/eui'; import { XJsonLang } from '@kbn/monaco'; import React, { FunctionComponent, useCallback } from 'react'; -import { EuiFormRow } from '@elastic/eui'; -import { - CodeEditor, - FieldHook, - getFieldValidityAndErrorMessage, - Monaco, -} from '../../../../../../shared_imports'; +import { FieldHook, Monaco } from '../../../../../../shared_imports'; -export type OnXJsonEditorUpdateHandler = (arg: { - data: { - raw: string; - format(): T; - }; - validate(): boolean; - isValid: boolean | undefined; -}) => void; +import { TextEditor } from './text_editor'; interface Props { field: FieldHook; @@ -30,9 +16,8 @@ interface Props { } export const XJsonEditor: FunctionComponent = ({ field, editorProps }) => { - const { value, helpText, setValue, label } = field; + const { value, setValue } = field; const { xJson, setXJson, convertToJson } = Monaco.useXJsonMode(value); - const { errorMessage } = getFieldValidityAndErrorMessage(field); const onChange = useCallback( (s) => { @@ -42,25 +27,18 @@ export const XJsonEditor: FunctionComponent = ({ field, editorProps }) => [setValue, setXJson, convertToJson] ); return ( - - - { - XJsonLang.registerGrammarChecker(m); - }} - options={{ minimap: { enabled: false } }} - onChange={onChange} - {...(editorProps as any)} - /> - - + { + XJsonLang.registerGrammarChecker(m); + }, + onChange, + ...editorProps, + }} + /> ); }; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.container.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.container.tsx index ea137b87e66d5..84551ce152099 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.container.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.container.tsx @@ -40,18 +40,19 @@ export const ManageProcessorForm: FunctionComponent = ({ const handleSubmit = useCallback( async (data: FormData, isValid: boolean) => { if (isValid) { - const { type, customOptions, ...options } = data; + const { type, customOptions, fields } = data; onSubmit({ type, - options: customOptions ? customOptions : options, + options: customOptions ? customOptions : fields, }); } }, [onSubmit] ); + const maybeProcessorOptions = processor?.options; const { form } = useForm({ - defaultValue: processor?.options, + defaultValue: { fields: maybeProcessorOptions ?? {} }, onSubmit: handleSubmit, }); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.tsx index 4e172cce63027..ad6d191be802d 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.tsx @@ -14,12 +14,12 @@ import { EuiFlyoutHeader, EuiFlyoutBody, EuiFlyoutFooter, - EuiSpacer, EuiTabs, EuiTab, EuiTitle, EuiFlexGroup, EuiFlexItem, + EuiSpacer, } from '@elastic/eui'; import { Form, FormDataProvider, FormHook } from '../../../../../shared_imports'; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx index 6b2568bad3afc..a6447bc30ac00 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx @@ -5,7 +5,7 @@ */ import React, { FunctionComponent } from 'react'; -import { EuiHorizontalRule } from '@elastic/eui'; +import { EuiHorizontalRule, EuiSpacer } from '@elastic/eui'; import { FormDataProvider } from '../../../../../shared_imports'; import { ProcessorInternal } from '../../types'; @@ -36,6 +36,7 @@ export const ProcessorSettingsFields: FunctionComponent = ({ processor }) return ( <> + ); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/append.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/append.tsx new file mode 100644 index 0000000000000..8eb484b56bafe --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/append.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; + +import { + FIELD_TYPES, + fieldValidators, + UseField, + ComboBoxField, +} from '../../../../../../shared_imports'; + +import { FieldsConfig } from './shared'; +import { FieldNameField } from './common_fields/field_name_field'; + +const { emptyField } = fieldValidators; + +const fieldsConfig: FieldsConfig = { + value: { + type: FIELD_TYPES.COMBO_BOX, + deserializer: (v) => (Array.isArray(v) ? v : [String(v)]), + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.appendForm.valueFieldLabel', { + defaultMessage: 'Value', + }), + helpText: i18n.translate('xpack.ingestPipelines.pipelineEditor.appendForm.valueFieldHelpText', { + defaultMessage: 'The value to be appended by this processor.', + }), + validations: [ + { + validator: emptyField( + i18n.translate('xpack.ingestPipelines.pipelineEditor.appendForm.valueRequiredError', { + defaultMessage: 'A value to set is required.', + }) + ), + }, + ], + }, +}; + +export const Append: FunctionComponent = () => { + return ( + <> + + + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/bytes.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/bytes.tsx new file mode 100644 index 0000000000000..64a501f03d454 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/bytes.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; + +import { FIELD_TYPES, UseField, Field } from '../../../../../../shared_imports'; + +import { FieldsConfig } from './shared'; +import { IgnoreMissingField } from './common_fields/ignore_missing_field'; +import { FieldNameField } from './common_fields/field_name_field'; + +const fieldsConfig: FieldsConfig = { + target_field: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.bytesForm.targetFieldLabel', { + defaultMessage: 'Target field (optional)', + }), + helpText: i18n.translate('xpack.ingestPipelines.pipelineEditor.bytesForm.targetFieldHelpText', { + defaultMessage: 'The field to assign the converted value to', + }), + }, +}; + +export const Bytes: FunctionComponent = () => { + return ( + <> + + + + + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/circle.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/circle.tsx new file mode 100644 index 0000000000000..3a39e597cb8dc --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/circle.tsx @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; + +import { + FIELD_TYPES, + fieldValidators, + UseField, + Field, + SelectField, + NumericField, +} from '../../../../../../shared_imports'; + +import { FieldsConfig } from './shared'; +import { IgnoreMissingField } from './common_fields/ignore_missing_field'; +import { FieldNameField } from './common_fields/field_name_field'; + +const { emptyField } = fieldValidators; + +const fieldsConfig: FieldsConfig = { + target_field: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.circleForm.targetFieldLabel', { + defaultMessage: 'Target field (optional)', + }), + helpText: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.circleForm.targetFieldHelpText', + { + defaultMessage: 'By default field is updated in-place.', + } + ), + }, + error_distance: { + type: FIELD_TYPES.NUMBER, + deserializer: (v) => (typeof v === 'number' && !isNaN(v) ? v : 1.0), + serializer: Number, + label: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.circleForm.errorDistanceFieldLabel', + { + defaultMessage: 'Error distance', + } + ), + helpText: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.circleForm.errorDistanceHelpText', + { + defaultMessage: + 'The difference between the resulting inscribed distance from center to side and the circle’s radius (measured in meters for geo_shape, unit-less for shape).', + } + ), + validations: [ + { + validator: ({ value }) => { + return isNaN(Number(value)) + ? { + message: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.circleForm.errorDistanceError', + { + defaultMessage: 'An error distance value is required.', + } + ), + } + : undefined; + }, + }, + ], + }, + shape_type: { + type: FIELD_TYPES.SELECT, + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.circleForm.shapeTypeFieldLabel', { + defaultMessage: 'Shape type', + }), + helpText: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.circleForm.shapeTypeFieldHelpText', + { defaultMessage: 'Which field mapping type is to be used.' } + ), + validations: [ + { + validator: emptyField( + i18n.translate('xpack.ingestPipelines.pipelineEditor.circleForm.shapeTypeRequiredError', { + defaultMessage: 'A shape type value is required.', + }) + ), + }, + ], + }, +}; + +export const Circle: FunctionComponent = () => { + return ( + <> + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/common_processor_fields.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/common_processor_fields.tsx index 4802653f9e680..7ae7b82c31a43 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/common_processor_fields.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/common_processor_fields.tsx @@ -15,41 +15,64 @@ import { ToggleField, } from '../../../../../../../shared_imports'; +import { TextEditor } from '../../field_components'; + const ignoreFailureConfig: FieldConfig = { defaultValue: false, + serializer: (v) => (v === false ? undefined : v), + deserializer: (v) => (typeof v === 'boolean' ? v : undefined), label: i18n.translate( 'xpack.ingestPipelines.pipelineEditor.commonFields.ignoreFailureFieldLabel', { defaultMessage: 'Ignore failure', } ), + helpText: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.commonFields.ignoreFailureHelpText', + { defaultMessage: 'Ignore failures for this processor.' } + ), type: FIELD_TYPES.TOGGLE, }; const ifConfig: FieldConfig = { - defaultValue: undefined, label: i18n.translate('xpack.ingestPipelines.pipelineEditor.commonFields.ifFieldLabel', { defaultMessage: 'Condition (optional)', }), + helpText: i18n.translate('xpack.ingestPipelines.pipelineEditor.commonFields.ifFieldHelpText', { + defaultMessage: 'Conditionally execute this processor.', + }), type: FIELD_TYPES.TEXT, }; const tagConfig: FieldConfig = { - defaultValue: undefined, label: i18n.translate('xpack.ingestPipelines.pipelineEditor.commonFields.tagFieldLabel', { defaultMessage: 'Tag (optional)', }), + helpText: i18n.translate('xpack.ingestPipelines.pipelineEditor.commonFields.tagFieldHelpText', { + defaultMessage: 'An identifier for this processor. Useful for debugging and metrics.', + }), type: FIELD_TYPES.TEXT, }; export const CommonProcessorFields: FunctionComponent = () => { return ( - <> - +
    + - + - - + +
    ); }; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/field_name_field.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/field_name_field.tsx new file mode 100644 index 0000000000000..7ef5ba6768c19 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/field_name_field.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; +import { + FIELD_TYPES, + UseField, + Field, + fieldValidators, + ValidationConfig, +} from '../../../../../../../shared_imports'; + +import { FieldsConfig } from '../shared'; + +const { emptyField } = fieldValidators; + +export const fieldsConfig: FieldsConfig = { + field: { + type: FIELD_TYPES.TEXT, + deserializer: String, + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.commonFields.fieldFieldLabel', { + defaultMessage: 'Field', + }), + validations: [ + { + validator: emptyField( + i18n.translate('xpack.ingestPipelines.pipelineEditor.commonFields.fieldRequiredError', { + defaultMessage: 'A field value is required.', + }) + ), + }, + ], + }, +}; + +interface Props { + helpText?: React.ReactNode; + /** + * The field name requires a value. Processor specific validation + * checks can be added here. + */ + additionalValidations?: ValidationConfig[]; +} + +export const FieldNameField: FunctionComponent = ({ helpText, additionalValidations }) => ( + +); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/ignore_missing_field.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/ignore_missing_field.tsx new file mode 100644 index 0000000000000..08eb0a425ef33 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/ignore_missing_field.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FIELD_TYPES, UseField, ToggleField } from '../../../../../../../shared_imports'; + +import { FieldsConfig } from '../shared'; + +export const fieldsConfig: FieldsConfig = { + ignore_missing: { + type: FIELD_TYPES.TOGGLE, + defaultValue: false, + serializer: (v) => (v === false ? undefined : v), + deserializer: (v) => (typeof v === 'boolean' ? v : undefined), + label: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.commonFields.ignoreMissingFieldLabel', + { + defaultMessage: 'Ignore missing', + } + ), + }, +}; + +interface Props { + helpText?: string; +} + +export const IgnoreMissingField: FunctionComponent = ({ helpText }) => ( + +); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/processor_type_field.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/processor_type_field.tsx index 71ee4a714a28e..e4ad90f61af0a 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/processor_type_field.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/processor_type_field.tsx @@ -46,20 +46,12 @@ interface Props { const { emptyField } = fieldValidators; -const typeConfig: FieldConfig = { +const typeConfig: FieldConfig = { type: FIELD_TYPES.COMBO_BOX, label: i18n.translate('xpack.ingestPipelines.pipelineEditor.typeField.typeFieldLabel', { defaultMessage: 'Processor', }), - deserializer: (value: string | undefined) => { - if (value) { - return [value]; - } - return []; - }, - serializer: (value: string[]) => { - return value[0]; - }, + deserializer: String, validations: [ { validator: emptyField( @@ -73,11 +65,11 @@ const typeConfig: FieldConfig = { export const ProcessorTypeField: FunctionComponent = ({ initialType }) => { return ( - + config={typeConfig} defaultValue={initialType} path="type"> {(typeField) => { let selectedOptions: ProcessorTypeAndLabel[]; - if ((typeField.value as string[]).length) { - const [type] = typeField.value as string[]; + if (typeField.value?.length) { + const type = typeField.value; const descriptor = getProcessorDescriptor(type); selectedOptions = descriptor ? [{ label: descriptor.label, value: type }] @@ -103,9 +95,7 @@ export const ProcessorTypeField: FunctionComponent = ({ initialType }) => return false; } - const newValue = [...(typeField.value as string[]), value]; - - typeField.setValue(newValue); + typeField.setValue(value); }; return ( @@ -131,8 +121,9 @@ export const ProcessorTypeField: FunctionComponent = ({ initialType }) => options={processorTypesAndLabels} selectedOptions={selectedOptions} onCreateOption={onCreateComboOption} - onChange={(options: EuiComboBoxOptionOption[]) => { - typeField.setValue(options.map(({ value }) => value)); + onChange={(options: Array>) => { + const [selection] = options; + typeField.setValue(selection?.value! ?? ''); }} noSuggestions={false} singleSelection={{ diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/convert.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/convert.tsx new file mode 100644 index 0000000000000..b45f589bf0f92 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/convert.tsx @@ -0,0 +1,136 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; + +import { + FIELD_TYPES, + fieldValidators, + UseField, + Field, + SelectField, +} from '../../../../../../shared_imports'; + +import { FieldsConfig } from './shared'; +import { FieldNameField } from './common_fields/field_name_field'; +import { IgnoreMissingField } from './common_fields/ignore_missing_field'; + +const { emptyField } = fieldValidators; + +const fieldsConfig: FieldsConfig = { + /* Required fields config */ + type: { + type: FIELD_TYPES.TEXT, + defaultValue: '', + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.convertForm.typeFieldLabel', { + defaultMessage: 'Type', + }), + helpText: i18n.translate('xpack.ingestPipelines.pipelineEditor.convertForm.typeFieldHelpText', { + defaultMessage: 'The type to convert the existing value to.', + }), + validations: [ + { + validator: emptyField( + i18n.translate('xpack.ingestPipelines.pipelineEditor.convertForm.typeRequiredError', { + defaultMessage: 'A type value is required.', + }) + ), + }, + ], + }, + /* Optional fields config */ + target_field: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.convertForm.targetFieldLabel', { + defaultMessage: 'Target field (optional)', + }), + helpText: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.convertForm.targetFieldHelpText', + { + defaultMessage: 'The field to assign the converted value to.', + } + ), + }, +}; + +export const Convert: FunctionComponent = () => { + return ( + <> + + + + + + + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/csv.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/csv.tsx new file mode 100644 index 0000000000000..3ac0179ca02a6 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/csv.tsx @@ -0,0 +1,164 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent } from 'react'; +import { EuiCode } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { + FIELD_TYPES, + fieldValidators, + UseField, + Field, + ToggleField, + ComboBoxField, + ValidationFunc, +} from '../../../../../../shared_imports'; + +import { FieldsConfig } from './shared'; +import { IgnoreMissingField } from './common_fields/ignore_missing_field'; +import { FieldNameField } from './common_fields/field_name_field'; + +import { isArrayOfStrings } from './shared'; + +const { minLengthField } = fieldValidators; + +/** + * Allow empty strings ('') to pass this validation. + */ +const isStringLengthOne: ValidationFunc = ({ value }) => { + return typeof value === 'string' && value !== '' && value.length !== 1 + ? { + message: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.convertForm.separatorLengthError', + { + defaultMessage: 'A separator value must be 1 character.', + } + ), + } + : undefined; +}; + +const fieldsConfig: FieldsConfig = { + /* Required fields config */ + target_fields: { + type: FIELD_TYPES.COMBO_BOX, + deserializer: (v) => { + return isArrayOfStrings(v) ? v : []; + }, + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.csvForm.targetFieldsFieldLabel', { + defaultMessage: 'Target fields', + }), + helpText: i18n.translate('xpack.ingestPipelines.pipelineEditor.csvForm.targetFieldsHelpText', { + defaultMessage: 'The array of fields to assign extracted values to.', + }), + validations: [ + { + validator: minLengthField({ + length: 1, + message: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.csvForm.targetFieldRequiredError', + { + defaultMessage: 'A target fields value is required.', + } + ), + }), + }, + ], + }, + /* Optional fields config */ + separator: { + type: FIELD_TYPES.TEXT, + serializer: (v) => (v ? v : undefined), + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.convertForm.separatorFieldLabel', { + defaultMessage: 'Separator (optional)', + }), + validations: [ + { + validator: isStringLengthOne, + }, + ], + helpText: ( + {','} }} + /> + ), + }, + quote: { + type: FIELD_TYPES.TEXT, + serializer: (v) => (v ? v : undefined), + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.convertForm.quoteFieldLabel', { + defaultMessage: 'Quote (optional)', + }), + validations: [ + { + validator: isStringLengthOne, + }, + ], + helpText: ( + {'"'} }} + /> + ), + }, + trim: { + type: FIELD_TYPES.TOGGLE, + defaultValue: false, + deserializer: (v) => (typeof v === 'boolean' ? v : undefined), + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.csvForm.trimFieldLabel', { + defaultMessage: 'Trim', + }), + helpText: i18n.translate('xpack.ingestPipelines.pipelineEditor.csvForm.trimFieldHelpText', { + defaultMessage: 'Trim whitespaces in unquoted fields', + }), + }, + empty_value: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.convertForm.emptyValueFieldLabel', { + defaultMessage: 'Empty value (optional)', + }), + helpText: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.convertForm.emptyValueFieldHelpText', + { + defaultMessage: + 'Value used to fill empty fields, empty fields will be skipped if this is not provided.', + } + ), + }, +}; + +export const CSV: FunctionComponent = () => { + return ( + <> + + + + + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/date.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/date.tsx new file mode 100644 index 0000000000000..424e84058ac3f --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/date.tsx @@ -0,0 +1,122 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent } from 'react'; +import { EuiCode } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { + FIELD_TYPES, + fieldValidators, + UseField, + Field, + ComboBoxField, +} from '../../../../../../shared_imports'; + +import { FieldsConfig, isArrayOfStrings } from './shared'; +import { FieldNameField } from './common_fields/field_name_field'; + +const { minLengthField } = fieldValidators; + +const fieldsConfig: FieldsConfig = { + /* Required fields config */ + formats: { + type: FIELD_TYPES.COMBO_BOX, + deserializer: (v) => { + return isArrayOfStrings(v) ? v : []; + }, + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.dateForm.formatsFieldLabel', { + defaultMessage: 'Formats', + }), + helpText: i18n.translate('xpack.ingestPipelines.pipelineEditor.dateForm.formatsFieldHelpText', { + defaultMessage: + 'An array of the expected date formats. Can be a java time pattern or one of the following formats: ISO8601, UNIX, UNIX_MS, or TAI64N.', + }), + validations: [ + { + validator: minLengthField({ + length: 1, + message: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dateForm.formatsRequiredError', + { + defaultMessage: 'A value for formats is required.', + } + ), + }), + }, + ], + }, + /* Optional fields config */ + target_field: { + type: FIELD_TYPES.TEXT, + serializer: (v) => (v ? undefined : v), + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.dateForm.targetFieldFieldLabel', { + defaultMessage: 'Target field (optional)', + }), + helpText: ( + {'@timestamp'}, + }} + /> + ), + }, + timezone: { + type: FIELD_TYPES.TEXT, + serializer: (v) => (v ? v : undefined), + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.dateForm.timezoneFieldLabel', { + defaultMessage: 'Timezone (optional)', + }), + helpText: ( + {'UTC'} }} + /> + ), + }, + locale: { + type: FIELD_TYPES.TEXT, + serializer: (v) => (v ? v : undefined), + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.dateForm.localeFieldLabel', { + defaultMessage: 'Locale (optional)', + }), + helpText: ( + {'ENGLISH'} }} + /> + ), + }, +}; + +/** + * Disambiguate from global Date object + */ +export const DateProcessor: FunctionComponent = () => { + return ( + <> + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/date_index_name.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/date_index_name.tsx new file mode 100644 index 0000000000000..387c9ff4e0b46 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/date_index_name.tsx @@ -0,0 +1,242 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent } from 'react'; +import { EuiCode } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { + FIELD_TYPES, + fieldValidators, + UseField, + Field, + ComboBoxField, + SelectField, +} from '../../../../../../shared_imports'; + +import { FieldsConfig, isArrayOfStrings } from './shared'; +import { FieldNameField } from './common_fields/field_name_field'; + +const { emptyField } = fieldValidators; + +const fieldsConfig: FieldsConfig = { + /* Required fields config */ + date_rounding: { + type: FIELD_TYPES.SELECT, + label: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dateIndexNameForm.dateRoundingFieldLabel', + { + defaultMessage: 'Date rounding', + } + ), + helpText: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dateIndexNameForm.dateRoundingFieldHelpText', + { + defaultMessage: 'How to round the date when formatting the date into the index name.', + } + ), + validations: [ + { + validator: emptyField( + i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dateIndexNameForm.dateRoundingRequiredError', + { + defaultMessage: 'A field value is required.', + } + ) + ), + }, + ], + }, + /* Optional fields config */ + index_name_prefix: { + type: FIELD_TYPES.TEXT, + serializer: (v) => (v ? v : undefined), + label: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dateIndexNameForm.indexNamePrefixFieldLabel', + { + defaultMessage: 'Index name prefix (optional)', + } + ), + helpText: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dateIndexNameForm.indexNamePrefixFieldHelpText', + { defaultMessage: 'A prefix of the index name to be prepended before the printed date.' } + ), + }, + index_name_format: { + type: FIELD_TYPES.TEXT, + serializer: (v) => (v ? v : undefined), + label: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dateIndexNameForm.indexNameFormatFieldLabel', + { + defaultMessage: 'Index name format (optional)', + } + ), + helpText: ( + {'yyyy-MM-dd'} }} + /> + ), + }, + date_formats: { + type: FIELD_TYPES.COMBO_BOX, + serializer: (v: string[]) => { + return v.length ? v : undefined; + }, + deserializer: (v) => { + return isArrayOfStrings(v) ? v : []; + }, + label: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dateIndexNameForm.dateFormatsFieldLabel', + { + defaultMessage: 'Date formats (optional)', + } + ), + helpText: ( + {"yyyy-MM-dd'T'HH:mm:ss.SSSXX"} }} + /> + ), + }, + timezone: { + type: FIELD_TYPES.TEXT, + serializer: (v) => (v ? v : undefined), + label: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dateIndexNameForm.timezoneFieldLabel', + { + defaultMessage: 'Timezone (optional)', + } + ), + helpText: ( + {'UTC'} }} + /> + ), + }, + locale: { + type: FIELD_TYPES.TEXT, + serializer: (v) => (v ? v : undefined), + label: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dateIndexNameForm.localeFieldLabel', + { + defaultMessage: 'Locale (optional)', + } + ), + helpText: ( + {'ENGLISH'} }} + /> + ), + }, +}; + +/** + * Disambiguate from global Date object + */ +export const DateIndexName: FunctionComponent = () => { + return ( + <> + + + + + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/dissect.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/dissect.tsx new file mode 100644 index 0000000000000..5f9f55ced1a25 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/dissect.tsx @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent } from 'react'; +import { EuiCode } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { TextEditor } from '../field_components'; + +import { + FieldConfig, + FIELD_TYPES, + fieldValidators, + UseField, + Field, +} from '../../../../../../shared_imports'; + +import { FieldNameField } from './common_fields/field_name_field'; +import { IgnoreMissingField } from './common_fields/ignore_missing_field'; + +const { emptyField } = fieldValidators; + +const fieldsConfig: Record = { + /* Required field config */ + pattern: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.dissectForm.patternFieldLabel', { + defaultMessage: 'Pattern', + }), + helpText: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dissectForm.patternFieldHelpText', + { + defaultMessage: 'The pattern to apply to the field.', + } + ), + validations: [ + { + validator: emptyField( + i18n.translate('xpack.ingestPipelines.pipelineEditor.dissectForm.patternRequiredError', { + defaultMessage: 'A pattern value is required.', + }) + ), + }, + ], + }, + /* Optional field config */ + append_separator: { + type: FIELD_TYPES.TEXT, + label: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dissectForm.appendSeparatorparaotrFieldLabel', + { + defaultMessage: 'Append separator (optional)', + } + ), + helpText: ( + {'""'} }} + /> + ), + }, +}; + +export const Dissect: FunctionComponent = () => { + return ( + <> + + + + + + + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/dot_expander.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/dot_expander.tsx new file mode 100644 index 0000000000000..4e50c61ac930c --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/dot_expander.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; + +import { FieldConfig, FIELD_TYPES, UseField, Field } from '../../../../../../shared_imports'; + +import { FieldNameField } from './common_fields/field_name_field'; + +const fieldsConfig: Record = { + path: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.dotExpanderForm.pathFieldLabel', { + defaultMessage: 'Path', + }), + helpText: i18n.translate('xpack.ingestPipelines.pipelineEditor.dotExpanderForm.pathHelpText', { + defaultMessage: 'Only required if the field to expand is part another object field.', + }), + }, +}; + +export const DotExpander: FunctionComponent = () => { + return ( + <> + { + if (typeof value === 'string' && value.length) { + return !value.includes('.') + ? { + message: i18n.translate( + 'xpack.ingestPipelines.pipelineEditor.dotExpanderForm.fieldNameRequiresDotError', + { defaultMessage: 'A field value requires at least one dot character.' } + ), + } + : undefined; + } + }, + }, + ]} + /> + + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/drop.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/drop.tsx new file mode 100644 index 0000000000000..87b6cb76cdcce --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/drop.tsx @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FunctionComponent } from 'react'; + +/** + * This fields component has no unique fields + */ +export const Drop: FunctionComponent = () => { + return null; +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/gsub.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/gsub.tsx index 77f85e61eff6b..3148022adaa98 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/gsub.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/gsub.tsx @@ -15,6 +15,7 @@ import { UseField, Field, } from '../../../../../../shared_imports'; +import { TextEditor } from '../field_components'; const { emptyField } = fieldValidators; @@ -84,15 +85,25 @@ const ignoreMissingConfig: FieldConfig = { export const Gsub: FunctionComponent = () => { return ( <> - + - + - + - + - + ); }; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/index.ts new file mode 100644 index 0000000000000..6996deb2d861c --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { Append } from './append'; +export { Bytes } from './bytes'; +export { Circle } from './circle'; +export { Convert } from './convert'; +export { CSV } from './csv'; +export { DateProcessor } from './date'; +export { DateIndexName } from './date_index_name'; +export { Dissect } from './dissect'; +export { DotExpander } from './dot_expander'; +export { Drop } from './drop'; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/set.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/set.tsx index 1ba6a14d0448d..88cea620ae804 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/set.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/set.tsx @@ -64,11 +64,11 @@ const overrideConfig: FieldConfig = { export const SetProcessor: FunctionComponent = () => { return ( <> - + - + - + ); }; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/shared.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/shared.ts new file mode 100644 index 0000000000000..a0a31dd3a8e93 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/shared.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as rt from 'io-ts'; +import { isRight } from 'fp-ts/lib/Either'; +import { flow } from 'fp-ts/lib/function'; + +import { FieldConfig } from '../../../../../../shared_imports'; + +export const arrayOfStrings = rt.array(rt.string); +export const isArrayOfStrings = flow(arrayOfStrings.decode, isRight); + +export type FieldsConfig = Record; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/shared/map_processor_type_to_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/shared/map_processor_type_to_form.tsx index 7055721fc8b07..502045084b24d 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/shared/map_processor_type_to_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/shared/map_processor_type_to_form.tsx @@ -7,6 +7,19 @@ import { i18n } from '@kbn/i18n'; import { FunctionComponent } from 'react'; +import { + Append, + Bytes, + Circle, + Convert, + CSV, + DateProcessor, + DateIndexName, + Dissect, + DotExpander, + Drop, +} from '../manage_processor_form/processors'; + // import { SetProcessor } from './processors/set'; // import { Gsub } from './processors/gsub'; @@ -23,70 +36,70 @@ type MapProcessorTypeToDescriptor = Record; export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = { append: { - FieldsComponent: undefined, // TODO: Implement + FieldsComponent: Append, docLinkPath: '/append-processor.html', label: i18n.translate('xpack.ingestPipelines.processors.label.append', { defaultMessage: 'Append', }), }, bytes: { - FieldsComponent: undefined, // TODO: Implement + FieldsComponent: Bytes, docLinkPath: '/bytes-processor.html', label: i18n.translate('xpack.ingestPipelines.processors.label.bytes', { defaultMessage: 'Bytes', }), }, circle: { - FieldsComponent: undefined, // TODO: Implement + FieldsComponent: Circle, docLinkPath: '/ingest-circle-processor.html', label: i18n.translate('xpack.ingestPipelines.processors.label.circle', { defaultMessage: 'Circle', }), }, convert: { - FieldsComponent: undefined, // TODO: Implement + FieldsComponent: Convert, docLinkPath: '/convert-processor.html', label: i18n.translate('xpack.ingestPipelines.processors.label.convert', { defaultMessage: 'Convert', }), }, csv: { - FieldsComponent: undefined, // TODO: Implement + FieldsComponent: CSV, docLinkPath: '/csv-processor.html', label: i18n.translate('xpack.ingestPipelines.processors.label.csv', { defaultMessage: 'CSV', }), }, date: { - FieldsComponent: undefined, // TODO: Implement + FieldsComponent: DateProcessor, docLinkPath: '/date-processor.html', label: i18n.translate('xpack.ingestPipelines.processors.label.date', { defaultMessage: 'Date', }), }, date_index_name: { - FieldsComponent: undefined, // TODO: Implement + FieldsComponent: DateIndexName, docLinkPath: '/date-index-name-processor.html', label: i18n.translate('xpack.ingestPipelines.processors.label.dateIndexName', { defaultMessage: 'Date Index Name', }), }, dissect: { - FieldsComponent: undefined, // TODO: Implement + FieldsComponent: Dissect, docLinkPath: '/dissect-processor.html', label: i18n.translate('xpack.ingestPipelines.processors.label.dissect', { defaultMessage: 'Dissect', }), }, dot_expander: { - FieldsComponent: undefined, // TODO: Implement + FieldsComponent: DotExpander, docLinkPath: '/dot-expand-processor.html', label: i18n.translate('xpack.ingestPipelines.processors.label.dotExpander', { defaultMessage: 'Dot Expander', }), }, drop: { - FieldsComponent: undefined, // TODO: Implement + FieldsComponent: Drop, docLinkPath: '/drop-processor.html', label: i18n.translate('xpack.ingestPipelines.processors.label.drop', { defaultMessage: 'Drop', diff --git a/x-pack/plugins/ingest_pipelines/public/shared_imports.ts b/x-pack/plugins/ingest_pipelines/public/shared_imports.ts index d2c4b73a48767..936db37f0c629 100644 --- a/x-pack/plugins/ingest_pipelines/public/shared_imports.ts +++ b/x-pack/plugins/ingest_pipelines/public/shared_imports.ts @@ -43,6 +43,8 @@ export { FieldConfig, FieldHook, getFieldValidityAndErrorMessage, + ValidationFunc, + ValidationConfig, } from '../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib'; export { @@ -57,6 +59,9 @@ export { FormRow, ToggleField, ComboBoxField, + RadioGroupField, + NumericField, + SelectField, } from '../../../../src/plugins/es_ui_shared/static/forms/components'; export { From acc8ffed299fbba5ede703c79429f8df8c9feec5 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Thu, 13 Aug 2020 16:38:57 +0300 Subject: [PATCH 098/113] Fixed tooltip (#74074) Co-authored-by: Elastic Machine --- src/plugins/vis_type_vega/public/_vega_vis.scss | 1 + src/plugins/vis_type_vega/public/vega_view/vega_tooltip.js | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/vis_type_vega/public/_vega_vis.scss b/src/plugins/vis_type_vega/public/_vega_vis.scss index f9468d677eeed..12108c7ba3de0 100644 --- a/src/plugins/vis_type_vega/public/_vega_vis.scss +++ b/src/plugins/vis_type_vega/public/_vega_vis.scss @@ -107,6 +107,7 @@ .vgaVis__tooltip { max-width: 100%; + position: fixed; h2 { margin-bottom: $euiSizeS; diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_tooltip.js b/src/plugins/vis_type_vega/public/vega_view/vega_tooltip.js index 01386fd91abc5..7b0274478cea2 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_tooltip.js +++ b/src/plugins/vis_type_vega/public/vega_view/vega_tooltip.js @@ -85,12 +85,12 @@ export class TooltipHandler { let anchorBounds; if (item.bounds.width() > this.centerOnMark || item.bounds.height() > this.centerOnMark) { // I would expect clientX/Y, but that shows incorrectly - anchorBounds = createRect(event.pageX, event.pageY, 0, 0); + anchorBounds = createRect(event.clientX, event.clientY, 0, 0); } else { const containerBox = this.container.getBoundingClientRect(); anchorBounds = createRect( - containerBox.left + view._origin[0] + item.bounds.x1 + window.pageXOffset, - containerBox.top + view._origin[1] + item.bounds.y1 + window.pageYOffset, + containerBox.left + view._origin[0] + item.bounds.x1, + containerBox.top + view._origin[1] + item.bounds.y1, item.bounds.width(), item.bounds.height() ); From 8095c7ba1575d85a98c79ef779864fe4795a4fa5 Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper Date: Thu, 13 Aug 2020 09:32:14 -0500 Subject: [PATCH 099/113] [Metrics UI] Add Jest tests for alert previews (#74890) --- .../preview_metric_threshold_alert.test.ts | 133 ++++++++++++++++++ .../alerting/metric_threshold/test_mocks.ts | 54 +++++++ .../lib/alerting/metric_threshold/types.ts | 2 +- 3 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 x-pack/plugins/infra/server/lib/alerting/metric_threshold/preview_metric_threshold_alert.test.ts diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/preview_metric_threshold_alert.test.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/preview_metric_threshold_alert.test.ts new file mode 100644 index 0000000000000..c26b44dfe8ff8 --- /dev/null +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/preview_metric_threshold_alert.test.ts @@ -0,0 +1,133 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as mocks from './test_mocks'; +import { Comparator, Aggregators, MetricExpressionParams } from './types'; +import { alertsMock, AlertServicesMock } from '../../../../../alerts/server/mocks'; +import { previewMetricThresholdAlert } from './preview_metric_threshold_alert'; + +describe('Previewing the metric threshold alert type', () => { + describe('querying the entire infrastructure', () => { + test('returns the expected results using a bucket interval equal to the alert interval', async () => { + const [ungroupedResult] = await previewMetricThresholdAlert({ + ...baseParams, + lookback: 'h', + alertInterval: '1m', + }); + const [firedResults, noDataResults, errorResults] = ungroupedResult; + expect(firedResults).toBe(30); + expect(noDataResults).toBe(0); + expect(errorResults).toBe(0); + }); + + test('returns the expected results using a bucket interval shorter than the alert interval', async () => { + const [ungroupedResult] = await previewMetricThresholdAlert({ + ...baseParams, + lookback: 'h', + alertInterval: '3m', + }); + const [firedResults, noDataResults, errorResults] = ungroupedResult; + expect(firedResults).toBe(10); + expect(noDataResults).toBe(0); + expect(errorResults).toBe(0); + }); + test('returns the expected results using a bucket interval longer than the alert interval', async () => { + const [ungroupedResult] = await previewMetricThresholdAlert({ + ...baseParams, + lookback: 'h', + alertInterval: '30s', + }); + const [firedResults, noDataResults, errorResults] = ungroupedResult; + expect(firedResults).toBe(60); + expect(noDataResults).toBe(0); + expect(errorResults).toBe(0); + }); + }); + describe('querying with a groupBy parameter', () => { + test('returns the expected results', async () => { + const [resultA, resultB] = await previewMetricThresholdAlert({ + ...baseParams, + params: { + ...baseParams.params, + groupBy: ['something'], + }, + lookback: 'h', + alertInterval: '1m', + }); + const [firedResultsA, noDataResultsA, errorResultsA] = resultA; + expect(firedResultsA).toBe(30); + expect(noDataResultsA).toBe(0); + expect(errorResultsA).toBe(0); + const [firedResultsB, noDataResultsB, errorResultsB] = resultB; + expect(firedResultsB).toBe(60); + expect(noDataResultsB).toBe(0); + expect(errorResultsB).toBe(0); + }); + }); + describe('querying a data set with a period of No Data', () => { + test('returns the expected results', async () => { + const [ungroupedResult] = await previewMetricThresholdAlert({ + ...baseParams, + params: { + ...baseParams.params, + criteria: [ + { + ...baseCriterion, + metric: 'test.metric.2', + } as MetricExpressionParams, + ], + }, + lookback: 'h', + alertInterval: '1m', + }); + const [firedResults, noDataResults, errorResults] = ungroupedResult; + expect(firedResults).toBe(25); + expect(noDataResults).toBe(10); + expect(errorResults).toBe(0); + }); + }); +}); + +const services: AlertServicesMock = alertsMock.createAlertServices(); +services.callCluster.mockImplementation(async (_: string, { body, index }: any) => { + const metric = body.query.bool.filter[1]?.exists.field; + if (body.aggs.groupings) { + if (body.aggs.groupings.composite.after) { + return mocks.compositeEndResponse; + } + return mocks.basicCompositePreviewResponse; + } + if (metric === 'test.metric.2') { + return mocks.alternateMetricPreviewResponse; + } + return mocks.basicMetricPreviewResponse; +}); + +const baseCriterion = { + aggType: Aggregators.AVERAGE, + metric: 'test.metric.1', + timeSize: 1, + timeUnit: 'm', + comparator: Comparator.GT, + threshold: [0.75], +} as MetricExpressionParams; + +const config = { + metricAlias: 'metricbeat-*', + fields: { + timefield: '@timestamp', + }, +} as any; + +const baseParams = { + callCluster: services.callCluster, + params: { + criteria: [baseCriterion], + groupBy: undefined, + filterQuery: undefined, + }, + config, +}; diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts index 164f1ed6d18e5..d1178f6766979 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts @@ -38,6 +38,13 @@ const bucketsC = [ }, ]; +const previewBucketsA = Array.from(Array(60), (_, i) => bucketsA[i % 2]); // Repeat bucketsA to a total length of 60 +const previewBucketsB = Array.from(Array(60), (_, i) => bucketsB[i % 2]); +const previewBucketsWithNulls = [ + ...Array.from(Array(10), (_, i) => ({ aggregatedValue: { value: null } })), + ...previewBucketsA.slice(10), +]; + export const basicMetricResponse = { aggregations: { aggregatedIntervals: { @@ -150,3 +157,50 @@ export const changedSourceIdResponse = { }, }, }; + +export const basicMetricPreviewResponse = { + aggregations: { + aggregatedIntervals: { + buckets: previewBucketsA, + }, + }, +}; + +export const alternateMetricPreviewResponse = { + aggregations: { + aggregatedIntervals: { + buckets: previewBucketsWithNulls, + }, + }, +}; + +export const basicCompositePreviewResponse = { + aggregations: { + groupings: { + after_key: { groupBy0: 'foo' }, + buckets: [ + { + key: { + groupBy0: 'a', + }, + aggregatedIntervals: { + buckets: previewBucketsA, + }, + }, + { + key: { + groupBy0: 'b', + }, + aggregatedIntervals: { + buckets: previewBucketsB, + }, + }, + ], + }, + }, + hits: { + total: { + value: 2, + }, + }, +}; diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/types.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/types.ts index 62ab94b7d8c83..cbe4014b24348 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/types.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/types.ts @@ -35,7 +35,7 @@ interface NonCountMetricExpressionParams extends BaseMetricExpressionParams { } interface CountMetricExpressionParams extends BaseMetricExpressionParams { - aggType: 'count'; + aggType: Aggregators.COUNT; metric: never; } From 6a85e893f759f3c897c900e71352dbc93853c4a0 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Thu, 13 Aug 2020 10:30:13 -0500 Subject: [PATCH 100/113] skip test Reporting paginates content #74922 --- .../test/functional/apps/reporting_management/report_listing.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/reporting_management/report_listing.ts b/x-pack/test/functional/apps/reporting_management/report_listing.ts index 5bb36103fc6f6..476f3e73d0923 100644 --- a/x-pack/test/functional/apps/reporting_management/report_listing.ts +++ b/x-pack/test/functional/apps/reporting_management/report_listing.ts @@ -68,7 +68,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); - it('Paginates content', async () => { + it.skip('Paginates content', async () => { const previousButton = await testSubjects.find('pagination-button-previous'); // previous CAN NOT be clicked From d21d10003001adfd2464c64bb655a0dae2a36939 Mon Sep 17 00:00:00 2001 From: Caroline Horn <549577+cchaos@users.noreply.github.com> Date: Thu, 13 Aug 2020 11:44:22 -0400 Subject: [PATCH 101/113] Update design-specific GH code-owners (#74877) * Update design-specific GH code-owners Created a `@elastic/stack-design` encompassing all product designers associated with the stack+solutions (Kibana repo contributors, not cloud). The `@elastic/kibana-design` team has been reduced to the actual Kibana design team. Then other individual design teams have been added as code-owners to their respective folders containing SASS changes. --- .github/CODEOWNERS | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 73fb10532fd8d..6863b91858ff6 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,6 +8,7 @@ /x-pack/plugins/lens/ @elastic/kibana-app /x-pack/plugins/graph/ @elastic/kibana-app /src/plugins/dashboard/ @elastic/kibana-app +/src/plugins/dashboard/**/*.scss @elastic/kibana-core-ui /src/plugins/discover/ @elastic/kibana-app /src/plugins/input_control_vis/ @elastic/kibana-app /src/plugins/kibana_legacy/ @elastic/kibana-app @@ -58,6 +59,7 @@ # APM /x-pack/plugins/apm/ @elastic/apm-ui +/x-pack/plugins/apm/**/*.scss @elastic/observability-design /x-pack/test/functional/apps/apm/ @elastic/apm-ui /src/legacy/core_plugins/apm_oss/ @elastic/apm-ui /src/plugins/apm_oss/ @elastic/apm-ui @@ -68,6 +70,7 @@ # Canvas /x-pack/plugins/canvas/ @elastic/kibana-canvas +/x-pack/plugins/canvas/**/*.scss @elastic/kibana-core-ui /x-pack/test/functional/apps/canvas/ @elastic/kibana-canvas # Core UI @@ -77,15 +80,18 @@ /src/plugins/home/server/services/ @elastic/kibana-core-ui # Exclude tutorial resources folder for now because they are not owned by Kibana app and most will move out soon /src/legacy/core_plugins/kibana/public/home/*.ts @elastic/kibana-core-ui -/src/legacy/core_plugins/kibana/public/home/*.scss @elastic/kibana-core-ui +/src/legacy/core_plugins/kibana/public/home/**/*.scss @elastic/kibana-core-ui /src/legacy/core_plugins/kibana/public/home/np_ready/ @elastic/kibana-core-ui # Observability UIs /x-pack/legacy/plugins/infra/ @elastic/logs-metrics-ui /x-pack/plugins/infra/ @elastic/logs-metrics-ui +/x-pack/plugins/infra/**/*.scss @elastic/observability-design /x-pack/plugins/ingest_manager/ @elastic/ingest-management +/x-pack/plugins/ingest_manager/**/*.scss @elastic/observability-design /x-pack/legacy/plugins/ingest_manager/ @elastic/ingest-management /x-pack/plugins/observability/ @elastic/observability-ui +/x-pack/plugins/observability/**/*.scss @elastic/observability-design /x-pack/legacy/plugins/monitoring/ @elastic/stack-monitoring-ui /x-pack/plugins/monitoring/ @elastic/stack-monitoring-ui /x-pack/plugins/uptime @elastic/uptime @@ -159,10 +165,14 @@ # Security /src/core/server/csp/ @elastic/kibana-security @elastic/kibana-platform /x-pack/legacy/plugins/security/ @elastic/kibana-security +/x-pack/legacy/plugins/security/**/*.scss @elastic/kibana-core-ui /x-pack/legacy/plugins/spaces/ @elastic/kibana-security +/x-pack/legacy/plugins/spaces/**/*.scss @elastic/kibana-core-ui /x-pack/plugins/spaces/ @elastic/kibana-security +/x-pack/plugins/spaces/**/*.scss @elastic/kibana-core-ui /x-pack/plugins/encrypted_saved_objects/ @elastic/kibana-security /x-pack/plugins/security/ @elastic/kibana-security +/x-pack/plugins/security/**/*.scss @elastic/kibana-core-ui /x-pack/test/api_integration/apis/security/ @elastic/kibana-security # Kibana Localization @@ -234,6 +244,7 @@ x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @elastic/kib # Endpoint /x-pack/plugins/endpoint/ @elastic/endpoint-app-team @elastic/siem +/x-pack/plugins/endpoint/**/*.scss @elastic/security-design /x-pack/test/api_integration/apis/endpoint/ @elastic/endpoint-app-team @elastic/siem /x-pack/test/endpoint_api_integration_no_ingest/ @elastic/endpoint-app-team @elastic/siem /x-pack/test/security_solution_endpoint/ @elastic/endpoint-app-team @elastic/siem @@ -243,6 +254,7 @@ x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @elastic/kib # Security Solution /x-pack/plugins/security_solution/ @elastic/siem @elastic/endpoint-app-team +/x-pack/plugins/security_solution/**/*.scss @elastic/security-design /x-pack/test/detection_engine_api_integration @elastic/siem @elastic/endpoint-app-team /x-pack/test/api_integration/apis/security_solution @elastic/siem @elastic/endpoint-app-team /x-pack/plugins/case @elastic/siem @elastic/endpoint-app-team From 4c810be33595d478c6eb802170d0644b32e62898 Mon Sep 17 00:00:00 2001 From: Spencer Date: Thu, 13 Aug 2020 09:08:44 -0700 Subject: [PATCH 102/113] Remove legacy optimizer (#73154) Co-authored-by: spalger Co-authored-by: Elastic Machine --- .eslintignore | 7 +- .eslintrc.js | 6 +- README.md | 1 - STYLEGUIDE.md | 2 +- docs/setup/install/deb.asciidoc | 6 - docs/setup/install/rpm.asciidoc | 6 - docs/setup/install/targz.asciidoc | 6 - docs/setup/install/windows.asciidoc | 6 - package.json | 24 - packages/eslint-config-kibana/package.json | 2 +- packages/kbn-babel-preset/package.json | 4 +- .../import_resolver_kibana.js | 23 +- .../lib/get_plugins.js | 66 - .../lib/get_webpack_config.js | 40 +- .../lib/index.js | 1 - .../lib/is_probably_webpack_shim.js | 59 - packages/kbn-optimizer/package.json | 1 - .../plugins/bar/public/legacy/styles.scss | 1 - .../core_app}/styles/_globals_v7dark.scss | 0 .../core_app}/styles/_globals_v7light.scss | 0 .../core_app}/styles/_globals_v8dark.scss | 0 .../core_app}/styles/_globals_v8light.scss | 0 .../mock_repo/src/legacy/ui/public/icon.svg | 1 - .../basic_optimization.test.ts.snap | 2 +- .../basic_optimization.test.ts | 7 +- .../src/worker/webpack.config.ts | 38 +- packages/kbn-plugin-helpers/package.json | 2 - .../src/lib/plugin_config.ts | 2 +- .../src/tasks/build/create_build.ts | 17 - .../build_action_test_plugin/index.js | 7 +- .../build_action_test_plugin/public/hack.js | 20 - .../create_build_test_plugin/index.js | 7 +- .../public/styles.scss | 3 - .../create_package_test_plugin/index.js | 7 +- .../create_package_test_plugin/public/hack.js | 20 - .../integration_tests/create_build.test.js | 26 +- packages/kbn-pm/dist/index.js | 31235 +++++++--------- packages/kbn-storybook/index.js | 10 +- packages/kbn-storybook/lib/storybook_entry.js | 2 +- .../kbn-storybook/lib/webpack.dll.config.js | 17 - packages/kbn-storybook/package.json | 1 + .../storybook_config/webpack.config.js | 28 +- .../src/functional_tests/lib/paths.js | 1 - packages/kbn-test/src/index.ts | 2 +- scripts/build_sass.js | 21 - src/cli/cluster/cluster_manager.test.ts | 52 +- src/cli/cluster/cluster_manager.ts | 61 +- src/cli/cluster/run_kbn_optimizer.ts | 5 +- src/cli/serve/serve.js | 5 +- src/core/MIGRATION.md | 1 - .../core_app}/images/bg_bottom_branded.svg | 0 .../images/bg_bottom_branded_dark.svg | 0 .../core_app}/images/bg_top_branded.svg | 0 .../core_app}/images/bg_top_branded_dark.svg | 0 .../core_app}/styles/_globals_v7dark.scss | 3 +- .../core_app}/styles/_globals_v7light.scss | 3 +- .../core_app}/styles/_globals_v8dark.scss | 0 .../core_app}/styles/_globals_v8light.scss | 0 .../public/core_app}/styles/_mixins.scss | 4 +- src/core/server/bootstrap.ts | 11 +- src/core/server/config/__mocks__/env.ts | 4 +- .../config/__snapshots__/env.test.ts.snap | 24 +- .../config/deprecation/core_deprecations.ts | 29 +- src/core/server/config/env.ts | 6 +- .../config_deprecation.test.ts | 25 +- .../server/core_app/assets/fonts/readme.md | 5 - .../server/core_app/assets/images/kibana.svg | 9 - .../core_app/assets/legacy_dark_theme.css | 4419 +++ .../core_app/assets/legacy_light_theme.css | 4419 +++ .../rendering_service.test.ts.snap | 274 - .../rendering/rendering_service.test.ts | 57 - .../server/rendering/rendering_service.tsx | 4 +- src/core/server/uuid/resolve_uuid.test.ts | 147 +- src/core/server/uuid/resolve_uuid.ts | 12 +- src/core/server/uuid/uuid_service.test.ts | 20 - src/core/server/uuid/uuid_service.ts | 5 +- src/dev/build/build_distributables.ts | 2 - src/dev/build/tasks/copy_source_task.ts | 1 - src/dev/build/tasks/index.ts | 2 - src/dev/build/tasks/optimize_task.ts | 52 - src/dev/build/tasks/transpile_scss_task.ts | 33 - src/dev/i18n/README.md | 14 +- .../test_plugin_1/test_file_2.pug | 10 - .../extract_default_translations.test.js.snap | 7 - src/dev/i18n/extract_default_translations.js | 11 +- .../extractors/__snapshots__/pug.test.js.snap | 37 - src/dev/i18n/extractors/index.js | 1 - src/dev/i18n/extractors/pug.js | 74 - src/dev/i18n/extractors/pug.test.js | 64 - .../tasks/extract_untracked_translations.ts | 1 - src/dev/jest/config.js | 1 + src/dev/precommit_hook/casing_check_config.js | 28 +- src/dev/sass/build_sass.js | 94 - src/dev/sass/run_build_sass_cli.js | 47 - src/legacy/core_plugins/kibana/index.js | 2 - src/legacy/core_plugins/status_page/index.js | 31 - .../core_plugins/status_page/package.json | 4 - .../status_page/public/components/render.js | 41 - .../status_page/public/status_page.html | 1 - .../status_page/public/status_page.js | 33 - .../plugin_spec/plugin_spec_options.d.ts | 4 - src/legacy/plugin_discovery/types.ts | 2 - src/legacy/server/config/schema.js | 25 - src/legacy/server/http/index.js | 12 +- src/legacy/server/kbn_server.js | 10 +- .../server/sass/__fixtures__/images/img.png | Bin 3820 -> 0 bytes .../server/sass/__fixtures__/index.scss | 6 - src/legacy/server/sass/build.js | 194 - src/legacy/server/sass/build.test.js | 119 - src/legacy/server/sass/build_all.js | 45 - src/legacy/server/sass/index.js | 137 - src/legacy/server/views/index.pug | 6 - src/legacy/ui/public/UI_SYSTEMS.md | 8 - .../ui/public/chrome/__mocks__/index.js | 6 - src/legacy/ui/public/chrome/chrome.js | 6 - .../public/styles/bootstrap/_colors_dark.less | 20 - .../styles/bootstrap/_colors_light.less | 20 - .../styles/bootstrap/_custom_variables.less | 443 - .../_custom_variables_dark_overrides.less | 4 - .../public/styles/bootstrap/_overrides.less | 252 - .../ui/public/styles/bootstrap/alerts.less | 73 - .../styles/bootstrap/bootstrap_dark.less | 77 - .../styles/bootstrap/bootstrap_light.less | 76 - .../ui/public/styles/bootstrap/buttons.less | 69 - .../ui/public/styles/bootstrap/close.less | 34 - .../bootstrap/component-animations.less | 33 - .../ui/public/styles/bootstrap/dropdowns.less | 227 - .../ui/public/styles/bootstrap/forms.less | 470 - .../ui/public/styles/bootstrap/grid.less | 84 - .../public/styles/bootstrap/input-groups.less | 117 - .../ui/public/styles/bootstrap/labels.less | 58 - .../public/styles/bootstrap/list-group.less | 133 - .../ui/public/styles/bootstrap/mixins.less | 40 - .../styles/bootstrap/mixins/alerts.less | 14 - .../bootstrap/mixins/background-variant.less | 9 - .../bootstrap/mixins/border-radius.less | 18 - .../styles/bootstrap/mixins/buttons.less | 65 - .../styles/bootstrap/mixins/center-block.less | 7 - .../styles/bootstrap/mixins/clearfix.less | 22 - .../public/styles/bootstrap/mixins/forms.less | 85 - .../styles/bootstrap/mixins/gradients.less | 59 - .../bootstrap/mixins/grid-framework.less | 91 - .../public/styles/bootstrap/mixins/grid.less | 122 - .../styles/bootstrap/mixins/hide-text.less | 21 - .../public/styles/bootstrap/mixins/image.less | 33 - .../styles/bootstrap/mixins/labels.less | 12 - .../styles/bootstrap/mixins/list-group.less | 30 - .../styles/bootstrap/mixins/nav-divider.less | 10 - .../bootstrap/mixins/nav-vertical-align.less | 9 - .../styles/bootstrap/mixins/opacity.less | 8 - .../styles/bootstrap/mixins/pagination.less | 24 - .../styles/bootstrap/mixins/panels.less | 24 - .../styles/bootstrap/mixins/progress-bar.less | 10 - .../styles/bootstrap/mixins/reset-filter.less | 8 - .../styles/bootstrap/mixins/reset-text.less | 18 - .../styles/bootstrap/mixins/resize.less | 6 - .../mixins/responsive-visibility.less | 15 - .../public/styles/bootstrap/mixins/size.less | 10 - .../styles/bootstrap/mixins/tab-focus.less | 5 - .../styles/bootstrap/mixins/table-row.less | 28 - .../bootstrap/mixins/text-emphasis.less | 9 - .../bootstrap/mixins/text-overflow.less | 8 - .../bootstrap/mixins/vendor-prefixes.less | 227 - .../ui/public/styles/bootstrap/modals.less | 136 - .../ui/public/styles/bootstrap/navbar.less | 603 - .../ui/public/styles/bootstrap/navs.less | 243 - .../ui/public/styles/bootstrap/pager.less | 54 - .../public/styles/bootstrap/pagination.less | 89 - .../ui/public/styles/bootstrap/panels.less | 271 - .../ui/public/styles/bootstrap/popovers.less | 131 - .../styles/bootstrap/progress-bars.less | 86 - .../bootstrap/responsive-utilities.less | 173 - .../ui/public/styles/bootstrap/tables.less | 227 - .../ui/public/styles/bootstrap/tooltip.less | 101 - .../ui/public/styles/bootstrap/type.less | 63 - .../ui/public/styles/bootstrap/utilities.less | 55 - .../ui/public/styles/bootstrap/variables.less | 852 - .../ui/public/styles/bootstrap_dark.less | 4 - .../ui/public/styles/bootstrap_light.less | 5 - .../__tests__/app_entry_template.js | 45 - .../ui/ui_bundles/__tests__/ui_bundle.js | 50 - .../ui/ui_bundles/app_entry_template.js | 66 - src/legacy/ui/ui_bundles/ui_bundle.js | 125 - .../ui/ui_bundles/ui_bundles_controller.js | 255 - src/legacy/ui/ui_bundles/ui_bundles_mixin.js | 29 - .../__tests__/collect_ui_exports.js | 12 - .../ui/ui_exports/ui_export_defaults.js | 28 +- .../ui/ui_exports/ui_export_types/index.js | 38 - .../ui_export_types/style_sheet_paths.js | 97 - .../ui_export_types/style_sheet_paths.test.js | 139 - .../ui_export_types/ui_app_extensions.js | 66 - .../ui/ui_exports/ui_export_types/ui_apps.js | 70 - .../ui_export_types/webpack_customizations.js | 48 - src/legacy/ui/ui_mixin.js | 2 - .../ui/ui_render/bootstrap/template.js.hbs | 7 +- src/legacy/ui/ui_render/ui_render_mixin.js | 30 +- src/optimize/base_optimizer.js | 520 - .../outside_output.js | 0 .../plugin/foo}/image.png | Bin .../plugin/foo/plugin.js} | 0 .../bundles_route/__tests__/bundles_route.js | 440 - .../fixtures/output/no_placeholder.css | 3 - .../fixtures/output/no_placeholder.js | 20 - .../fixtures/output/with_placeholder.css | 3 - .../fixtures/output/with_placeholder.js | 20 - .../plugin/placeholder/placeholder.plugin.js | 20 - .../bundles_route/bundles_route.test.ts | 307 + src/optimize/bundles_route/bundles_route.ts | 36 +- .../bundles_route/dynamic_asset_response.ts | 10 +- .../bundles_route/proxy_bundles_route.ts | 5 +- src/optimize/create_ui_exports_module.js | 40 - src/optimize/fs_optimizer.js | 41 - src/optimize/index.js | 21 - .../public/hack.js => src/optimize/index.ts | 2 +- src/optimize/intentionally_empty_module.js | 18 - src/optimize/optimize_mixin.ts | 58 - src/optimize/postcss.config.js | 22 - src/optimize/public_path_placeholder.ts | 57 - src/optimize/watch/optmzr_role.js | 74 - src/optimize/watch/proxy_role.js | 57 - src/optimize/watch/watch.js | 51 - src/optimize/watch/watch_optimizer.js | 192 - src/optimize/watch/watch_server.js | 47 - src/plugins/timelion/public/flot.js | 26 - .../timelion/public/flot}/index.js | 8 +- .../jquery.flot.axislabels.js | 0 .../jquery.flot.crosshair.js | 0 .../{webpackShims => flot}/jquery.flot.js | 0 .../jquery.flot.selection.js | 0 .../jquery.flot.stack.js | 0 .../jquery.flot.symbol.js | 0 .../jquery.flot.time.js | 0 src/plugins/vis_type_timelion/public/flot.js | 26 - .../vis_type_timelion/public/flot}/index.js | 8 +- .../jquery.flot.axislabels.js | 0 .../jquery.flot.crosshair.js | 0 .../{webpackShims => flot}/jquery.flot.js | 0 .../jquery.flot.selection.js | 0 .../jquery.flot.stack.js | 0 .../jquery.flot.symbol.js | 0 .../jquery.flot.time.js | 0 src/test_utils/kbn_server.ts | 5 +- test/api_integration/config.js | 1 - test/common/config.js | 13 +- test/functional/apps/bundles/index.js | 7 - .../plugins/core_plugin_legacy/index.ts | 50 - .../plugins/core_plugin_legacy/package.json | 17 - .../core_plugin_legacy/public/application.tsx | 34 - .../core_plugin_legacy/public/index.ts | 29 - .../plugins/core_plugin_legacy/tsconfig.json | 15 - .../plugins/legacy_plugin/index.ts | 34 - .../plugins/legacy_plugin/package.json | 17 - .../plugins/legacy_plugin/public/index.tsx | 35 - .../plugins/legacy_plugin/tsconfig.json | 15 - .../core_plugins/application_leave_confirm.ts | 21 - .../test_suites/core_plugins/index.ts | 1 - .../core_plugins/legacy_plugins.ts | 52 - .../test_suites/core_plugins/rendering.ts | 36 - test/scripts/jenkins_xpack.sh | 6 - test/server_integration/config.js | 1 - test/server_integration/http/cache/index.js | 5 +- webpackShims/.eslintrc | 2 - webpackShims/ace.js | 24 - webpackShims/elasticsearch.js | 23 - webpackShims/lru-cache.js | 20 - webpackShims/mocha.js | 20 - webpackShims/sinon.js | 21 - x-pack/.kibana-plugin-helpers.json | 1 - x-pack/legacy/plugins/security/index.ts | 1 - .../plugins/security/public/hacks/legacy.ts | 64 - x-pack/legacy/plugins/spaces/index.ts | 4 - x-pack/legacy/plugins/spaces/public/legacy.ts | 18 - x-pack/legacy/plugins/xpack_main/index.js | 11 - .../xpack_main/public/components/index.js | 16 - .../public/hacks/check_xpack_info_change.js | 53 - .../xpack_main/public/jquery_flot/index.js | 7 - .../public/jquery_flot/jquery_flot.js | 19 - .../public/services/__tests__/_mock_window.js | 23 - .../public/services/__tests__/xpack_info.js | 46 - .../__tests__/xpack_info_signature.js | 24 - .../xpack_main/public/services/path.js | 19 - .../xpack_main/public/services/xpack_info.js | 76 - .../public/services/xpack_info_signature.js | 19 - .../datasource_preview/datasource_preview.js | 2 +- .../public/expression_types/arg_types/font.js | 2 +- .../canvas/scripts/shareable_runtime.js | 6 - x-pack/plugins/canvas/scripts/storybook.js | 17 - .../plugins/canvas/shareable_runtime/index.ts | 19 +- .../shareable_runtime/webpack.config.js | 40 +- x-pack/plugins/canvas/storybook/constants.js | 4 +- .../plugins/canvas/storybook/dll_contexts.js | 20 +- x-pack/plugins/canvas/storybook/preview.ts | 9 - .../canvas/storybook/webpack.config.js | 5 +- .../canvas/storybook/webpack.dll.config.js | 16 - x-pack/plugins/graph/public/application.ts | 6 +- x-pack/test/api_integration/config.ts | 1 - .../login_selector_api_integration/config.ts | 1 - x-pack/test/saml_api_integration/config.ts | 1 - .../common/config.ts | 1 - .../spaces_api_integration/common/config.ts | 1 - x-pack/test/token_api_integration/config.js | 1 - .../upgrade_assistant_integration/config.js | 8 +- yarn.lock | 805 +- 303 files changed, 23623 insertions(+), 30328 deletions(-) delete mode 100755 packages/kbn-eslint-import-resolver-kibana/lib/get_plugins.js delete mode 100644 packages/kbn-eslint-import-resolver-kibana/lib/is_probably_webpack_shim.js rename packages/kbn-optimizer/src/__fixtures__/mock_repo/src/{legacy/ui/public => core/public/core_app}/styles/_globals_v7dark.scss (100%) rename packages/kbn-optimizer/src/__fixtures__/mock_repo/src/{legacy/ui/public => core/public/core_app}/styles/_globals_v7light.scss (100%) rename packages/kbn-optimizer/src/__fixtures__/mock_repo/src/{legacy/ui/public => core/public/core_app}/styles/_globals_v8dark.scss (100%) rename packages/kbn-optimizer/src/__fixtures__/mock_repo/src/{legacy/ui/public => core/public/core_app}/styles/_globals_v8light.scss (100%) delete mode 100644 packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/icon.svg delete mode 100644 packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/build_action_test_plugin/public/hack.js delete mode 100644 packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/public/styles.scss delete mode 100644 packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_package_test_plugin/public/hack.js delete mode 100644 scripts/build_sass.js rename src/core/{server/core_app/assets => public/core_app}/images/bg_bottom_branded.svg (100%) rename src/core/{server/core_app/assets => public/core_app}/images/bg_bottom_branded_dark.svg (100%) rename src/core/{server/core_app/assets => public/core_app}/images/bg_top_branded.svg (100%) rename src/core/{server/core_app/assets => public/core_app}/images/bg_top_branded_dark.svg (100%) rename src/{legacy/ui/public => core/public/core_app}/styles/_globals_v7dark.scss (81%) rename src/{legacy/ui/public => core/public/core_app}/styles/_globals_v7light.scss (80%) rename src/{legacy/ui/public => core/public/core_app}/styles/_globals_v8dark.scss (100%) rename src/{legacy/ui/public => core/public/core_app}/styles/_globals_v8light.scss (100%) rename src/{legacy/ui/public => core/public/core_app}/styles/_mixins.scss (88%) delete mode 100644 src/core/server/core_app/assets/images/kibana.svg create mode 100644 src/core/server/core_app/assets/legacy_dark_theme.css create mode 100644 src/core/server/core_app/assets/legacy_light_theme.css delete mode 100644 src/dev/build/tasks/optimize_task.ts delete mode 100644 src/dev/build/tasks/transpile_scss_task.ts delete mode 100644 src/dev/i18n/__fixtures__/extract_default_translations/test_plugin_1/test_file_2.pug delete mode 100644 src/dev/i18n/extractors/__snapshots__/pug.test.js.snap delete mode 100644 src/dev/i18n/extractors/pug.js delete mode 100644 src/dev/i18n/extractors/pug.test.js delete mode 100644 src/dev/sass/build_sass.js delete mode 100644 src/dev/sass/run_build_sass_cli.js delete mode 100644 src/legacy/core_plugins/status_page/index.js delete mode 100644 src/legacy/core_plugins/status_page/package.json delete mode 100644 src/legacy/core_plugins/status_page/public/components/render.js delete mode 100644 src/legacy/core_plugins/status_page/public/status_page.html delete mode 100644 src/legacy/core_plugins/status_page/public/status_page.js delete mode 100644 src/legacy/server/sass/__fixtures__/images/img.png delete mode 100644 src/legacy/server/sass/__fixtures__/index.scss delete mode 100644 src/legacy/server/sass/build.js delete mode 100644 src/legacy/server/sass/build.test.js delete mode 100644 src/legacy/server/sass/build_all.js delete mode 100644 src/legacy/server/sass/index.js delete mode 100644 src/legacy/server/views/index.pug delete mode 100644 src/legacy/ui/public/UI_SYSTEMS.md delete mode 100644 src/legacy/ui/public/styles/bootstrap/_colors_dark.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/_colors_light.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/_custom_variables.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/_custom_variables_dark_overrides.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/_overrides.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/alerts.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/bootstrap_dark.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/bootstrap_light.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/buttons.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/close.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/component-animations.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/dropdowns.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/forms.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/grid.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/input-groups.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/labels.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/list-group.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/alerts.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/background-variant.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/border-radius.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/buttons.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/center-block.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/clearfix.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/forms.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/gradients.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/grid-framework.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/grid.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/hide-text.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/image.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/labels.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/list-group.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/nav-divider.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/nav-vertical-align.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/opacity.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/pagination.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/panels.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/progress-bar.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/reset-filter.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/reset-text.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/resize.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/responsive-visibility.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/size.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/tab-focus.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/table-row.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/text-emphasis.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/text-overflow.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/mixins/vendor-prefixes.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/modals.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/navbar.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/navs.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/pager.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/pagination.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/panels.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/popovers.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/progress-bars.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/responsive-utilities.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/tables.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/tooltip.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/type.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/utilities.less delete mode 100644 src/legacy/ui/public/styles/bootstrap/variables.less delete mode 100644 src/legacy/ui/public/styles/bootstrap_dark.less delete mode 100644 src/legacy/ui/public/styles/bootstrap_light.less delete mode 100644 src/legacy/ui/ui_bundles/__tests__/app_entry_template.js delete mode 100644 src/legacy/ui/ui_bundles/__tests__/ui_bundle.js delete mode 100644 src/legacy/ui/ui_bundles/app_entry_template.js delete mode 100644 src/legacy/ui/ui_bundles/ui_bundle.js delete mode 100644 src/legacy/ui/ui_bundles/ui_bundles_controller.js delete mode 100644 src/legacy/ui/ui_bundles/ui_bundles_mixin.js delete mode 100644 src/legacy/ui/ui_exports/ui_export_types/style_sheet_paths.js delete mode 100644 src/legacy/ui/ui_exports/ui_export_types/style_sheet_paths.test.js delete mode 100644 src/legacy/ui/ui_exports/ui_export_types/ui_app_extensions.js delete mode 100644 src/legacy/ui/ui_exports/ui_export_types/ui_apps.js delete mode 100644 src/legacy/ui/ui_exports/ui_export_types/webpack_customizations.js delete mode 100644 src/optimize/base_optimizer.js rename src/optimize/bundles_route/{__tests__/fixtures => __fixtures__}/outside_output.js (100%) rename src/optimize/bundles_route/{__tests__/fixtures/output => __fixtures__/plugin/foo}/image.png (100%) rename src/optimize/bundles_route/{__tests__/fixtures/plugin/no_placeholder/no_placeholder.plugin.js => __fixtures__/plugin/foo/plugin.js} (100%) delete mode 100644 src/optimize/bundles_route/__tests__/bundles_route.js delete mode 100644 src/optimize/bundles_route/__tests__/fixtures/output/no_placeholder.css delete mode 100644 src/optimize/bundles_route/__tests__/fixtures/output/no_placeholder.js delete mode 100644 src/optimize/bundles_route/__tests__/fixtures/output/with_placeholder.css delete mode 100644 src/optimize/bundles_route/__tests__/fixtures/output/with_placeholder.js delete mode 100644 src/optimize/bundles_route/__tests__/fixtures/plugin/placeholder/placeholder.plugin.js create mode 100644 src/optimize/bundles_route/bundles_route.test.ts delete mode 100644 src/optimize/create_ui_exports_module.js delete mode 100644 src/optimize/fs_optimizer.js delete mode 100644 src/optimize/index.js rename packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/public/hack.js => src/optimize/index.ts (94%) delete mode 100644 src/optimize/intentionally_empty_module.js delete mode 100644 src/optimize/postcss.config.js delete mode 100644 src/optimize/public_path_placeholder.ts delete mode 100644 src/optimize/watch/optmzr_role.js delete mode 100644 src/optimize/watch/proxy_role.js delete mode 100644 src/optimize/watch/watch.js delete mode 100644 src/optimize/watch/watch_optimizer.js delete mode 100644 src/optimize/watch/watch_server.js delete mode 100644 src/plugins/timelion/public/flot.js rename src/{dev/sass => plugins/timelion/public/flot}/index.js (78%) rename src/plugins/timelion/public/{webpackShims => flot}/jquery.flot.axislabels.js (100%) rename src/plugins/timelion/public/{webpackShims => flot}/jquery.flot.crosshair.js (100%) rename src/plugins/timelion/public/{webpackShims => flot}/jquery.flot.js (100%) rename src/plugins/timelion/public/{webpackShims => flot}/jquery.flot.selection.js (100%) rename src/plugins/timelion/public/{webpackShims => flot}/jquery.flot.stack.js (100%) rename src/plugins/timelion/public/{webpackShims => flot}/jquery.flot.symbol.js (100%) rename src/plugins/timelion/public/{webpackShims => flot}/jquery.flot.time.js (100%) delete mode 100644 src/plugins/vis_type_timelion/public/flot.js rename src/{legacy/ui/ui_bundles => plugins/vis_type_timelion/public/flot}/index.js (78%) rename src/plugins/vis_type_timelion/public/{webpackShims => flot}/jquery.flot.axislabels.js (100%) rename src/plugins/vis_type_timelion/public/{webpackShims => flot}/jquery.flot.crosshair.js (100%) rename src/plugins/vis_type_timelion/public/{webpackShims => flot}/jquery.flot.js (100%) rename src/plugins/vis_type_timelion/public/{webpackShims => flot}/jquery.flot.selection.js (100%) rename src/plugins/vis_type_timelion/public/{webpackShims => flot}/jquery.flot.stack.js (100%) rename src/plugins/vis_type_timelion/public/{webpackShims => flot}/jquery.flot.symbol.js (100%) rename src/plugins/vis_type_timelion/public/{webpackShims => flot}/jquery.flot.time.js (100%) delete mode 100644 test/plugin_functional/plugins/core_plugin_legacy/index.ts delete mode 100644 test/plugin_functional/plugins/core_plugin_legacy/package.json delete mode 100644 test/plugin_functional/plugins/core_plugin_legacy/public/application.tsx delete mode 100644 test/plugin_functional/plugins/core_plugin_legacy/public/index.ts delete mode 100644 test/plugin_functional/plugins/core_plugin_legacy/tsconfig.json delete mode 100644 test/plugin_functional/plugins/legacy_plugin/index.ts delete mode 100644 test/plugin_functional/plugins/legacy_plugin/package.json delete mode 100644 test/plugin_functional/plugins/legacy_plugin/public/index.tsx delete mode 100644 test/plugin_functional/plugins/legacy_plugin/tsconfig.json delete mode 100644 test/plugin_functional/test_suites/core_plugins/legacy_plugins.ts delete mode 100644 webpackShims/.eslintrc delete mode 100644 webpackShims/ace.js delete mode 100644 webpackShims/elasticsearch.js delete mode 100644 webpackShims/lru-cache.js delete mode 100644 webpackShims/mocha.js delete mode 100644 webpackShims/sinon.js delete mode 100644 x-pack/legacy/plugins/security/public/hacks/legacy.ts delete mode 100644 x-pack/legacy/plugins/spaces/public/legacy.ts delete mode 100644 x-pack/legacy/plugins/xpack_main/public/components/index.js delete mode 100644 x-pack/legacy/plugins/xpack_main/public/hacks/check_xpack_info_change.js delete mode 100644 x-pack/legacy/plugins/xpack_main/public/jquery_flot/index.js delete mode 100644 x-pack/legacy/plugins/xpack_main/public/jquery_flot/jquery_flot.js delete mode 100644 x-pack/legacy/plugins/xpack_main/public/services/__tests__/_mock_window.js delete mode 100644 x-pack/legacy/plugins/xpack_main/public/services/__tests__/xpack_info.js delete mode 100644 x-pack/legacy/plugins/xpack_main/public/services/__tests__/xpack_info_signature.js delete mode 100644 x-pack/legacy/plugins/xpack_main/public/services/path.js delete mode 100644 x-pack/legacy/plugins/xpack_main/public/services/xpack_info.js delete mode 100644 x-pack/legacy/plugins/xpack_main/public/services/xpack_info_signature.js diff --git a/.eslintignore b/.eslintignore index 9263b483b8de9..2b291e1c19714 100644 --- a/.eslintignore +++ b/.eslintignore @@ -18,15 +18,12 @@ target # plugin overrides /src/core/lib/kbn_internal_native_observable -/src/legacy/core_plugins/console/public/tests/webpackShims -/src/legacy/core_plugins/console/public/webpackShims /src/legacy/plugin_discovery/plugin_pack/__tests__/fixtures/plugins/broken /src/legacy/ui/public/flot-charts -/src/legacy/ui/public/utils/decode_geo_hash.js /src/plugins/data/common/es_query/kuery/ast/_generated_/** /src/plugins/vis_type_timelion/public/_generated_/** -/src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.* -/src/plugins/timelion/public/webpackShims/jquery.flot.* +/src/plugins/vis_type_timelion/public/flot/jquery.flot.* +/src/plugins/timelion/public/flot/jquery.flot.* /x-pack/legacy/plugins/**/__tests__/fixtures/** /x-pack/plugins/apm/e2e/**/snapshots.js /x-pack/plugins/apm/e2e/tmp/* diff --git a/.eslintrc.js b/.eslintrc.js index 5a03552ba3a51..5cd9809242bba 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -400,7 +400,7 @@ module.exports = { }, { target: ['(src|x-pack)/plugins/*/public/**/*'], - from: ['ui/**/*', 'uiExports/**/*'], + from: ['ui/**/*'], errorMessage: 'Plugins cannot import legacy UI code.', }, { @@ -457,14 +457,13 @@ module.exports = { { files: [ '**/public/**/*.js', - '**/webpackShims/**/*.js', 'packages/kbn-ui-framework/doc_site/src/**/*.js', 'src/fixtures/**/*.js', // TODO: this directory needs to be more obviously "public" (or go away) ], settings: { // instructs import/no-extraneous-dependencies to treat certain modules // as core modules, even if they aren't listed in package.json - 'import/core-modules': ['plugins', 'legacy/ui', 'uiExports'], + 'import/core-modules': ['plugins', 'legacy/ui'], 'import/resolver': { '@kbn/eslint-import-resolver-kibana': { @@ -605,7 +604,6 @@ module.exports = { { files: [ '.eslintrc.js', - '**/webpackShims/**/*.js', 'packages/kbn-plugin-generator/**/*.js', 'packages/kbn-eslint-import-resolver-kibana/**/*.js', 'packages/kbn-eslint-plugin-eslint/**/*', diff --git a/README.md b/README.md index 03ce6a6525873..b786d95ce2994 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,6 @@ out an open PR: - [CONTRIBUTING.md](CONTRIBUTING.md) will help you get Kibana up and running. - If you would like to contribute code, please follow our [STYLEGUIDE.md](STYLEGUIDE.md). -- Learn more about our UI code with [UI_SYSTEMS.md](src/legacy/ui/public/UI_SYSTEMS.md). - For all other questions, check out the [FAQ.md](FAQ.md) and [wiki](https://github.com/elastic/kibana/wiki). diff --git a/STYLEGUIDE.md b/STYLEGUIDE.md index 4ea7b04ebef6d..94bb40ab3ff2e 100644 --- a/STYLEGUIDE.md +++ b/STYLEGUIDE.md @@ -593,7 +593,7 @@ Do not use setters, they cause more problems than they can solve. When writing a new component, create a sibling SASS file of the same name and import directly into the **top** of the JS/TS component file. Doing so ensures the styles are never separated or lost on import and allows for better modularization (smaller individual plugin asset footprint). -All SASS (.scss) files will automatically build with the [EUI](https://elastic.github.io/eui/#/guidelines/sass) & Kibana invisibles (SASS variables, mixins, functions) from the [`globals_[theme].scss` file](src/legacy/ui/public/styles/_globals_v7light.scss). +All SASS (.scss) files will automatically build with the [EUI](https://elastic.github.io/eui/#/guidelines/sass) & Kibana invisibles (SASS variables, mixins, functions) from the [`globals_[theme].scss` file](src/core/public/core_app/styles/_globals_v7light.scss). While the styles for this component will only be loaded if the component exists on the page, the styles **will** be global and so it is recommended to use a three letter prefix on your diff --git a/docs/setup/install/deb.asciidoc b/docs/setup/install/deb.asciidoc index d24c1cf8ae9d1..234c02cee0be1 100644 --- a/docs/setup/install/deb.asciidoc +++ b/docs/setup/install/deb.asciidoc @@ -214,12 +214,6 @@ locations for a Debian-based system: | /var/log/kibana | path.logs -| optimize - | Transpiled source code. Certain administrative actions (e.g. plugin install) - result in the source code being retranspiled on the fly. - | /var/lib/kibana/optimize - d| - | plugins | Plugin files location. Each plugin will be contained in a subdirectory. | /usr/share/kibana/plugins diff --git a/docs/setup/install/rpm.asciidoc b/docs/setup/install/rpm.asciidoc index 5d4f47f300eac..1153353aa9a0f 100644 --- a/docs/setup/install/rpm.asciidoc +++ b/docs/setup/install/rpm.asciidoc @@ -206,12 +206,6 @@ locations for an RPM-based system: | /var/log/kibana | path.logs -| optimize - | Transpiled source code. Certain administrative actions (e.g. plugin install) - result in the source code being retranspiled on the fly. - | /var/lib/kibana/optimize - d| - | plugins | Plugin files location. Each plugin will be contained in a subdirectory. | /usr/share/kibana/plugins diff --git a/docs/setup/install/targz.asciidoc b/docs/setup/install/targz.asciidoc index 14ee1b297ffc6..c7e784186da09 100644 --- a/docs/setup/install/targz.asciidoc +++ b/docs/setup/install/targz.asciidoc @@ -149,12 +149,6 @@ important data later on. | $KIBANA_HOME\data d| -| optimize - | Transpiled source code. Certain administrative actions (e.g. plugin install) - result in the source code being retranspiled on the fly. - | $KIBANA_HOME\data\optimize - d| - | plugins | Plugin files location. Each plugin will be contained in a subdirectory. | $KIBANA_HOME\plugins diff --git a/docs/setup/install/windows.asciidoc b/docs/setup/install/windows.asciidoc index 0d467f2fa7dd9..ce6bf3766fa20 100644 --- a/docs/setup/install/windows.asciidoc +++ b/docs/setup/install/windows.asciidoc @@ -96,12 +96,6 @@ important data later on. | $KIBANA_HOME\data d| -| optimize - | Transpiled source code. Certain administrative actions (e.g. plugin install) - result in the source code being retranspiled on the fly. - | $KIBANA_HOME\data\optimize - d| - | plugins | Plugin files location. Each plugin will be contained in a subdirectory. | $KIBANA_HOME\plugins diff --git a/package.json b/package.json index 200aa41743f51..df35e5901159b 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,6 @@ }, "dependencies": { "@babel/core": "^7.11.1", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", "@babel/register": "^7.10.5", "@elastic/apm-rum": "^5.4.0", "@elastic/charts": "19.8.1", @@ -154,12 +153,9 @@ "angular-route": "^1.8.0", "angular-sanitize": "^1.8.0", "angular-sortable-view": "^0.0.17", - "autoprefixer": "^9.7.4", - "babel-loader": "^8.0.6", "bluebird": "3.5.5", "boom": "^7.2.0", "brace": "0.11.1", - "cache-loader": "^4.1.0", "chalk": "^2.4.2", "check-disk-space": "^2.1.0", "chokidar": "3.2.1", @@ -167,7 +163,6 @@ "commander": "3.0.2", "compare-versions": "3.5.1", "core-js": "^3.6.4", - "css-loader": "^3.4.2", "d3": "3.5.17", "d3-cloud": "1.2.5", "deep-freeze-strict": "^1.1.1", @@ -179,7 +174,6 @@ "execa": "^4.0.2", "expiry-js": "0.1.7", "fast-deep-equal": "^3.1.1", - "file-loader": "4.2.0", "font-awesome": "4.7.0", "fp-ts": "^2.3.1", "getos": "^3.1.0", @@ -211,11 +205,9 @@ "leaflet-vega": "^0.8.6", "leaflet.heat": "0.2.0", "less": "npm:@elastic/less@2.7.3-kibana", - "less-loader": "5.0.0", "lodash": "^4.17.15", "lru-cache": "4.1.5", "markdown-it": "^10.0.0", - "mini-css-extract-plugin": "0.8.0", "minimatch": "^3.0.4", "moment": "^2.24.0", "moment-timezone": "^0.5.27", @@ -227,12 +219,9 @@ "opn": "^5.5.0", "oppsy": "^2.0.0", "pegjs": "0.10.0", - "postcss-loader": "^3.0.0", "prop-types": "15.6.0", "proxy-from-env": "1.0.0", - "pug": "^2.0.4", "query-string": "5.1.1", - "raw-loader": "3.1.0", "re2": "^1.15.4", "react": "^16.12.0", "react-color": "^2.13.8", @@ -258,33 +247,24 @@ "resize-observer-polyfill": "^1.5.0", "rison-node": "1.0.2", "rxjs": "^6.5.5", - "script-loader": "0.7.2", "seedrandom": "^3.0.5", "semver": "^5.5.0", "style-it": "^2.1.3", - "style-loader": "^1.1.3", "symbol-observable": "^1.2.0", "tar": "4.4.13", - "terser-webpack-plugin": "^2.3.4", - "thread-loader": "^2.1.3", "tinygradient": "0.4.3", "tinymath": "1.2.1", "topojson-client": "3.0.0", "tslib": "^2.0.0", "type-detect": "^4.0.8", "ui-select": "0.19.8", - "url-loader": "2.2.0", "uuid": "3.3.2", - "val-loader": "^1.1.1", "vega": "^5.13.0", "vega-lite": "^4.13.1", "vega-schema-url-parser": "^1.1.0", "vega-tooltip": "^0.12.0", "vision": "^5.3.3", - "webpack": "^4.41.5", - "webpack-merge": "4.2.2", "whatwg-fetch": "^3.0.0", - "wrapper-webpack-plugin": "^2.1.0", "yauzl": "2.10.0" }, "devDependencies": { @@ -450,8 +430,6 @@ "has-ansi": "^3.0.0", "iedriver": "^3.14.2", "intl-messageformat-parser": "^1.4.0", - "is-path-inside": "^2.1.0", - "istanbul-instrumenter-loader": "3.0.1", "jest": "^25.5.4", "jest-canvas-mock": "^2.2.0", "jest-circus": "^25.5.4", @@ -472,14 +450,12 @@ "murmurhash3js": "3.0.1", "mutation-observer": "^1.0.3", "nock": "12.0.3", - "node-sass": "^4.13.1", "normalize-path": "^3.0.0", "nyc": "^15.0.1", "pixelmatch": "^5.1.0", "pkg-up": "^2.0.0", "pngjs": "^3.4.0", "postcss": "^7.0.32", - "postcss-url": "^8.0.0", "prettier": "^2.0.5", "proxyquire": "1.8.0", "react-popper-tooltip": "^2.10.1", diff --git a/packages/eslint-config-kibana/package.json b/packages/eslint-config-kibana/package.json index 967e53249da75..618f71daf0339 100644 --- a/packages/eslint-config-kibana/package.json +++ b/packages/eslint-config-kibana/package.json @@ -29,6 +29,6 @@ "eslint-plugin-no-unsanitized": "^3.0.2", "eslint-plugin-prefer-object-spread": "^1.2.1", "eslint-plugin-react": "^7.17.0", - "eslint-plugin-react-hooks": "^2.3.0" + "eslint-plugin-react-hooks": "^4.0.4" } } diff --git a/packages/kbn-babel-preset/package.json b/packages/kbn-babel-preset/package.json index db1f2161b6e38..d73294b4cf873 100644 --- a/packages/kbn-babel-preset/package.json +++ b/packages/kbn-babel-preset/package.json @@ -16,6 +16,8 @@ "babel-plugin-filter-imports": "^3.0.0", "babel-plugin-styled-components": "^1.10.7", "babel-plugin-transform-define": "^1.3.1", - "babel-plugin-transform-imports": "^2.0.0" + "babel-plugin-transform-imports": "^2.0.0", + "react-is": "^16.8.0", + "styled-components": "^5.1.0" } } diff --git a/packages/kbn-eslint-import-resolver-kibana/import_resolver_kibana.js b/packages/kbn-eslint-import-resolver-kibana/import_resolver_kibana.js index 5c409ade260b1..c2a28ef23a1d1 100755 --- a/packages/kbn-eslint-import-resolver-kibana/import_resolver_kibana.js +++ b/packages/kbn-eslint-import-resolver-kibana/import_resolver_kibana.js @@ -27,7 +27,6 @@ const { getProjectRoot, getWebpackConfig, isFile, - isProbablyWebpackShim, getIsPathRequest, resolveWebpackAlias, } = require('./lib'); @@ -73,15 +72,6 @@ exports.resolve = function resolveKibanaPath(importRequest, file, config) { return tryNodeResolver(importRequest, file, config); } - // these modules are simulated by webpack, so there is no - // path to resolve to and no reason to do any more work - if (importRequest.startsWith('uiExports/')) { - return { - found: true, - path: null, - }; - } - const { webpackConfig, aliasEntries } = initContext(file, config); let isPathRequest = getIsPathRequest(importRequest); @@ -110,16 +100,9 @@ exports.resolve = function resolveKibanaPath(importRequest, file, config) { } } - // only use the node resolver if the importRequest is a path, or is - // a module request but not one that's probably a webpackShim. This - // prevents false positives as webpackShims are likely to be resolved - // to the node_modules directory by the node resolver, but we want - // them to resolve to the actual shim - if (isPathRequest || !isProbablyWebpackShim(importRequest, file)) { - const nodeResult = tryNodeResolver(importRequest, file, config); - if (nodeResult && nodeResult.found) { - return nodeResult; - } + const nodeResult = tryNodeResolver(importRequest, file, config); + if (nodeResult && nodeResult.found) { + return nodeResult; } return webpackResolver.resolve(importRequest, file, { diff --git a/packages/kbn-eslint-import-resolver-kibana/lib/get_plugins.js b/packages/kbn-eslint-import-resolver-kibana/lib/get_plugins.js deleted file mode 100755 index 84481783b22fc..0000000000000 --- a/packages/kbn-eslint-import-resolver-kibana/lib/get_plugins.js +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -const { dirname, resolve } = require('path'); - -const glob = require('glob-all'); - -exports.getPlugins = function (config, kibanaPath, projectRoot) { - const resolveToRoot = (path) => resolve(projectRoot, path); - - const pluginDirs = [ - ...(config.pluginDirs || []).map(resolveToRoot), - resolve(kibanaPath, 'plugins'), - resolve(kibanaPath, 'src/legacy/core_plugins'), - ]; - - const pluginPaths = [ - ...(config.pluginPaths || []).map(resolveToRoot), - - // when the rootPackageName is specified we assume that the root of the project - // is not a plugin, so don't include it automatically - ...(config.rootPackageName ? [] : [projectRoot]), - ]; - - const globPatterns = [ - ...pluginDirs.map((dir) => resolve(dir, '*/package.json')), - ...pluginPaths.map((path) => resolve(path, 'package.json')), - ]; - - const pluginsFromMap = Object.keys(config.pluginMap || {}).map((name) => { - const directory = resolveToRoot(config.pluginMap[name]); - return { - name, - directory, - publicDirectory: resolve(directory, 'public'), - }; - }); - - return pluginsFromMap.concat( - glob.sync(globPatterns).map((pkgJsonPath) => { - const path = dirname(pkgJsonPath); - const pkg = require(pkgJsonPath); // eslint-disable-line import/no-dynamic-require - return { - name: pkg.name, - directory: path, - publicDirectory: resolve(path, 'public'), - }; - }) - ); -}; diff --git a/packages/kbn-eslint-import-resolver-kibana/lib/get_webpack_config.js b/packages/kbn-eslint-import-resolver-kibana/lib/get_webpack_config.js index baf5baaf916aa..d4e234e3a6a2e 100755 --- a/packages/kbn-eslint-import-resolver-kibana/lib/get_webpack_config.js +++ b/packages/kbn-eslint-import-resolver-kibana/lib/get_webpack_config.js @@ -19,40 +19,22 @@ const { resolve } = require('path'); -const { debug } = require('./debug'); -const { getPlugins } = require('./get_plugins'); - -exports.getWebpackConfig = function (kibanaPath, projectRoot, config) { - const fromKibana = (...path) => resolve(kibanaPath, ...path); - - const alias = { - // Kibana defaults https://github.com/elastic/kibana/blob/6998f074542e8c7b32955db159d15661aca253d7/src/legacy/ui/ui_bundler_env.js#L30-L36 - ui: fromKibana('src/legacy/ui/public'), - - // Dev defaults for test bundle https://github.com/elastic/kibana/blob/6998f074542e8c7b32955db159d15661aca253d7/src/core_plugins/tests_bundle/index.js#L73-L78 - ng_mock$: fromKibana('src/test_utils/public/ng_mock'), - fixtures: fromKibana('src/fixtures'), - test_utils: fromKibana('src/test_utils/public'), - }; - - getPlugins(config, kibanaPath, projectRoot).forEach((plugin) => { - alias[`plugins/${plugin.name}`] = plugin.publicDirectory; - }); - - debug('Webpack resolved aliases', alias); - +exports.getWebpackConfig = function (kibanaPath) { return { context: kibanaPath, resolve: { extensions: ['.js', '.json', '.ts', '.tsx'], mainFields: ['browser', 'main'], - modules: [ - 'webpackShims', - 'node_modules', - fromKibana('webpackShims'), - fromKibana('node_modules'), - ], - alias, + modules: ['node_modules', resolve(kibanaPath, 'node_modules')], + alias: { + // Kibana defaults https://github.com/elastic/kibana/blob/6998f074542e8c7b32955db159d15661aca253d7/src/legacy/ui/ui_bundler_env.js#L30-L36 + ui: resolve(kibanaPath, 'src/legacy/ui/public'), + + // Dev defaults for test bundle https://github.com/elastic/kibana/blob/6998f074542e8c7b32955db159d15661aca253d7/src/core_plugins/tests_bundle/index.js#L73-L78 + ng_mock$: resolve(kibanaPath, 'src/test_utils/public/ng_mock'), + fixtures: resolve(kibanaPath, 'src/fixtures'), + test_utils: resolve(kibanaPath, 'src/test_utils/public'), + }, unsafeCache: true, }, }; diff --git a/packages/kbn-eslint-import-resolver-kibana/lib/index.js b/packages/kbn-eslint-import-resolver-kibana/lib/index.js index 465ba2f740ac3..54ada9a76b20f 100644 --- a/packages/kbn-eslint-import-resolver-kibana/lib/index.js +++ b/packages/kbn-eslint-import-resolver-kibana/lib/index.js @@ -23,7 +23,6 @@ module.exports = Object.assign( require('./get_project_root'), require('./get_webpack_config'), require('./get_path_type'), - require('./is_probably_webpack_shim'), require('./get_is_path_request'), require('./resolve_webpack_alias') ); diff --git a/packages/kbn-eslint-import-resolver-kibana/lib/is_probably_webpack_shim.js b/packages/kbn-eslint-import-resolver-kibana/lib/is_probably_webpack_shim.js deleted file mode 100644 index 9eb3234fca7b4..0000000000000 --- a/packages/kbn-eslint-import-resolver-kibana/lib/is_probably_webpack_shim.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -const { readdirSync } = require('fs'); -const { join, dirname } = require('path'); - -const LRU = require('lru-cache'); - -const { isDirectory } = require('./get_path_type'); - -const cache = process.env.KIBANA_RESOLVER_HARD_CACHE ? new Map() : new LRU({ max: 1000 }); - -function readShimNames(shimDirectory) { - if (!isDirectory(shimDirectory)) { - return []; - } - - return readdirSync(shimDirectory) - .filter((name) => !name.startsWith('.') && !name.startsWith('_')) - .map((name) => (name.endsWith('.js') ? name.slice(0, -3) : name)); -} - -function findRelativeWebpackShims(directory) { - const cached = cache.get(directory); - if (cached) { - return cached; - } - - const ownShims = readShimNames(join(directory, 'webpackShims')); - - const parent = dirname(directory); - const parentShims = parent !== directory ? findRelativeWebpackShims(parent) : []; - - const allShims = !ownShims.length ? parentShims : ownShims.concat(parentShims); - - cache.set(directory, allShims); - return allShims; -} - -exports.isProbablyWebpackShim = function (source, file) { - const shims = findRelativeWebpackShims(dirname(file)); - return shims.some((shim) => source === shim || source.startsWith(shim + '/')); -}; diff --git a/packages/kbn-optimizer/package.json b/packages/kbn-optimizer/package.json index 84e5c79e2e358..740555fd87897 100644 --- a/packages/kbn-optimizer/package.json +++ b/packages/kbn-optimizer/package.json @@ -36,7 +36,6 @@ "postcss": "^7.0.32", "postcss-loader": "^3.0.0", "raw-loader": "^3.1.0", - "resolve-url-loader": "^3.1.1", "rxjs": "^6.5.5", "sass-loader": "^8.0.2", "style-loader": "^1.1.3", diff --git a/packages/kbn-optimizer/src/__fixtures__/mock_repo/plugins/bar/public/legacy/styles.scss b/packages/kbn-optimizer/src/__fixtures__/mock_repo/plugins/bar/public/legacy/styles.scss index 1dc7bbe9daeb0..7fa8383ec239c 100644 --- a/packages/kbn-optimizer/src/__fixtures__/mock_repo/plugins/bar/public/legacy/styles.scss +++ b/packages/kbn-optimizer/src/__fixtures__/mock_repo/plugins/bar/public/legacy/styles.scss @@ -2,5 +2,4 @@ body { width: $globalStyleConstant; - background-image: url("ui/icon.svg"); } diff --git a/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/styles/_globals_v7dark.scss b/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/core/public/core_app/styles/_globals_v7dark.scss similarity index 100% rename from packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/styles/_globals_v7dark.scss rename to packages/kbn-optimizer/src/__fixtures__/mock_repo/src/core/public/core_app/styles/_globals_v7dark.scss diff --git a/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/styles/_globals_v7light.scss b/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/core/public/core_app/styles/_globals_v7light.scss similarity index 100% rename from packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/styles/_globals_v7light.scss rename to packages/kbn-optimizer/src/__fixtures__/mock_repo/src/core/public/core_app/styles/_globals_v7light.scss diff --git a/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/styles/_globals_v8dark.scss b/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/core/public/core_app/styles/_globals_v8dark.scss similarity index 100% rename from packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/styles/_globals_v8dark.scss rename to packages/kbn-optimizer/src/__fixtures__/mock_repo/src/core/public/core_app/styles/_globals_v8dark.scss diff --git a/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/styles/_globals_v8light.scss b/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/core/public/core_app/styles/_globals_v8light.scss similarity index 100% rename from packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/styles/_globals_v8light.scss rename to packages/kbn-optimizer/src/__fixtures__/mock_repo/src/core/public/core_app/styles/_globals_v8light.scss diff --git a/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/icon.svg b/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/icon.svg deleted file mode 100644 index ae7d5b958bbad..0000000000000 --- a/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap b/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap index 5f44d8068e694..79442c35df265 100644 --- a/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap +++ b/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap @@ -98,7 +98,7 @@ OptimizerConfig { } `; -exports[`prepares assets for distribution: bar bundle 1`] = `"(function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId]){return installedModules[moduleId].exports}var module=installedModules[moduleId]={i:moduleId,l:false,exports:{}};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.l=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.d=function(exports,name,getter){if(!__webpack_require__.o(exports,name)){Object.defineProperty(exports,name,{enumerable:true,get:getter})}};__webpack_require__.r=function(exports){if(typeof Symbol!==\\"undefined\\"&&Symbol.toStringTag){Object.defineProperty(exports,Symbol.toStringTag,{value:\\"Module\\"})}Object.defineProperty(exports,\\"__esModule\\",{value:true})};__webpack_require__.t=function(value,mode){if(mode&1)value=__webpack_require__(value);if(mode&8)return value;if(mode&4&&typeof value===\\"object\\"&&value&&value.__esModule)return value;var ns=Object.create(null);__webpack_require__.r(ns);Object.defineProperty(ns,\\"default\\",{enumerable:true,value:value});if(mode&2&&typeof value!=\\"string\\")for(var key in value)__webpack_require__.d(ns,key,function(key){return value[key]}.bind(null,key));return ns};__webpack_require__.n=function(module){var getter=module&&module.__esModule?function getDefault(){return module[\\"default\\"]}:function getModuleExports(){return module};__webpack_require__.d(getter,\\"a\\",getter);return getter};__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)};__webpack_require__.p=\\"\\";return __webpack_require__(__webpack_require__.s=5)})([function(module,exports,__webpack_require__){\\"use strict\\";var isOldIE=function isOldIE(){var memo;return function memorize(){if(typeof memo===\\"undefined\\"){memo=Boolean(window&&document&&document.all&&!window.atob)}return memo}}();var getTarget=function getTarget(){var memo={};return function memorize(target){if(typeof memo[target]===\\"undefined\\"){var styleTarget=document.querySelector(target);if(window.HTMLIFrameElement&&styleTarget instanceof window.HTMLIFrameElement){try{styleTarget=styleTarget.contentDocument.head}catch(e){styleTarget=null}}memo[target]=styleTarget}return memo[target]}}();var stylesInDom=[];function getIndexByIdentifier(identifier){var result=-1;for(var i=0;i { bar.cache.refresh(); expect(bar.cache.getModuleCount()).toBe( // code + styles + style/css-loader runtimes + public path updater - 18 + 16 ); expect(bar.cache.getReferencedFiles()).toMatchInlineSnapshot(` @@ -168,9 +168,8 @@ it('builds expected bundles, saves bundle counts to metadata', async () => { /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/bar/public/legacy/_other_styles.scss, /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/bar/public/legacy/styles.scss, /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/bar/public/lib.ts, - /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/src/legacy/ui/public/icon.svg, - /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/src/legacy/ui/public/styles/_globals_v7dark.scss, - /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/src/legacy/ui/public/styles/_globals_v7light.scss, + /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/src/core/public/core_app/styles/_globals_v7dark.scss, + /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/src/core/public/core_app/styles/_globals_v7light.scss, /packages/kbn-optimizer/target/worker/entry_point_creator.js, /packages/kbn-ui-shared-deps/public_path_module_creator.js, ] diff --git a/packages/kbn-optimizer/src/worker/webpack.config.ts b/packages/kbn-optimizer/src/worker/webpack.config.ts index 820b13629697d..6b07384910abb 100644 --- a/packages/kbn-optimizer/src/worker/webpack.config.ts +++ b/packages/kbn-optimizer/src/worker/webpack.config.ts @@ -29,7 +29,7 @@ import { CleanWebpackPlugin } from 'clean-webpack-plugin'; import CompressionPlugin from 'compression-webpack-plugin'; import * as UiSharedDeps from '@kbn/ui-shared-deps'; -import { Bundle, BundleRefs, WorkerConfig, parseDirPath } from '../common'; +import { Bundle, BundleRefs, WorkerConfig } from '../common'; import { BundleRefsPlugin } from './bundle_refs_plugin'; const IS_CODE_COVERAGE = !!process.env.CODE_COVERAGE; @@ -155,48 +155,15 @@ export function getWebpackConfig(bundle: Bundle, bundleRefs: BundleRefs, worker: }, }, }, - { - loader: 'resolve-url-loader', - options: { - join: (_: string, __: any) => (uri: string, base?: string) => { - // apply only to legacy platform styles - if (!base || !parseDirPath(base).dirs.includes('legacy')) { - return null; - } - - if (uri.startsWith('ui/assets')) { - return Path.resolve( - worker.repoRoot, - 'src/core/server/core_app/', - uri.replace('ui/', '') - ); - } - - // manually force ui/* urls in legacy styles to resolve to ui/legacy/public - if (uri.startsWith('ui/')) { - return Path.resolve( - worker.repoRoot, - 'src/legacy/ui/public', - uri.replace('ui/', '') - ); - } - - return null; - }, - }, - }, { loader: 'sass-loader', options: { - // must always be enabled as long as we're using the `resolve-url-loader` to - // rewrite `ui/*` urls. They're dropped by subsequent loaders though - sourceMap: true, prependData(loaderContext: webpack.loader.LoaderContext) { return `@import ${stringifyRequest( loaderContext, Path.resolve( worker.repoRoot, - `src/legacy/ui/public/styles/_globals_${theme}.scss` + `src/core/public/core_app/styles/_globals_${theme}.scss` ) )};\n`; }, @@ -254,6 +221,7 @@ export function getWebpackConfig(bundle: Bundle, bundleRefs: BundleRefs, worker: mainFields: ['browser', 'main'], alias: { tinymath: require.resolve('tinymath/lib/tinymath.es5.js'), + core_app_image_assets: Path.resolve(worker.repoRoot, 'src/core/public/core_app/images'), }, }, diff --git a/packages/kbn-plugin-helpers/package.json b/packages/kbn-plugin-helpers/package.json index 45582ad2af97a..9cc34bcda1af4 100644 --- a/packages/kbn-plugin-helpers/package.json +++ b/packages/kbn-plugin-helpers/package.json @@ -23,7 +23,6 @@ "gulp-zip": "5.0.1", "inquirer": "^1.2.2", "minimatch": "^3.0.4", - "node-sass": "^4.13.1", "through2": "^2.0.3", "through2-map": "^3.0.0", "vinyl": "^2.2.0", @@ -33,7 +32,6 @@ "@types/gulp-rename": "^0.0.33", "@types/gulp-zip": "^4.0.1", "@types/inquirer": "^6.5.0", - "@types/node-sass": "^4.11.0", "@types/through2": "^2.0.35", "@types/through2-map": "^3.0.0", "@types/vinyl": "^2.0.4", diff --git a/packages/kbn-plugin-helpers/src/lib/plugin_config.ts b/packages/kbn-plugin-helpers/src/lib/plugin_config.ts index dc3ef936e2164..c186bc3275a05 100644 --- a/packages/kbn-plugin-helpers/src/lib/plugin_config.ts +++ b/packages/kbn-plugin-helpers/src/lib/plugin_config.ts @@ -43,7 +43,7 @@ export function pluginConfig(root: string = process.cwd()): PluginConfig { 'tsconfig.json', 'package.json', 'index.{js,ts}', - '{lib,public,server,webpackShims,translations}/**/*', + '{lib,public,server,translations}/**/*', ]; const kibanaExtraDir = resolve(root, '../../kibana'); diff --git a/packages/kbn-plugin-helpers/src/tasks/build/create_build.ts b/packages/kbn-plugin-helpers/src/tasks/build/create_build.ts index a469e4fe67390..1681c7cfdcf90 100644 --- a/packages/kbn-plugin-helpers/src/tasks/build/create_build.ts +++ b/packages/kbn-plugin-helpers/src/tasks/build/create_build.ts @@ -22,7 +22,6 @@ import path from 'path'; import { readFileSync, writeFileSync, unlinkSync, existsSync } from 'fs'; import execa from 'execa'; -import sass from 'node-sass'; import del from 'del'; import File from 'vinyl'; import vfs from 'vinyl-fs'; @@ -135,22 +134,6 @@ export async function createBuild( }); } - // compile stylesheet - if (typeof plugin.styleSheetToCompile === 'string') { - const file = path.resolve(plugin.root, plugin.styleSheetToCompile); - if (!existsSync(file)) { - throw new Error(`Path provided for styleSheetToCompile does not exist: ${file}`); - } - - const outputFileName = path.basename(file, path.extname(file)) + '.css'; - const output = path.join(buildRoot, path.dirname(plugin.styleSheetToCompile), outputFileName); - - const rendered = sass.renderSync({ file, output }); - writeFileSync(output, rendered.css); - - del.sync([path.join(buildRoot, '**', '*.s{a,c}ss')]); - } - // transform typescript to js and clean out typescript const tsConfigPath = path.join(buildRoot, 'tsconfig.json'); if (existsSync(tsConfigPath)) { diff --git a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/build_action_test_plugin/index.js b/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/build_action_test_plugin/index.js index 052d224b662e2..e6a975e75ed2d 100644 --- a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/build_action_test_plugin/index.js +++ b/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/build_action_test_plugin/index.js @@ -17,9 +17,4 @@ * under the License. */ -module.exports = (kibana) => - new kibana.Plugin({ - uiExports: { - hacks: ['plugins/test_plugin/hack.js'], - }, - }); +module.exports = (kibana) => new kibana.Plugin({}); diff --git a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/build_action_test_plugin/public/hack.js b/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/build_action_test_plugin/public/hack.js deleted file mode 100644 index dbeba25f9dfec..0000000000000 --- a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/build_action_test_plugin/public/hack.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -console.log('this is my hack'); diff --git a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/index.js b/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/index.js index 052d224b662e2..e6a975e75ed2d 100644 --- a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/index.js +++ b/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/index.js @@ -17,9 +17,4 @@ * under the License. */ -module.exports = (kibana) => - new kibana.Plugin({ - uiExports: { - hacks: ['plugins/test_plugin/hack.js'], - }, - }); +module.exports = (kibana) => new kibana.Plugin({}); diff --git a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/public/styles.scss b/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/public/styles.scss deleted file mode 100644 index 88cb00c52437f..0000000000000 --- a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/public/styles.scss +++ /dev/null @@ -1,3 +0,0 @@ -body { - background-color: red; -} \ No newline at end of file diff --git a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_package_test_plugin/index.js b/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_package_test_plugin/index.js index 052d224b662e2..e6a975e75ed2d 100644 --- a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_package_test_plugin/index.js +++ b/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_package_test_plugin/index.js @@ -17,9 +17,4 @@ * under the License. */ -module.exports = (kibana) => - new kibana.Plugin({ - uiExports: { - hacks: ['plugins/test_plugin/hack.js'], - }, - }); +module.exports = (kibana) => new kibana.Plugin({}); diff --git a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_package_test_plugin/public/hack.js b/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_package_test_plugin/public/hack.js deleted file mode 100644 index dbeba25f9dfec..0000000000000 --- a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_package_test_plugin/public/hack.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -console.log('this is my hack'); diff --git a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/create_build.test.js b/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/create_build.test.js index 8a4a5a55ce237..6662de24a3e03 100644 --- a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/create_build.test.js +++ b/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/create_build.test.js @@ -18,7 +18,7 @@ */ import { resolve } from 'path'; -import { readdirSync, existsSync, unlinkSync } from 'fs'; +import { readdirSync } from 'fs'; import del from 'del'; import { createBuild } from '../create_build'; import { pluginConfig } from '../../../lib'; @@ -84,28 +84,4 @@ describe('creating the build', () => { expect(readdirSync(resolve(PLUGIN_BUILD_TARGET))).not.toContain('node_modules'); }); }); - - describe('with styleSheetToCompile', () => { - const sassPath = 'public/styles.scss'; - const cssPath = resolve(PLUGIN_BUILD_TARGET, 'public/styles.css'); - - beforeEach(() => { - PLUGIN.skipInstallDependencies = true; - PLUGIN.styleSheetToCompile = sassPath; - }); - - afterEach(() => { - PLUGIN.skipInstallDependencies = false; - PLUGIN.styleSheetToCompile = undefined; - unlinkSync(cssPath); - }); - - it('produces CSS', async () => { - expect(PLUGIN.styleSheetToCompile).toBe(sassPath); - - await createBuild(PLUGIN, buildTarget, buildVersion, kibanaVersion, buildFiles); - - expect(existsSync(cssPath)).toBe(true); - }); - }); }); diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index e411dcd472768..339f16eaf8593 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -94,7 +94,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _cli__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "run", function() { return _cli__WEBPACK_IMPORTED_MODULE_0__["run"]; }); -/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(511); +/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(505); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["buildProductionProjects"]; }); /* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); @@ -150,7 +150,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5); /* harmony import */ var _kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(127); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(503); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(498); /* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(143); /* * Licensed to Elasticsearch B.V. under one or more contributor @@ -8763,8 +8763,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commands", function() { return commands; }); /* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(128); /* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(295); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(402); -/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(403); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(397); +/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(398); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -30015,12 +30015,21 @@ module.exports = function (args, opts) { function setKey (obj, keys, value) { var o = obj; - keys.slice(0,-1).forEach(function (key) { + for (var i = 0; i < keys.length-1; i++) { + var key = keys[i]; + if (key === '__proto__') return; if (o[key] === undefined) o[key] = {}; + if (o[key] === Object.prototype || o[key] === Number.prototype + || o[key] === String.prototype) o[key] = {}; + if (o[key] === Array.prototype) o[key] = []; o = o[key]; - }); + } var key = keys[keys.length - 1]; + if (key === '__proto__') return; + if (o === Object.prototype || o === Number.prototype + || o === String.prototype) o = {}; + if (o === Array.prototype) o = []; if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') { o[key] = value; } @@ -30118,7 +30127,7 @@ module.exports = function (args, opts) { setArg(key, args[i+1], arg); i++; } - else if (args[i+1] && /true|false/.test(args[i+1])) { + else if (args[i+1] && /^(true|false)$/.test(args[i+1])) { setArg(key, args[i+1] === 'true', arg); i++; } @@ -41056,7 +41065,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CleanCommand", function() { return CleanCommand; }); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(296); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(388); +/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(383); /* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ora__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); @@ -41164,13 +41173,13 @@ const CleanCommand = { const {promisify} = __webpack_require__(111); const path = __webpack_require__(4); const globby = __webpack_require__(297); -const isGlob = __webpack_require__(380); -const slash = __webpack_require__(378); +const isGlob = __webpack_require__(375); +const slash = __webpack_require__(373); const gracefulFs = __webpack_require__(132); -const isPathCwd = __webpack_require__(381); -const isPathInside = __webpack_require__(382); -const rimraf = __webpack_require__(383); -const pMap = __webpack_require__(384); +const isPathCwd = __webpack_require__(376); +const isPathInside = __webpack_require__(377); +const rimraf = __webpack_require__(378); +const pMap = __webpack_require__(379); const rimrafP = promisify(rimraf); @@ -41292,11 +41301,11 @@ module.exports.sync = (patterns, {force, dryRun, cwd = process.cwd(), ...options const fs = __webpack_require__(133); const arrayUnion = __webpack_require__(298); const merge2 = __webpack_require__(299); -const glob = __webpack_require__(300); -const fastGlob = __webpack_require__(305); -const dirGlob = __webpack_require__(374); -const gitignore = __webpack_require__(376); -const {FilterStream, UniqueStream} = __webpack_require__(379); +const glob = __webpack_require__(146); +const fastGlob = __webpack_require__(300); +const dirGlob = __webpack_require__(369); +const gitignore = __webpack_require__(371); +const {FilterStream, UniqueStream} = __webpack_require__(374); const DEFAULT_FILTER = () => false; @@ -41635,15122 +41644,10930 @@ function pauseStreams (streams, options) { /* 300 */ /***/ (function(module, exports, __webpack_require__) { -// Approach: -// -// 1. Get the minimatch set -// 2. For each pattern in the set, PROCESS(pattern, false) -// 3. Store matches per-set, then uniq them -// -// PROCESS(pattern, inGlobStar) -// Get the first [n] items from pattern that are all strings -// Join these together. This is PREFIX. -// If there is no more remaining, then stat(PREFIX) and -// add to matches if it succeeds. END. -// -// If inGlobStar and PREFIX is symlink and points to dir -// set ENTRIES = [] -// else readdir(PREFIX) as ENTRIES -// If fail, END -// -// with ENTRIES -// If pattern[n] is GLOBSTAR -// // handle the case where the globstar match is empty -// // by pruning it out, and testing the resulting pattern -// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) -// // handle other cases. -// for ENTRY in ENTRIES (not dotfiles) -// // attach globstar + tail onto the entry -// // Mark that this entry is a globstar match -// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) -// -// else // not globstar -// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) -// Test ENTRY against pattern[n] -// If fails, continue -// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) -// -// Caveat: -// Cache all stats and readdirs results to minimize syscall. Since all -// we ever care about is existence and directory-ness, we can just keep -// `true` for files, and [children,...] for directories, or `false` for -// things that don't exist. +"use strict"; + +const taskManager = __webpack_require__(301); +const async_1 = __webpack_require__(330); +const stream_1 = __webpack_require__(365); +const sync_1 = __webpack_require__(366); +const settings_1 = __webpack_require__(368); +const utils = __webpack_require__(302); +async function FastGlob(source, options) { + assertPatternsInput(source); + const works = getWorks(source, async_1.default, options); + const result = await Promise.all(works); + return utils.array.flatten(result); +} +// https://github.com/typescript-eslint/typescript-eslint/issues/60 +// eslint-disable-next-line no-redeclare +(function (FastGlob) { + function sync(source, options) { + assertPatternsInput(source); + const works = getWorks(source, sync_1.default, options); + return utils.array.flatten(works); + } + FastGlob.sync = sync; + function stream(source, options) { + assertPatternsInput(source); + const works = getWorks(source, stream_1.default, options); + /** + * The stream returned by the provider cannot work with an asynchronous iterator. + * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams. + * This affects performance (+25%). I don't see best solution right now. + */ + return utils.stream.merge(works); + } + FastGlob.stream = stream; + function generateTasks(source, options) { + assertPatternsInput(source); + const patterns = [].concat(source); + const settings = new settings_1.default(options); + return taskManager.generate(patterns, settings); + } + FastGlob.generateTasks = generateTasks; + function isDynamicPattern(source, options) { + assertPatternsInput(source); + const settings = new settings_1.default(options); + return utils.pattern.isDynamicPattern(source, settings); + } + FastGlob.isDynamicPattern = isDynamicPattern; + function escapePath(source) { + assertPatternsInput(source); + return utils.path.escape(source); + } + FastGlob.escapePath = escapePath; +})(FastGlob || (FastGlob = {})); +function getWorks(source, _Provider, options) { + const patterns = [].concat(source); + const settings = new settings_1.default(options); + const tasks = taskManager.generate(patterns, settings); + const provider = new _Provider(settings); + return tasks.map(provider.read, provider); +} +function assertPatternsInput(input) { + const source = [].concat(input); + const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item)); + if (!isValidSource) { + throw new TypeError('Patterns must be a string (non empty) or an array of strings'); + } +} +module.exports = FastGlob; -module.exports = glob -var fs = __webpack_require__(133) -var rp = __webpack_require__(147) -var minimatch = __webpack_require__(149) -var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(301) -var EE = __webpack_require__(155).EventEmitter -var path = __webpack_require__(4) -var assert = __webpack_require__(139) -var isAbsolute = __webpack_require__(156) -var globSync = __webpack_require__(303) -var common = __webpack_require__(304) -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var inflight = __webpack_require__(159) -var util = __webpack_require__(111) -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored +/***/ }), +/* 301 */ +/***/ (function(module, exports, __webpack_require__) { -var once = __webpack_require__(161) +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(302); +function generate(patterns, settings) { + const positivePatterns = getPositivePatterns(patterns); + const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); + const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings)); + const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings)); + const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false); + const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true); + return staticTasks.concat(dynamicTasks); +} +exports.generate = generate; +function convertPatternsToTasks(positive, negative, dynamic) { + const positivePatternsGroup = groupPatternsByBaseDirectory(positive); + // When we have a global group – there is no reason to divide the patterns into independent tasks. + // In this case, the global task covers the rest. + if ('.' in positivePatternsGroup) { + const task = convertPatternGroupToTask('.', positive, negative, dynamic); + return [task]; + } + return convertPatternGroupsToTasks(positivePatternsGroup, negative, dynamic); +} +exports.convertPatternsToTasks = convertPatternsToTasks; +function getPositivePatterns(patterns) { + return utils.pattern.getPositivePatterns(patterns); +} +exports.getPositivePatterns = getPositivePatterns; +function getNegativePatternsAsPositive(patterns, ignore) { + const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore); + const positive = negative.map(utils.pattern.convertToPositivePattern); + return positive; +} +exports.getNegativePatternsAsPositive = getNegativePatternsAsPositive; +function groupPatternsByBaseDirectory(patterns) { + const group = {}; + return patterns.reduce((collection, pattern) => { + const base = utils.pattern.getBaseDirectory(pattern); + if (base in collection) { + collection[base].push(pattern); + } + else { + collection[base] = [pattern]; + } + return collection; + }, group); +} +exports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory; +function convertPatternGroupsToTasks(positive, negative, dynamic) { + return Object.keys(positive).map((base) => { + return convertPatternGroupToTask(base, positive[base], negative, dynamic); + }); +} +exports.convertPatternGroupsToTasks = convertPatternGroupsToTasks; +function convertPatternGroupToTask(base, positive, negative, dynamic) { + return { + dynamic, + positive, + negative, + base, + patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern)) + }; +} +exports.convertPatternGroupToTask = convertPatternGroupToTask; -function glob (pattern, options, cb) { - if (typeof options === 'function') cb = options, options = {} - if (!options) options = {} - if (options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return globSync(pattern, options) - } +/***/ }), +/* 302 */ +/***/ (function(module, exports, __webpack_require__) { - return new Glob(pattern, options, cb) -} +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const array = __webpack_require__(303); +exports.array = array; +const errno = __webpack_require__(304); +exports.errno = errno; +const fs = __webpack_require__(305); +exports.fs = fs; +const path = __webpack_require__(306); +exports.path = path; +const pattern = __webpack_require__(307); +exports.pattern = pattern; +const stream = __webpack_require__(328); +exports.stream = stream; +const string = __webpack_require__(329); +exports.string = string; -glob.sync = globSync -var GlobSync = glob.GlobSync = globSync.GlobSync -// old api surface -glob.glob = glob +/***/ }), +/* 303 */ +/***/ (function(module, exports, __webpack_require__) { -function extend (origin, add) { - if (add === null || typeof add !== 'object') { - return origin - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function flatten(items) { + return items.reduce((collection, item) => [].concat(collection, item), []); +} +exports.flatten = flatten; +function splitWhen(items, predicate) { + const result = [[]]; + let groupIndex = 0; + for (const item of items) { + if (predicate(item)) { + groupIndex++; + result[groupIndex] = []; + } + else { + result[groupIndex].push(item); + } + } + return result; +} +exports.splitWhen = splitWhen; - var keys = Object.keys(add) - var i = keys.length - while (i--) { - origin[keys[i]] = add[keys[i]] - } - return origin -} -glob.hasMagic = function (pattern, options_) { - var options = extend({}, options_) - options.noprocess = true +/***/ }), +/* 304 */ +/***/ (function(module, exports, __webpack_require__) { - var g = new Glob(pattern, options) - var set = g.minimatch.set +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function isEnoentCodeError(error) { + return error.code === 'ENOENT'; +} +exports.isEnoentCodeError = isEnoentCodeError; - if (!pattern) - return false - if (set.length > 1) - return true +/***/ }), +/* 305 */ +/***/ (function(module, exports, __webpack_require__) { - for (var j = 0; j < set[0].length; j++) { - if (typeof set[0][j] !== 'string') - return true - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +class DirentFromStats { + constructor(name, stats) { + this.name = name; + this.isBlockDevice = stats.isBlockDevice.bind(stats); + this.isCharacterDevice = stats.isCharacterDevice.bind(stats); + this.isDirectory = stats.isDirectory.bind(stats); + this.isFIFO = stats.isFIFO.bind(stats); + this.isFile = stats.isFile.bind(stats); + this.isSocket = stats.isSocket.bind(stats); + this.isSymbolicLink = stats.isSymbolicLink.bind(stats); + } +} +function createDirentFromStats(name, stats) { + return new DirentFromStats(name, stats); +} +exports.createDirentFromStats = createDirentFromStats; - return false -} -glob.Glob = Glob -inherits(Glob, EE) -function Glob (pattern, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } +/***/ }), +/* 306 */ +/***/ (function(module, exports, __webpack_require__) { - if (options && options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return new GlobSync(pattern, options) - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\ +const UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g; +/** + * Designed to work only with simple paths: `dir\\file`. + */ +function unixify(filepath) { + return filepath.replace(/\\/g, '/'); +} +exports.unixify = unixify; +function makeAbsolute(cwd, filepath) { + return path.resolve(cwd, filepath); +} +exports.makeAbsolute = makeAbsolute; +function escape(pattern) { + return pattern.replace(UNESCAPED_GLOB_SYMBOLS_RE, '\\$2'); +} +exports.escape = escape; +function removeLeadingDotSegment(entry) { + // We do not use `startsWith` because this is 10x slower than current implementation for some cases. + // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with + if (entry.charAt(0) === '.') { + const secondCharactery = entry.charAt(1); + if (secondCharactery === '/' || secondCharactery === '\\') { + return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT); + } + } + return entry; +} +exports.removeLeadingDotSegment = removeLeadingDotSegment; - if (!(this instanceof Glob)) - return new Glob(pattern, options, cb) - setopts(this, pattern, options) - this._didRealPath = false +/***/ }), +/* 307 */ +/***/ (function(module, exports, __webpack_require__) { - // process each pattern in the minimatch set - var n = this.minimatch.set.length +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const globParent = __webpack_require__(308); +const micromatch = __webpack_require__(311); +const picomatch = __webpack_require__(322); +const GLOBSTAR = '**'; +const ESCAPE_SYMBOL = '\\'; +const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; +const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[.*]/; +const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\(.*\|.*\)/; +const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\(.*\)/; +const BRACE_EXPANSIONS_SYMBOLS_RE = /{.*(?:,|\.\.).*}/; +function isStaticPattern(pattern, options = {}) { + return !isDynamicPattern(pattern, options); +} +exports.isStaticPattern = isStaticPattern; +function isDynamicPattern(pattern, options = {}) { + /** + * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check + * filepath directly (without read directory). + */ + if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) { + return true; + } + if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) { + return true; + } + if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) { + return true; + } + if (options.braceExpansion !== false && BRACE_EXPANSIONS_SYMBOLS_RE.test(pattern)) { + return true; + } + return false; +} +exports.isDynamicPattern = isDynamicPattern; +function convertToPositivePattern(pattern) { + return isNegativePattern(pattern) ? pattern.slice(1) : pattern; +} +exports.convertToPositivePattern = convertToPositivePattern; +function convertToNegativePattern(pattern) { + return '!' + pattern; +} +exports.convertToNegativePattern = convertToNegativePattern; +function isNegativePattern(pattern) { + return pattern.startsWith('!') && pattern[1] !== '('; +} +exports.isNegativePattern = isNegativePattern; +function isPositivePattern(pattern) { + return !isNegativePattern(pattern); +} +exports.isPositivePattern = isPositivePattern; +function getNegativePatterns(patterns) { + return patterns.filter(isNegativePattern); +} +exports.getNegativePatterns = getNegativePatterns; +function getPositivePatterns(patterns) { + return patterns.filter(isPositivePattern); +} +exports.getPositivePatterns = getPositivePatterns; +function getBaseDirectory(pattern) { + return globParent(pattern, { flipBackslashes: false }); +} +exports.getBaseDirectory = getBaseDirectory; +function hasGlobStar(pattern) { + return pattern.includes(GLOBSTAR); +} +exports.hasGlobStar = hasGlobStar; +function endsWithSlashGlobStar(pattern) { + return pattern.endsWith('/' + GLOBSTAR); +} +exports.endsWithSlashGlobStar = endsWithSlashGlobStar; +function isAffectDepthOfReadingPattern(pattern) { + const basename = path.basename(pattern); + return endsWithSlashGlobStar(pattern) || isStaticPattern(basename); +} +exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern; +function expandPatternsWithBraceExpansion(patterns) { + return patterns.reduce((collection, pattern) => { + return collection.concat(expandBraceExpansion(pattern)); + }, []); +} +exports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion; +function expandBraceExpansion(pattern) { + return micromatch.braces(pattern, { + expand: true, + nodupes: true + }); +} +exports.expandBraceExpansion = expandBraceExpansion; +function getPatternParts(pattern, options) { + const info = picomatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true })); + // See micromatch/picomatch#58 for more details + if (info.parts.length === 0) { + return [pattern]; + } + return info.parts; +} +exports.getPatternParts = getPatternParts; +function makeRe(pattern, options) { + return micromatch.makeRe(pattern, options); +} +exports.makeRe = makeRe; +function convertPatternsToRe(patterns, options) { + return patterns.map((pattern) => makeRe(pattern, options)); +} +exports.convertPatternsToRe = convertPatternsToRe; +function matchAny(entry, patternsRe) { + return patternsRe.some((patternRe) => patternRe.test(entry)); +} +exports.matchAny = matchAny; - // The matches are stored as {: true,...} so that - // duplicates are automagically pruned. - // Later, we do an Object.keys() on these. - // Keep them as a list so we can fill in when nonull is set. - this.matches = new Array(n) - if (typeof cb === 'function') { - cb = once(cb) - this.on('error', cb) - this.on('end', function (matches) { - cb(null, matches) - }) - } +/***/ }), +/* 308 */ +/***/ (function(module, exports, __webpack_require__) { - var self = this - this._processing = 0 +"use strict"; - this._emitQueue = [] - this._processQueue = [] - this.paused = false - if (this.noprocess) - return this +var isGlob = __webpack_require__(309); +var pathPosixDirname = __webpack_require__(4).posix.dirname; +var isWin32 = __webpack_require__(120).platform() === 'win32'; - if (n === 0) - return done() +var slash = '/'; +var backslash = /\\/g; +var enclosure = /[\{\[].*[\/]*.*[\}\]]$/; +var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; +var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g; - var sync = true - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false, done) +/** + * @param {string} str + * @param {Object} opts + * @param {boolean} [opts.flipBackslashes=true] + */ +module.exports = function globParent(str, opts) { + var options = Object.assign({ flipBackslashes: true }, opts); + + // flip windows path separators + if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) { + str = str.replace(backslash, slash); } - sync = false - function done () { - --self._processing - if (self._processing <= 0) { - if (sync) { - process.nextTick(function () { - self._finish() - }) - } else { - self._finish() - } - } + // special case for strings ending in enclosure containing path separator + if (enclosure.test(str)) { + str += slash; } -} -Glob.prototype._finish = function () { - assert(this instanceof Glob) - if (this.aborted) - return + // preserves full path in case of trailing path separator + str += 'a'; - if (this.realpath && !this._didRealpath) - return this._realpath() + // remove path parts that are globby + do { + str = pathPosixDirname(str); + } while (isGlob(str) || globby.test(str)); - common.finish(this) - this.emit('end', this.found) -} + // remove escape chars and return result + return str.replace(escaped, '$1'); +}; -Glob.prototype._realpath = function () { - if (this._didRealpath) - return - this._didRealpath = true +/***/ }), +/* 309 */ +/***/ (function(module, exports, __webpack_require__) { - var n = this.matches.length - if (n === 0) - return this._finish() +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ - var self = this - for (var i = 0; i < this.matches.length; i++) - this._realpathSet(i, next) +var isExtglob = __webpack_require__(310); +var chars = { '{': '}', '(': ')', '[': ']'}; +var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; +var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; - function next () { - if (--n === 0) - self._finish() +module.exports = function isGlob(str, options) { + if (typeof str !== 'string' || str === '') { + return false; } -} -Glob.prototype._realpathSet = function (index, cb) { - var matchset = this.matches[index] - if (!matchset) - return cb() + if (isExtglob(str)) { + return true; + } - var found = Object.keys(matchset) - var self = this - var n = found.length + var regex = strictRegex; + var match; - if (n === 0) - return cb() + // optionally relax regex + if (options && options.strict === false) { + regex = relaxedRegex; + } - var set = this.matches[index] = Object.create(null) - found.forEach(function (p, i) { - // If there's a problem with the stat, then it means that - // one or more of the links in the realpath couldn't be - // resolved. just return the abs value in that case. - p = self._makeAbs(p) - rp.realpath(p, self.realpathCache, function (er, real) { - if (!er) - set[real] = true - else if (er.syscall === 'stat') - set[p] = true - else - self.emit('error', er) // srsly wtf right here + while ((match = regex.exec(str))) { + if (match[2]) return true; + var idx = match.index + match[0].length; - if (--n === 0) { - self.matches[index] = set - cb() + // if an open bracket/brace/paren is escaped, + // set the index to the next closing character + var open = match[1]; + var close = open ? chars[open] : null; + if (open && close) { + var n = str.indexOf(close, idx); + if (n !== -1) { + idx = n + 1; } - }) - }) -} - -Glob.prototype._mark = function (p) { - return common.mark(this, p) -} - -Glob.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} - -Glob.prototype.abort = function () { - this.aborted = true - this.emit('abort') -} + } -Glob.prototype.pause = function () { - if (!this.paused) { - this.paused = true - this.emit('pause') + str = str.slice(idx); } -} + return false; +}; -Glob.prototype.resume = function () { - if (this.paused) { - this.emit('resume') - this.paused = false - if (this._emitQueue.length) { - var eq = this._emitQueue.slice(0) - this._emitQueue.length = 0 - for (var i = 0; i < eq.length; i ++) { - var e = eq[i] - this._emitMatch(e[0], e[1]) - } - } - if (this._processQueue.length) { - var pq = this._processQueue.slice(0) - this._processQueue.length = 0 - for (var i = 0; i < pq.length; i ++) { - var p = pq[i] - this._processing-- - this._process(p[0], p[1], p[2], p[3]) - } - } - } -} -Glob.prototype._process = function (pattern, index, inGlobStar, cb) { - assert(this instanceof Glob) - assert(typeof cb === 'function') +/***/ }), +/* 310 */ +/***/ (function(module, exports) { - if (this.aborted) - return +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ - this._processing++ - if (this.paused) { - this._processQueue.push([pattern, index, inGlobStar, cb]) - return +module.exports = function isExtglob(str) { + if (typeof str !== 'string' || str === '') { + return false; } - //console.error('PROCESS %d', this._processing, pattern) - - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ + var match; + while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) { + if (match[2]) return true; + str = str.slice(match.index + match[0].length); } - // now n is the index of the first one that is *not* a string. - // see if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index, cb) - return + return false; +}; - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break - } +/***/ }), +/* 311 */ +/***/ (function(module, exports, __webpack_require__) { - var remain = pattern.slice(n) +"use strict"; - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix - var abs = this._makeAbs(read) +const util = __webpack_require__(111); +const braces = __webpack_require__(312); +const picomatch = __webpack_require__(322); +const utils = __webpack_require__(325); +const isEmptyString = val => typeof val === 'string' && (val === '' || val === './'); - //if ignored, skip _processing - if (childrenIgnored(this, read)) - return cb() +/** + * Returns an array of strings that match one or more glob patterns. + * + * ```js + * const mm = require('micromatch'); + * // mm(list, patterns[, options]); + * + * console.log(mm(['a.js', 'a.txt'], ['*.js'])); + * //=> [ 'a.js' ] + * ``` + * @param {String|Array} list List of strings to match. + * @param {String|Array} patterns One or more glob patterns to use for matching. + * @param {Object} options See available [options](#options) + * @return {Array} Returns an array of matches + * @summary false + * @api public + */ - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) -} +const micromatch = (list, patterns, options) => { + patterns = [].concat(patterns); + list = [].concat(list); -Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} + let omit = new Set(); + let keep = new Set(); + let items = new Set(); + let negatives = 0; -Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + let onResult = state => { + items.add(state.output); + if (options && options.onResult) { + options.onResult(state); + } + }; - // if the abs isn't a dir, then nothing can match! - if (!entries) - return cb() + for (let i = 0; i < patterns.length; i++) { + let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true); + let negated = isMatch.state.negated || isMatch.state.negatedExtglob; + if (negated) negatives++; - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' + for (let item of list) { + let matched = isMatch(item, true); - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) + let match = negated ? !matched.isMatch : matched.isMatch; + if (!match) continue; + + if (negated) { + omit.add(matched.output); } else { - m = e.match(pn) + omit.delete(matched.output); + keep.add(matched.output); } - if (m) - matchedEntries.push(e) } } - //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) - - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return cb() - - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. - - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } + let result = negatives === patterns.length ? [...items] : [...keep]; + let matches = result.filter(item => !omit.has(item)); - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this._emitMatch(index, e) + if (options && matches.length === 0) { + if (options.failglob === true) { + throw new Error(`No matches found for "${patterns.join(', ')}"`); } - // This was the last one, and no stats were needed - return cb() - } - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e + if (options.nonull === true || options.nullglob === true) { + return options.unescape ? patterns.map(p => p.replace(/\\/g, '')) : patterns; } - this._process([e].concat(remain), index, inGlobStar, cb) } - cb() -} - -Glob.prototype._emitMatch = function (index, e) { - if (this.aborted) - return - if (isIgnored(this, e)) - return + return matches; +}; - if (this.paused) { - this._emitQueue.push([index, e]) - return - } +/** + * Backwards compatibility + */ - var abs = isAbsolute(e) ? e : this._makeAbs(e) +micromatch.match = micromatch; - if (this.mark) - e = this._mark(e) +/** + * Returns a matcher function from the given glob `pattern` and `options`. + * The returned function takes a string to match as its only argument and returns + * true if the string is a match. + * + * ```js + * const mm = require('micromatch'); + * // mm.matcher(pattern[, options]); + * + * const isMatch = mm.matcher('*.!(*a)'); + * console.log(isMatch('a.a')); //=> false + * console.log(isMatch('a.b')); //=> true + * ``` + * @param {String} `pattern` Glob pattern + * @param {Object} `options` + * @return {Function} Returns a matcher function. + * @api public + */ - if (this.absolute) - e = abs +micromatch.matcher = (pattern, options) => picomatch(pattern, options); - if (this.matches[index][e]) - return +/** + * Returns true if **any** of the given glob `patterns` match the specified `string`. + * + * ```js + * const mm = require('micromatch'); + * // mm.isMatch(string, patterns[, options]); + * + * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true + * console.log(mm.isMatch('a.a', 'b.*')); //=> false + * ``` + * @param {String} str The string to test. + * @param {String|Array} patterns One or more glob patterns to use for matching. + * @param {Object} [options] See available [options](#options). + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } +micromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); - this.matches[index][e] = true +/** + * Backwards compatibility + */ - var st = this.statCache[abs] - if (st) - this.emit('stat', e, st) +micromatch.any = micromatch.isMatch; - this.emit('match', e) -} +/** + * Returns a list of strings that _**do not match any**_ of the given `patterns`. + * + * ```js + * const mm = require('micromatch'); + * // mm.not(list, patterns[, options]); + * + * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a')); + * //=> ['b.b', 'c.c'] + * ``` + * @param {Array} `list` Array of strings to match. + * @param {String|Array} `patterns` One or more glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Array} Returns an array of strings that **do not match** the given patterns. + * @api public + */ -Glob.prototype._readdirInGlobStar = function (abs, cb) { - if (this.aborted) - return +micromatch.not = (list, patterns, options = {}) => { + patterns = [].concat(patterns).map(String); + let result = new Set(); + let items = []; - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false, cb) + let onResult = state => { + if (options.onResult) options.onResult(state); + items.push(state.output); + }; - var lstatkey = 'lstat\0' + abs - var self = this - var lstatcb = inflight(lstatkey, lstatcb_) + let matches = micromatch(list, patterns, { ...options, onResult }); - if (lstatcb) - fs.lstat(abs, lstatcb) + for (let item of items) { + if (!matches.includes(item)) { + result.add(item); + } + } + return [...result]; +}; - function lstatcb_ (er, lstat) { - if (er && er.code === 'ENOENT') - return cb() +/** + * Returns true if the given `string` contains the given pattern. Similar + * to [.isMatch](#isMatch) but the pattern can match any part of the string. + * + * ```js + * var mm = require('micromatch'); + * // mm.contains(string, pattern[, options]); + * + * console.log(mm.contains('aa/bb/cc', '*b')); + * //=> true + * console.log(mm.contains('aa/bb/cc', '*d')); + * //=> false + * ``` + * @param {String} `str` The string to match. + * @param {String|Array} `patterns` Glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if the patter matches any part of `str`. + * @api public + */ - var isSym = lstat && lstat.isSymbolicLink() - self.symlinks[abs] = isSym +micromatch.contains = (str, pattern, options) => { + if (typeof str !== 'string') { + throw new TypeError(`Expected a string: "${util.inspect(str)}"`); + } - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) { - self.cache[abs] = 'FILE' - cb() - } else - self._readdir(abs, false, cb) + if (Array.isArray(pattern)) { + return pattern.some(p => micromatch.contains(str, p, options)); } -} -Glob.prototype._readdir = function (abs, inGlobStar, cb) { - if (this.aborted) - return + if (typeof pattern === 'string') { + if (isEmptyString(str) || isEmptyString(pattern)) { + return false; + } - cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) - if (!cb) - return + if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) { + return true; + } + } - //console.error('RD %j %j', +inGlobStar, abs) - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs, cb) + return micromatch.isMatch(str, pattern, { ...options, contains: true }); +}; - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return cb() +/** + * Filter the keys of the given object with the given `glob` pattern + * and `options`. Does not attempt to match nested keys. If you need this feature, + * use [glob-object][] instead. + * + * ```js + * const mm = require('micromatch'); + * // mm.matchKeys(object, patterns[, options]); + * + * const obj = { aa: 'a', ab: 'b', ac: 'c' }; + * console.log(mm.matchKeys(obj, '*b')); + * //=> { ab: 'b' } + * ``` + * @param {Object} `object` The object with keys to filter. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Object} Returns an object with only keys that match the given patterns. + * @api public + */ - if (Array.isArray(c)) - return cb(null, c) +micromatch.matchKeys = (obj, patterns, options) => { + if (!utils.isObject(obj)) { + throw new TypeError('Expected the first argument to be an object'); } + let keys = micromatch(Object.keys(obj), patterns, options); + let res = {}; + for (let key of keys) res[key] = obj[key]; + return res; +}; - var self = this - fs.readdir(abs, readdirCb(this, abs, cb)) -} - -function readdirCb (self, abs, cb) { - return function (er, entries) { - if (er) - self._readdirError(abs, er, cb) - else - self._readdirEntries(abs, entries, cb) - } -} +/** + * Returns true if some of the strings in the given `list` match any of the given glob `patterns`. + * + * ```js + * const mm = require('micromatch'); + * // mm.some(list, patterns[, options]); + * + * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); + * // true + * console.log(mm.some(['foo.js'], ['*.js', '!foo.js'])); + * // false + * ``` + * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ -Glob.prototype._readdirEntries = function (abs, entries, cb) { - if (this.aborted) - return +micromatch.some = (list, patterns, options) => { + let items = [].concat(list); - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true + for (let pattern of [].concat(patterns)) { + let isMatch = picomatch(String(pattern), options); + if (items.some(item => isMatch(item))) { + return true; } } + return false; +}; - this.cache[abs] = entries - return cb(null, entries) -} - -Glob.prototype._readdirError = function (f, er, cb) { - if (this.aborted) - return - - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - this.emit('error', error) - this.abort() - } - break +/** + * Returns true if every string in the given `list` matches + * any of the given glob `patterns`. + * + * ```js + * const mm = require('micromatch'); + * // mm.every(list, patterns[, options]); + * + * console.log(mm.every('foo.js', ['foo.js'])); + * // true + * console.log(mm.every(['foo.js', 'bar.js'], ['*.js'])); + * // true + * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); + * // false + * console.log(mm.every(['foo.js'], ['*.js', '!foo.js'])); + * // false + * ``` + * @param {String|Array} `list` The string or array of strings to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break +micromatch.every = (list, patterns, options) => { + let items = [].concat(list); - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) { - this.emit('error', er) - // If the error is handled, then we abort - // if not, we threw out of here - this.abort() - } - if (!this.silent) - console.error('glob error', er) - break + for (let pattern of [].concat(patterns)) { + let isMatch = picomatch(String(pattern), options); + if (!items.every(item => isMatch(item))) { + return false; + } } + return true; +}; - return cb() -} +/** + * Returns true if **all** of the given `patterns` match + * the specified string. + * + * ```js + * const mm = require('micromatch'); + * // mm.all(string, patterns[, options]); + * + * console.log(mm.all('foo.js', ['foo.js'])); + * // true + * + * console.log(mm.all('foo.js', ['*.js', '!foo.js'])); + * // false + * + * console.log(mm.all('foo.js', ['*.js', 'foo.js'])); + * // true + * + * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); + * // true + * ``` + * @param {String|Array} `str` The string to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ -Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} +micromatch.all = (str, patterns, options) => { + if (typeof str !== 'string') { + throw new TypeError(`Expected a string: "${util.inspect(str)}"`); + } + return [].concat(patterns).every(p => picomatch(p, options)(str)); +}; -Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - //console.error('pgs2', prefix, remain[0], entries) +/** + * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match. + * + * ```js + * const mm = require('micromatch'); + * // mm.capture(pattern, string[, options]); + * + * console.log(mm.capture('test/*.js', 'test/foo.js')); + * //=> ['foo'] + * console.log(mm.capture('test/*.js', 'foo/bar.css')); + * //=> null + * ``` + * @param {String} `glob` Glob pattern to use for matching. + * @param {String} `input` String to match + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns an array of captures if the input matches the glob pattern, otherwise `null`. + * @api public + */ - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return cb() +micromatch.capture = (glob, input, options) => { + let posix = utils.isWindows(options); + let regex = picomatch.makeRe(String(glob), { ...options, capture: true }); + let match = regex.exec(posix ? utils.toPosixSlashes(input) : input); - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) + if (match) { + return match.slice(1).map(v => v === void 0 ? '' : v); + } +}; - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false, cb) +/** + * Create a regular expression from the given glob `pattern`. + * + * ```js + * const mm = require('micromatch'); + * // mm.makeRe(pattern[, options]); + * + * console.log(mm.makeRe('*.js')); + * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ + * ``` + * @param {String} `pattern` A glob pattern to convert to regex. + * @param {Object} `options` + * @return {RegExp} Returns a regex created from the given pattern. + * @api public + */ - var isSym = this.symlinks[abs] - var len = entries.length +micromatch.makeRe = (...args) => picomatch.makeRe(...args); - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return cb() +/** + * Scan a glob pattern to separate the pattern into segments. Used + * by the [split](#split) method. + * + * ```js + * const mm = require('micromatch'); + * const state = mm.scan(pattern[, options]); + * ``` + * @param {String} `pattern` + * @param {Object} `options` + * @return {Object} Returns an object with + * @api public + */ - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue +micromatch.scan = (...args) => picomatch.scan(...args); - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true, cb) +/** + * Parse a glob pattern to create the source string for a regular + * expression. + * + * ```js + * const mm = require('micromatch'); + * const state = mm(pattern[, options]); + * ``` + * @param {String} `glob` + * @param {Object} `options` + * @return {Object} Returns an object with useful properties and output to be used as regex source string. + * @api public + */ - var below = gspref.concat(entries[i], remain) - this._process(below, index, true, cb) +micromatch.parse = (patterns, options) => { + let res = []; + for (let pattern of [].concat(patterns || [])) { + for (let str of braces(String(pattern), options)) { + res.push(picomatch.parse(str, options)); + } } + return res; +}; - cb() -} - -Glob.prototype._processSimple = function (prefix, index, cb) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var self = this - this._stat(prefix, function (er, exists) { - self._processSimple2(prefix, index, er, exists, cb) - }) -} -Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { - - //console.error('ps2', prefix, exists) - - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return cb() +/** + * Process the given brace `pattern`. + * + * ```js + * const { braces } = require('micromatch'); + * console.log(braces('foo/{a,b,c}/bar')); + * //=> [ 'foo/(a|b|c)/bar' ] + * + * console.log(braces('foo/{a,b,c}/bar', { expand: true })); + * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ] + * ``` + * @param {String} `pattern` String with brace pattern to process. + * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options. + * @return {Array} + * @api public + */ - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } +micromatch.braces = (pattern, options) => { + if (typeof pattern !== 'string') throw new TypeError('Expected a string'); + if ((options && options.nobrace === true) || !/\{.*\}/.test(pattern)) { + return [pattern]; } + return braces(pattern, options); +}; - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') +/** + * Expand braces + */ - // Mark this as a match - this._emitMatch(index, prefix) - cb() -} +micromatch.braceExpand = (pattern, options) => { + if (typeof pattern !== 'string') throw new TypeError('Expected a string'); + return micromatch.braces(pattern, { ...options, expand: true }); +}; -// Returns either 'DIR', 'FILE', or false -Glob.prototype._stat = function (f, cb) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' +/** + * Expose micromatch + */ - if (f.length > this.maxLength) - return cb() +module.exports = micromatch; - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (Array.isArray(c)) - c = 'DIR' +/***/ }), +/* 312 */ +/***/ (function(module, exports, __webpack_require__) { - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return cb(null, c) +"use strict"; - if (needDir && c === 'FILE') - return cb() - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } +const stringify = __webpack_require__(313); +const compile = __webpack_require__(315); +const expand = __webpack_require__(319); +const parse = __webpack_require__(320); - var exists - var stat = this.statCache[abs] - if (stat !== undefined) { - if (stat === false) - return cb(null, stat) - else { - var type = stat.isDirectory() ? 'DIR' : 'FILE' - if (needDir && type === 'FILE') - return cb() - else - return cb(null, type, stat) - } - } +/** + * Expand the given pattern or create a regex-compatible string. + * + * ```js + * const braces = require('braces'); + * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)'] + * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c'] + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {String} + * @api public + */ - var self = this - var statcb = inflight('stat\0' + abs, lstatcb_) - if (statcb) - fs.lstat(abs, statcb) +const braces = (input, options = {}) => { + let output = []; - function lstatcb_ (er, lstat) { - if (lstat && lstat.isSymbolicLink()) { - // If it's a symlink, then treat it as the target, unless - // the target does not exist, then treat it as a file. - return fs.stat(abs, function (er, stat) { - if (er) - self._stat2(f, abs, null, lstat, cb) - else - self._stat2(f, abs, er, stat, cb) - }) - } else { - self._stat2(f, abs, er, lstat, cb) + if (Array.isArray(input)) { + for (let pattern of input) { + let result = braces.create(pattern, options); + if (Array.isArray(result)) { + output.push(...result); + } else { + output.push(result); + } } + } else { + output = [].concat(braces.create(input, options)); } -} -Glob.prototype._stat2 = function (f, abs, er, stat, cb) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return cb() + if (options && options.expand === true && options.nodupes === true) { + output = [...new Set(output)]; } + return output; +}; - var needDir = f.slice(-1) === '/' - this.statCache[abs] = stat - - if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) - return cb(null, false, stat) +/** + * Parse the given `str` with the given `options`. + * + * ```js + * // braces.parse(pattern, [, options]); + * const ast = braces.parse('a/{b,c}/d'); + * console.log(ast); + * ``` + * @param {String} pattern Brace pattern to parse + * @param {Object} options + * @return {Object} Returns an AST + * @api public + */ - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' - this.cache[abs] = this.cache[abs] || c +braces.parse = (input, options = {}) => parse(input, options); - if (needDir && c === 'FILE') - return cb() +/** + * Creates a braces string from an AST, or an AST node. + * + * ```js + * const braces = require('braces'); + * let ast = braces.parse('foo/{a,b}/bar'); + * console.log(stringify(ast.nodes[2])); //=> '{a,b}' + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ - return cb(null, c, stat) -} +braces.stringify = (input, options = {}) => { + if (typeof input === 'string') { + return stringify(braces.parse(input, options), options); + } + return stringify(input, options); +}; + +/** + * Compiles a brace pattern into a regex-compatible, optimized string. + * This method is called by the main [braces](#braces) function by default. + * + * ```js + * const braces = require('braces'); + * console.log(braces.compile('a/{b,c}/d')); + * //=> ['a/(b|c)/d'] + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.compile = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + return compile(input, options); +}; + +/** + * Expands a brace pattern into an array. This method is called by the + * main [braces](#braces) function when `options.expand` is true. Before + * using this method it's recommended that you read the [performance notes](#performance)) + * and advantages of using [.compile](#compile) instead. + * + * ```js + * const braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/b/d', 'a/c/d']; + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.expand = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + + let result = expand(input, options); + + // filter out empty strings if specified + if (options.noempty === true) { + result = result.filter(Boolean); + } + + // filter out duplicates if specified + if (options.nodupes === true) { + result = [...new Set(result)]; + } + + return result; +}; + +/** + * Processes a brace pattern and returns either an expanded array + * (if `options.expand` is true), a highly optimized regex-compatible string. + * This method is called by the main [braces](#braces) function. + * + * ```js + * const braces = require('braces'); + * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) + * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.create = (input, options = {}) => { + if (input === '' || input.length < 3) { + return [input]; + } + + return options.expand !== true + ? braces.compile(input, options) + : braces.expand(input, options); +}; + +/** + * Expose "braces" + */ + +module.exports = braces; /***/ }), -/* 301 */ +/* 313 */ /***/ (function(module, exports, __webpack_require__) { -try { - var util = __webpack_require__(111); - /* istanbul ignore next */ - if (typeof util.inherits !== 'function') throw ''; - module.exports = util.inherits; -} catch (e) { - /* istanbul ignore next */ - module.exports = __webpack_require__(302); -} +"use strict"; -/***/ }), -/* 302 */ -/***/ (function(module, exports) { +const utils = __webpack_require__(314); -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }) +module.exports = (ast, options = {}) => { + let stringify = (node, parent = {}) => { + let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let output = ''; + + if (node.value) { + if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { + return '\\' + node.value; + } + return node.value; } - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor + + if (node.value) { + return node.value; } - } -} + + if (node.nodes) { + for (let child of node.nodes) { + output += stringify(child); + } + } + return output; + }; + + return stringify(ast); +}; + /***/ }), -/* 303 */ +/* 314 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = globSync -globSync.GlobSync = GlobSync +"use strict"; -var fs = __webpack_require__(133) -var rp = __webpack_require__(147) -var minimatch = __webpack_require__(149) -var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(300).Glob -var util = __webpack_require__(111) -var path = __webpack_require__(4) -var assert = __webpack_require__(139) -var isAbsolute = __webpack_require__(156) -var common = __webpack_require__(304) -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored -function globSync (pattern, options) { - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') +exports.isInteger = num => { + if (typeof num === 'number') { + return Number.isInteger(num); + } + if (typeof num === 'string' && num.trim() !== '') { + return Number.isInteger(Number(num)); + } + return false; +}; - return new GlobSync(pattern, options).found -} +/** + * Find a node of the given type + */ -function GlobSync (pattern, options) { - if (!pattern) - throw new Error('must provide pattern') +exports.find = (node, type) => node.nodes.find(node => node.type === type); - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') +/** + * Find a node of the given type + */ - if (!(this instanceof GlobSync)) - return new GlobSync(pattern, options) +exports.exceedsLimit = (min, max, step = 1, limit) => { + if (limit === false) return false; + if (!exports.isInteger(min) || !exports.isInteger(max)) return false; + return ((Number(max) - Number(min)) / Number(step)) >= limit; +}; - setopts(this, pattern, options) +/** + * Escape the given node with '\\' before node.value + */ - if (this.noprocess) - return this +exports.escapeNode = (block, n = 0, type) => { + let node = block.nodes[n]; + if (!node) return; - var n = this.minimatch.set.length - this.matches = new Array(n) - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false) + if ((type && node.type === type) || node.type === 'open' || node.type === 'close') { + if (node.escaped !== true) { + node.value = '\\' + node.value; + node.escaped = true; + } } - this._finish() -} +}; -GlobSync.prototype._finish = function () { - assert(this instanceof GlobSync) - if (this.realpath) { - var self = this - this.matches.forEach(function (matchset, index) { - var set = self.matches[index] = Object.create(null) - for (var p in matchset) { - try { - p = self._makeAbs(p) - var real = rp.realpathSync(p, self.realpathCache) - set[real] = true - } catch (er) { - if (er.syscall === 'stat') - set[self._makeAbs(p)] = true - else - throw er - } - } - }) +/** + * Returns true if the given brace node should be enclosed in literal braces + */ + +exports.encloseBrace = node => { + if (node.type !== 'brace') return false; + if ((node.commas >> 0 + node.ranges >> 0) === 0) { + node.invalid = true; + return true; } - common.finish(this) -} + return false; +}; +/** + * Returns true if a brace node is invalid. + */ -GlobSync.prototype._process = function (pattern, index, inGlobStar) { - assert(this instanceof GlobSync) +exports.isInvalidBrace = block => { + if (block.type !== 'brace') return false; + if (block.invalid === true || block.dollar) return true; + if ((block.commas >> 0 + block.ranges >> 0) === 0) { + block.invalid = true; + return true; + } + if (block.open !== true || block.close !== true) { + block.invalid = true; + return true; + } + return false; +}; - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ +/** + * Returns true if a node is an open or close node + */ + +exports.isOpenOrClose = node => { + if (node.type === 'open' || node.type === 'close') { + return true; } - // now n is the index of the first one that is *not* a string. + return node.open === true || node.close === true; +}; - // See if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index) - return +/** + * Reduce an array of text nodes. + */ - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break +exports.reduce = nodes => nodes.reduce((acc, node) => { + if (node.type === 'text') acc.push(node.value); + if (node.type === 'range') node.type = 'text'; + return acc; +}, []); - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break - } +/** + * Flatten an array + */ - var remain = pattern.slice(n) +exports.flatten = (...args) => { + const result = []; + const flat = arr => { + for (let i = 0; i < arr.length; i++) { + let ele = arr[i]; + Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele); + } + return result; + }; + flat(args); + return result; +}; - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix - var abs = this._makeAbs(read) +/***/ }), +/* 315 */ +/***/ (function(module, exports, __webpack_require__) { - //if ignored, skip processing - if (childrenIgnored(this, read)) - return +"use strict"; - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar) -} +const fill = __webpack_require__(316); +const utils = __webpack_require__(314); -GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { - var entries = this._readdir(abs, inGlobStar) +const compile = (ast, options = {}) => { + let walk = (node, parent = {}) => { + let invalidBlock = utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let invalid = invalidBlock === true || invalidNode === true; + let prefix = options.escapeInvalid === true ? '\\' : ''; + let output = ''; - // if the abs isn't a dir, then nothing can match! - if (!entries) - return + if (node.isOpen === true) { + return prefix + node.value; + } + if (node.isClose === true) { + return prefix + node.value; + } - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' + if (node.type === 'open') { + return invalid ? (prefix + node.value) : '('; + } - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) + if (node.type === 'close') { + return invalid ? (prefix + node.value) : ')'; } - } - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return + if (node.type === 'comma') { + return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|'); + } - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. + if (node.value) { + return node.value; + } - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); + let range = fill(...args, { ...options, wrap: false, toRegex: true }); - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix.slice(-1) !== '/') - e = prefix + '/' + e - else - e = prefix + e + if (range.length !== 0) { + return args.length > 1 && range.length > 1 ? `(${range})` : range; } + } - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) + if (node.nodes) { + for (let child of node.nodes) { + output += walk(child, node); } - this._emitMatch(index, e) } - // This was the last one, and no stats were needed - return - } + return output; + }; - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) - newPattern = [prefix, e] - else - newPattern = [e] - this._process(newPattern.concat(remain), index, inGlobStar) - } -} + return walk(ast); +}; +module.exports = compile; -GlobSync.prototype._emitMatch = function (index, e) { - if (isIgnored(this, e)) - return - var abs = this._makeAbs(e) +/***/ }), +/* 316 */ +/***/ (function(module, exports, __webpack_require__) { - if (this.mark) - e = this._mark(e) +"use strict"; +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ - if (this.absolute) { - e = abs - } - if (this.matches[index][e]) - return - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } +const util = __webpack_require__(111); +const toRegexRange = __webpack_require__(317); - this.matches[index][e] = true +const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); - if (this.stat) - this._stat(e) -} +const transform = toNumber => { + return value => toNumber === true ? Number(value) : String(value); +}; +const isValidValue = value => { + return typeof value === 'number' || (typeof value === 'string' && value !== ''); +}; -GlobSync.prototype._readdirInGlobStar = function (abs) { - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false) +const isNumber = num => Number.isInteger(+num); - var entries - var lstat - var stat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er.code === 'ENOENT') { - // lstat failed, doesn't exist - return null - } - } +const zeros = input => { + let value = `${input}`; + let index = -1; + if (value[0] === '-') value = value.slice(1); + if (value === '0') return false; + while (value[++index] === '0'); + return index > 0; +}; - var isSym = lstat && lstat.isSymbolicLink() - this.symlinks[abs] = isSym +const stringify = (start, end, options) => { + if (typeof start === 'string' || typeof end === 'string') { + return true; + } + return options.stringify === true; +}; - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) - this.cache[abs] = 'FILE' - else - entries = this._readdir(abs, false) +const pad = (input, maxLength, toNumber) => { + if (maxLength > 0) { + let dash = input[0] === '-' ? '-' : ''; + if (dash) input = input.slice(1); + input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0')); + } + if (toNumber === false) { + return String(input); + } + return input; +}; - return entries -} +const toMaxLen = (input, maxLength) => { + let negative = input[0] === '-' ? '-' : ''; + if (negative) { + input = input.slice(1); + maxLength--; + } + while (input.length < maxLength) input = '0' + input; + return negative ? ('-' + input) : input; +}; -GlobSync.prototype._readdir = function (abs, inGlobStar) { - var entries +const toSequence = (parts, options) => { + parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); + parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs) + let prefix = options.capture ? '' : '?:'; + let positives = ''; + let negatives = ''; + let result; - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return null + if (parts.positives.length) { + positives = parts.positives.join('|'); + } - if (Array.isArray(c)) - return c + if (parts.negatives.length) { + negatives = `-(${prefix}${parts.negatives.join('|')})`; } - try { - return this._readdirEntries(abs, fs.readdirSync(abs)) - } catch (er) { - this._readdirError(abs, er) - return null + if (positives && negatives) { + result = `${positives}|${negatives}`; + } else { + result = positives || negatives; } -} -GlobSync.prototype._readdirEntries = function (abs, entries) { - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } + if (options.wrap) { + return `(${prefix}${result})`; } - this.cache[abs] = entries + return result; +}; - // mark and cache dir-ness - return entries -} +const toRange = (a, b, isNumbers, options) => { + if (isNumbers) { + return toRegexRange(a, b, { wrap: false, ...options }); + } -GlobSync.prototype._readdirError = function (f, er) { - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - throw error - } - break + let start = String.fromCharCode(a); + if (a === b) return start; - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break + let stop = String.fromCharCode(b); + return `[${start}-${stop}]`; +}; - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) - throw er - if (!this.silent) - console.error('glob error', er) - break +const toRegex = (start, end, options) => { + if (Array.isArray(start)) { + let wrap = options.wrap === true; + let prefix = options.capture ? '' : '?:'; + return wrap ? `(${prefix}${start.join('|')})` : start.join('|'); } -} - -GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + return toRegexRange(start, end, options); +}; - var entries = this._readdir(abs, inGlobStar) +const rangeError = (...args) => { + return new RangeError('Invalid range arguments: ' + util.inspect(...args)); +}; - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return +const invalidRange = (start, end, options) => { + if (options.strictRanges === true) throw rangeError([start, end]); + return []; +}; - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) +const invalidStep = (step, options) => { + if (options.strictRanges === true) { + throw new TypeError(`Expected step "${step}" to be a number`); + } + return []; +}; - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false) +const fillNumbers = (start, end, step = 1, options = {}) => { + let a = Number(start); + let b = Number(end); - var len = entries.length - var isSym = this.symlinks[abs] + if (!Number.isInteger(a) || !Number.isInteger(b)) { + if (options.strictRanges === true) throw rangeError([start, end]); + return []; + } - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return + // fix negative zero + if (a === 0) a = 0; + if (b === 0) b = 0; - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue + let descending = a > b; + let startString = String(start); + let endString = String(end); + let stepString = String(step); + step = Math.max(Math.abs(step), 1); - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true) + let padded = zeros(startString) || zeros(endString) || zeros(stepString); + let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0; + let toNumber = padded === false && stringify(start, end, options) === false; + let format = options.transform || transform(toNumber); - var below = gspref.concat(entries[i], remain) - this._process(below, index, true) + if (options.toRegex && step === 1) { + return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options); } -} - -GlobSync.prototype._processSimple = function (prefix, index) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var exists = this._stat(prefix) - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return + let parts = { negatives: [], positives: [] }; + let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num)); + let range = []; + let index = 0; - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) + while (descending ? a >= b : a <= b) { + if (options.toRegex === true && step > 1) { + push(a); } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' + range.push(pad(format(a, index), maxLen, toNumber)); } + a = descending ? a - step : a + step; + index++; } - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') + if (options.toRegex === true) { + return step > 1 + ? toSequence(parts, options) + : toRegex(range, null, { wrap: false, ...options }); + } - // Mark this as a match - this._emitMatch(index, prefix) -} + return range; +}; -// Returns either 'DIR', 'FILE', or false -GlobSync.prototype._stat = function (f) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' +const fillLetters = (start, end, step = 1, options = {}) => { + if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) { + return invalidRange(start, end, options); + } - if (f.length > this.maxLength) - return false - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] + let format = options.transform || (val => String.fromCharCode(val)); + let a = `${start}`.charCodeAt(0); + let b = `${end}`.charCodeAt(0); - if (Array.isArray(c)) - c = 'DIR' + let descending = a > b; + let min = Math.min(a, b); + let max = Math.max(a, b); - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return c + if (options.toRegex && step === 1) { + return toRange(min, max, false, options); + } - if (needDir && c === 'FILE') - return false + let range = []; + let index = 0; - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. + while (descending ? a >= b : a <= b) { + range.push(format(a, index)); + a = descending ? a - step : a + step; + index++; } - var exists - var stat = this.statCache[abs] - if (!stat) { - var lstat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return false - } - } + if (options.toRegex === true) { + return toRegex(range, null, { wrap: false, options }); + } - if (lstat && lstat.isSymbolicLink()) { - try { - stat = fs.statSync(abs) - } catch (er) { - stat = lstat - } - } else { - stat = lstat - } + return range; +}; + +const fill = (start, end, step, options = {}) => { + if (end == null && isValidValue(start)) { + return [start]; } - this.statCache[abs] = stat + if (!isValidValue(start) || !isValidValue(end)) { + return invalidRange(start, end, options); + } - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' + if (typeof step === 'function') { + return fill(start, end, 1, { transform: step }); + } - this.cache[abs] = this.cache[abs] || c + if (isObject(step)) { + return fill(start, end, 0, step); + } - if (needDir && c === 'FILE') - return false + let opts = { ...options }; + if (opts.capture === true) opts.wrap = true; + step = step || opts.step || 1; - return c -} + if (!isNumber(step)) { + if (step != null && !isObject(step)) return invalidStep(step, opts); + return fill(start, end, 1, step); + } -GlobSync.prototype._mark = function (p) { - return common.mark(this, p) -} + if (isNumber(start) && isNumber(end)) { + return fillNumbers(start, end, step, opts); + } -GlobSync.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} + return fillLetters(start, end, Math.max(Math.abs(step), 1), opts); +}; + +module.exports = fill; /***/ }), -/* 304 */ +/* 317 */ /***/ (function(module, exports, __webpack_require__) { -exports.alphasort = alphasort -exports.alphasorti = alphasorti -exports.setopts = setopts -exports.ownProp = ownProp -exports.makeAbs = makeAbs -exports.finish = finish -exports.mark = mark -exports.isIgnored = isIgnored -exports.childrenIgnored = childrenIgnored - -function ownProp (obj, field) { - return Object.prototype.hasOwnProperty.call(obj, field) -} +"use strict"; +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ -var path = __webpack_require__(4) -var minimatch = __webpack_require__(149) -var isAbsolute = __webpack_require__(156) -var Minimatch = minimatch.Minimatch -function alphasorti (a, b) { - return a.toLowerCase().localeCompare(b.toLowerCase()) -} -function alphasort (a, b) { - return a.localeCompare(b) -} +const isNumber = __webpack_require__(318); -function setupIgnores (self, options) { - self.ignore = options.ignore || [] +const toRegexRange = (min, max, options) => { + if (isNumber(min) === false) { + throw new TypeError('toRegexRange: expected the first argument to be a number'); + } - if (!Array.isArray(self.ignore)) - self.ignore = [self.ignore] + if (max === void 0 || min === max) { + return String(min); + } - if (self.ignore.length) { - self.ignore = self.ignore.map(ignoreMap) + if (isNumber(max) === false) { + throw new TypeError('toRegexRange: expected the second argument to be a number.'); } -} -// ignore patterns are always in dot:true mode. -function ignoreMap (pattern) { - var gmatcher = null - if (pattern.slice(-3) === '/**') { - var gpattern = pattern.replace(/(\/\*\*)+$/, '') - gmatcher = new Minimatch(gpattern, { dot: true }) + let opts = { relaxZeros: true, ...options }; + if (typeof opts.strictZeros === 'boolean') { + opts.relaxZeros = opts.strictZeros === false; } - return { - matcher: new Minimatch(pattern, { dot: true }), - gmatcher: gmatcher + let relax = String(opts.relaxZeros); + let shorthand = String(opts.shorthand); + let capture = String(opts.capture); + let wrap = String(opts.wrap); + let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap; + + if (toRegexRange.cache.hasOwnProperty(cacheKey)) { + return toRegexRange.cache[cacheKey].result; } -} -function setopts (self, pattern, options) { - if (!options) - options = {} + let a = Math.min(min, max); + let b = Math.max(min, max); - // base-matching: just use globstar for that. - if (options.matchBase && -1 === pattern.indexOf("/")) { - if (options.noglobstar) { - throw new Error("base matching requires globstar") + if (Math.abs(a - b) === 1) { + let result = min + '|' + max; + if (opts.capture) { + return `(${result})`; } - pattern = "**/" + pattern + if (opts.wrap === false) { + return result; + } + return `(?:${result})`; } - self.silent = !!options.silent - self.pattern = pattern - self.strict = options.strict !== false - self.realpath = !!options.realpath - self.realpathCache = options.realpathCache || Object.create(null) - self.follow = !!options.follow - self.dot = !!options.dot - self.mark = !!options.mark - self.nodir = !!options.nodir - if (self.nodir) - self.mark = true - self.sync = !!options.sync - self.nounique = !!options.nounique - self.nonull = !!options.nonull - self.nosort = !!options.nosort - self.nocase = !!options.nocase - self.stat = !!options.stat - self.noprocess = !!options.noprocess - self.absolute = !!options.absolute + let isPadded = hasPadding(min) || hasPadding(max); + let state = { min, max, a, b }; + let positives = []; + let negatives = []; - self.maxLength = options.maxLength || Infinity - self.cache = options.cache || Object.create(null) - self.statCache = options.statCache || Object.create(null) - self.symlinks = options.symlinks || Object.create(null) + if (isPadded) { + state.isPadded = isPadded; + state.maxLen = String(state.max).length; + } - setupIgnores(self, options) + if (a < 0) { + let newMin = b < 0 ? Math.abs(b) : 1; + negatives = splitToPatterns(newMin, Math.abs(a), state, opts); + a = state.a = 0; + } - self.changedCwd = false - var cwd = process.cwd() - if (!ownProp(options, "cwd")) - self.cwd = cwd - else { - self.cwd = path.resolve(options.cwd) - self.changedCwd = self.cwd !== cwd + if (b >= 0) { + positives = splitToPatterns(a, b, state, opts); } - self.root = options.root || path.resolve(self.cwd, "/") - self.root = path.resolve(self.root) - if (process.platform === "win32") - self.root = self.root.replace(/\\/g, "/") + state.negatives = negatives; + state.positives = positives; + state.result = collatePatterns(negatives, positives, opts); - // TODO: is an absolute `cwd` supposed to be resolved against `root`? - // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') - self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) - if (process.platform === "win32") - self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") - self.nomount = !!options.nomount + if (opts.capture === true) { + state.result = `(${state.result})`; + } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) { + state.result = `(?:${state.result})`; + } - // disable comments and negation in Minimatch. - // Note that they are not supported in Glob itself anyway. - options.nonegate = true - options.nocomment = true + toRegexRange.cache[cacheKey] = state; + return state.result; +}; - self.minimatch = new Minimatch(pattern, options) - self.options = self.minimatch.options +function collatePatterns(neg, pos, options) { + let onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; + let onlyPositive = filterPatterns(pos, neg, '', false, options) || []; + let intersected = filterPatterns(neg, pos, '-?', true, options) || []; + let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); + return subpatterns.join('|'); } -function finish (self) { - var nou = self.nounique - var all = nou ? [] : Object.create(null) +function splitToRanges(min, max) { + let nines = 1; + let zeros = 1; - for (var i = 0, l = self.matches.length; i < l; i ++) { - var matches = self.matches[i] - if (!matches || Object.keys(matches).length === 0) { - if (self.nonull) { - // do like the shell, and spit out the literal glob - var literal = self.minimatch.globSet[i] - if (nou) - all.push(literal) - else - all[literal] = true - } - } else { - // had matches - var m = Object.keys(matches) - if (nou) - all.push.apply(all, m) - else - m.forEach(function (m) { - all[m] = true - }) - } + let stop = countNines(min, nines); + let stops = new Set([max]); + + while (min <= stop && stop <= max) { + stops.add(stop); + nines += 1; + stop = countNines(min, nines); } - if (!nou) - all = Object.keys(all) + stop = countZeros(max + 1, zeros) - 1; - if (!self.nosort) - all = all.sort(self.nocase ? alphasorti : alphasort) + while (min < stop && stop <= max) { + stops.add(stop); + zeros += 1; + stop = countZeros(max + 1, zeros) - 1; + } - // at *some* point we statted all of these - if (self.mark) { - for (var i = 0; i < all.length; i++) { - all[i] = self._mark(all[i]) - } - if (self.nodir) { - all = all.filter(function (e) { - var notDir = !(/\/$/.test(e)) - var c = self.cache[e] || self.cache[makeAbs(self, e)] - if (notDir && c) - notDir = c !== 'DIR' && !Array.isArray(c) - return notDir - }) + stops = [...stops]; + stops.sort(compare); + return stops; +} + +/** + * Convert a range to a regex pattern + * @param {Number} `start` + * @param {Number} `stop` + * @return {String} + */ + +function rangeToPattern(start, stop, options) { + if (start === stop) { + return { pattern: start, count: [], digits: 0 }; + } + + let zipped = zip(start, stop); + let digits = zipped.length; + let pattern = ''; + let count = 0; + + for (let i = 0; i < digits; i++) { + let [startDigit, stopDigit] = zipped[i]; + + if (startDigit === stopDigit) { + pattern += startDigit; + + } else if (startDigit !== '0' || stopDigit !== '9') { + pattern += toCharacterClass(startDigit, stopDigit, options); + + } else { + count++; } } - if (self.ignore.length) - all = all.filter(function(m) { - return !isIgnored(self, m) - }) + if (count) { + pattern += options.shorthand === true ? '\\d' : '[0-9]'; + } - self.found = all + return { pattern, count: [count], digits }; } -function mark (self, p) { - var abs = makeAbs(self, p) - var c = self.cache[abs] - var m = p - if (c) { - var isDir = c === 'DIR' || Array.isArray(c) - var slash = p.slice(-1) === '/' +function splitToPatterns(min, max, tok, options) { + let ranges = splitToRanges(min, max); + let tokens = []; + let start = min; + let prev; - if (isDir && !slash) - m += '/' - else if (!isDir && slash) - m = m.slice(0, -1) + for (let i = 0; i < ranges.length; i++) { + let max = ranges[i]; + let obj = rangeToPattern(String(start), String(max), options); + let zeros = ''; - if (m !== p) { - var mabs = makeAbs(self, m) - self.statCache[mabs] = self.statCache[abs] - self.cache[mabs] = self.cache[abs] + if (!tok.isPadded && prev && prev.pattern === obj.pattern) { + if (prev.count.length > 1) { + prev.count.pop(); + } + + prev.count.push(obj.count[0]); + prev.string = prev.pattern + toQuantifier(prev.count); + start = max + 1; + continue; + } + + if (tok.isPadded) { + zeros = padZeros(max, tok, options); } + + obj.string = zeros + obj.pattern + toQuantifier(obj.count); + tokens.push(obj); + start = max + 1; + prev = obj; } - return m + return tokens; } -// lotta situps... -function makeAbs (self, f) { - var abs = f - if (f.charAt(0) === '/') { - abs = path.join(self.root, f) - } else if (isAbsolute(f) || f === '') { - abs = f - } else if (self.changedCwd) { - abs = path.resolve(self.cwd, f) - } else { - abs = path.resolve(f) +function filterPatterns(arr, comparison, prefix, intersection, options) { + let result = []; + + for (let ele of arr) { + let { string } = ele; + + // only push if _both_ are negative... + if (!intersection && !contains(comparison, 'string', string)) { + result.push(prefix + string); + } + + // or _both_ are positive + if (intersection && contains(comparison, 'string', string)) { + result.push(prefix + string); + } } + return result; +} - if (process.platform === 'win32') - abs = abs.replace(/\\/g, '/') +/** + * Zip strings + */ - return abs +function zip(a, b) { + let arr = []; + for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]); + return arr; } +function compare(a, b) { + return a > b ? 1 : b > a ? -1 : 0; +} -// Return true, if pattern ends with globstar '**', for the accompanying parent directory. -// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents -function isIgnored (self, path) { - if (!self.ignore.length) - return false +function contains(arr, key, val) { + return arr.some(ele => ele[key] === val); +} - return self.ignore.some(function(item) { - return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) - }) +function countNines(min, len) { + return Number(String(min).slice(0, -len) + '9'.repeat(len)); } -function childrenIgnored (self, path) { - if (!self.ignore.length) - return false +function countZeros(integer, zeros) { + return integer - (integer % Math.pow(10, zeros)); +} - return self.ignore.some(function(item) { - return !!(item.gmatcher && item.gmatcher.match(path)) - }) +function toQuantifier(digits) { + let [start = 0, stop = ''] = digits; + if (stop || start > 1) { + return `{${start + (stop ? ',' + stop : '')}}`; + } + return ''; } +function toCharacterClass(a, b, options) { + return `[${a}${(b - a === 1) ? '' : '-'}${b}]`; +} -/***/ }), -/* 305 */ -/***/ (function(module, exports, __webpack_require__) { +function hasPadding(str) { + return /^-?(0+)\d/.test(str); +} -"use strict"; - -const taskManager = __webpack_require__(306); -const async_1 = __webpack_require__(335); -const stream_1 = __webpack_require__(370); -const sync_1 = __webpack_require__(371); -const settings_1 = __webpack_require__(373); -const utils = __webpack_require__(307); -async function FastGlob(source, options) { - assertPatternsInput(source); - const works = getWorks(source, async_1.default, options); - const result = await Promise.all(works); - return utils.array.flatten(result); -} -// https://github.com/typescript-eslint/typescript-eslint/issues/60 -// eslint-disable-next-line no-redeclare -(function (FastGlob) { - function sync(source, options) { - assertPatternsInput(source); - const works = getWorks(source, sync_1.default, options); - return utils.array.flatten(works); - } - FastGlob.sync = sync; - function stream(source, options) { - assertPatternsInput(source); - const works = getWorks(source, stream_1.default, options); - /** - * The stream returned by the provider cannot work with an asynchronous iterator. - * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams. - * This affects performance (+25%). I don't see best solution right now. - */ - return utils.stream.merge(works); - } - FastGlob.stream = stream; - function generateTasks(source, options) { - assertPatternsInput(source); - const patterns = [].concat(source); - const settings = new settings_1.default(options); - return taskManager.generate(patterns, settings); - } - FastGlob.generateTasks = generateTasks; - function isDynamicPattern(source, options) { - assertPatternsInput(source); - const settings = new settings_1.default(options); - return utils.pattern.isDynamicPattern(source, settings); - } - FastGlob.isDynamicPattern = isDynamicPattern; - function escapePath(source) { - assertPatternsInput(source); - return utils.path.escape(source); - } - FastGlob.escapePath = escapePath; -})(FastGlob || (FastGlob = {})); -function getWorks(source, _Provider, options) { - const patterns = [].concat(source); - const settings = new settings_1.default(options); - const tasks = taskManager.generate(patterns, settings); - const provider = new _Provider(settings); - return tasks.map(provider.read, provider); -} -function assertPatternsInput(input) { - const source = [].concat(input); - const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item)); - if (!isValidSource) { - throw new TypeError('Patterns must be a string (non empty) or an array of strings'); - } -} -module.exports = FastGlob; +function padZeros(value, tok, options) { + if (!tok.isPadded) { + return value; + } + let diff = Math.abs(tok.maxLen - String(value).length); + let relax = options.relaxZeros !== false; -/***/ }), -/* 306 */ -/***/ (function(module, exports, __webpack_require__) { + switch (diff) { + case 0: + return ''; + case 1: + return relax ? '0?' : '0'; + case 2: + return relax ? '0{0,2}' : '00'; + default: { + return relax ? `0{0,${diff}}` : `0{${diff}}`; + } + } +} -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(307); -function generate(patterns, settings) { - const positivePatterns = getPositivePatterns(patterns); - const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); - const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings)); - const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings)); - const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false); - const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true); - return staticTasks.concat(dynamicTasks); -} -exports.generate = generate; -function convertPatternsToTasks(positive, negative, dynamic) { - const positivePatternsGroup = groupPatternsByBaseDirectory(positive); - // When we have a global group – there is no reason to divide the patterns into independent tasks. - // In this case, the global task covers the rest. - if ('.' in positivePatternsGroup) { - const task = convertPatternGroupToTask('.', positive, negative, dynamic); - return [task]; - } - return convertPatternGroupsToTasks(positivePatternsGroup, negative, dynamic); -} -exports.convertPatternsToTasks = convertPatternsToTasks; -function getPositivePatterns(patterns) { - return utils.pattern.getPositivePatterns(patterns); -} -exports.getPositivePatterns = getPositivePatterns; -function getNegativePatternsAsPositive(patterns, ignore) { - const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore); - const positive = negative.map(utils.pattern.convertToPositivePattern); - return positive; -} -exports.getNegativePatternsAsPositive = getNegativePatternsAsPositive; -function groupPatternsByBaseDirectory(patterns) { - const group = {}; - return patterns.reduce((collection, pattern) => { - const base = utils.pattern.getBaseDirectory(pattern); - if (base in collection) { - collection[base].push(pattern); - } - else { - collection[base] = [pattern]; - } - return collection; - }, group); -} -exports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory; -function convertPatternGroupsToTasks(positive, negative, dynamic) { - return Object.keys(positive).map((base) => { - return convertPatternGroupToTask(base, positive[base], negative, dynamic); - }); -} -exports.convertPatternGroupsToTasks = convertPatternGroupsToTasks; -function convertPatternGroupToTask(base, positive, negative, dynamic) { - return { - dynamic, - positive, - negative, - base, - patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern)) - }; -} -exports.convertPatternGroupToTask = convertPatternGroupToTask; +/** + * Cache + */ +toRegexRange.cache = {}; +toRegexRange.clearCache = () => (toRegexRange.cache = {}); -/***/ }), -/* 307 */ -/***/ (function(module, exports, __webpack_require__) { +/** + * Expose `toRegexRange` + */ -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const array = __webpack_require__(308); -exports.array = array; -const errno = __webpack_require__(309); -exports.errno = errno; -const fs = __webpack_require__(310); -exports.fs = fs; -const path = __webpack_require__(311); -exports.path = path; -const pattern = __webpack_require__(312); -exports.pattern = pattern; -const stream = __webpack_require__(333); -exports.stream = stream; -const string = __webpack_require__(334); -exports.string = string; +module.exports = toRegexRange; /***/ }), -/* 308 */ +/* 318 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function flatten(items) { - return items.reduce((collection, item) => [].concat(collection, item), []); -} -exports.flatten = flatten; -function splitWhen(items, predicate) { - const result = [[]]; - let groupIndex = 0; - for (const item of items) { - if (predicate(item)) { - groupIndex++; - result[groupIndex] = []; - } - else { - result[groupIndex].push(item); - } - } - return result; -} -exports.splitWhen = splitWhen; +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ -/***/ }), -/* 309 */ -/***/ (function(module, exports, __webpack_require__) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function isEnoentCodeError(error) { - return error.code === 'ENOENT'; -} -exports.isEnoentCodeError = isEnoentCodeError; +module.exports = function(num) { + if (typeof num === 'number') { + return num - num === 0; + } + if (typeof num === 'string' && num.trim() !== '') { + return Number.isFinite ? Number.isFinite(+num) : isFinite(+num); + } + return false; +}; /***/ }), -/* 310 */ +/* 319 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -class DirentFromStats { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } -} -function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); -} -exports.createDirentFromStats = createDirentFromStats; -/***/ }), -/* 311 */ -/***/ (function(module, exports, __webpack_require__) { +const fill = __webpack_require__(316); +const stringify = __webpack_require__(313); +const utils = __webpack_require__(314); -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(4); -const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\ -const UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g; -/** - * Designed to work only with simple paths: `dir\\file`. - */ -function unixify(filepath) { - return filepath.replace(/\\/g, '/'); -} -exports.unixify = unixify; -function makeAbsolute(cwd, filepath) { - return path.resolve(cwd, filepath); -} -exports.makeAbsolute = makeAbsolute; -function escape(pattern) { - return pattern.replace(UNESCAPED_GLOB_SYMBOLS_RE, '\\$2'); -} -exports.escape = escape; -function removeLeadingDotSegment(entry) { - // We do not use `startsWith` because this is 10x slower than current implementation for some cases. - // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with - if (entry.charAt(0) === '.') { - const secondCharactery = entry.charAt(1); - if (secondCharactery === '/' || secondCharactery === '\\') { - return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT); - } - } - return entry; -} -exports.removeLeadingDotSegment = removeLeadingDotSegment; +const append = (queue = '', stash = '', enclose = false) => { + let result = []; + queue = [].concat(queue); + stash = [].concat(stash); -/***/ }), -/* 312 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(4); -const globParent = __webpack_require__(313); -const micromatch = __webpack_require__(316); -const picomatch = __webpack_require__(327); -const GLOBSTAR = '**'; -const ESCAPE_SYMBOL = '\\'; -const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; -const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[.*]/; -const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\(.*\|.*\)/; -const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\(.*\)/; -const BRACE_EXPANSIONS_SYMBOLS_RE = /{.*(?:,|\.\.).*}/; -function isStaticPattern(pattern, options = {}) { - return !isDynamicPattern(pattern, options); -} -exports.isStaticPattern = isStaticPattern; -function isDynamicPattern(pattern, options = {}) { - /** - * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check - * filepath directly (without read directory). - */ - if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) { - return true; - } - if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) { - return true; - } - if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) { - return true; - } - if (options.braceExpansion !== false && BRACE_EXPANSIONS_SYMBOLS_RE.test(pattern)) { - return true; - } - return false; -} -exports.isDynamicPattern = isDynamicPattern; -function convertToPositivePattern(pattern) { - return isNegativePattern(pattern) ? pattern.slice(1) : pattern; -} -exports.convertToPositivePattern = convertToPositivePattern; -function convertToNegativePattern(pattern) { - return '!' + pattern; -} -exports.convertToNegativePattern = convertToNegativePattern; -function isNegativePattern(pattern) { - return pattern.startsWith('!') && pattern[1] !== '('; -} -exports.isNegativePattern = isNegativePattern; -function isPositivePattern(pattern) { - return !isNegativePattern(pattern); -} -exports.isPositivePattern = isPositivePattern; -function getNegativePatterns(patterns) { - return patterns.filter(isNegativePattern); -} -exports.getNegativePatterns = getNegativePatterns; -function getPositivePatterns(patterns) { - return patterns.filter(isPositivePattern); -} -exports.getPositivePatterns = getPositivePatterns; -function getBaseDirectory(pattern) { - return globParent(pattern, { flipBackslashes: false }); -} -exports.getBaseDirectory = getBaseDirectory; -function hasGlobStar(pattern) { - return pattern.includes(GLOBSTAR); -} -exports.hasGlobStar = hasGlobStar; -function endsWithSlashGlobStar(pattern) { - return pattern.endsWith('/' + GLOBSTAR); -} -exports.endsWithSlashGlobStar = endsWithSlashGlobStar; -function isAffectDepthOfReadingPattern(pattern) { - const basename = path.basename(pattern); - return endsWithSlashGlobStar(pattern) || isStaticPattern(basename); -} -exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern; -function expandPatternsWithBraceExpansion(patterns) { - return patterns.reduce((collection, pattern) => { - return collection.concat(expandBraceExpansion(pattern)); - }, []); -} -exports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion; -function expandBraceExpansion(pattern) { - return micromatch.braces(pattern, { - expand: true, - nodupes: true - }); -} -exports.expandBraceExpansion = expandBraceExpansion; -function getPatternParts(pattern, options) { - const info = picomatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true })); - // See micromatch/picomatch#58 for more details - if (info.parts.length === 0) { - return [pattern]; - } - return info.parts; -} -exports.getPatternParts = getPatternParts; -function makeRe(pattern, options) { - return micromatch.makeRe(pattern, options); -} -exports.makeRe = makeRe; -function convertPatternsToRe(patterns, options) { - return patterns.map((pattern) => makeRe(pattern, options)); -} -exports.convertPatternsToRe = convertPatternsToRe; -function matchAny(entry, patternsRe) { - return patternsRe.some((patternRe) => patternRe.test(entry)); -} -exports.matchAny = matchAny; - - -/***/ }), -/* 313 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var isGlob = __webpack_require__(314); -var pathPosixDirname = __webpack_require__(4).posix.dirname; -var isWin32 = __webpack_require__(120).platform() === 'win32'; - -var slash = '/'; -var backslash = /\\/g; -var enclosure = /[\{\[].*[\/]*.*[\}\]]$/; -var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; -var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g; - -/** - * @param {string} str - * @param {Object} opts - * @param {boolean} [opts.flipBackslashes=true] - */ -module.exports = function globParent(str, opts) { - var options = Object.assign({ flipBackslashes: true }, opts); - - // flip windows path separators - if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) { - str = str.replace(backslash, slash); + if (!stash.length) return queue; + if (!queue.length) { + return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash; } - // special case for strings ending in enclosure containing path separator - if (enclosure.test(str)) { - str += slash; + for (let item of queue) { + if (Array.isArray(item)) { + for (let value of item) { + result.push(append(value, stash, enclose)); + } + } else { + for (let ele of stash) { + if (enclose === true && typeof ele === 'string') ele = `{${ele}}`; + result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele)); + } + } } + return utils.flatten(result); +}; - // preserves full path in case of trailing path separator - str += 'a'; - - // remove path parts that are globby - do { - str = pathPosixDirname(str); - } while (isGlob(str) || globby.test(str)); +const expand = (ast, options = {}) => { + let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit; - // remove escape chars and return result - return str.replace(escaped, '$1'); -}; + let walk = (node, parent = {}) => { + node.queue = []; + let p = parent; + let q = parent.queue; -/***/ }), -/* 314 */ -/***/ (function(module, exports, __webpack_require__) { + while (p.type !== 'brace' && p.type !== 'root' && p.parent) { + p = p.parent; + q = p.queue; + } -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ + if (node.invalid || node.dollar) { + q.push(append(q.pop(), stringify(node, options))); + return; + } -var isExtglob = __webpack_require__(315); -var chars = { '{': '}', '(': ')', '[': ']'}; -var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; -var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; + if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) { + q.push(append(q.pop(), ['{}'])); + return; + } -module.exports = function isGlob(str, options) { - if (typeof str !== 'string' || str === '') { - return false; - } + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); - if (isExtglob(str)) { - return true; - } + if (utils.exceedsLimit(...args, options.step, rangeLimit)) { + throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); + } - var regex = strictRegex; - var match; + let range = fill(...args, options); + if (range.length === 0) { + range = stringify(node, options); + } - // optionally relax regex - if (options && options.strict === false) { - regex = relaxedRegex; - } + q.push(append(q.pop(), range)); + node.nodes = []; + return; + } - while ((match = regex.exec(str))) { - if (match[2]) return true; - var idx = match.index + match[0].length; + let enclose = utils.encloseBrace(node); + let queue = node.queue; + let block = node; - // if an open bracket/brace/paren is escaped, - // set the index to the next closing character - var open = match[1]; - var close = open ? chars[open] : null; - if (open && close) { - var n = str.indexOf(close, idx); - if (n !== -1) { - idx = n + 1; - } + while (block.type !== 'brace' && block.type !== 'root' && block.parent) { + block = block.parent; + queue = block.queue; } - str = str.slice(idx); - } - return false; -}; + for (let i = 0; i < node.nodes.length; i++) { + let child = node.nodes[i]; + if (child.type === 'comma' && node.type === 'brace') { + if (i === 1) queue.push(''); + queue.push(''); + continue; + } -/***/ }), -/* 315 */ -/***/ (function(module, exports) { + if (child.type === 'close') { + q.push(append(q.pop(), queue, enclose)); + continue; + } -/*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ + if (child.value && child.type !== 'open') { + queue.push(append(queue.pop(), child.value)); + continue; + } -module.exports = function isExtglob(str) { - if (typeof str !== 'string' || str === '') { - return false; - } + if (child.nodes) { + walk(child, node); + } + } - var match; - while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) { - if (match[2]) return true; - str = str.slice(match.index + match[0].length); - } + return queue; + }; - return false; + return utils.flatten(walk(ast)); }; +module.exports = expand; + /***/ }), -/* 316 */ +/* 320 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const util = __webpack_require__(111); -const braces = __webpack_require__(317); -const picomatch = __webpack_require__(327); -const utils = __webpack_require__(330); -const isEmptyString = val => typeof val === 'string' && (val === '' || val === './'); +const stringify = __webpack_require__(313); /** - * Returns an array of strings that match one or more glob patterns. - * - * ```js - * const mm = require('micromatch'); - * // mm(list, patterns[, options]); - * - * console.log(mm(['a.js', 'a.txt'], ['*.js'])); - * //=> [ 'a.js' ] - * ``` - * @param {String|Array} list List of strings to match. - * @param {String|Array} patterns One or more glob patterns to use for matching. - * @param {Object} options See available [options](#options) - * @return {Array} Returns an array of matches - * @summary false - * @api public + * Constants */ -const micromatch = (list, patterns, options) => { - patterns = [].concat(patterns); - list = [].concat(list); +const { + MAX_LENGTH, + CHAR_BACKSLASH, /* \ */ + CHAR_BACKTICK, /* ` */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_RIGHT_SQUARE_BRACKET, /* ] */ + CHAR_DOUBLE_QUOTE, /* " */ + CHAR_SINGLE_QUOTE, /* ' */ + CHAR_NO_BREAK_SPACE, + CHAR_ZERO_WIDTH_NOBREAK_SPACE +} = __webpack_require__(321); - let omit = new Set(); - let keep = new Set(); - let items = new Set(); - let negatives = 0; +/** + * parse + */ - let onResult = state => { - items.add(state.output); - if (options && options.onResult) { - options.onResult(state); - } - }; +const parse = (input, options = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); + } - for (let i = 0; i < patterns.length; i++) { - let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true); - let negated = isMatch.state.negated || isMatch.state.negatedExtglob; - if (negated) negatives++; + let opts = options || {}; + let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + if (input.length > max) { + throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); + } - for (let item of list) { - let matched = isMatch(item, true); + let ast = { type: 'root', input, nodes: [] }; + let stack = [ast]; + let block = ast; + let prev = ast; + let brackets = 0; + let length = input.length; + let index = 0; + let depth = 0; + let value; + let memo = {}; - let match = negated ? !matched.isMatch : matched.isMatch; - if (!match) continue; + /** + * Helpers + */ - if (negated) { - omit.add(matched.output); - } else { - omit.delete(matched.output); - keep.add(matched.output); - } + const advance = () => input[index++]; + const push = node => { + if (node.type === 'text' && prev.type === 'dot') { + prev.type = 'text'; } - } - - let result = negatives === patterns.length ? [...items] : [...keep]; - let matches = result.filter(item => !omit.has(item)); - if (options && matches.length === 0) { - if (options.failglob === true) { - throw new Error(`No matches found for "${patterns.join(', ')}"`); + if (prev && prev.type === 'text' && node.type === 'text') { + prev.value += node.value; + return; } - if (options.nonull === true || options.nullglob === true) { - return options.unescape ? patterns.map(p => p.replace(/\\/g, '')) : patterns; - } - } + block.nodes.push(node); + node.parent = block; + node.prev = prev; + prev = node; + return node; + }; - return matches; -}; + push({ type: 'bos' }); -/** - * Backwards compatibility - */ + while (index < length) { + block = stack[stack.length - 1]; + value = advance(); -micromatch.match = micromatch; + /** + * Invalid chars + */ -/** - * Returns a matcher function from the given glob `pattern` and `options`. - * The returned function takes a string to match as its only argument and returns - * true if the string is a match. - * - * ```js - * const mm = require('micromatch'); - * // mm.matcher(pattern[, options]); - * - * const isMatch = mm.matcher('*.!(*a)'); - * console.log(isMatch('a.a')); //=> false - * console.log(isMatch('a.b')); //=> true - * ``` - * @param {String} `pattern` Glob pattern - * @param {Object} `options` - * @return {Function} Returns a matcher function. - * @api public - */ + if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { + continue; + } -micromatch.matcher = (pattern, options) => picomatch(pattern, options); + /** + * Escaped chars + */ -/** - * Returns true if **any** of the given glob `patterns` match the specified `string`. - * - * ```js - * const mm = require('micromatch'); - * // mm.isMatch(string, patterns[, options]); - * - * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true - * console.log(mm.isMatch('a.a', 'b.*')); //=> false - * ``` - * @param {String} str The string to test. - * @param {String|Array} patterns One or more glob patterns to use for matching. - * @param {Object} [options] See available [options](#options). - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ + if (value === CHAR_BACKSLASH) { + push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() }); + continue; + } -micromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); + /** + * Right square bracket (literal): ']' + */ -/** - * Backwards compatibility - */ + if (value === CHAR_RIGHT_SQUARE_BRACKET) { + push({ type: 'text', value: '\\' + value }); + continue; + } -micromatch.any = micromatch.isMatch; + /** + * Left square bracket: '[' + */ -/** - * Returns a list of strings that _**do not match any**_ of the given `patterns`. - * - * ```js - * const mm = require('micromatch'); - * // mm.not(list, patterns[, options]); - * - * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a')); - * //=> ['b.b', 'c.c'] - * ``` - * @param {Array} `list` Array of strings to match. - * @param {String|Array} `patterns` One or more glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Array} Returns an array of strings that **do not match** the given patterns. - * @api public - */ + if (value === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; -micromatch.not = (list, patterns, options = {}) => { - patterns = [].concat(patterns).map(String); - let result = new Set(); - let items = []; + let closed = true; + let next; - let onResult = state => { - if (options.onResult) options.onResult(state); - items.push(state.output); - }; + while (index < length && (next = advance())) { + value += next; - let matches = micromatch(list, patterns, { ...options, onResult }); + if (next === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + continue; + } - for (let item of items) { - if (!matches.includes(item)) { - result.add(item); + if (next === CHAR_BACKSLASH) { + value += advance(); + continue; + } + + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + brackets--; + + if (brackets === 0) { + break; + } + } + } + + push({ type: 'text', value }); + continue; + } + + /** + * Parentheses + */ + + if (value === CHAR_LEFT_PARENTHESES) { + block = push({ type: 'paren', nodes: [] }); + stack.push(block); + push({ type: 'text', value }); + continue; + } + + if (value === CHAR_RIGHT_PARENTHESES) { + if (block.type !== 'paren') { + push({ type: 'text', value }); + continue; + } + block = stack.pop(); + push({ type: 'text', value }); + block = stack[stack.length - 1]; + continue; + } + + /** + * Quotes: '|"|` + */ + + if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { + let open = value; + let next; + + if (options.keepQuotes !== true) { + value = ''; + } + + while (index < length && (next = advance())) { + if (next === CHAR_BACKSLASH) { + value += next + advance(); + continue; + } + + if (next === open) { + if (options.keepQuotes === true) value += next; + break; + } + + value += next; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Left curly brace: '{' + */ + + if (value === CHAR_LEFT_CURLY_BRACE) { + depth++; + + let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true; + let brace = { + type: 'brace', + open: true, + close: false, + dollar, + depth, + commas: 0, + ranges: 0, + nodes: [] + }; + + block = push(brace); + stack.push(block); + push({ type: 'open', value }); + continue; + } + + /** + * Right curly brace: '}' + */ + + if (value === CHAR_RIGHT_CURLY_BRACE) { + if (block.type !== 'brace') { + push({ type: 'text', value }); + continue; + } + + let type = 'close'; + block = stack.pop(); + block.close = true; + + push({ type, value }); + depth--; + + block = stack[stack.length - 1]; + continue; + } + + /** + * Comma: ',' + */ + + if (value === CHAR_COMMA && depth > 0) { + if (block.ranges > 0) { + block.ranges = 0; + let open = block.nodes.shift(); + block.nodes = [open, { type: 'text', value: stringify(block) }]; + } + + push({ type: 'comma', value }); + block.commas++; + continue; + } + + /** + * Dot: '.' + */ + + if (value === CHAR_DOT && depth > 0 && block.commas === 0) { + let siblings = block.nodes; + + if (depth === 0 || siblings.length === 0) { + push({ type: 'text', value }); + continue; + } + + if (prev.type === 'dot') { + block.range = []; + prev.value += value; + prev.type = 'range'; + + if (block.nodes.length !== 3 && block.nodes.length !== 5) { + block.invalid = true; + block.ranges = 0; + prev.type = 'text'; + continue; + } + + block.ranges++; + block.args = []; + continue; + } + + if (prev.type === 'range') { + siblings.pop(); + + let before = siblings[siblings.length - 1]; + before.value += prev.value + value; + prev = before; + block.ranges--; + continue; + } + + push({ type: 'dot', value }); + continue; } + + /** + * Text + */ + + push({ type: 'text', value }); } - return [...result]; + + // Mark imbalanced braces and brackets as invalid + do { + block = stack.pop(); + + if (block.type !== 'root') { + block.nodes.forEach(node => { + if (!node.nodes) { + if (node.type === 'open') node.isOpen = true; + if (node.type === 'close') node.isClose = true; + if (!node.nodes) node.type = 'text'; + node.invalid = true; + } + }); + + // get the location of the block on parent.nodes (block's siblings) + let parent = stack[stack.length - 1]; + let index = parent.nodes.indexOf(block); + // replace the (invalid) block with it's nodes + parent.nodes.splice(index, 1, ...block.nodes); + } + } while (stack.length > 0); + + push({ type: 'eos' }); + return ast; +}; + +module.exports = parse; + + +/***/ }), +/* 321 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = { + MAX_LENGTH: 1024 * 64, + + // Digits + CHAR_0: '0', /* 0 */ + CHAR_9: '9', /* 9 */ + + // Alphabet chars. + CHAR_UPPERCASE_A: 'A', /* A */ + CHAR_LOWERCASE_A: 'a', /* a */ + CHAR_UPPERCASE_Z: 'Z', /* Z */ + CHAR_LOWERCASE_Z: 'z', /* z */ + + CHAR_LEFT_PARENTHESES: '(', /* ( */ + CHAR_RIGHT_PARENTHESES: ')', /* ) */ + + CHAR_ASTERISK: '*', /* * */ + + // Non-alphabetic chars. + CHAR_AMPERSAND: '&', /* & */ + CHAR_AT: '@', /* @ */ + CHAR_BACKSLASH: '\\', /* \ */ + CHAR_BACKTICK: '`', /* ` */ + CHAR_CARRIAGE_RETURN: '\r', /* \r */ + CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */ + CHAR_COLON: ':', /* : */ + CHAR_COMMA: ',', /* , */ + CHAR_DOLLAR: '$', /* . */ + CHAR_DOT: '.', /* . */ + CHAR_DOUBLE_QUOTE: '"', /* " */ + CHAR_EQUAL: '=', /* = */ + CHAR_EXCLAMATION_MARK: '!', /* ! */ + CHAR_FORM_FEED: '\f', /* \f */ + CHAR_FORWARD_SLASH: '/', /* / */ + CHAR_HASH: '#', /* # */ + CHAR_HYPHEN_MINUS: '-', /* - */ + CHAR_LEFT_ANGLE_BRACKET: '<', /* < */ + CHAR_LEFT_CURLY_BRACE: '{', /* { */ + CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */ + CHAR_LINE_FEED: '\n', /* \n */ + CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */ + CHAR_PERCENT: '%', /* % */ + CHAR_PLUS: '+', /* + */ + CHAR_QUESTION_MARK: '?', /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */ + CHAR_RIGHT_CURLY_BRACE: '}', /* } */ + CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */ + CHAR_SEMICOLON: ';', /* ; */ + CHAR_SINGLE_QUOTE: '\'', /* ' */ + CHAR_SPACE: ' ', /* */ + CHAR_TAB: '\t', /* \t */ + CHAR_UNDERSCORE: '_', /* _ */ + CHAR_VERTICAL_LINE: '|', /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */ }; + +/***/ }), +/* 322 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = __webpack_require__(323); + + +/***/ }), +/* 323 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +const path = __webpack_require__(4); +const scan = __webpack_require__(324); +const parse = __webpack_require__(327); +const utils = __webpack_require__(325); +const constants = __webpack_require__(326); +const isObject = val => val && typeof val === 'object' && !Array.isArray(val); + /** - * Returns true if the given `string` contains the given pattern. Similar - * to [.isMatch](#isMatch) but the pattern can match any part of the string. + * Creates a matcher function from one or more glob patterns. The + * returned function takes a string to match as its first argument, + * and returns true if the string is a match. The returned matcher + * function also takes a boolean as the second argument that, when true, + * returns an object with additional information. * * ```js - * var mm = require('micromatch'); - * // mm.contains(string, pattern[, options]); + * const picomatch = require('picomatch'); + * // picomatch(glob[, options]); * - * console.log(mm.contains('aa/bb/cc', '*b')); - * //=> true - * console.log(mm.contains('aa/bb/cc', '*d')); - * //=> false + * const isMatch = picomatch('*.!(*a)'); + * console.log(isMatch('a.a')); //=> false + * console.log(isMatch('a.b')); //=> true * ``` - * @param {String} `str` The string to match. - * @param {String|Array} `patterns` Glob pattern to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if the patter matches any part of `str`. + * @name picomatch + * @param {String|Array} `globs` One or more glob patterns. + * @param {Object=} `options` + * @return {Function=} Returns a matcher function. * @api public */ -micromatch.contains = (str, pattern, options) => { - if (typeof str !== 'string') { - throw new TypeError(`Expected a string: "${util.inspect(str)}"`); +const picomatch = (glob, options, returnState = false) => { + if (Array.isArray(glob)) { + const fns = glob.map(input => picomatch(input, options, returnState)); + const arrayMatcher = str => { + for (const isMatch of fns) { + const state = isMatch(str); + if (state) return state; + } + return false; + }; + return arrayMatcher; } - if (Array.isArray(pattern)) { - return pattern.some(p => micromatch.contains(str, p, options)); + const isState = isObject(glob) && glob.tokens && glob.input; + + if (glob === '' || (typeof glob !== 'string' && !isState)) { + throw new TypeError('Expected pattern to be a non-empty string'); } - if (typeof pattern === 'string') { - if (isEmptyString(str) || isEmptyString(pattern)) { - return false; + const opts = options || {}; + const posix = utils.isWindows(options); + const regex = isState + ? picomatch.compileRe(glob, options) + : picomatch.makeRe(glob, options, false, true); + + const state = regex.state; + delete regex.state; + + let isIgnored = () => false; + if (opts.ignore) { + const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null }; + isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); + } + + const matcher = (input, returnObject = false) => { + const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix }); + const result = { glob, state, regex, posix, input, output, match, isMatch }; + + if (typeof opts.onResult === 'function') { + opts.onResult(result); } - if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) { - return true; + if (isMatch === false) { + result.isMatch = false; + return returnObject ? result : false; + } + + if (isIgnored(input)) { + if (typeof opts.onIgnore === 'function') { + opts.onIgnore(result); + } + result.isMatch = false; + return returnObject ? result : false; + } + + if (typeof opts.onMatch === 'function') { + opts.onMatch(result); } + return returnObject ? result : true; + }; + + if (returnState) { + matcher.state = state; } - return micromatch.isMatch(str, pattern, { ...options, contains: true }); + return matcher; }; /** - * Filter the keys of the given object with the given `glob` pattern - * and `options`. Does not attempt to match nested keys. If you need this feature, - * use [glob-object][] instead. + * Test `input` with the given `regex`. This is used by the main + * `picomatch()` function to test the input string. * * ```js - * const mm = require('micromatch'); - * // mm.matchKeys(object, patterns[, options]); + * const picomatch = require('picomatch'); + * // picomatch.test(input, regex[, options]); * - * const obj = { aa: 'a', ab: 'b', ac: 'c' }; - * console.log(mm.matchKeys(obj, '*b')); - * //=> { ab: 'b' } + * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); + * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } * ``` - * @param {Object} `object` The object with keys to filter. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Object} Returns an object with only keys that match the given patterns. + * @param {String} `input` String to test. + * @param {RegExp} `regex` + * @return {Object} Returns an object with matching info. * @api public */ -micromatch.matchKeys = (obj, patterns, options) => { - if (!utils.isObject(obj)) { - throw new TypeError('Expected the first argument to be an object'); +picomatch.test = (input, regex, options, { glob, posix } = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected input to be a string'); } - let keys = micromatch(Object.keys(obj), patterns, options); - let res = {}; - for (let key of keys) res[key] = obj[key]; - return res; + + if (input === '') { + return { isMatch: false, output: '' }; + } + + const opts = options || {}; + const format = opts.format || (posix ? utils.toPosixSlashes : null); + let match = input === glob; + let output = (match && format) ? format(input) : input; + + if (match === false) { + output = format ? format(input) : input; + match = output === glob; + } + + if (match === false || opts.capture === true) { + if (opts.matchBase === true || opts.basename === true) { + match = picomatch.matchBase(input, regex, options, posix); + } else { + match = regex.exec(output); + } + } + + return { isMatch: Boolean(match), match, output }; }; /** - * Returns true if some of the strings in the given `list` match any of the given glob `patterns`. + * Match the basename of a filepath. * * ```js - * const mm = require('micromatch'); - * // mm.some(list, patterns[, options]); - * - * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); - * // true - * console.log(mm.some(['foo.js'], ['*.js', '!foo.js'])); - * // false + * const picomatch = require('picomatch'); + * // picomatch.matchBase(input, glob[, options]); + * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true * ``` - * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` + * @param {String} `input` String to test. + * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe). + * @return {Boolean} * @api public */ -micromatch.some = (list, patterns, options) => { - let items = [].concat(list); - - for (let pattern of [].concat(patterns)) { - let isMatch = picomatch(String(pattern), options); - if (items.some(item => isMatch(item))) { - return true; - } - } - return false; +picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => { + const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); + return regex.test(path.basename(input)); }; /** - * Returns true if every string in the given `list` matches - * any of the given glob `patterns`. + * Returns true if **any** of the given glob `patterns` match the specified `string`. * * ```js - * const mm = require('micromatch'); - * // mm.every(list, patterns[, options]); + * const picomatch = require('picomatch'); + * // picomatch.isMatch(string, patterns[, options]); * - * console.log(mm.every('foo.js', ['foo.js'])); - * // true - * console.log(mm.every(['foo.js', 'bar.js'], ['*.js'])); - * // true - * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); - * // false - * console.log(mm.every(['foo.js'], ['*.js', '!foo.js'])); - * // false + * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true + * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false * ``` - * @param {String|Array} `list` The string or array of strings to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @param {String|Array} str The string to test. + * @param {String|Array} patterns One or more glob patterns to use for matching. + * @param {Object} [options] See available [options](#options). * @return {Boolean} Returns true if any patterns match `str` * @api public */ -micromatch.every = (list, patterns, options) => { - let items = [].concat(list); - - for (let pattern of [].concat(patterns)) { - let isMatch = picomatch(String(pattern), options); - if (!items.every(item => isMatch(item))) { - return false; - } - } - return true; -}; +picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); /** - * Returns true if **all** of the given `patterns` match - * the specified string. + * Parse a glob pattern to create the source string for a regular + * expression. * * ```js - * const mm = require('micromatch'); - * // mm.all(string, patterns[, options]); - * - * console.log(mm.all('foo.js', ['foo.js'])); - * // true - * - * console.log(mm.all('foo.js', ['*.js', '!foo.js'])); - * // false - * - * console.log(mm.all('foo.js', ['*.js', 'foo.js'])); - * // true - * - * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); - * // true + * const picomatch = require('picomatch'); + * const result = picomatch.parse(pattern[, options]); * ``` - * @param {String|Array} `str` The string to test. - * @param {String|Array} `patterns` One or more glob patterns to use for matching. - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns true if any patterns match `str` + * @param {String} `pattern` + * @param {Object} `options` + * @return {Object} Returns an object with useful properties and output to be used as a regex source string. * @api public */ -micromatch.all = (str, patterns, options) => { - if (typeof str !== 'string') { - throw new TypeError(`Expected a string: "${util.inspect(str)}"`); - } - - return [].concat(patterns).every(p => picomatch(p, options)(str)); +picomatch.parse = (pattern, options) => { + if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options)); + return parse(pattern, { ...options, fastpaths: false }); }; /** - * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match. + * Scan a glob pattern to separate the pattern into segments. * * ```js - * const mm = require('micromatch'); - * // mm.capture(pattern, string[, options]); + * const picomatch = require('picomatch'); + * // picomatch.scan(input[, options]); * - * console.log(mm.capture('test/*.js', 'test/foo.js')); - * //=> ['foo'] - * console.log(mm.capture('test/*.js', 'foo/bar.css')); - * //=> null + * const result = picomatch.scan('!./foo/*.js'); + * console.log(result); + * { prefix: '!./', + * input: '!./foo/*.js', + * start: 3, + * base: 'foo', + * glob: '*.js', + * isBrace: false, + * isBracket: false, + * isGlob: true, + * isExtglob: false, + * isGlobstar: false, + * negated: true } * ``` - * @param {String} `glob` Glob pattern to use for matching. - * @param {String} `input` String to match - * @param {Object} `options` See available [options](#options) for changing how matches are performed - * @return {Boolean} Returns an array of captures if the input matches the glob pattern, otherwise `null`. + * @param {String} `input` Glob pattern to scan. + * @param {Object} `options` + * @return {Object} Returns an object with * @api public */ -micromatch.capture = (glob, input, options) => { - let posix = utils.isWindows(options); - let regex = picomatch.makeRe(String(glob), { ...options, capture: true }); - let match = regex.exec(posix ? utils.toPosixSlashes(input) : input); - - if (match) { - return match.slice(1).map(v => v === void 0 ? '' : v); - } -}; +picomatch.scan = (input, options) => scan(input, options); /** - * Create a regular expression from the given glob `pattern`. + * Create a regular expression from a parsed glob pattern. * * ```js - * const mm = require('micromatch'); - * // mm.makeRe(pattern[, options]); + * const picomatch = require('picomatch'); + * const state = picomatch.parse('*.js'); + * // picomatch.compileRe(state[, options]); * - * console.log(mm.makeRe('*.js')); - * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ + * console.log(picomatch.compileRe(state)); + * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ * ``` - * @param {String} `pattern` A glob pattern to convert to regex. + * @param {String} `state` The object returned from the `.parse` method. * @param {Object} `options` * @return {RegExp} Returns a regex created from the given pattern. * @api public */ -micromatch.makeRe = (...args) => picomatch.makeRe(...args); +picomatch.compileRe = (parsed, options, returnOutput = false, returnState = false) => { + if (returnOutput === true) { + return parsed.output; + } -/** - * Scan a glob pattern to separate the pattern into segments. Used - * by the [split](#split) method. - * - * ```js - * const mm = require('micromatch'); - * const state = mm.scan(pattern[, options]); - * ``` - * @param {String} `pattern` - * @param {Object} `options` - * @return {Object} Returns an object with - * @api public - */ + const opts = options || {}; + const prepend = opts.contains ? '' : '^'; + const append = opts.contains ? '' : '$'; -micromatch.scan = (...args) => picomatch.scan(...args); + let source = `${prepend}(?:${parsed.output})${append}`; + if (parsed && parsed.negated === true) { + source = `^(?!${source}).*$`; + } -/** - * Parse a glob pattern to create the source string for a regular - * expression. - * - * ```js - * const mm = require('micromatch'); - * const state = mm(pattern[, options]); - * ``` - * @param {String} `glob` - * @param {Object} `options` - * @return {Object} Returns an object with useful properties and output to be used as regex source string. - * @api public - */ + const regex = picomatch.toRegex(source, options); + if (returnState === true) { + regex.state = parsed; + } -micromatch.parse = (patterns, options) => { - let res = []; - for (let pattern of [].concat(patterns || [])) { - for (let str of braces(String(pattern), options)) { - res.push(picomatch.parse(str, options)); - } + return regex; +}; + +picomatch.makeRe = (input, options, returnOutput = false, returnState = false) => { + if (!input || typeof input !== 'string') { + throw new TypeError('Expected a non-empty string'); } - return res; + + const opts = options || {}; + let parsed = { negated: false, fastpaths: true }; + let prefix = ''; + let output; + + if (input.startsWith('./')) { + input = input.slice(2); + prefix = parsed.prefix = './'; + } + + if (opts.fastpaths !== false && (input[0] === '.' || input[0] === '*')) { + output = parse.fastpaths(input, options); + } + + if (output === undefined) { + parsed = parse(input, options); + parsed.prefix = prefix + (parsed.prefix || ''); + } else { + parsed.output = output; + } + + return picomatch.compileRe(parsed, options, returnOutput, returnState); }; /** - * Process the given brace `pattern`. + * Create a regular expression from the given regex source string. * * ```js - * const { braces } = require('micromatch'); - * console.log(braces('foo/{a,b,c}/bar')); - * //=> [ 'foo/(a|b|c)/bar' ] + * const picomatch = require('picomatch'); + * // picomatch.toRegex(source[, options]); * - * console.log(braces('foo/{a,b,c}/bar', { expand: true })); - * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ] + * const { output } = picomatch.parse('*.js'); + * console.log(picomatch.toRegex(output)); + * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ * ``` - * @param {String} `pattern` String with brace pattern to process. - * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options. - * @return {Array} + * @param {String} `source` Regular expression source string. + * @param {Object} `options` + * @return {RegExp} * @api public */ -micromatch.braces = (pattern, options) => { - if (typeof pattern !== 'string') throw new TypeError('Expected a string'); - if ((options && options.nobrace === true) || !/\{.*\}/.test(pattern)) { - return [pattern]; +picomatch.toRegex = (source, options) => { + try { + const opts = options || {}; + return new RegExp(source, opts.flags || (opts.nocase ? 'i' : '')); + } catch (err) { + if (options && options.debug === true) throw err; + return /$^/; } - return braces(pattern, options); }; /** - * Expand braces + * Picomatch constants. + * @return {Object} */ -micromatch.braceExpand = (pattern, options) => { - if (typeof pattern !== 'string') throw new TypeError('Expected a string'); - return micromatch.braces(pattern, { ...options, expand: true }); -}; +picomatch.constants = constants; /** - * Expose micromatch + * Expose "picomatch" */ -module.exports = micromatch; +module.exports = picomatch; /***/ }), -/* 317 */ +/* 324 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const stringify = __webpack_require__(318); -const compile = __webpack_require__(320); -const expand = __webpack_require__(324); -const parse = __webpack_require__(325); - -/** - * Expand the given pattern or create a regex-compatible string. - * - * ```js - * const braces = require('braces'); - * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)'] - * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c'] - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {String} - * @api public - */ - -const braces = (input, options = {}) => { - let output = []; - - if (Array.isArray(input)) { - for (let pattern of input) { - let result = braces.create(pattern, options); - if (Array.isArray(result)) { - output.push(...result); - } else { - output.push(result); - } - } - } else { - output = [].concat(braces.create(input, options)); - } +const utils = __webpack_require__(325); +const { + CHAR_ASTERISK, /* * */ + CHAR_AT, /* @ */ + CHAR_BACKWARD_SLASH, /* \ */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_EXCLAMATION_MARK, /* ! */ + CHAR_FORWARD_SLASH, /* / */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_PLUS, /* + */ + CHAR_QUESTION_MARK, /* ? */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_RIGHT_SQUARE_BRACKET /* ] */ +} = __webpack_require__(326); - if (options && options.expand === true && options.nodupes === true) { - output = [...new Set(output)]; - } - return output; +const isPathSeparator = code => { + return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; }; -/** - * Parse the given `str` with the given `options`. - * - * ```js - * // braces.parse(pattern, [, options]); - * const ast = braces.parse('a/{b,c}/d'); - * console.log(ast); - * ``` - * @param {String} pattern Brace pattern to parse - * @param {Object} options - * @return {Object} Returns an AST - * @api public - */ - -braces.parse = (input, options = {}) => parse(input, options); - -/** - * Creates a braces string from an AST, or an AST node. - * - * ```js - * const braces = require('braces'); - * let ast = braces.parse('foo/{a,b}/bar'); - * console.log(stringify(ast.nodes[2])); //=> '{a,b}' - * ``` - * @param {String} `input` Brace pattern or AST. - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ - -braces.stringify = (input, options = {}) => { - if (typeof input === 'string') { - return stringify(braces.parse(input, options), options); +const depth = token => { + if (token.isPrefix !== true) { + token.depth = token.isGlobstar ? Infinity : 1; } - return stringify(input, options); }; /** - * Compiles a brace pattern into a regex-compatible, optimized string. - * This method is called by the main [braces](#braces) function by default. + * Quickly scans a glob pattern and returns an object with a handful of + * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists), + * `glob` (the actual pattern), and `negated` (true if the path starts with `!`). * * ```js - * const braces = require('braces'); - * console.log(braces.compile('a/{b,c}/d')); - * //=> ['a/(b|c)/d'] + * const pm = require('picomatch'); + * console.log(pm.scan('foo/bar/*.js')); + * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' } * ``` - * @param {String} `input` Brace pattern or AST. + * @param {String} `str` * @param {Object} `options` - * @return {Array} Returns an array of expanded values. + * @return {Object} Returns an object with tokens and regex source string. * @api public */ -braces.compile = (input, options = {}) => { - if (typeof input === 'string') { - input = braces.parse(input, options); - } - return compile(input, options); -}; +const scan = (input, options) => { + const opts = options || {}; -/** - * Expands a brace pattern into an array. This method is called by the - * main [braces](#braces) function when `options.expand` is true. Before - * using this method it's recommended that you read the [performance notes](#performance)) - * and advantages of using [.compile](#compile) instead. - * - * ```js - * const braces = require('braces'); - * console.log(braces.expand('a/{b,c}/d')); - * //=> ['a/b/d', 'a/c/d']; - * ``` - * @param {String} `pattern` Brace pattern - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ + const length = input.length - 1; + const scanToEnd = opts.parts === true || opts.scanToEnd === true; + const slashes = []; + const tokens = []; + const parts = []; -braces.expand = (input, options = {}) => { - if (typeof input === 'string') { - input = braces.parse(input, options); - } + let str = input; + let index = -1; + let start = 0; + let lastIndex = 0; + let isBrace = false; + let isBracket = false; + let isGlob = false; + let isExtglob = false; + let isGlobstar = false; + let braceEscaped = false; + let backslashes = false; + let negated = false; + let finished = false; + let braces = 0; + let prev; + let code; + let token = { value: '', depth: 0, isGlob: false }; - let result = expand(input, options); + const eos = () => index >= length; + const peek = () => str.charCodeAt(index + 1); + const advance = () => { + prev = code; + return str.charCodeAt(++index); + }; - // filter out empty strings if specified - if (options.noempty === true) { - result = result.filter(Boolean); - } + while (index < length) { + code = advance(); + let next; - // filter out duplicates if specified - if (options.nodupes === true) { - result = [...new Set(result)]; - } + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance(); - return result; -}; + if (code === CHAR_LEFT_CURLY_BRACE) { + braceEscaped = true; + } + continue; + } -/** - * Processes a brace pattern and returns either an expanded array - * (if `options.expand` is true), a highly optimized regex-compatible string. - * This method is called by the main [braces](#braces) function. - * - * ```js - * const braces = require('braces'); - * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) - * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' - * ``` - * @param {String} `pattern` Brace pattern - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ + if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { + braces++; -braces.create = (input, options = {}) => { - if (input === '' || input.length < 3) { - return [input]; - } + while (eos() !== true && (code = advance())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance(); + continue; + } - return options.expand !== true - ? braces.compile(input, options) - : braces.expand(input, options); -}; + if (code === CHAR_LEFT_CURLY_BRACE) { + braces++; + continue; + } -/** - * Expose "braces" - */ + if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) { + isBrace = token.isBrace = true; + isGlob = token.isGlob = true; + finished = true; -module.exports = braces; + if (scanToEnd === true) { + continue; + } + break; + } -/***/ }), -/* 318 */ -/***/ (function(module, exports, __webpack_require__) { + if (braceEscaped !== true && code === CHAR_COMMA) { + isBrace = token.isBrace = true; + isGlob = token.isGlob = true; + finished = true; -"use strict"; + if (scanToEnd === true) { + continue; + } + break; + } -const utils = __webpack_require__(319); + if (code === CHAR_RIGHT_CURLY_BRACE) { + braces--; -module.exports = (ast, options = {}) => { - let stringify = (node, parent = {}) => { - let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); - let invalidNode = node.invalid === true && options.escapeInvalid === true; - let output = ''; + if (braces === 0) { + braceEscaped = false; + isBrace = token.isBrace = true; + finished = true; + break; + } + } + } - if (node.value) { - if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { - return '\\' + node.value; + if (scanToEnd === true) { + continue; } - return node.value; - } - if (node.value) { - return node.value; + break; } - if (node.nodes) { - for (let child of node.nodes) { - output += stringify(child); + if (code === CHAR_FORWARD_SLASH) { + slashes.push(index); + tokens.push(token); + token = { value: '', depth: 0, isGlob: false }; + + if (finished === true) continue; + if (prev === CHAR_DOT && index === (start + 1)) { + start += 2; + continue; } - } - return output; - }; - return stringify(ast); -}; + lastIndex = index + 1; + continue; + } + if (opts.noext !== true) { + const isExtglobChar = code === CHAR_PLUS + || code === CHAR_AT + || code === CHAR_ASTERISK + || code === CHAR_QUESTION_MARK + || code === CHAR_EXCLAMATION_MARK; + if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) { + isGlob = token.isGlob = true; + isExtglob = token.isExtglob = true; + finished = true; -/***/ }), -/* 319 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.isInteger = num => { - if (typeof num === 'number') { - return Number.isInteger(num); - } - if (typeof num === 'string' && num.trim() !== '') { - return Number.isInteger(Number(num)); - } - return false; -}; - -/** - * Find a node of the given type - */ - -exports.find = (node, type) => node.nodes.find(node => node.type === type); + if (scanToEnd === true) { + while (eos() !== true && (code = advance())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance(); + continue; + } -/** - * Find a node of the given type - */ + if (code === CHAR_RIGHT_PARENTHESES) { + isGlob = token.isGlob = true; + finished = true; + break; + } + } + continue; + } + break; + } + } -exports.exceedsLimit = (min, max, step = 1, limit) => { - if (limit === false) return false; - if (!exports.isInteger(min) || !exports.isInteger(max)) return false; - return ((Number(max) - Number(min)) / Number(step)) >= limit; -}; + if (code === CHAR_ASTERISK) { + if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true; + isGlob = token.isGlob = true; + finished = true; -/** - * Escape the given node with '\\' before node.value - */ + if (scanToEnd === true) { + continue; + } + break; + } -exports.escapeNode = (block, n = 0, type) => { - let node = block.nodes[n]; - if (!node) return; + if (code === CHAR_QUESTION_MARK) { + isGlob = token.isGlob = true; + finished = true; - if ((type && node.type === type) || node.type === 'open' || node.type === 'close') { - if (node.escaped !== true) { - node.value = '\\' + node.value; - node.escaped = true; + if (scanToEnd === true) { + continue; + } + break; } - } -}; -/** - * Returns true if the given brace node should be enclosed in literal braces - */ + if (code === CHAR_LEFT_SQUARE_BRACKET) { + while (eos() !== true && (next = advance())) { + if (next === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance(); + continue; + } -exports.encloseBrace = node => { - if (node.type !== 'brace') return false; - if ((node.commas >> 0 + node.ranges >> 0) === 0) { - node.invalid = true; - return true; - } - return false; -}; + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + isBracket = token.isBracket = true; + isGlob = token.isGlob = true; + finished = true; -/** - * Returns true if a brace node is invalid. - */ + if (scanToEnd === true) { + continue; + } + break; + } + } + } -exports.isInvalidBrace = block => { - if (block.type !== 'brace') return false; - if (block.invalid === true || block.dollar) return true; - if ((block.commas >> 0 + block.ranges >> 0) === 0) { - block.invalid = true; - return true; - } - if (block.open !== true || block.close !== true) { - block.invalid = true; - return true; - } - return false; -}; + if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) { + negated = token.negated = true; + start++; + continue; + } -/** - * Returns true if a node is an open or close node - */ + if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) { + isGlob = token.isGlob = true; -exports.isOpenOrClose = node => { - if (node.type === 'open' || node.type === 'close') { - return true; - } - return node.open === true || node.close === true; -}; + if (scanToEnd === true) { + while (eos() !== true && (code = advance())) { + if (code === CHAR_LEFT_PARENTHESES) { + backslashes = token.backslashes = true; + code = advance(); + continue; + } -/** - * Reduce an array of text nodes. - */ + if (code === CHAR_RIGHT_PARENTHESES) { + finished = true; + break; + } + } + continue; + } + break; + } -exports.reduce = nodes => nodes.reduce((acc, node) => { - if (node.type === 'text') acc.push(node.value); - if (node.type === 'range') node.type = 'text'; - return acc; -}, []); + if (isGlob === true) { + finished = true; -/** - * Flatten an array - */ + if (scanToEnd === true) { + continue; + } -exports.flatten = (...args) => { - const result = []; - const flat = arr => { - for (let i = 0; i < arr.length; i++) { - let ele = arr[i]; - Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele); + break; } - return result; - }; - flat(args); - return result; -}; - - -/***/ }), -/* 320 */ -/***/ (function(module, exports, __webpack_require__) { + } -"use strict"; + if (opts.noext === true) { + isExtglob = false; + isGlob = false; + } + let base = str; + let prefix = ''; + let glob = ''; -const fill = __webpack_require__(321); -const utils = __webpack_require__(319); + if (start > 0) { + prefix = str.slice(0, start); + str = str.slice(start); + lastIndex -= start; + } -const compile = (ast, options = {}) => { - let walk = (node, parent = {}) => { - let invalidBlock = utils.isInvalidBrace(parent); - let invalidNode = node.invalid === true && options.escapeInvalid === true; - let invalid = invalidBlock === true || invalidNode === true; - let prefix = options.escapeInvalid === true ? '\\' : ''; - let output = ''; + if (base && isGlob === true && lastIndex > 0) { + base = str.slice(0, lastIndex); + glob = str.slice(lastIndex); + } else if (isGlob === true) { + base = ''; + glob = str; + } else { + base = str; + } - if (node.isOpen === true) { - return prefix + node.value; - } - if (node.isClose === true) { - return prefix + node.value; + if (base && base !== '' && base !== '/' && base !== str) { + if (isPathSeparator(base.charCodeAt(base.length - 1))) { + base = base.slice(0, -1); } + } - if (node.type === 'open') { - return invalid ? (prefix + node.value) : '('; - } + if (opts.unescape === true) { + if (glob) glob = utils.removeBackslashes(glob); - if (node.type === 'close') { - return invalid ? (prefix + node.value) : ')'; + if (base && backslashes === true) { + base = utils.removeBackslashes(base); } + } - if (node.type === 'comma') { - return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|'); - } + const state = { + prefix, + input, + start, + base, + glob, + isBrace, + isBracket, + isGlob, + isExtglob, + isGlobstar, + negated + }; - if (node.value) { - return node.value; + if (opts.tokens === true) { + state.maxDepth = 0; + if (!isPathSeparator(code)) { + tokens.push(token); } + state.tokens = tokens; + } - if (node.nodes && node.ranges > 0) { - let args = utils.reduce(node.nodes); - let range = fill(...args, { ...options, wrap: false, toRegex: true }); + if (opts.parts === true || opts.tokens === true) { + let prevIndex; - if (range.length !== 0) { - return args.length > 1 && range.length > 1 ? `(${range})` : range; + for (let idx = 0; idx < slashes.length; idx++) { + const n = prevIndex ? prevIndex + 1 : start; + const i = slashes[idx]; + const value = input.slice(n, i); + if (opts.tokens) { + if (idx === 0 && start !== 0) { + tokens[idx].isPrefix = true; + tokens[idx].value = prefix; + } else { + tokens[idx].value = value; + } + depth(tokens[idx]); + state.maxDepth += tokens[idx].depth; } + if (idx !== 0 || value !== '') { + parts.push(value); + } + prevIndex = i; } - if (node.nodes) { - for (let child of node.nodes) { - output += walk(child, node); + if (prevIndex && prevIndex + 1 < input.length) { + const value = input.slice(prevIndex + 1); + parts.push(value); + + if (opts.tokens) { + tokens[tokens.length - 1].value = value; + depth(tokens[tokens.length - 1]); + state.maxDepth += tokens[tokens.length - 1].depth; } } - return output; - }; - return walk(ast); + state.slashes = slashes; + state.parts = parts; + } + + return state; }; -module.exports = compile; +module.exports = scan; /***/ }), -/* 321 */ +/* 325 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - */ - - - -const util = __webpack_require__(111); -const toRegexRange = __webpack_require__(322); - -const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); -const transform = toNumber => { - return value => toNumber === true ? Number(value) : String(value); -}; -const isValidValue = value => { - return typeof value === 'number' || (typeof value === 'string' && value !== ''); -}; +const path = __webpack_require__(4); +const win32 = process.platform === 'win32'; +const { + REGEX_BACKSLASH, + REGEX_REMOVE_BACKSLASH, + REGEX_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_GLOBAL +} = __webpack_require__(326); -const isNumber = num => Number.isInteger(+num); +exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); +exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); +exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str); +exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1'); +exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/'); -const zeros = input => { - let value = `${input}`; - let index = -1; - if (value[0] === '-') value = value.slice(1); - if (value === '0') return false; - while (value[++index] === '0'); - return index > 0; +exports.removeBackslashes = str => { + return str.replace(REGEX_REMOVE_BACKSLASH, match => { + return match === '\\' ? '' : match; + }); }; -const stringify = (start, end, options) => { - if (typeof start === 'string' || typeof end === 'string') { +exports.supportsLookbehinds = () => { + const segs = process.version.slice(1).split('.').map(Number); + if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) { return true; } - return options.stringify === true; + return false; }; -const pad = (input, maxLength, toNumber) => { - if (maxLength > 0) { - let dash = input[0] === '-' ? '-' : ''; - if (dash) input = input.slice(1); - input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0')); - } - if (toNumber === false) { - return String(input); +exports.isWindows = options => { + if (options && typeof options.windows === 'boolean') { + return options.windows; } - return input; + return win32 === true || path.sep === '\\'; }; -const toMaxLen = (input, maxLength) => { - let negative = input[0] === '-' ? '-' : ''; - if (negative) { - input = input.slice(1); - maxLength--; - } - while (input.length < maxLength) input = '0' + input; - return negative ? ('-' + input) : input; +exports.escapeLast = (input, char, lastIdx) => { + const idx = input.lastIndexOf(char, lastIdx); + if (idx === -1) return input; + if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1); + return `${input.slice(0, idx)}\\${input.slice(idx)}`; }; -const toSequence = (parts, options) => { - parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); - parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); +exports.removePrefix = (input, state = {}) => { + let output = input; + if (output.startsWith('./')) { + output = output.slice(2); + state.prefix = './'; + } + return output; +}; - let prefix = options.capture ? '' : '?:'; - let positives = ''; - let negatives = ''; - let result; +exports.wrapOutput = (input, state = {}, options = {}) => { + const prepend = options.contains ? '' : '^'; + const append = options.contains ? '' : '$'; - if (parts.positives.length) { - positives = parts.positives.join('|'); + let output = `${prepend}(?:${input})${append}`; + if (state.negated === true) { + output = `(?:^(?!${output}).*$)`; } + return output; +}; - if (parts.negatives.length) { - negatives = `-(${prefix}${parts.negatives.join('|')})`; - } - if (positives && negatives) { - result = `${positives}|${negatives}`; - } else { - result = positives || negatives; - } +/***/ }), +/* 326 */ +/***/ (function(module, exports, __webpack_require__) { - if (options.wrap) { - return `(${prefix}${result})`; - } +"use strict"; - return result; -}; -const toRange = (a, b, isNumbers, options) => { - if (isNumbers) { - return toRegexRange(a, b, { wrap: false, ...options }); - } +const path = __webpack_require__(4); +const WIN_SLASH = '\\\\/'; +const WIN_NO_SLASH = `[^${WIN_SLASH}]`; - let start = String.fromCharCode(a); - if (a === b) return start; +/** + * Posix glob regex + */ - let stop = String.fromCharCode(b); - return `[${start}-${stop}]`; -}; +const DOT_LITERAL = '\\.'; +const PLUS_LITERAL = '\\+'; +const QMARK_LITERAL = '\\?'; +const SLASH_LITERAL = '\\/'; +const ONE_CHAR = '(?=.)'; +const QMARK = '[^/]'; +const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; +const START_ANCHOR = `(?:^|${SLASH_LITERAL})`; +const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; +const NO_DOT = `(?!${DOT_LITERAL})`; +const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; +const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; +const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; +const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; +const STAR = `${QMARK}*?`; -const toRegex = (start, end, options) => { - if (Array.isArray(start)) { - let wrap = options.wrap === true; - let prefix = options.capture ? '' : '?:'; - return wrap ? `(${prefix}${start.join('|')})` : start.join('|'); - } - return toRegexRange(start, end, options); +const POSIX_CHARS = { + DOT_LITERAL, + PLUS_LITERAL, + QMARK_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + QMARK, + END_ANCHOR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK_NO_DOT, + STAR, + START_ANCHOR }; -const rangeError = (...args) => { - return new RangeError('Invalid range arguments: ' + util.inspect(...args)); -}; +/** + * Windows glob regex + */ -const invalidRange = (start, end, options) => { - if (options.strictRanges === true) throw rangeError([start, end]); - return []; -}; +const WINDOWS_CHARS = { + ...POSIX_CHARS, -const invalidStep = (step, options) => { - if (options.strictRanges === true) { - throw new TypeError(`Expected step "${step}" to be a number`); - } - return []; + SLASH_LITERAL: `[${WIN_SLASH}]`, + QMARK: WIN_NO_SLASH, + STAR: `${WIN_NO_SLASH}*?`, + DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, + NO_DOT: `(?!${DOT_LITERAL})`, + NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, + NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + QMARK_NO_DOT: `[^.${WIN_SLASH}]`, + START_ANCHOR: `(?:^|[${WIN_SLASH}])`, + END_ANCHOR: `(?:[${WIN_SLASH}]|$)` }; -const fillNumbers = (start, end, step = 1, options = {}) => { - let a = Number(start); - let b = Number(end); +/** + * POSIX Bracket Regex + */ - if (!Number.isInteger(a) || !Number.isInteger(b)) { - if (options.strictRanges === true) throw rangeError([start, end]); - return []; - } - - // fix negative zero - if (a === 0) a = 0; - if (b === 0) b = 0; - - let descending = a > b; - let startString = String(start); - let endString = String(end); - let stepString = String(step); - step = Math.max(Math.abs(step), 1); - - let padded = zeros(startString) || zeros(endString) || zeros(stepString); - let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0; - let toNumber = padded === false && stringify(start, end, options) === false; - let format = options.transform || transform(toNumber); - - if (options.toRegex && step === 1) { - return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options); - } - - let parts = { negatives: [], positives: [] }; - let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num)); - let range = []; - let index = 0; - - while (descending ? a >= b : a <= b) { - if (options.toRegex === true && step > 1) { - push(a); - } else { - range.push(pad(format(a, index), maxLen, toNumber)); - } - a = descending ? a - step : a + step; - index++; - } - - if (options.toRegex === true) { - return step > 1 - ? toSequence(parts, options) - : toRegex(range, null, { wrap: false, ...options }); - } - - return range; +const POSIX_REGEX_SOURCE = { + alnum: 'a-zA-Z0-9', + alpha: 'a-zA-Z', + ascii: '\\x00-\\x7F', + blank: ' \\t', + cntrl: '\\x00-\\x1F\\x7F', + digit: '0-9', + graph: '\\x21-\\x7E', + lower: 'a-z', + print: '\\x20-\\x7E ', + punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', + space: ' \\t\\r\\n\\v\\f', + upper: 'A-Z', + word: 'A-Za-z0-9_', + xdigit: 'A-Fa-f0-9' }; -const fillLetters = (start, end, step = 1, options = {}) => { - if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) { - return invalidRange(start, end, options); - } - - - let format = options.transform || (val => String.fromCharCode(val)); - let a = `${start}`.charCodeAt(0); - let b = `${end}`.charCodeAt(0); - - let descending = a > b; - let min = Math.min(a, b); - let max = Math.max(a, b); +module.exports = { + MAX_LENGTH: 1024 * 64, + POSIX_REGEX_SOURCE, - if (options.toRegex && step === 1) { - return toRange(min, max, false, options); - } + // regular expressions + REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, + REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, + REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, + REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, + REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, + REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, - let range = []; - let index = 0; + // Replace globs with equivalent patterns to reduce parsing time. + REPLACEMENTS: { + '***': '*', + '**/**': '**', + '**/**/**': '**' + }, - while (descending ? a >= b : a <= b) { - range.push(format(a, index)); - a = descending ? a - step : a + step; - index++; - } + // Digits + CHAR_0: 48, /* 0 */ + CHAR_9: 57, /* 9 */ - if (options.toRegex === true) { - return toRegex(range, null, { wrap: false, options }); - } + // Alphabet chars. + CHAR_UPPERCASE_A: 65, /* A */ + CHAR_LOWERCASE_A: 97, /* a */ + CHAR_UPPERCASE_Z: 90, /* Z */ + CHAR_LOWERCASE_Z: 122, /* z */ - return range; -}; + CHAR_LEFT_PARENTHESES: 40, /* ( */ + CHAR_RIGHT_PARENTHESES: 41, /* ) */ -const fill = (start, end, step, options = {}) => { - if (end == null && isValidValue(start)) { - return [start]; - } + CHAR_ASTERISK: 42, /* * */ - if (!isValidValue(start) || !isValidValue(end)) { - return invalidRange(start, end, options); - } + // Non-alphabetic chars. + CHAR_AMPERSAND: 38, /* & */ + CHAR_AT: 64, /* @ */ + CHAR_BACKWARD_SLASH: 92, /* \ */ + CHAR_CARRIAGE_RETURN: 13, /* \r */ + CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */ + CHAR_COLON: 58, /* : */ + CHAR_COMMA: 44, /* , */ + CHAR_DOT: 46, /* . */ + CHAR_DOUBLE_QUOTE: 34, /* " */ + CHAR_EQUAL: 61, /* = */ + CHAR_EXCLAMATION_MARK: 33, /* ! */ + CHAR_FORM_FEED: 12, /* \f */ + CHAR_FORWARD_SLASH: 47, /* / */ + CHAR_GRAVE_ACCENT: 96, /* ` */ + CHAR_HASH: 35, /* # */ + CHAR_HYPHEN_MINUS: 45, /* - */ + CHAR_LEFT_ANGLE_BRACKET: 60, /* < */ + CHAR_LEFT_CURLY_BRACE: 123, /* { */ + CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */ + CHAR_LINE_FEED: 10, /* \n */ + CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */ + CHAR_PERCENT: 37, /* % */ + CHAR_PLUS: 43, /* + */ + CHAR_QUESTION_MARK: 63, /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */ + CHAR_RIGHT_CURLY_BRACE: 125, /* } */ + CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */ + CHAR_SEMICOLON: 59, /* ; */ + CHAR_SINGLE_QUOTE: 39, /* ' */ + CHAR_SPACE: 32, /* */ + CHAR_TAB: 9, /* \t */ + CHAR_UNDERSCORE: 95, /* _ */ + CHAR_VERTICAL_LINE: 124, /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */ - if (typeof step === 'function') { - return fill(start, end, 1, { transform: step }); - } + SEP: path.sep, - if (isObject(step)) { - return fill(start, end, 0, step); - } + /** + * Create EXTGLOB_CHARS + */ - let opts = { ...options }; - if (opts.capture === true) opts.wrap = true; - step = step || opts.step || 1; + extglobChars(chars) { + return { + '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` }, + '?': { type: 'qmark', open: '(?:', close: ')?' }, + '+': { type: 'plus', open: '(?:', close: ')+' }, + '*': { type: 'star', open: '(?:', close: ')*' }, + '@': { type: 'at', open: '(?:', close: ')' } + }; + }, - if (!isNumber(step)) { - if (step != null && !isObject(step)) return invalidStep(step, opts); - return fill(start, end, 1, step); - } + /** + * Create GLOB_CHARS + */ - if (isNumber(start) && isNumber(end)) { - return fillNumbers(start, end, step, opts); + globChars(win32) { + return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; } - - return fillLetters(start, end, Math.max(Math.abs(step), 1), opts); }; -module.exports = fill; - /***/ }), -/* 322 */ +/* 327 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - */ - -const isNumber = __webpack_require__(323); +const constants = __webpack_require__(326); +const utils = __webpack_require__(325); -const toRegexRange = (min, max, options) => { - if (isNumber(min) === false) { - throw new TypeError('toRegexRange: expected the first argument to be a number'); - } +/** + * Constants + */ - if (max === void 0 || min === max) { - return String(min); - } +const { + MAX_LENGTH, + POSIX_REGEX_SOURCE, + REGEX_NON_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_BACKREF, + REPLACEMENTS +} = constants; - if (isNumber(max) === false) { - throw new TypeError('toRegexRange: expected the second argument to be a number.'); - } +/** + * Helpers + */ - let opts = { relaxZeros: true, ...options }; - if (typeof opts.strictZeros === 'boolean') { - opts.relaxZeros = opts.strictZeros === false; +const expandRange = (args, options) => { + if (typeof options.expandRange === 'function') { + return options.expandRange(...args, options); } - let relax = String(opts.relaxZeros); - let shorthand = String(opts.shorthand); - let capture = String(opts.capture); - let wrap = String(opts.wrap); - let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap; + args.sort(); + const value = `[${args.join('-')}]`; - if (toRegexRange.cache.hasOwnProperty(cacheKey)) { - return toRegexRange.cache[cacheKey].result; + try { + /* eslint-disable-next-line no-new */ + new RegExp(value); + } catch (ex) { + return args.map(v => utils.escapeRegex(v)).join('..'); } - let a = Math.min(min, max); - let b = Math.max(min, max); + return value; +}; - if (Math.abs(a - b) === 1) { - let result = min + '|' + max; - if (opts.capture) { - return `(${result})`; - } - if (opts.wrap === false) { - return result; - } - return `(?:${result})`; - } +/** + * Create the message for a syntax error + */ - let isPadded = hasPadding(min) || hasPadding(max); - let state = { min, max, a, b }; - let positives = []; - let negatives = []; +const syntaxError = (type, char) => { + return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; +}; - if (isPadded) { - state.isPadded = isPadded; - state.maxLen = String(state.max).length; - } +/** + * Parse the given input string. + * @param {String} input + * @param {Object} options + * @return {Object} + */ - if (a < 0) { - let newMin = b < 0 ? Math.abs(b) : 1; - negatives = splitToPatterns(newMin, Math.abs(a), state, opts); - a = state.a = 0; +const parse = (input, options) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); } - if (b >= 0) { - positives = splitToPatterns(a, b, state, opts); - } + input = REPLACEMENTS[input] || input; - state.negatives = negatives; - state.positives = positives; - state.result = collatePatterns(negatives, positives, opts); + const opts = { ...options }; + const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - if (opts.capture === true) { - state.result = `(${state.result})`; - } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) { - state.result = `(?:${state.result})`; + let len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); } - toRegexRange.cache[cacheKey] = state; - return state.result; -}; + const bos = { type: 'bos', value: '', output: opts.prepend || '' }; + const tokens = [bos]; -function collatePatterns(neg, pos, options) { - let onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; - let onlyPositive = filterPatterns(pos, neg, '', false, options) || []; - let intersected = filterPatterns(neg, pos, '-?', true, options) || []; - let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); - return subpatterns.join('|'); -} + const capture = opts.capture ? '' : '?:'; + const win32 = utils.isWindows(options); -function splitToRanges(min, max) { - let nines = 1; - let zeros = 1; + // create constants based on platform, for windows or posix + const PLATFORM_CHARS = constants.globChars(win32); + const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); - let stop = countNines(min, nines); - let stops = new Set([max]); + const { + DOT_LITERAL, + PLUS_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK, + QMARK_NO_DOT, + STAR, + START_ANCHOR + } = PLATFORM_CHARS; - while (min <= stop && stop <= max) { - stops.add(stop); - nines += 1; - stop = countNines(min, nines); - } + const globstar = (opts) => { + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; - stop = countZeros(max + 1, zeros) - 1; + const nodot = opts.dot ? '' : NO_DOT; + const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; + let star = opts.bash === true ? globstar(opts) : STAR; - while (min < stop && stop <= max) { - stops.add(stop); - zeros += 1; - stop = countZeros(max + 1, zeros) - 1; + if (opts.capture) { + star = `(${star})`; } - stops = [...stops]; - stops.sort(compare); - return stops; -} + // minimatch options support + if (typeof opts.noext === 'boolean') { + opts.noextglob = opts.noext; + } -/** - * Convert a range to a regex pattern - * @param {Number} `start` - * @param {Number} `stop` - * @return {String} - */ + const state = { + input, + index: -1, + start: 0, + dot: opts.dot === true, + consumed: '', + output: '', + prefix: '', + backtrack: false, + negated: false, + brackets: 0, + braces: 0, + parens: 0, + quotes: 0, + globstar: false, + tokens + }; -function rangeToPattern(start, stop, options) { - if (start === stop) { - return { pattern: start, count: [], digits: 0 }; - } + input = utils.removePrefix(input, state); + len = input.length; - let zipped = zip(start, stop); - let digits = zipped.length; - let pattern = ''; - let count = 0; + const extglobs = []; + const braces = []; + const stack = []; + let prev = bos; + let value; - for (let i = 0; i < digits; i++) { - let [startDigit, stopDigit] = zipped[i]; + /** + * Tokenizing helpers + */ - if (startDigit === stopDigit) { - pattern += startDigit; + const eos = () => state.index === len - 1; + const peek = state.peek = (n = 1) => input[state.index + n]; + const advance = state.advance = () => input[++state.index]; + const remaining = () => input.slice(state.index + 1); + const consume = (value = '', num = 0) => { + state.consumed += value; + state.index += num; + }; + const append = token => { + state.output += token.output != null ? token.output : token.value; + consume(token.value); + }; - } else if (startDigit !== '0' || stopDigit !== '9') { - pattern += toCharacterClass(startDigit, stopDigit, options); + const negate = () => { + let count = 1; - } else { + while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) { + advance(); + state.start++; count++; } - } - if (count) { - pattern += options.shorthand === true ? '\\d' : '[0-9]'; - } + if (count % 2 === 0) { + return false; + } - return { pattern, count: [count], digits }; -} + state.negated = true; + state.start++; + return true; + }; -function splitToPatterns(min, max, tok, options) { - let ranges = splitToRanges(min, max); - let tokens = []; - let start = min; - let prev; + const increment = type => { + state[type]++; + stack.push(type); + }; - for (let i = 0; i < ranges.length; i++) { - let max = ranges[i]; - let obj = rangeToPattern(String(start), String(max), options); - let zeros = ''; + const decrement = type => { + state[type]--; + stack.pop(); + }; - if (!tok.isPadded && prev && prev.pattern === obj.pattern) { - if (prev.count.length > 1) { - prev.count.pop(); + /** + * Push tokens onto the tokens array. This helper speeds up + * tokenizing by 1) helping us avoid backtracking as much as possible, + * and 2) helping us avoid creating extra tokens when consecutive + * characters are plain text. This improves performance and simplifies + * lookbehinds. + */ + + const push = tok => { + if (prev.type === 'globstar') { + const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); + const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren')); + + if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { + state.output = state.output.slice(0, -prev.output.length); + prev.type = 'star'; + prev.value = '*'; + prev.output = star; + state.output += prev.output; } + } - prev.count.push(obj.count[0]); - prev.string = prev.pattern + toQuantifier(prev.count); - start = max + 1; - continue; + if (extglobs.length && tok.type !== 'paren' && !EXTGLOB_CHARS[tok.value]) { + extglobs[extglobs.length - 1].inner += tok.value; } - if (tok.isPadded) { - zeros = padZeros(max, tok, options); + if (tok.value || tok.output) append(tok); + if (prev && prev.type === 'text' && tok.type === 'text') { + prev.value += tok.value; + prev.output = (prev.output || '') + tok.value; + return; } - obj.string = zeros + obj.pattern + toQuantifier(obj.count); - tokens.push(obj); - start = max + 1; - prev = obj; - } + tok.prev = prev; + tokens.push(tok); + prev = tok; + }; - return tokens; -} + const extglobOpen = (type, value) => { + const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; -function filterPatterns(arr, comparison, prefix, intersection, options) { - let result = []; + token.prev = prev; + token.parens = state.parens; + token.output = state.output; + const output = (opts.capture ? '(' : '') + token.open; - for (let ele of arr) { - let { string } = ele; - - // only push if _both_ are negative... - if (!intersection && !contains(comparison, 'string', string)) { - result.push(prefix + string); - } - - // or _both_ are positive - if (intersection && contains(comparison, 'string', string)) { - result.push(prefix + string); - } - } - return result; -} - -/** - * Zip strings - */ - -function zip(a, b) { - let arr = []; - for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]); - return arr; -} - -function compare(a, b) { - return a > b ? 1 : b > a ? -1 : 0; -} - -function contains(arr, key, val) { - return arr.some(ele => ele[key] === val); -} - -function countNines(min, len) { - return Number(String(min).slice(0, -len) + '9'.repeat(len)); -} - -function countZeros(integer, zeros) { - return integer - (integer % Math.pow(10, zeros)); -} - -function toQuantifier(digits) { - let [start = 0, stop = ''] = digits; - if (stop || start > 1) { - return `{${start + (stop ? ',' + stop : '')}}`; - } - return ''; -} + increment('parens'); + push({ type, value, output: state.output ? '' : ONE_CHAR }); + push({ type: 'paren', extglob: true, value: advance(), output }); + extglobs.push(token); + }; -function toCharacterClass(a, b, options) { - return `[${a}${(b - a === 1) ? '' : '-'}${b}]`; -} + const extglobClose = token => { + let output = token.close + (opts.capture ? ')' : ''); -function hasPadding(str) { - return /^-?(0+)\d/.test(str); -} + if (token.type === 'negate') { + let extglobStar = star; -function padZeros(value, tok, options) { - if (!tok.isPadded) { - return value; - } + if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { + extglobStar = globstar(opts); + } - let diff = Math.abs(tok.maxLen - String(value).length); - let relax = options.relaxZeros !== false; + if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) { + output = token.close = `)$))${extglobStar}`; + } - switch (diff) { - case 0: - return ''; - case 1: - return relax ? '0?' : '0'; - case 2: - return relax ? '0{0,2}' : '00'; - default: { - return relax ? `0{0,${diff}}` : `0{${diff}}`; + if (token.prev.type === 'bos' && eos()) { + state.negatedExtglob = true; + } } - } -} - -/** - * Cache - */ - -toRegexRange.cache = {}; -toRegexRange.clearCache = () => (toRegexRange.cache = {}); - -/** - * Expose `toRegexRange` - */ - -module.exports = toRegexRange; - - -/***/ }), -/* 323 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - */ - - - -module.exports = function(num) { - if (typeof num === 'number') { - return num - num === 0; - } - if (typeof num === 'string' && num.trim() !== '') { - return Number.isFinite ? Number.isFinite(+num) : isFinite(+num); - } - return false; -}; + push({ type: 'paren', extglob: true, value, output }); + decrement('parens'); + }; -/***/ }), -/* 324 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const fill = __webpack_require__(321); -const stringify = __webpack_require__(318); -const utils = __webpack_require__(319); - -const append = (queue = '', stash = '', enclose = false) => { - let result = []; - - queue = [].concat(queue); - stash = [].concat(stash); + /** + * Fast paths + */ - if (!stash.length) return queue; - if (!queue.length) { - return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash; - } + if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) { + let backslashes = false; - for (let item of queue) { - if (Array.isArray(item)) { - for (let value of item) { - result.push(append(value, stash, enclose)); - } - } else { - for (let ele of stash) { - if (enclose === true && typeof ele === 'string') ele = `{${ele}}`; - result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele)); + let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { + if (first === '\\') { + backslashes = true; + return m; } - } - } - return utils.flatten(result); -}; - -const expand = (ast, options = {}) => { - let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit; - let walk = (node, parent = {}) => { - node.queue = []; + if (first === '?') { + if (esc) { + return esc + first + (rest ? QMARK.repeat(rest.length) : ''); + } + if (index === 0) { + return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); + } + return QMARK.repeat(chars.length); + } - let p = parent; - let q = parent.queue; + if (first === '.') { + return DOT_LITERAL.repeat(chars.length); + } - while (p.type !== 'brace' && p.type !== 'root' && p.parent) { - p = p.parent; - q = p.queue; - } + if (first === '*') { + if (esc) { + return esc + first + (rest ? star : ''); + } + return star; + } + return esc ? m : `\\${m}`; + }); - if (node.invalid || node.dollar) { - q.push(append(q.pop(), stringify(node, options))); - return; + if (backslashes === true) { + if (opts.unescape === true) { + output = output.replace(/\\/g, ''); + } else { + output = output.replace(/\\+/g, m => { + return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); + }); + } } - if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) { - q.push(append(q.pop(), ['{}'])); - return; + if (output === input && opts.contains === true) { + state.output = input; + return state; } - if (node.nodes && node.ranges > 0) { - let args = utils.reduce(node.nodes); + state.output = utils.wrapOutput(output, state, options); + return state; + } - if (utils.exceedsLimit(...args, options.step, rangeLimit)) { - throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); - } + /** + * Tokenize input until we reach end-of-string + */ - let range = fill(...args, options); - if (range.length === 0) { - range = stringify(node, options); - } + while (!eos()) { + value = advance(); - q.push(append(q.pop(), range)); - node.nodes = []; - return; + if (value === '\u0000') { + continue; } - let enclose = utils.encloseBrace(node); - let queue = node.queue; - let block = node; - - while (block.type !== 'brace' && block.type !== 'root' && block.parent) { - block = block.parent; - queue = block.queue; - } + /** + * Escaped characters + */ - for (let i = 0; i < node.nodes.length; i++) { - let child = node.nodes[i]; + if (value === '\\') { + const next = peek(); - if (child.type === 'comma' && node.type === 'brace') { - if (i === 1) queue.push(''); - queue.push(''); + if (next === '/' && opts.bash !== true) { continue; } - if (child.type === 'close') { - q.push(append(q.pop(), queue, enclose)); + if (next === '.' || next === ';') { continue; } - if (child.value && child.type !== 'open') { - queue.push(append(queue.pop(), child.value)); + if (!next) { + value += '\\'; + push({ type: 'text', value }); continue; } - if (child.nodes) { - walk(child, node); - } - } - - return queue; - }; - - return utils.flatten(walk(ast)); -}; - -module.exports = expand; - - -/***/ }), -/* 325 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; + // collapse slashes to reduce potential for exploits + const match = /^\\+/.exec(remaining()); + let slashes = 0; + if (match && match[0].length > 2) { + slashes = match[0].length; + state.index += slashes; + if (slashes % 2 !== 0) { + value += '\\'; + } + } -const stringify = __webpack_require__(318); + if (opts.unescape === true) { + value = advance() || ''; + } else { + value += advance() || ''; + } -/** - * Constants - */ + if (state.brackets === 0) { + push({ type: 'text', value }); + continue; + } + } -const { - MAX_LENGTH, - CHAR_BACKSLASH, /* \ */ - CHAR_BACKTICK, /* ` */ - CHAR_COMMA, /* , */ - CHAR_DOT, /* . */ - CHAR_LEFT_PARENTHESES, /* ( */ - CHAR_RIGHT_PARENTHESES, /* ) */ - CHAR_LEFT_CURLY_BRACE, /* { */ - CHAR_RIGHT_CURLY_BRACE, /* } */ - CHAR_LEFT_SQUARE_BRACKET, /* [ */ - CHAR_RIGHT_SQUARE_BRACKET, /* ] */ - CHAR_DOUBLE_QUOTE, /* " */ - CHAR_SINGLE_QUOTE, /* ' */ - CHAR_NO_BREAK_SPACE, - CHAR_ZERO_WIDTH_NOBREAK_SPACE -} = __webpack_require__(326); + /** + * If we're inside a regex character class, continue + * until we reach the closing bracket. + */ -/** - * parse - */ + if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { + if (opts.posix !== false && value === ':') { + const inner = prev.value.slice(1); + if (inner.includes('[')) { + prev.posix = true; -const parse = (input, options = {}) => { - if (typeof input !== 'string') { - throw new TypeError('Expected a string'); - } + if (inner.includes(':')) { + const idx = prev.value.lastIndexOf('['); + const pre = prev.value.slice(0, idx); + const rest = prev.value.slice(idx + 2); + const posix = POSIX_REGEX_SOURCE[rest]; + if (posix) { + prev.value = pre + posix; + state.backtrack = true; + advance(); - let opts = options || {}; - let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - if (input.length > max) { - throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); - } + if (!bos.output && tokens.indexOf(prev) === 1) { + bos.output = ONE_CHAR; + } + continue; + } + } + } + } - let ast = { type: 'root', input, nodes: [] }; - let stack = [ast]; - let block = ast; - let prev = ast; - let brackets = 0; - let length = input.length; - let index = 0; - let depth = 0; - let value; - let memo = {}; + if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { + value = `\\${value}`; + } - /** - * Helpers - */ + if (value === ']' && (prev.value === '[' || prev.value === '[^')) { + value = `\\${value}`; + } - const advance = () => input[index++]; - const push = node => { - if (node.type === 'text' && prev.type === 'dot') { - prev.type = 'text'; - } + if (opts.posix === true && value === '!' && prev.value === '[') { + value = '^'; + } - if (prev && prev.type === 'text' && node.type === 'text') { - prev.value += node.value; - return; + prev.value += value; + append({ value }); + continue; } - block.nodes.push(node); - node.parent = block; - node.prev = prev; - prev = node; - return node; - }; - - push({ type: 'bos' }); - - while (index < length) { - block = stack[stack.length - 1]; - value = advance(); - /** - * Invalid chars + * If we're inside a quoted string, continue + * until we reach the closing double quote. */ - if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { + if (state.quotes === 1 && value !== '"') { + value = utils.escapeRegex(value); + prev.value += value; + append({ value }); continue; } /** - * Escaped chars + * Double quotes */ - if (value === CHAR_BACKSLASH) { - push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() }); + if (value === '"') { + state.quotes = state.quotes === 1 ? 0 : 1; + if (opts.keepQuotes === true) { + push({ type: 'text', value }); + } continue; } /** - * Right square bracket (literal): ']' + * Parentheses */ - if (value === CHAR_RIGHT_SQUARE_BRACKET) { - push({ type: 'text', value: '\\' + value }); + if (value === '(') { + increment('parens'); + push({ type: 'paren', value }); continue; } - /** - * Left square bracket: '[' - */ - - if (value === CHAR_LEFT_SQUARE_BRACKET) { - brackets++; - - let closed = true; - let next; - - while (index < length && (next = advance())) { - value += next; - - if (next === CHAR_LEFT_SQUARE_BRACKET) { - brackets++; - continue; - } - - if (next === CHAR_BACKSLASH) { - value += advance(); - continue; - } - - if (next === CHAR_RIGHT_SQUARE_BRACKET) { - brackets--; + if (value === ')') { + if (state.parens === 0 && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '(')); + } - if (brackets === 0) { - break; - } - } + const extglob = extglobs[extglobs.length - 1]; + if (extglob && state.parens === extglob.parens + 1) { + extglobClose(extglobs.pop()); + continue; } - push({ type: 'text', value }); + push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); + decrement('parens'); continue; } /** - * Parentheses + * Square brackets */ - if (value === CHAR_LEFT_PARENTHESES) { - block = push({ type: 'paren', nodes: [] }); - stack.push(block); - push({ type: 'text', value }); + if (value === '[') { + if (opts.nobracket === true || !remaining().includes(']')) { + if (opts.nobracket !== true && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('closing', ']')); + } + + value = `\\${value}`; + } else { + increment('brackets'); + } + + push({ type: 'bracket', value }); continue; } - if (value === CHAR_RIGHT_PARENTHESES) { - if (block.type !== 'paren') { - push({ type: 'text', value }); + if (value === ']') { + if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { + push({ type: 'text', value, output: `\\${value}` }); continue; } - block = stack.pop(); - push({ type: 'text', value }); - block = stack[stack.length - 1]; - continue; - } - /** - * Quotes: '|"|` - */ + if (state.brackets === 0) { + if (opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '[')); + } - if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { - let open = value; - let next; + push({ type: 'text', value, output: `\\${value}` }); + continue; + } - if (options.keepQuotes !== true) { - value = ''; + decrement('brackets'); + + const prevValue = prev.value.slice(1); + if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { + value = `/${value}`; } - while (index < length && (next = advance())) { - if (next === CHAR_BACKSLASH) { - value += next + advance(); - continue; - } + prev.value += value; + append({ value }); - if (next === open) { - if (options.keepQuotes === true) value += next; - break; - } + // when literal brackets are explicitly disabled + // assume we should match with a regex character class + if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { + continue; + } - value += next; + const escaped = utils.escapeRegex(prev.value); + state.output = state.output.slice(0, -prev.value.length); + + // when literal brackets are explicitly enabled + // assume we should escape the brackets to match literal characters + if (opts.literalBrackets === true) { + state.output += escaped; + prev.value = escaped; + continue; } - push({ type: 'text', value }); + // when the user specifies nothing, try to match both + prev.value = `(${capture}${escaped}|${prev.value})`; + state.output += prev.value; continue; } /** - * Left curly brace: '{' + * Braces */ - if (value === CHAR_LEFT_CURLY_BRACE) { - depth++; + if (value === '{' && opts.nobrace !== true) { + increment('braces'); - let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true; - let brace = { + const open = { type: 'brace', - open: true, - close: false, - dollar, - depth, - commas: 0, - ranges: 0, - nodes: [] + value, + output: '(', + outputIndex: state.output.length, + tokensIndex: state.tokens.length }; - block = push(brace); - stack.push(block); - push({ type: 'open', value }); + braces.push(open); + push(open); continue; } - /** - * Right curly brace: '}' - */ + if (value === '}') { + const brace = braces[braces.length - 1]; - if (value === CHAR_RIGHT_CURLY_BRACE) { - if (block.type !== 'brace') { - push({ type: 'text', value }); + if (opts.nobrace === true || !brace) { + push({ type: 'text', value, output: value }); continue; } - let type = 'close'; - block = stack.pop(); - block.close = true; + let output = ')'; - push({ type, value }); - depth--; + if (brace.dots === true) { + const arr = tokens.slice(); + const range = []; - block = stack[stack.length - 1]; + for (let i = arr.length - 1; i >= 0; i--) { + tokens.pop(); + if (arr[i].type === 'brace') { + break; + } + if (arr[i].type !== 'dots') { + range.unshift(arr[i].value); + } + } + + output = expandRange(range, opts); + state.backtrack = true; + } + + if (brace.comma !== true && brace.dots !== true) { + const out = state.output.slice(0, brace.outputIndex); + const toks = state.tokens.slice(brace.tokensIndex); + brace.value = brace.output = '\\{'; + value = output = '\\}'; + state.output = out; + for (const t of toks) { + state.output += (t.output || t.value); + } + } + + push({ type: 'brace', value, output }); + decrement('braces'); + braces.pop(); continue; } /** - * Comma: ',' + * Pipes */ - if (value === CHAR_COMMA && depth > 0) { - if (block.ranges > 0) { - block.ranges = 0; - let open = block.nodes.shift(); - block.nodes = [open, { type: 'text', value: stringify(block) }]; + if (value === '|') { + if (extglobs.length > 0) { + extglobs[extglobs.length - 1].conditions++; } - - push({ type: 'comma', value }); - block.commas++; + push({ type: 'text', value }); continue; } /** - * Dot: '.' + * Commas */ - if (value === CHAR_DOT && depth > 0 && block.commas === 0) { - let siblings = block.nodes; + if (value === ',') { + let output = value; - if (depth === 0 || siblings.length === 0) { - push({ type: 'text', value }); - continue; + const brace = braces[braces.length - 1]; + if (brace && stack[stack.length - 1] === 'braces') { + brace.comma = true; + output = '|'; } - if (prev.type === 'dot') { - block.range = []; - prev.value += value; - prev.type = 'range'; + push({ type: 'comma', value, output }); + continue; + } - if (block.nodes.length !== 3 && block.nodes.length !== 5) { - block.invalid = true; - block.ranges = 0; - prev.type = 'text'; - continue; - } + /** + * Slashes + */ - block.ranges++; - block.args = []; + if (value === '/') { + // if the beginning of the glob is "./", advance the start + // to the current index, and don't add the "./" characters + // to the state. This greatly simplifies lookbehinds when + // checking for BOS characters like "!" and "." (not "./") + if (prev.type === 'dot' && state.index === state.start + 1) { + state.start = state.index + 1; + state.consumed = ''; + state.output = ''; + tokens.pop(); + prev = bos; // reset "prev" to the first token continue; } - if (prev.type === 'range') { - siblings.pop(); + push({ type: 'slash', value, output: SLASH_LITERAL }); + continue; + } - let before = siblings[siblings.length - 1]; - before.value += prev.value + value; - prev = before; - block.ranges--; + /** + * Dots + */ + + if (value === '.') { + if (state.braces > 0 && prev.type === 'dot') { + if (prev.value === '.') prev.output = DOT_LITERAL; + const brace = braces[braces.length - 1]; + prev.type = 'dots'; + prev.output += value; + prev.value += value; + brace.dots = true; continue; } - push({ type: 'dot', value }); + if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') { + push({ type: 'text', value, output: DOT_LITERAL }); + continue; + } + + push({ type: 'dot', value, output: DOT_LITERAL }); continue; } /** - * Text + * Question marks */ - push({ type: 'text', value }); - } + if (value === '?') { + const isGroup = prev && prev.value === '('; + if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('qmark', value); + continue; + } - // Mark imbalanced braces and brackets as invalid - do { - block = stack.pop(); + if (prev && prev.type === 'paren') { + const next = peek(); + let output = value; - if (block.type !== 'root') { - block.nodes.forEach(node => { - if (!node.nodes) { - if (node.type === 'open') node.isOpen = true; - if (node.type === 'close') node.isClose = true; - if (!node.nodes) node.type = 'text'; - node.invalid = true; + if (next === '<' && !utils.supportsLookbehinds()) { + throw new Error('Node.js v10 or higher is required for regex lookbehinds'); } - }); - // get the location of the block on parent.nodes (block's siblings) - let parent = stack[stack.length - 1]; - let index = parent.nodes.indexOf(block); - // replace the (invalid) block with it's nodes - parent.nodes.splice(index, 1, ...block.nodes); - } - } while (stack.length > 0); + if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) { + output = `\\${value}`; + } - push({ type: 'eos' }); - return ast; -}; + push({ type: 'text', value, output }); + continue; + } -module.exports = parse; + if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { + push({ type: 'qmark', value, output: QMARK_NO_DOT }); + continue; + } + push({ type: 'qmark', value, output: QMARK }); + continue; + } -/***/ }), -/* 326 */ -/***/ (function(module, exports, __webpack_require__) { + /** + * Exclamation + */ -"use strict"; + if (value === '!') { + if (opts.noextglob !== true && peek() === '(') { + if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { + extglobOpen('negate', value); + continue; + } + } + if (opts.nonegate !== true && state.index === 0) { + negate(); + continue; + } + } -module.exports = { - MAX_LENGTH: 1024 * 64, + /** + * Plus + */ - // Digits - CHAR_0: '0', /* 0 */ - CHAR_9: '9', /* 9 */ + if (value === '+') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('plus', value); + continue; + } - // Alphabet chars. - CHAR_UPPERCASE_A: 'A', /* A */ - CHAR_LOWERCASE_A: 'a', /* a */ - CHAR_UPPERCASE_Z: 'Z', /* Z */ - CHAR_LOWERCASE_Z: 'z', /* z */ + if ((prev && prev.value === '(') || opts.regex === false) { + push({ type: 'plus', value, output: PLUS_LITERAL }); + continue; + } - CHAR_LEFT_PARENTHESES: '(', /* ( */ - CHAR_RIGHT_PARENTHESES: ')', /* ) */ + if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) { + push({ type: 'plus', value }); + continue; + } - CHAR_ASTERISK: '*', /* * */ + push({ type: 'plus', value: PLUS_LITERAL }); + continue; + } - // Non-alphabetic chars. - CHAR_AMPERSAND: '&', /* & */ - CHAR_AT: '@', /* @ */ - CHAR_BACKSLASH: '\\', /* \ */ - CHAR_BACKTICK: '`', /* ` */ - CHAR_CARRIAGE_RETURN: '\r', /* \r */ - CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */ - CHAR_COLON: ':', /* : */ - CHAR_COMMA: ',', /* , */ - CHAR_DOLLAR: '$', /* . */ - CHAR_DOT: '.', /* . */ - CHAR_DOUBLE_QUOTE: '"', /* " */ - CHAR_EQUAL: '=', /* = */ - CHAR_EXCLAMATION_MARK: '!', /* ! */ - CHAR_FORM_FEED: '\f', /* \f */ - CHAR_FORWARD_SLASH: '/', /* / */ - CHAR_HASH: '#', /* # */ - CHAR_HYPHEN_MINUS: '-', /* - */ - CHAR_LEFT_ANGLE_BRACKET: '<', /* < */ - CHAR_LEFT_CURLY_BRACE: '{', /* { */ - CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */ - CHAR_LINE_FEED: '\n', /* \n */ - CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */ - CHAR_PERCENT: '%', /* % */ - CHAR_PLUS: '+', /* + */ - CHAR_QUESTION_MARK: '?', /* ? */ - CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */ - CHAR_RIGHT_CURLY_BRACE: '}', /* } */ - CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */ - CHAR_SEMICOLON: ';', /* ; */ - CHAR_SINGLE_QUOTE: '\'', /* ' */ - CHAR_SPACE: ' ', /* */ - CHAR_TAB: '\t', /* \t */ - CHAR_UNDERSCORE: '_', /* _ */ - CHAR_VERTICAL_LINE: '|', /* | */ - CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */ -}; + /** + * Plain text + */ + if (value === '@') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + push({ type: 'at', extglob: true, value, output: '' }); + continue; + } -/***/ }), -/* 327 */ -/***/ (function(module, exports, __webpack_require__) { + push({ type: 'text', value }); + continue; + } -"use strict"; + /** + * Plain text + */ + if (value !== '*') { + if (value === '$' || value === '^') { + value = `\\${value}`; + } -module.exports = __webpack_require__(328); + const match = REGEX_NON_SPECIAL_CHARS.exec(remaining()); + if (match) { + value += match[0]; + state.index += match[0].length; + } + push({ type: 'text', value }); + continue; + } -/***/ }), -/* 328 */ -/***/ (function(module, exports, __webpack_require__) { + /** + * Stars + */ -"use strict"; + if (prev && (prev.type === 'globstar' || prev.star === true)) { + prev.type = 'star'; + prev.star = true; + prev.value += value; + prev.output = star; + state.backtrack = true; + state.globstar = true; + consume(value); + continue; + } + let rest = remaining(); + if (opts.noextglob !== true && /^\([^?]/.test(rest)) { + extglobOpen('star', value); + continue; + } -const path = __webpack_require__(4); -const scan = __webpack_require__(329); -const parse = __webpack_require__(332); -const utils = __webpack_require__(330); -const constants = __webpack_require__(331); -const isObject = val => val && typeof val === 'object' && !Array.isArray(val); + if (prev.type === 'star') { + if (opts.noglobstar === true) { + consume(value); + continue; + } -/** - * Creates a matcher function from one or more glob patterns. The - * returned function takes a string to match as its first argument, - * and returns true if the string is a match. The returned matcher - * function also takes a boolean as the second argument that, when true, - * returns an object with additional information. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch(glob[, options]); - * - * const isMatch = picomatch('*.!(*a)'); - * console.log(isMatch('a.a')); //=> false - * console.log(isMatch('a.b')); //=> true - * ``` - * @name picomatch - * @param {String|Array} `globs` One or more glob patterns. - * @param {Object=} `options` - * @return {Function=} Returns a matcher function. - * @api public - */ + const prior = prev.prev; + const before = prior.prev; + const isStart = prior.type === 'slash' || prior.type === 'bos'; + const afterStar = before && (before.type === 'star' || before.type === 'globstar'); -const picomatch = (glob, options, returnState = false) => { - if (Array.isArray(glob)) { - const fns = glob.map(input => picomatch(input, options, returnState)); - const arrayMatcher = str => { - for (const isMatch of fns) { - const state = isMatch(str); - if (state) return state; + if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) { + push({ type: 'star', value, output: '' }); + continue; } - return false; - }; - return arrayMatcher; - } - const isState = isObject(glob) && glob.tokens && glob.input; + const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); + const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); + if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { + push({ type: 'star', value, output: '' }); + continue; + } - if (glob === '' || (typeof glob !== 'string' && !isState)) { - throw new TypeError('Expected pattern to be a non-empty string'); - } + // strip consecutive `/**/` + while (rest.slice(0, 3) === '/**') { + const after = input[state.index + 4]; + if (after && after !== '/') { + break; + } + rest = rest.slice(3); + consume('/**', 3); + } - const opts = options || {}; - const posix = utils.isWindows(options); - const regex = isState - ? picomatch.compileRe(glob, options) - : picomatch.makeRe(glob, options, false, true); + if (prior.type === 'bos' && eos()) { + prev.type = 'globstar'; + prev.value += value; + prev.output = globstar(opts); + state.output = prev.output; + state.globstar = true; + consume(value); + continue; + } - const state = regex.state; - delete regex.state; + if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; - let isIgnored = () => false; - if (opts.ignore) { - const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null }; - isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); - } + prev.type = 'globstar'; + prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)'); + prev.value += value; + state.globstar = true; + state.output += prior.output + prev.output; + consume(value); + continue; + } - const matcher = (input, returnObject = false) => { - const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix }); - const result = { glob, state, regex, posix, input, output, match, isMatch }; + if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') { + const end = rest[1] !== void 0 ? '|$' : ''; - if (typeof opts.onResult === 'function') { - opts.onResult(result); - } + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; - if (isMatch === false) { - result.isMatch = false; - return returnObject ? result : false; - } + prev.type = 'globstar'; + prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; + prev.value += value; - if (isIgnored(input)) { - if (typeof opts.onIgnore === 'function') { - opts.onIgnore(result); - } - result.isMatch = false; - return returnObject ? result : false; - } + state.output += prior.output + prev.output; + state.globstar = true; - if (typeof opts.onMatch === 'function') { - opts.onMatch(result); - } - return returnObject ? result : true; - }; - - if (returnState) { - matcher.state = state; - } - - return matcher; -}; - -/** - * Test `input` with the given `regex`. This is used by the main - * `picomatch()` function to test the input string. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.test(input, regex[, options]); - * - * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); - * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } - * ``` - * @param {String} `input` String to test. - * @param {RegExp} `regex` - * @return {Object} Returns an object with matching info. - * @api public - */ + consume(value + advance()); -picomatch.test = (input, regex, options, { glob, posix } = {}) => { - if (typeof input !== 'string') { - throw new TypeError('Expected input to be a string'); - } + push({ type: 'slash', value: '/', output: '' }); + continue; + } - if (input === '') { - return { isMatch: false, output: '' }; - } + if (prior.type === 'bos' && rest[0] === '/') { + prev.type = 'globstar'; + prev.value += value; + prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; + state.output = prev.output; + state.globstar = true; + consume(value + advance()); + push({ type: 'slash', value: '/', output: '' }); + continue; + } - const opts = options || {}; - const format = opts.format || (posix ? utils.toPosixSlashes : null); - let match = input === glob; - let output = (match && format) ? format(input) : input; + // remove single star from output + state.output = state.output.slice(0, -prev.output.length); - if (match === false) { - output = format ? format(input) : input; - match = output === glob; - } + // reset previous token to globstar + prev.type = 'globstar'; + prev.output = globstar(opts); + prev.value += value; - if (match === false || opts.capture === true) { - if (opts.matchBase === true || opts.basename === true) { - match = picomatch.matchBase(input, regex, options, posix); - } else { - match = regex.exec(output); + // reset output with globstar + state.output += prev.output; + state.globstar = true; + consume(value); + continue; } - } - - return { isMatch: Boolean(match), match, output }; -}; - -/** - * Match the basename of a filepath. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.matchBase(input, glob[, options]); - * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true - * ``` - * @param {String} `input` String to test. - * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe). - * @return {Boolean} - * @api public - */ - -picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => { - const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); - return regex.test(path.basename(input)); -}; -/** - * Returns true if **any** of the given glob `patterns` match the specified `string`. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.isMatch(string, patterns[, options]); - * - * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true - * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false - * ``` - * @param {String|Array} str The string to test. - * @param {String|Array} patterns One or more glob patterns to use for matching. - * @param {Object} [options] See available [options](#options). - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ + const token = { type: 'star', value, output: star }; -picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); + if (opts.bash === true) { + token.output = '.*?'; + if (prev.type === 'bos' || prev.type === 'slash') { + token.output = nodot + token.output; + } + push(token); + continue; + } -/** - * Parse a glob pattern to create the source string for a regular - * expression. - * - * ```js - * const picomatch = require('picomatch'); - * const result = picomatch.parse(pattern[, options]); - * ``` - * @param {String} `pattern` - * @param {Object} `options` - * @return {Object} Returns an object with useful properties and output to be used as a regex source string. - * @api public - */ + if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { + token.output = value; + push(token); + continue; + } -picomatch.parse = (pattern, options) => { - if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options)); - return parse(pattern, { ...options, fastpaths: false }); -}; + if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { + if (prev.type === 'dot') { + state.output += NO_DOT_SLASH; + prev.output += NO_DOT_SLASH; -/** - * Scan a glob pattern to separate the pattern into segments. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.scan(input[, options]); - * - * const result = picomatch.scan('!./foo/*.js'); - * console.log(result); - * { prefix: '!./', - * input: '!./foo/*.js', - * start: 3, - * base: 'foo', - * glob: '*.js', - * isBrace: false, - * isBracket: false, - * isGlob: true, - * isExtglob: false, - * isGlobstar: false, - * negated: true } - * ``` - * @param {String} `input` Glob pattern to scan. - * @param {Object} `options` - * @return {Object} Returns an object with - * @api public - */ + } else if (opts.dot === true) { + state.output += NO_DOTS_SLASH; + prev.output += NO_DOTS_SLASH; -picomatch.scan = (input, options) => scan(input, options); + } else { + state.output += nodot; + prev.output += nodot; + } -/** - * Create a regular expression from a parsed glob pattern. - * - * ```js - * const picomatch = require('picomatch'); - * const state = picomatch.parse('*.js'); - * // picomatch.compileRe(state[, options]); - * - * console.log(picomatch.compileRe(state)); - * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ - * ``` - * @param {String} `state` The object returned from the `.parse` method. - * @param {Object} `options` - * @return {RegExp} Returns a regex created from the given pattern. - * @api public - */ + if (peek() !== '*') { + state.output += ONE_CHAR; + prev.output += ONE_CHAR; + } + } -picomatch.compileRe = (parsed, options, returnOutput = false, returnState = false) => { - if (returnOutput === true) { - return parsed.output; + push(token); } - const opts = options || {}; - const prepend = opts.contains ? '' : '^'; - const append = opts.contains ? '' : '$'; - - let source = `${prepend}(?:${parsed.output})${append}`; - if (parsed && parsed.negated === true) { - source = `^(?!${source}).*$`; + while (state.brackets > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); + state.output = utils.escapeLast(state.output, '['); + decrement('brackets'); } - const regex = picomatch.toRegex(source, options); - if (returnState === true) { - regex.state = parsed; + while (state.parens > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); + state.output = utils.escapeLast(state.output, '('); + decrement('parens'); } - return regex; -}; - -picomatch.makeRe = (input, options, returnOutput = false, returnState = false) => { - if (!input || typeof input !== 'string') { - throw new TypeError('Expected a non-empty string'); + while (state.braces > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); + state.output = utils.escapeLast(state.output, '{'); + decrement('braces'); } - const opts = options || {}; - let parsed = { negated: false, fastpaths: true }; - let prefix = ''; - let output; - - if (input.startsWith('./')) { - input = input.slice(2); - prefix = parsed.prefix = './'; + if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { + push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); } - if (opts.fastpaths !== false && (input[0] === '.' || input[0] === '*')) { - output = parse.fastpaths(input, options); - } + // rebuild the output if we had to backtrack at any point + if (state.backtrack === true) { + state.output = ''; - if (output === undefined) { - parsed = parse(input, options); - parsed.prefix = prefix + (parsed.prefix || ''); - } else { - parsed.output = output; + for (const token of state.tokens) { + state.output += token.output != null ? token.output : token.value; + + if (token.suffix) { + state.output += token.suffix; + } + } } - return picomatch.compileRe(parsed, options, returnOutput, returnState); + return state; }; /** - * Create a regular expression from the given regex source string. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.toRegex(source[, options]); - * - * const { output } = picomatch.parse('*.js'); - * console.log(picomatch.toRegex(output)); - * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ - * ``` - * @param {String} `source` Regular expression source string. - * @param {Object} `options` - * @return {RegExp} - * @api public + * Fast paths for creating regular expressions for common glob patterns. + * This can significantly speed up processing and has very little downside + * impact when none of the fast paths match. */ -picomatch.toRegex = (source, options) => { - try { - const opts = options || {}; - return new RegExp(source, opts.flags || (opts.nocase ? 'i' : '')); - } catch (err) { - if (options && options.debug === true) throw err; - return /$^/; +parse.fastpaths = (input, options) => { + const opts = { ...options }; + const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + const len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); } -}; -/** - * Picomatch constants. - * @return {Object} - */ + input = REPLACEMENTS[input] || input; + const win32 = utils.isWindows(options); -picomatch.constants = constants; + // create constants based on platform, for windows or posix + const { + DOT_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOTS_SLASH, + STAR, + START_ANCHOR + } = constants.globChars(win32); -/** - * Expose "picomatch" - */ + const nodot = opts.dot ? NO_DOTS : NO_DOT; + const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; + const capture = opts.capture ? '' : '?:'; + const state = { negated: false, prefix: '' }; + let star = opts.bash === true ? '.*?' : STAR; -module.exports = picomatch; + if (opts.capture) { + star = `(${star})`; + } + const globstar = (opts) => { + if (opts.noglobstar === true) return star; + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; -/***/ }), -/* 329 */ -/***/ (function(module, exports, __webpack_require__) { + const create = str => { + switch (str) { + case '*': + return `${nodot}${ONE_CHAR}${star}`; -"use strict"; + case '.*': + return `${DOT_LITERAL}${ONE_CHAR}${star}`; + case '*.*': + return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; -const utils = __webpack_require__(330); -const { - CHAR_ASTERISK, /* * */ - CHAR_AT, /* @ */ - CHAR_BACKWARD_SLASH, /* \ */ - CHAR_COMMA, /* , */ - CHAR_DOT, /* . */ - CHAR_EXCLAMATION_MARK, /* ! */ - CHAR_FORWARD_SLASH, /* / */ - CHAR_LEFT_CURLY_BRACE, /* { */ - CHAR_LEFT_PARENTHESES, /* ( */ - CHAR_LEFT_SQUARE_BRACKET, /* [ */ - CHAR_PLUS, /* + */ - CHAR_QUESTION_MARK, /* ? */ - CHAR_RIGHT_CURLY_BRACE, /* } */ - CHAR_RIGHT_PARENTHESES, /* ) */ - CHAR_RIGHT_SQUARE_BRACKET /* ] */ -} = __webpack_require__(331); + case '*/*': + return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; -const isPathSeparator = code => { - return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; -}; + case '**': + return nodot + globstar(opts); -const depth = token => { - if (token.isPrefix !== true) { - token.depth = token.isGlobstar ? Infinity : 1; - } -}; + case '**/*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; -/** - * Quickly scans a glob pattern and returns an object with a handful of - * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists), - * `glob` (the actual pattern), and `negated` (true if the path starts with `!`). - * - * ```js - * const pm = require('picomatch'); - * console.log(pm.scan('foo/bar/*.js')); - * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' } - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {Object} Returns an object with tokens and regex source string. - * @api public - */ + case '**/*.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; -const scan = (input, options) => { - const opts = options || {}; + case '**/.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; - const length = input.length - 1; - const scanToEnd = opts.parts === true || opts.scanToEnd === true; - const slashes = []; - const tokens = []; - const parts = []; + default: { + const match = /^(.*?)\.(\w+)$/.exec(str); + if (!match) return; - let str = input; - let index = -1; - let start = 0; - let lastIndex = 0; - let isBrace = false; - let isBracket = false; - let isGlob = false; - let isExtglob = false; - let isGlobstar = false; - let braceEscaped = false; - let backslashes = false; - let negated = false; - let finished = false; - let braces = 0; - let prev; - let code; - let token = { value: '', depth: 0, isGlob: false }; + const source = create(match[1]); + if (!source) return; - const eos = () => index >= length; - const peek = () => str.charCodeAt(index + 1); - const advance = () => { - prev = code; - return str.charCodeAt(++index); + return source + DOT_LITERAL + match[2]; + } + } }; - while (index < length) { - code = advance(); - let next; + const output = utils.removePrefix(input, state); + let source = create(output); - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - code = advance(); + if (source && opts.strictSlashes !== true) { + source += `${SLASH_LITERAL}?`; + } - if (code === CHAR_LEFT_CURLY_BRACE) { - braceEscaped = true; - } - continue; - } + return source; +}; - if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { - braces++; +module.exports = parse; - while (eos() !== true && (code = advance())) { - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - advance(); - continue; - } - if (code === CHAR_LEFT_CURLY_BRACE) { - braces++; - continue; - } +/***/ }), +/* 328 */ +/***/ (function(module, exports, __webpack_require__) { - if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) { - isBrace = token.isBrace = true; - isGlob = token.isGlob = true; - finished = true; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const merge2 = __webpack_require__(299); +function merge(streams) { + const mergedStream = merge2(streams); + streams.forEach((stream) => { + stream.once('error', (error) => mergedStream.emit('error', error)); + }); + mergedStream.once('close', () => propagateCloseEventToSources(streams)); + mergedStream.once('end', () => propagateCloseEventToSources(streams)); + return mergedStream; +} +exports.merge = merge; +function propagateCloseEventToSources(streams) { + streams.forEach((stream) => stream.emit('close')); +} - if (scanToEnd === true) { - continue; - } - break; - } +/***/ }), +/* 329 */ +/***/ (function(module, exports, __webpack_require__) { - if (braceEscaped !== true && code === CHAR_COMMA) { - isBrace = token.isBrace = true; - isGlob = token.isGlob = true; - finished = true; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function isString(input) { + return typeof input === 'string'; +} +exports.isString = isString; +function isEmpty(input) { + return input === ''; +} +exports.isEmpty = isEmpty; - if (scanToEnd === true) { - continue; - } - break; - } - - if (code === CHAR_RIGHT_CURLY_BRACE) { - braces--; - - if (braces === 0) { - braceEscaped = false; - isBrace = token.isBrace = true; - finished = true; - break; - } - } - } - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (code === CHAR_FORWARD_SLASH) { - slashes.push(index); - tokens.push(token); - token = { value: '', depth: 0, isGlob: false }; - - if (finished === true) continue; - if (prev === CHAR_DOT && index === (start + 1)) { - start += 2; - continue; - } - - lastIndex = index + 1; - continue; - } - - if (opts.noext !== true) { - const isExtglobChar = code === CHAR_PLUS - || code === CHAR_AT - || code === CHAR_ASTERISK - || code === CHAR_QUESTION_MARK - || code === CHAR_EXCLAMATION_MARK; - - if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) { - isGlob = token.isGlob = true; - isExtglob = token.isExtglob = true; - finished = true; - - if (scanToEnd === true) { - while (eos() !== true && (code = advance())) { - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - code = advance(); - continue; - } - - if (code === CHAR_RIGHT_PARENTHESES) { - isGlob = token.isGlob = true; - finished = true; - break; - } - } - continue; - } - break; - } - } - - if (code === CHAR_ASTERISK) { - if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true; - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - break; - } - - if (code === CHAR_QUESTION_MARK) { - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - break; - } - - if (code === CHAR_LEFT_SQUARE_BRACKET) { - while (eos() !== true && (next = advance())) { - if (next === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - advance(); - continue; - } +/***/ }), +/* 330 */ +/***/ (function(module, exports, __webpack_require__) { - if (next === CHAR_RIGHT_SQUARE_BRACKET) { - isBracket = token.isBracket = true; - isGlob = token.isGlob = true; - finished = true; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(331); +const provider_1 = __webpack_require__(358); +class ProviderAsync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_1.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = []; + return new Promise((resolve, reject) => { + const stream = this.api(root, task, options); + stream.once('error', reject); + stream.on('data', (entry) => entries.push(options.transform(entry))); + stream.once('end', () => resolve(entries)); + }); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderAsync; - if (scanToEnd === true) { - continue; - } - break; - } - } - } - if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) { - negated = token.negated = true; - start++; - continue; - } +/***/ }), +/* 331 */ +/***/ (function(module, exports, __webpack_require__) { - if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) { - isGlob = token.isGlob = true; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(137); +const fsStat = __webpack_require__(332); +const fsWalk = __webpack_require__(337); +const reader_1 = __webpack_require__(357); +class ReaderStream extends reader_1.default { + constructor() { + super(...arguments); + this._walkStream = fsWalk.walkStream; + this._stat = fsStat.stat; + } + dynamic(root, options) { + return this._walkStream(root, options); + } + static(patterns, options) { + const filepaths = patterns.map(this._getFullEntryPath, this); + const stream = new stream_1.PassThrough({ objectMode: true }); + stream._write = (index, _enc, done) => { + return this._getEntry(filepaths[index], patterns[index], options) + .then((entry) => { + if (entry !== null && options.entryFilter(entry)) { + stream.push(entry); + } + if (index === filepaths.length - 1) { + stream.end(); + } + done(); + }) + .catch(done); + }; + for (let i = 0; i < filepaths.length; i++) { + stream.write(i); + } + return stream; + } + _getEntry(filepath, pattern, options) { + return this._getStat(filepath) + .then((stats) => this._makeEntry(stats, pattern)) + .catch((error) => { + if (options.errorFilter(error)) { + return null; + } + throw error; + }); + } + _getStat(filepath) { + return new Promise((resolve, reject) => { + this._stat(filepath, this._fsStatSettings, (error, stats) => { + return error === null ? resolve(stats) : reject(error); + }); + }); + } +} +exports.default = ReaderStream; - if (scanToEnd === true) { - while (eos() !== true && (code = advance())) { - if (code === CHAR_LEFT_PARENTHESES) { - backslashes = token.backslashes = true; - code = advance(); - continue; - } - if (code === CHAR_RIGHT_PARENTHESES) { - finished = true; - break; - } - } - continue; - } - break; - } +/***/ }), +/* 332 */ +/***/ (function(module, exports, __webpack_require__) { - if (isGlob === true) { - finished = true; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async = __webpack_require__(333); +const sync = __webpack_require__(334); +const settings_1 = __webpack_require__(335); +exports.Settings = settings_1.default; +function stat(path, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return async.read(path, getSettings(), optionsOrSettingsOrCallback); + } + async.read(path, getSettings(optionsOrSettingsOrCallback), callback); +} +exports.stat = stat; +function statSync(path, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + return sync.read(path, settings); +} +exports.statSync = statSync; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} - if (scanToEnd === true) { - continue; - } - break; - } - } +/***/ }), +/* 333 */ +/***/ (function(module, exports, __webpack_require__) { - if (opts.noext === true) { - isExtglob = false; - isGlob = false; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function read(path, settings, callback) { + settings.fs.lstat(path, (lstatError, lstat) => { + if (lstatError !== null) { + return callFailureCallback(callback, lstatError); + } + if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { + return callSuccessCallback(callback, lstat); + } + settings.fs.stat(path, (statError, stat) => { + if (statError !== null) { + if (settings.throwErrorOnBrokenSymbolicLink) { + return callFailureCallback(callback, statError); + } + return callSuccessCallback(callback, lstat); + } + if (settings.markSymbolicLink) { + stat.isSymbolicLink = () => true; + } + callSuccessCallback(callback, stat); + }); + }); +} +exports.read = read; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, result) { + callback(null, result); +} - let base = str; - let prefix = ''; - let glob = ''; - if (start > 0) { - prefix = str.slice(0, start); - str = str.slice(start); - lastIndex -= start; - } +/***/ }), +/* 334 */ +/***/ (function(module, exports, __webpack_require__) { - if (base && isGlob === true && lastIndex > 0) { - base = str.slice(0, lastIndex); - glob = str.slice(lastIndex); - } else if (isGlob === true) { - base = ''; - glob = str; - } else { - base = str; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function read(path, settings) { + const lstat = settings.fs.lstatSync(path); + if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { + return lstat; + } + try { + const stat = settings.fs.statSync(path); + if (settings.markSymbolicLink) { + stat.isSymbolicLink = () => true; + } + return stat; + } + catch (error) { + if (!settings.throwErrorOnBrokenSymbolicLink) { + return lstat; + } + throw error; + } +} +exports.read = read; - if (base && base !== '' && base !== '/' && base !== str) { - if (isPathSeparator(base.charCodeAt(base.length - 1))) { - base = base.slice(0, -1); - } - } - if (opts.unescape === true) { - if (glob) glob = utils.removeBackslashes(glob); +/***/ }), +/* 335 */ +/***/ (function(module, exports, __webpack_require__) { - if (base && backslashes === true) { - base = utils.removeBackslashes(base); - } - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(336); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); + this.fs = fs.createFileSystemAdapter(this._options.fs); + this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); + } + _getValue(option, value) { + return option === undefined ? value : option; + } +} +exports.default = Settings; - const state = { - prefix, - input, - start, - base, - glob, - isBrace, - isBracket, - isGlob, - isExtglob, - isGlobstar, - negated - }; - if (opts.tokens === true) { - state.maxDepth = 0; - if (!isPathSeparator(code)) { - tokens.push(token); - } - state.tokens = tokens; - } +/***/ }), +/* 336 */ +/***/ (function(module, exports, __webpack_require__) { - if (opts.parts === true || opts.tokens === true) { - let prevIndex; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(133); +exports.FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + stat: fs.stat, + lstatSync: fs.lstatSync, + statSync: fs.statSync +}; +function createFileSystemAdapter(fsMethods) { + if (fsMethods === undefined) { + return exports.FILE_SYSTEM_ADAPTER; + } + return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods); +} +exports.createFileSystemAdapter = createFileSystemAdapter; - for (let idx = 0; idx < slashes.length; idx++) { - const n = prevIndex ? prevIndex + 1 : start; - const i = slashes[idx]; - const value = input.slice(n, i); - if (opts.tokens) { - if (idx === 0 && start !== 0) { - tokens[idx].isPrefix = true; - tokens[idx].value = prefix; - } else { - tokens[idx].value = value; - } - depth(tokens[idx]); - state.maxDepth += tokens[idx].depth; - } - if (idx !== 0 || value !== '') { - parts.push(value); - } - prevIndex = i; - } - if (prevIndex && prevIndex + 1 < input.length) { - const value = input.slice(prevIndex + 1); - parts.push(value); +/***/ }), +/* 337 */ +/***/ (function(module, exports, __webpack_require__) { - if (opts.tokens) { - tokens[tokens.length - 1].value = value; - depth(tokens[tokens.length - 1]); - state.maxDepth += tokens[tokens.length - 1].depth; - } - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async_1 = __webpack_require__(338); +const stream_1 = __webpack_require__(353); +const sync_1 = __webpack_require__(354); +const settings_1 = __webpack_require__(356); +exports.Settings = settings_1.default; +function walk(directory, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback); + } + new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback); +} +exports.walk = walk; +function walkSync(directory, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + const provider = new sync_1.default(directory, settings); + return provider.read(); +} +exports.walkSync = walkSync; +function walkStream(directory, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + const provider = new stream_1.default(directory, settings); + return provider.read(); +} +exports.walkStream = walkStream; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} - state.slashes = slashes; - state.parts = parts; - } - return state; -}; +/***/ }), +/* 338 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports = scan; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async_1 = __webpack_require__(339); +class AsyncProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new async_1.default(this._root, this._settings); + this._storage = new Set(); + } + read(callback) { + this._reader.onError((error) => { + callFailureCallback(callback, error); + }); + this._reader.onEntry((entry) => { + this._storage.add(entry); + }); + this._reader.onEnd(() => { + callSuccessCallback(callback, [...this._storage]); + }); + this._reader.read(); + } +} +exports.default = AsyncProvider; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, entries) { + callback(null, entries); +} /***/ }), -/* 330 */ +/* 339 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - - -const path = __webpack_require__(4); -const win32 = process.platform === 'win32'; -const { - REGEX_BACKSLASH, - REGEX_REMOVE_BACKSLASH, - REGEX_SPECIAL_CHARS, - REGEX_SPECIAL_CHARS_GLOBAL -} = __webpack_require__(331); - -exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); -exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); -exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str); -exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1'); -exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/'); - -exports.removeBackslashes = str => { - return str.replace(REGEX_REMOVE_BACKSLASH, match => { - return match === '\\' ? '' : match; - }); -}; - -exports.supportsLookbehinds = () => { - const segs = process.version.slice(1).split('.').map(Number); - if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) { - return true; - } - return false; -}; - -exports.isWindows = options => { - if (options && typeof options.windows === 'boolean') { - return options.windows; - } - return win32 === true || path.sep === '\\'; -}; - -exports.escapeLast = (input, char, lastIdx) => { - const idx = input.lastIndexOf(char, lastIdx); - if (idx === -1) return input; - if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1); - return `${input.slice(0, idx)}\\${input.slice(idx)}`; -}; - -exports.removePrefix = (input, state = {}) => { - let output = input; - if (output.startsWith('./')) { - output = output.slice(2); - state.prefix = './'; - } - return output; -}; - -exports.wrapOutput = (input, state = {}, options = {}) => { - const prepend = options.contains ? '' : '^'; - const append = options.contains ? '' : '$'; - - let output = `${prepend}(?:${input})${append}`; - if (state.negated === true) { - output = `(?:^(?!${output}).*$)`; - } - return output; -}; + +Object.defineProperty(exports, "__esModule", { value: true }); +const events_1 = __webpack_require__(155); +const fsScandir = __webpack_require__(340); +const fastq = __webpack_require__(349); +const common = __webpack_require__(351); +const reader_1 = __webpack_require__(352); +class AsyncReader extends reader_1.default { + constructor(_root, _settings) { + super(_root, _settings); + this._settings = _settings; + this._scandir = fsScandir.scandir; + this._emitter = new events_1.EventEmitter(); + this._queue = fastq(this._worker.bind(this), this._settings.concurrency); + this._isFatalError = false; + this._isDestroyed = false; + this._queue.drain = () => { + if (!this._isFatalError) { + this._emitter.emit('end'); + } + }; + } + read() { + this._isFatalError = false; + this._isDestroyed = false; + setImmediate(() => { + this._pushToQueue(this._root, this._settings.basePath); + }); + return this._emitter; + } + destroy() { + if (this._isDestroyed) { + throw new Error('The reader is already destroyed'); + } + this._isDestroyed = true; + this._queue.killAndDrain(); + } + onEntry(callback) { + this._emitter.on('entry', callback); + } + onError(callback) { + this._emitter.once('error', callback); + } + onEnd(callback) { + this._emitter.once('end', callback); + } + _pushToQueue(directory, base) { + const queueItem = { directory, base }; + this._queue.push(queueItem, (error) => { + if (error !== null) { + this._handleError(error); + } + }); + } + _worker(item, done) { + this._scandir(item.directory, this._settings.fsScandirSettings, (error, entries) => { + if (error !== null) { + return done(error, undefined); + } + for (const entry of entries) { + this._handleEntry(entry, item.base); + } + done(null, undefined); + }); + } + _handleError(error) { + if (!common.isFatalError(this._settings, error)) { + return; + } + this._isFatalError = true; + this._isDestroyed = true; + this._emitter.emit('error', error); + } + _handleEntry(entry, base) { + if (this._isDestroyed || this._isFatalError) { + return; + } + const fullpath = entry.path; + if (base !== undefined) { + entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); + } + if (common.isAppliedFilter(this._settings.entryFilter, entry)) { + this._emitEntry(entry); + } + if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { + this._pushToQueue(fullpath, entry.path); + } + } + _emitEntry(entry) { + this._emitter.emit('entry', entry); + } +} +exports.default = AsyncReader; /***/ }), -/* 331 */ +/* 340 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async = __webpack_require__(341); +const sync = __webpack_require__(346); +const settings_1 = __webpack_require__(347); +exports.Settings = settings_1.default; +function scandir(path, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return async.read(path, getSettings(), optionsOrSettingsOrCallback); + } + async.read(path, getSettings(optionsOrSettingsOrCallback), callback); +} +exports.scandir = scandir; +function scandirSync(path, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + return sync.read(path, settings); +} +exports.scandirSync = scandirSync; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} -const path = __webpack_require__(4); -const WIN_SLASH = '\\\\/'; -const WIN_NO_SLASH = `[^${WIN_SLASH}]`; - -/** - * Posix glob regex - */ - -const DOT_LITERAL = '\\.'; -const PLUS_LITERAL = '\\+'; -const QMARK_LITERAL = '\\?'; -const SLASH_LITERAL = '\\/'; -const ONE_CHAR = '(?=.)'; -const QMARK = '[^/]'; -const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; -const START_ANCHOR = `(?:^|${SLASH_LITERAL})`; -const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; -const NO_DOT = `(?!${DOT_LITERAL})`; -const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; -const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; -const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; -const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; -const STAR = `${QMARK}*?`; - -const POSIX_CHARS = { - DOT_LITERAL, - PLUS_LITERAL, - QMARK_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - QMARK, - END_ANCHOR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK_NO_DOT, - STAR, - START_ANCHOR -}; - -/** - * Windows glob regex - */ - -const WINDOWS_CHARS = { - ...POSIX_CHARS, +/***/ }), +/* 341 */ +/***/ (function(module, exports, __webpack_require__) { - SLASH_LITERAL: `[${WIN_SLASH}]`, - QMARK: WIN_NO_SLASH, - STAR: `${WIN_NO_SLASH}*?`, - DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, - NO_DOT: `(?!${DOT_LITERAL})`, - NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, - NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - QMARK_NO_DOT: `[^.${WIN_SLASH}]`, - START_ANCHOR: `(?:^|[${WIN_SLASH}])`, - END_ANCHOR: `(?:[${WIN_SLASH}]|$)` -}; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(332); +const rpl = __webpack_require__(342); +const constants_1 = __webpack_require__(343); +const utils = __webpack_require__(344); +function read(directory, settings, callback) { + if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { + return readdirWithFileTypes(directory, settings, callback); + } + return readdir(directory, settings, callback); +} +exports.read = read; +function readdirWithFileTypes(directory, settings, callback) { + settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => { + if (readdirError !== null) { + return callFailureCallback(callback, readdirError); + } + const entries = dirents.map((dirent) => ({ + dirent, + name: dirent.name, + path: `${directory}${settings.pathSegmentSeparator}${dirent.name}` + })); + if (!settings.followSymbolicLinks) { + return callSuccessCallback(callback, entries); + } + const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings)); + rpl(tasks, (rplError, rplEntries) => { + if (rplError !== null) { + return callFailureCallback(callback, rplError); + } + callSuccessCallback(callback, rplEntries); + }); + }); +} +exports.readdirWithFileTypes = readdirWithFileTypes; +function makeRplTaskEntry(entry, settings) { + return (done) => { + if (!entry.dirent.isSymbolicLink()) { + return done(null, entry); + } + settings.fs.stat(entry.path, (statError, stats) => { + if (statError !== null) { + if (settings.throwErrorOnBrokenSymbolicLink) { + return done(statError); + } + return done(null, entry); + } + entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); + return done(null, entry); + }); + }; +} +function readdir(directory, settings, callback) { + settings.fs.readdir(directory, (readdirError, names) => { + if (readdirError !== null) { + return callFailureCallback(callback, readdirError); + } + const filepaths = names.map((name) => `${directory}${settings.pathSegmentSeparator}${name}`); + const tasks = filepaths.map((filepath) => { + return (done) => fsStat.stat(filepath, settings.fsStatSettings, done); + }); + rpl(tasks, (rplError, results) => { + if (rplError !== null) { + return callFailureCallback(callback, rplError); + } + const entries = []; + names.forEach((name, index) => { + const stats = results[index]; + const entry = { + name, + path: filepaths[index], + dirent: utils.fs.createDirentFromStats(name, stats) + }; + if (settings.stats) { + entry.stats = stats; + } + entries.push(entry); + }); + callSuccessCallback(callback, entries); + }); + }); +} +exports.readdir = readdir; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, result) { + callback(null, result); +} -/** - * POSIX Bracket Regex - */ -const POSIX_REGEX_SOURCE = { - alnum: 'a-zA-Z0-9', - alpha: 'a-zA-Z', - ascii: '\\x00-\\x7F', - blank: ' \\t', - cntrl: '\\x00-\\x1F\\x7F', - digit: '0-9', - graph: '\\x21-\\x7E', - lower: 'a-z', - print: '\\x20-\\x7E ', - punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', - space: ' \\t\\r\\n\\v\\f', - upper: 'A-Z', - word: 'A-Za-z0-9_', - xdigit: 'A-Fa-f0-9' -}; +/***/ }), +/* 342 */ +/***/ (function(module, exports) { -module.exports = { - MAX_LENGTH: 1024 * 64, - POSIX_REGEX_SOURCE, +module.exports = runParallel - // regular expressions - REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, - REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, - REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, - REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, - REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, - REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, +function runParallel (tasks, cb) { + var results, pending, keys + var isSync = true - // Replace globs with equivalent patterns to reduce parsing time. - REPLACEMENTS: { - '***': '*', - '**/**': '**', - '**/**/**': '**' - }, + if (Array.isArray(tasks)) { + results = [] + pending = tasks.length + } else { + keys = Object.keys(tasks) + results = {} + pending = keys.length + } - // Digits - CHAR_0: 48, /* 0 */ - CHAR_9: 57, /* 9 */ + function done (err) { + function end () { + if (cb) cb(err, results) + cb = null + } + if (isSync) process.nextTick(end) + else end() + } - // Alphabet chars. - CHAR_UPPERCASE_A: 65, /* A */ - CHAR_LOWERCASE_A: 97, /* a */ - CHAR_UPPERCASE_Z: 90, /* Z */ - CHAR_LOWERCASE_Z: 122, /* z */ + function each (i, err, result) { + results[i] = result + if (--pending === 0 || err) { + done(err) + } + } - CHAR_LEFT_PARENTHESES: 40, /* ( */ - CHAR_RIGHT_PARENTHESES: 41, /* ) */ + if (!pending) { + // empty + done(null) + } else if (keys) { + // object + keys.forEach(function (key) { + tasks[key](function (err, result) { each(key, err, result) }) + }) + } else { + // array + tasks.forEach(function (task, i) { + task(function (err, result) { each(i, err, result) }) + }) + } - CHAR_ASTERISK: 42, /* * */ + isSync = false +} - // Non-alphabetic chars. - CHAR_AMPERSAND: 38, /* & */ - CHAR_AT: 64, /* @ */ - CHAR_BACKWARD_SLASH: 92, /* \ */ - CHAR_CARRIAGE_RETURN: 13, /* \r */ - CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */ - CHAR_COLON: 58, /* : */ - CHAR_COMMA: 44, /* , */ - CHAR_DOT: 46, /* . */ - CHAR_DOUBLE_QUOTE: 34, /* " */ - CHAR_EQUAL: 61, /* = */ - CHAR_EXCLAMATION_MARK: 33, /* ! */ - CHAR_FORM_FEED: 12, /* \f */ - CHAR_FORWARD_SLASH: 47, /* / */ - CHAR_GRAVE_ACCENT: 96, /* ` */ - CHAR_HASH: 35, /* # */ - CHAR_HYPHEN_MINUS: 45, /* - */ - CHAR_LEFT_ANGLE_BRACKET: 60, /* < */ - CHAR_LEFT_CURLY_BRACE: 123, /* { */ - CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */ - CHAR_LINE_FEED: 10, /* \n */ - CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */ - CHAR_PERCENT: 37, /* % */ - CHAR_PLUS: 43, /* + */ - CHAR_QUESTION_MARK: 63, /* ? */ - CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */ - CHAR_RIGHT_CURLY_BRACE: 125, /* } */ - CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */ - CHAR_SEMICOLON: 59, /* ; */ - CHAR_SINGLE_QUOTE: 39, /* ' */ - CHAR_SPACE: 32, /* */ - CHAR_TAB: 9, /* \t */ - CHAR_UNDERSCORE: 95, /* _ */ - CHAR_VERTICAL_LINE: 124, /* | */ - CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */ - SEP: path.sep, +/***/ }), +/* 343 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Create EXTGLOB_CHARS - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.'); +const MAJOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); +const MINOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); +const SUPPORTED_MAJOR_VERSION = 10; +const SUPPORTED_MINOR_VERSION = 10; +const IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION; +const IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION; +/** + * IS `true` for Node.js 10.10 and greater. + */ +exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR; - extglobChars(chars) { - return { - '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` }, - '?': { type: 'qmark', open: '(?:', close: ')?' }, - '+': { type: 'plus', open: '(?:', close: ')+' }, - '*': { type: 'star', open: '(?:', close: ')*' }, - '@': { type: 'at', open: '(?:', close: ')' } - }; - }, - /** - * Create GLOB_CHARS - */ +/***/ }), +/* 344 */ +/***/ (function(module, exports, __webpack_require__) { - globChars(win32) { - return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; - } -}; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(345); +exports.fs = fs; /***/ }), -/* 332 */ +/* 345 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +class DirentFromStats { + constructor(name, stats) { + this.name = name; + this.isBlockDevice = stats.isBlockDevice.bind(stats); + this.isCharacterDevice = stats.isCharacterDevice.bind(stats); + this.isDirectory = stats.isDirectory.bind(stats); + this.isFIFO = stats.isFIFO.bind(stats); + this.isFile = stats.isFile.bind(stats); + this.isSocket = stats.isSocket.bind(stats); + this.isSymbolicLink = stats.isSymbolicLink.bind(stats); + } +} +function createDirentFromStats(name, stats) { + return new DirentFromStats(name, stats); +} +exports.createDirentFromStats = createDirentFromStats; -const constants = __webpack_require__(331); -const utils = __webpack_require__(330); +/***/ }), +/* 346 */ +/***/ (function(module, exports, __webpack_require__) { -/** - * Constants - */ - -const { - MAX_LENGTH, - POSIX_REGEX_SOURCE, - REGEX_NON_SPECIAL_CHARS, - REGEX_SPECIAL_CHARS_BACKREF, - REPLACEMENTS -} = constants; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(332); +const constants_1 = __webpack_require__(343); +const utils = __webpack_require__(344); +function read(directory, settings) { + if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { + return readdirWithFileTypes(directory, settings); + } + return readdir(directory, settings); +} +exports.read = read; +function readdirWithFileTypes(directory, settings) { + const dirents = settings.fs.readdirSync(directory, { withFileTypes: true }); + return dirents.map((dirent) => { + const entry = { + dirent, + name: dirent.name, + path: `${directory}${settings.pathSegmentSeparator}${dirent.name}` + }; + if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) { + try { + const stats = settings.fs.statSync(entry.path); + entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); + } + catch (error) { + if (settings.throwErrorOnBrokenSymbolicLink) { + throw error; + } + } + } + return entry; + }); +} +exports.readdirWithFileTypes = readdirWithFileTypes; +function readdir(directory, settings) { + const names = settings.fs.readdirSync(directory); + return names.map((name) => { + const entryPath = `${directory}${settings.pathSegmentSeparator}${name}`; + const stats = fsStat.statSync(entryPath, settings.fsStatSettings); + const entry = { + name, + path: entryPath, + dirent: utils.fs.createDirentFromStats(name, stats) + }; + if (settings.stats) { + entry.stats = stats; + } + return entry; + }); +} +exports.readdir = readdir; -/** - * Helpers - */ -const expandRange = (args, options) => { - if (typeof options.expandRange === 'function') { - return options.expandRange(...args, options); - } +/***/ }), +/* 347 */ +/***/ (function(module, exports, __webpack_require__) { - args.sort(); - const value = `[${args.join('-')}]`; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const fsStat = __webpack_require__(332); +const fs = __webpack_require__(348); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); + this.fs = fs.createFileSystemAdapter(this._options.fs); + this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); + this.stats = this._getValue(this._options.stats, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); + this.fsStatSettings = new fsStat.Settings({ + followSymbolicLink: this.followSymbolicLinks, + fs: this.fs, + throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink + }); + } + _getValue(option, value) { + return option === undefined ? value : option; + } +} +exports.default = Settings; - try { - /* eslint-disable-next-line no-new */ - new RegExp(value); - } catch (ex) { - return args.map(v => utils.escapeRegex(v)).join('..'); - } - return value; -}; +/***/ }), +/* 348 */ +/***/ (function(module, exports, __webpack_require__) { -/** - * Create the message for a syntax error - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(133); +exports.FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + stat: fs.stat, + lstatSync: fs.lstatSync, + statSync: fs.statSync, + readdir: fs.readdir, + readdirSync: fs.readdirSync +}; +function createFileSystemAdapter(fsMethods) { + if (fsMethods === undefined) { + return exports.FILE_SYSTEM_ADAPTER; + } + return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods); +} +exports.createFileSystemAdapter = createFileSystemAdapter; -const syntaxError = (type, char) => { - return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; -}; -/** - * Parse the given input string. - * @param {String} input - * @param {Object} options - * @return {Object} - */ +/***/ }), +/* 349 */ +/***/ (function(module, exports, __webpack_require__) { -const parse = (input, options) => { - if (typeof input !== 'string') { - throw new TypeError('Expected a string'); - } +"use strict"; - input = REPLACEMENTS[input] || input; - const opts = { ...options }; - const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; +var reusify = __webpack_require__(350) - let len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); +function fastqueue (context, worker, concurrency) { + if (typeof context === 'function') { + concurrency = worker + worker = context + context = null } - const bos = { type: 'bos', value: '', output: opts.prepend || '' }; - const tokens = [bos]; - - const capture = opts.capture ? '' : '?:'; - const win32 = utils.isWindows(options); - - // create constants based on platform, for windows or posix - const PLATFORM_CHARS = constants.globChars(win32); - const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); - - const { - DOT_LITERAL, - PLUS_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK, - QMARK_NO_DOT, - STAR, - START_ANCHOR - } = PLATFORM_CHARS; + var cache = reusify(Task) + var queueHead = null + var queueTail = null + var _running = 0 - const globstar = (opts) => { - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; + var self = { + push: push, + drain: noop, + saturated: noop, + pause: pause, + paused: false, + concurrency: concurrency, + running: running, + resume: resume, + idle: idle, + length: length, + unshift: unshift, + empty: noop, + kill: kill, + killAndDrain: killAndDrain + } - const nodot = opts.dot ? '' : NO_DOT; - const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; - let star = opts.bash === true ? globstar(opts) : STAR; + return self - if (opts.capture) { - star = `(${star})`; + function running () { + return _running } - // minimatch options support - if (typeof opts.noext === 'boolean') { - opts.noextglob = opts.noext; + function pause () { + self.paused = true } - const state = { - input, - index: -1, - start: 0, - dot: opts.dot === true, - consumed: '', - output: '', - prefix: '', - backtrack: false, - negated: false, - brackets: 0, - braces: 0, - parens: 0, - quotes: 0, - globstar: false, - tokens - }; - - input = utils.removePrefix(input, state); - len = input.length; - - const extglobs = []; - const braces = []; - const stack = []; - let prev = bos; - let value; - - /** - * Tokenizing helpers - */ + function length () { + var current = queueHead + var counter = 0 - const eos = () => state.index === len - 1; - const peek = state.peek = (n = 1) => input[state.index + n]; - const advance = state.advance = () => input[++state.index]; - const remaining = () => input.slice(state.index + 1); - const consume = (value = '', num = 0) => { - state.consumed += value; - state.index += num; - }; - const append = token => { - state.output += token.output != null ? token.output : token.value; - consume(token.value); - }; + while (current) { + current = current.next + counter++ + } - const negate = () => { - let count = 1; + return counter + } - while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) { - advance(); - state.start++; - count++; + function resume () { + if (!self.paused) return + self.paused = false + for (var i = 0; i < self.concurrency; i++) { + _running++ + release() } + } - if (count % 2 === 0) { - return false; - } + function idle () { + return _running === 0 && self.length() === 0 + } - state.negated = true; - state.start++; - return true; - }; + function push (value, done) { + var current = cache.get() - const increment = type => { - state[type]++; - stack.push(type); - }; + current.context = context + current.release = release + current.value = value + current.callback = done || noop - const decrement = type => { - state[type]--; - stack.pop(); - }; + if (_running === self.concurrency || self.paused) { + if (queueTail) { + queueTail.next = current + queueTail = current + } else { + queueHead = current + queueTail = current + self.saturated() + } + } else { + _running++ + worker.call(context, current.value, current.worked) + } + } - /** - * Push tokens onto the tokens array. This helper speeds up - * tokenizing by 1) helping us avoid backtracking as much as possible, - * and 2) helping us avoid creating extra tokens when consecutive - * characters are plain text. This improves performance and simplifies - * lookbehinds. - */ + function unshift (value, done) { + var current = cache.get() - const push = tok => { - if (prev.type === 'globstar') { - const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); - const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren')); + current.context = context + current.release = release + current.value = value + current.callback = done || noop - if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { - state.output = state.output.slice(0, -prev.output.length); - prev.type = 'star'; - prev.value = '*'; - prev.output = star; - state.output += prev.output; + if (_running === self.concurrency || self.paused) { + if (queueHead) { + current.next = queueHead + queueHead = current + } else { + queueHead = current + queueTail = current + self.saturated() } + } else { + _running++ + worker.call(context, current.value, current.worked) } + } - if (extglobs.length && tok.type !== 'paren' && !EXTGLOB_CHARS[tok.value]) { - extglobs[extglobs.length - 1].inner += tok.value; + function release (holder) { + if (holder) { + cache.release(holder) } - - if (tok.value || tok.output) append(tok); - if (prev && prev.type === 'text' && tok.type === 'text') { - prev.value += tok.value; - prev.output = (prev.output || '') + tok.value; - return; + var next = queueHead + if (next) { + if (!self.paused) { + if (queueTail === queueHead) { + queueTail = null + } + queueHead = next.next + next.next = null + worker.call(context, next.value, next.worked) + if (queueTail === null) { + self.empty() + } + } else { + _running-- + } + } else if (--_running === 0) { + self.drain() } + } - tok.prev = prev; - tokens.push(tok); - prev = tok; - }; - - const extglobOpen = (type, value) => { - const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; - - token.prev = prev; - token.parens = state.parens; - token.output = state.output; - const output = (opts.capture ? '(' : '') + token.open; - - increment('parens'); - push({ type, value, output: state.output ? '' : ONE_CHAR }); - push({ type: 'paren', extglob: true, value: advance(), output }); - extglobs.push(token); - }; + function kill () { + queueHead = null + queueTail = null + self.drain = noop + } - const extglobClose = token => { - let output = token.close + (opts.capture ? ')' : ''); + function killAndDrain () { + queueHead = null + queueTail = null + self.drain() + self.drain = noop + } +} - if (token.type === 'negate') { - let extglobStar = star; +function noop () {} - if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { - extglobStar = globstar(opts); - } +function Task () { + this.value = null + this.callback = noop + this.next = null + this.release = noop + this.context = null - if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) { - output = token.close = `)$))${extglobStar}`; - } + var self = this - if (token.prev.type === 'bos' && eos()) { - state.negatedExtglob = true; - } - } + this.worked = function worked (err, result) { + var callback = self.callback + self.value = null + self.callback = noop + callback.call(self.context, err, result) + self.release(self) + } +} - push({ type: 'paren', extglob: true, value, output }); - decrement('parens'); - }; +module.exports = fastqueue - /** - * Fast paths - */ - if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) { - let backslashes = false; +/***/ }), +/* 350 */ +/***/ (function(module, exports, __webpack_require__) { - let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { - if (first === '\\') { - backslashes = true; - return m; - } +"use strict"; - if (first === '?') { - if (esc) { - return esc + first + (rest ? QMARK.repeat(rest.length) : ''); - } - if (index === 0) { - return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); - } - return QMARK.repeat(chars.length); - } - if (first === '.') { - return DOT_LITERAL.repeat(chars.length); - } +function reusify (Constructor) { + var head = new Constructor() + var tail = head - if (first === '*') { - if (esc) { - return esc + first + (rest ? star : ''); - } - return star; - } - return esc ? m : `\\${m}`; - }); + function get () { + var current = head - if (backslashes === true) { - if (opts.unescape === true) { - output = output.replace(/\\/g, ''); - } else { - output = output.replace(/\\+/g, m => { - return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); - }); - } + if (current.next) { + head = current.next + } else { + head = new Constructor() + tail = head } - if (output === input && opts.contains === true) { - state.output = input; - return state; - } + current.next = null - state.output = utils.wrapOutput(output, state, options); - return state; + return current } - /** - * Tokenize input until we reach end-of-string - */ + function release (obj) { + tail.next = obj + tail = obj + } - while (!eos()) { - value = advance(); + return { + get: get, + release: release + } +} - if (value === '\u0000') { - continue; - } +module.exports = reusify - /** - * Escaped characters - */ - if (value === '\\') { - const next = peek(); +/***/ }), +/* 351 */ +/***/ (function(module, exports, __webpack_require__) { - if (next === '/' && opts.bash !== true) { - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function isFatalError(settings, error) { + if (settings.errorFilter === null) { + return true; + } + return !settings.errorFilter(error); +} +exports.isFatalError = isFatalError; +function isAppliedFilter(filter, value) { + return filter === null || filter(value); +} +exports.isAppliedFilter = isAppliedFilter; +function replacePathSegmentSeparator(filepath, separator) { + return filepath.split(/[\\/]/).join(separator); +} +exports.replacePathSegmentSeparator = replacePathSegmentSeparator; +function joinPathSegments(a, b, separator) { + if (a === '') { + return b; + } + return a + separator + b; +} +exports.joinPathSegments = joinPathSegments; - if (next === '.' || next === ';') { - continue; - } - if (!next) { - value += '\\'; - push({ type: 'text', value }); - continue; - } +/***/ }), +/* 352 */ +/***/ (function(module, exports, __webpack_require__) { - // collapse slashes to reduce potential for exploits - const match = /^\\+/.exec(remaining()); - let slashes = 0; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const common = __webpack_require__(351); +class Reader { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); + } +} +exports.default = Reader; - if (match && match[0].length > 2) { - slashes = match[0].length; - state.index += slashes; - if (slashes % 2 !== 0) { - value += '\\'; - } - } - if (opts.unescape === true) { - value = advance() || ''; - } else { - value += advance() || ''; - } +/***/ }), +/* 353 */ +/***/ (function(module, exports, __webpack_require__) { - if (state.brackets === 0) { - push({ type: 'text', value }); - continue; - } - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(137); +const async_1 = __webpack_require__(339); +class StreamProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new async_1.default(this._root, this._settings); + this._stream = new stream_1.Readable({ + objectMode: true, + read: () => { }, + destroy: this._reader.destroy.bind(this._reader) + }); + } + read() { + this._reader.onError((error) => { + this._stream.emit('error', error); + }); + this._reader.onEntry((entry) => { + this._stream.push(entry); + }); + this._reader.onEnd(() => { + this._stream.push(null); + }); + this._reader.read(); + return this._stream; + } +} +exports.default = StreamProvider; - /** - * If we're inside a regex character class, continue - * until we reach the closing bracket. - */ - if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { - if (opts.posix !== false && value === ':') { - const inner = prev.value.slice(1); - if (inner.includes('[')) { - prev.posix = true; +/***/ }), +/* 354 */ +/***/ (function(module, exports, __webpack_require__) { - if (inner.includes(':')) { - const idx = prev.value.lastIndexOf('['); - const pre = prev.value.slice(0, idx); - const rest = prev.value.slice(idx + 2); - const posix = POSIX_REGEX_SOURCE[rest]; - if (posix) { - prev.value = pre + posix; - state.backtrack = true; - advance(); +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const sync_1 = __webpack_require__(355); +class SyncProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new sync_1.default(this._root, this._settings); + } + read() { + return this._reader.read(); + } +} +exports.default = SyncProvider; - if (!bos.output && tokens.indexOf(prev) === 1) { - bos.output = ONE_CHAR; - } - continue; - } - } - } - } - if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { - value = `\\${value}`; - } +/***/ }), +/* 355 */ +/***/ (function(module, exports, __webpack_require__) { - if (value === ']' && (prev.value === '[' || prev.value === '[^')) { - value = `\\${value}`; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsScandir = __webpack_require__(340); +const common = __webpack_require__(351); +const reader_1 = __webpack_require__(352); +class SyncReader extends reader_1.default { + constructor() { + super(...arguments); + this._scandir = fsScandir.scandirSync; + this._storage = new Set(); + this._queue = new Set(); + } + read() { + this._pushToQueue(this._root, this._settings.basePath); + this._handleQueue(); + return [...this._storage]; + } + _pushToQueue(directory, base) { + this._queue.add({ directory, base }); + } + _handleQueue() { + for (const item of this._queue.values()) { + this._handleDirectory(item.directory, item.base); + } + } + _handleDirectory(directory, base) { + try { + const entries = this._scandir(directory, this._settings.fsScandirSettings); + for (const entry of entries) { + this._handleEntry(entry, base); + } + } + catch (error) { + this._handleError(error); + } + } + _handleError(error) { + if (!common.isFatalError(this._settings, error)) { + return; + } + throw error; + } + _handleEntry(entry, base) { + const fullpath = entry.path; + if (base !== undefined) { + entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); + } + if (common.isAppliedFilter(this._settings.entryFilter, entry)) { + this._pushToStorage(entry); + } + if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { + this._pushToQueue(fullpath, entry.path); + } + } + _pushToStorage(entry) { + this._storage.add(entry); + } +} +exports.default = SyncReader; - if (opts.posix === true && value === '!' && prev.value === '[') { - value = '^'; - } - prev.value += value; - append({ value }); - continue; - } +/***/ }), +/* 356 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * If we're inside a quoted string, continue - * until we reach the closing double quote. - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const fsScandir = __webpack_require__(340); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.basePath = this._getValue(this._options.basePath, undefined); + this.concurrency = this._getValue(this._options.concurrency, Infinity); + this.deepFilter = this._getValue(this._options.deepFilter, null); + this.entryFilter = this._getValue(this._options.entryFilter, null); + this.errorFilter = this._getValue(this._options.errorFilter, null); + this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); + this.fsScandirSettings = new fsScandir.Settings({ + followSymbolicLinks: this._options.followSymbolicLinks, + fs: this._options.fs, + pathSegmentSeparator: this._options.pathSegmentSeparator, + stats: this._options.stats, + throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink + }); + } + _getValue(option, value) { + return option === undefined ? value : option; + } +} +exports.default = Settings; - if (state.quotes === 1 && value !== '"') { - value = utils.escapeRegex(value); - prev.value += value; - append({ value }); - continue; - } - /** - * Double quotes - */ +/***/ }), +/* 357 */ +/***/ (function(module, exports, __webpack_require__) { - if (value === '"') { - state.quotes = state.quotes === 1 ? 0 : 1; - if (opts.keepQuotes === true) { - push({ type: 'text', value }); - } - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const fsStat = __webpack_require__(332); +const utils = __webpack_require__(302); +class Reader { + constructor(_settings) { + this._settings = _settings; + this._fsStatSettings = new fsStat.Settings({ + followSymbolicLink: this._settings.followSymbolicLinks, + fs: this._settings.fs, + throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks + }); + } + _getFullEntryPath(filepath) { + return path.resolve(this._settings.cwd, filepath); + } + _makeEntry(stats, pattern) { + const entry = { + name: pattern, + path: pattern, + dirent: utils.fs.createDirentFromStats(pattern, stats) + }; + if (this._settings.stats) { + entry.stats = stats; + } + return entry; + } + _isFatalError(error) { + return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; + } +} +exports.default = Reader; - /** - * Parentheses - */ - if (value === '(') { - increment('parens'); - push({ type: 'paren', value }); - continue; - } +/***/ }), +/* 358 */ +/***/ (function(module, exports, __webpack_require__) { - if (value === ')') { - if (state.parens === 0 && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '(')); - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const deep_1 = __webpack_require__(359); +const entry_1 = __webpack_require__(362); +const error_1 = __webpack_require__(363); +const entry_2 = __webpack_require__(364); +class Provider { + constructor(_settings) { + this._settings = _settings; + this.errorFilter = new error_1.default(this._settings); + this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); + this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); + this.entryTransformer = new entry_2.default(this._settings); + } + _getRootDirectory(task) { + return path.resolve(this._settings.cwd, task.base); + } + _getReaderOptions(task) { + const basePath = task.base === '.' ? '' : task.base; + return { + basePath, + pathSegmentSeparator: '/', + concurrency: this._settings.concurrency, + deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), + entryFilter: this.entryFilter.getFilter(task.positive, task.negative), + errorFilter: this.errorFilter.getFilter(), + followSymbolicLinks: this._settings.followSymbolicLinks, + fs: this._settings.fs, + stats: this._settings.stats, + throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, + transform: this.entryTransformer.getTransformer() + }; + } + _getMicromatchOptions() { + return { + dot: this._settings.dot, + matchBase: this._settings.baseNameMatch, + nobrace: !this._settings.braceExpansion, + nocase: !this._settings.caseSensitiveMatch, + noext: !this._settings.extglob, + noglobstar: !this._settings.globstar, + posix: true, + strictSlashes: false + }; + } +} +exports.default = Provider; - const extglob = extglobs[extglobs.length - 1]; - if (extglob && state.parens === extglob.parens + 1) { - extglobClose(extglobs.pop()); - continue; - } - push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); - decrement('parens'); - continue; - } +/***/ }), +/* 359 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Square brackets - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(302); +const partial_1 = __webpack_require__(360); +class DeepFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + } + getFilter(basePath, positive, negative) { + const matcher = this._getMatcher(positive); + const negativeRe = this._getNegativePatternsRe(negative); + return (entry) => this._filter(basePath, entry, matcher, negativeRe); + } + _getMatcher(patterns) { + return new partial_1.default(patterns, this._settings, this._micromatchOptions); + } + _getNegativePatternsRe(patterns) { + const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); + return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); + } + _filter(basePath, entry, matcher, negativeRe) { + const depth = this._getEntryLevel(basePath, entry.path); + if (this._isSkippedByDeep(depth)) { + return false; + } + if (this._isSkippedSymbolicLink(entry)) { + return false; + } + const filepath = utils.path.removeLeadingDotSegment(entry.path); + if (this._isSkippedByPositivePatterns(filepath, matcher)) { + return false; + } + return this._isSkippedByNegativePatterns(filepath, negativeRe); + } + _isSkippedByDeep(entryDepth) { + return entryDepth >= this._settings.deep; + } + _isSkippedSymbolicLink(entry) { + return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); + } + _getEntryLevel(basePath, entryPath) { + const basePathDepth = basePath.split('/').length; + const entryPathDepth = entryPath.split('/').length; + return entryPathDepth - (basePath === '' ? 0 : basePathDepth); + } + _isSkippedByPositivePatterns(entryPath, matcher) { + return !this._settings.baseNameMatch && !matcher.match(entryPath); + } + _isSkippedByNegativePatterns(entryPath, negativeRe) { + return !utils.pattern.matchAny(entryPath, negativeRe); + } +} +exports.default = DeepFilter; - if (value === '[') { - if (opts.nobracket === true || !remaining().includes(']')) { - if (opts.nobracket !== true && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('closing', ']')); - } - value = `\\${value}`; - } else { - increment('brackets'); - } +/***/ }), +/* 360 */ +/***/ (function(module, exports, __webpack_require__) { - push({ type: 'bracket', value }); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const matcher_1 = __webpack_require__(361); +class PartialMatcher extends matcher_1.default { + match(filepath) { + const parts = filepath.split('/'); + const levels = parts.length; + const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels); + for (const pattern of patterns) { + const section = pattern.sections[0]; + /** + * In this case, the pattern has a globstar and we must read all directories unconditionally, + * but only if the level has reached the end of the first group. + * + * fixtures/{a,b}/** + * ^ true/false ^ always true + */ + if (!pattern.complete && levels > section.length) { + return true; + } + const match = parts.every((part, index) => { + const segment = pattern.segments[index]; + if (segment.dynamic && segment.patternRe.test(part)) { + return true; + } + if (!segment.dynamic && segment.pattern === part) { + return true; + } + return false; + }); + if (match) { + return true; + } + } + return false; + } +} +exports.default = PartialMatcher; - if (value === ']') { - if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { - push({ type: 'text', value, output: `\\${value}` }); - continue; - } - if (state.brackets === 0) { - if (opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '[')); - } - - push({ type: 'text', value, output: `\\${value}` }); - continue; - } - - decrement('brackets'); - - const prevValue = prev.value.slice(1); - if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { - value = `/${value}`; - } - - prev.value += value; - append({ value }); - - // when literal brackets are explicitly disabled - // assume we should match with a regex character class - if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { - continue; - } - - const escaped = utils.escapeRegex(prev.value); - state.output = state.output.slice(0, -prev.value.length); - - // when literal brackets are explicitly enabled - // assume we should escape the brackets to match literal characters - if (opts.literalBrackets === true) { - state.output += escaped; - prev.value = escaped; - continue; - } - - // when the user specifies nothing, try to match both - prev.value = `(${capture}${escaped}|${prev.value})`; - state.output += prev.value; - continue; - } - - /** - * Braces - */ - - if (value === '{' && opts.nobrace !== true) { - increment('braces'); - - const open = { - type: 'brace', - value, - output: '(', - outputIndex: state.output.length, - tokensIndex: state.tokens.length - }; - - braces.push(open); - push(open); - continue; - } - - if (value === '}') { - const brace = braces[braces.length - 1]; - - if (opts.nobrace === true || !brace) { - push({ type: 'text', value, output: value }); - continue; - } - - let output = ')'; - - if (brace.dots === true) { - const arr = tokens.slice(); - const range = []; - - for (let i = arr.length - 1; i >= 0; i--) { - tokens.pop(); - if (arr[i].type === 'brace') { - break; - } - if (arr[i].type !== 'dots') { - range.unshift(arr[i].value); - } - } - - output = expandRange(range, opts); - state.backtrack = true; - } - - if (brace.comma !== true && brace.dots !== true) { - const out = state.output.slice(0, brace.outputIndex); - const toks = state.tokens.slice(brace.tokensIndex); - brace.value = brace.output = '\\{'; - value = output = '\\}'; - state.output = out; - for (const t of toks) { - state.output += (t.output || t.value); - } - } - - push({ type: 'brace', value, output }); - decrement('braces'); - braces.pop(); - continue; - } - - /** - * Pipes - */ - - if (value === '|') { - if (extglobs.length > 0) { - extglobs[extglobs.length - 1].conditions++; - } - push({ type: 'text', value }); - continue; - } - - /** - * Commas - */ - - if (value === ',') { - let output = value; - - const brace = braces[braces.length - 1]; - if (brace && stack[stack.length - 1] === 'braces') { - brace.comma = true; - output = '|'; - } - - push({ type: 'comma', value, output }); - continue; - } - - /** - * Slashes - */ - - if (value === '/') { - // if the beginning of the glob is "./", advance the start - // to the current index, and don't add the "./" characters - // to the state. This greatly simplifies lookbehinds when - // checking for BOS characters like "!" and "." (not "./") - if (prev.type === 'dot' && state.index === state.start + 1) { - state.start = state.index + 1; - state.consumed = ''; - state.output = ''; - tokens.pop(); - prev = bos; // reset "prev" to the first token - continue; - } - - push({ type: 'slash', value, output: SLASH_LITERAL }); - continue; - } - - /** - * Dots - */ - - if (value === '.') { - if (state.braces > 0 && prev.type === 'dot') { - if (prev.value === '.') prev.output = DOT_LITERAL; - const brace = braces[braces.length - 1]; - prev.type = 'dots'; - prev.output += value; - prev.value += value; - brace.dots = true; - continue; - } - - if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') { - push({ type: 'text', value, output: DOT_LITERAL }); - continue; - } - - push({ type: 'dot', value, output: DOT_LITERAL }); - continue; - } - - /** - * Question marks - */ - - if (value === '?') { - const isGroup = prev && prev.value === '('; - if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('qmark', value); - continue; - } - - if (prev && prev.type === 'paren') { - const next = peek(); - let output = value; - - if (next === '<' && !utils.supportsLookbehinds()) { - throw new Error('Node.js v10 or higher is required for regex lookbehinds'); - } - - if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) { - output = `\\${value}`; - } - - push({ type: 'text', value, output }); - continue; - } - - if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { - push({ type: 'qmark', value, output: QMARK_NO_DOT }); - continue; - } - - push({ type: 'qmark', value, output: QMARK }); - continue; - } - - /** - * Exclamation - */ - - if (value === '!') { - if (opts.noextglob !== true && peek() === '(') { - if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { - extglobOpen('negate', value); - continue; - } - } - - if (opts.nonegate !== true && state.index === 0) { - negate(); - continue; - } - } - - /** - * Plus - */ - - if (value === '+') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('plus', value); - continue; - } - - if ((prev && prev.value === '(') || opts.regex === false) { - push({ type: 'plus', value, output: PLUS_LITERAL }); - continue; - } - - if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) { - push({ type: 'plus', value }); - continue; - } - - push({ type: 'plus', value: PLUS_LITERAL }); - continue; - } - - /** - * Plain text - */ - - if (value === '@') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - push({ type: 'at', extglob: true, value, output: '' }); - continue; - } - - push({ type: 'text', value }); - continue; - } - - /** - * Plain text - */ - - if (value !== '*') { - if (value === '$' || value === '^') { - value = `\\${value}`; - } - - const match = REGEX_NON_SPECIAL_CHARS.exec(remaining()); - if (match) { - value += match[0]; - state.index += match[0].length; - } - - push({ type: 'text', value }); - continue; - } - - /** - * Stars - */ - - if (prev && (prev.type === 'globstar' || prev.star === true)) { - prev.type = 'star'; - prev.star = true; - prev.value += value; - prev.output = star; - state.backtrack = true; - state.globstar = true; - consume(value); - continue; - } - - let rest = remaining(); - if (opts.noextglob !== true && /^\([^?]/.test(rest)) { - extglobOpen('star', value); - continue; - } - - if (prev.type === 'star') { - if (opts.noglobstar === true) { - consume(value); - continue; - } - - const prior = prev.prev; - const before = prior.prev; - const isStart = prior.type === 'slash' || prior.type === 'bos'; - const afterStar = before && (before.type === 'star' || before.type === 'globstar'); - - if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) { - push({ type: 'star', value, output: '' }); - continue; - } - - const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); - const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); - if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { - push({ type: 'star', value, output: '' }); - continue; - } - - // strip consecutive `/**/` - while (rest.slice(0, 3) === '/**') { - const after = input[state.index + 4]; - if (after && after !== '/') { - break; - } - rest = rest.slice(3); - consume('/**', 3); - } - - if (prior.type === 'bos' && eos()) { - prev.type = 'globstar'; - prev.value += value; - prev.output = globstar(opts); - state.output = prev.output; - state.globstar = true; - consume(value); - continue; - } - - if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = `(?:${prior.output}`; - - prev.type = 'globstar'; - prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)'); - prev.value += value; - state.globstar = true; - state.output += prior.output + prev.output; - consume(value); - continue; - } - - if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') { - const end = rest[1] !== void 0 ? '|$' : ''; - - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = `(?:${prior.output}`; - - prev.type = 'globstar'; - prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; - prev.value += value; - - state.output += prior.output + prev.output; - state.globstar = true; - - consume(value + advance()); - - push({ type: 'slash', value: '/', output: '' }); - continue; - } - - if (prior.type === 'bos' && rest[0] === '/') { - prev.type = 'globstar'; - prev.value += value; - prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; - state.output = prev.output; - state.globstar = true; - consume(value + advance()); - push({ type: 'slash', value: '/', output: '' }); - continue; - } - - // remove single star from output - state.output = state.output.slice(0, -prev.output.length); - - // reset previous token to globstar - prev.type = 'globstar'; - prev.output = globstar(opts); - prev.value += value; - - // reset output with globstar - state.output += prev.output; - state.globstar = true; - consume(value); - continue; - } - - const token = { type: 'star', value, output: star }; - - if (opts.bash === true) { - token.output = '.*?'; - if (prev.type === 'bos' || prev.type === 'slash') { - token.output = nodot + token.output; - } - push(token); - continue; - } - - if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { - token.output = value; - push(token); - continue; - } - - if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { - if (prev.type === 'dot') { - state.output += NO_DOT_SLASH; - prev.output += NO_DOT_SLASH; - - } else if (opts.dot === true) { - state.output += NO_DOTS_SLASH; - prev.output += NO_DOTS_SLASH; - - } else { - state.output += nodot; - prev.output += nodot; - } - - if (peek() !== '*') { - state.output += ONE_CHAR; - prev.output += ONE_CHAR; - } - } - - push(token); - } - - while (state.brackets > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); - state.output = utils.escapeLast(state.output, '['); - decrement('brackets'); - } - - while (state.parens > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); - state.output = utils.escapeLast(state.output, '('); - decrement('parens'); - } - - while (state.braces > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); - state.output = utils.escapeLast(state.output, '{'); - decrement('braces'); - } - - if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { - push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); - } - - // rebuild the output if we had to backtrack at any point - if (state.backtrack === true) { - state.output = ''; - - for (const token of state.tokens) { - state.output += token.output != null ? token.output : token.value; - - if (token.suffix) { - state.output += token.suffix; - } - } - } - - return state; -}; - -/** - * Fast paths for creating regular expressions for common glob patterns. - * This can significantly speed up processing and has very little downside - * impact when none of the fast paths match. - */ - -parse.fastpaths = (input, options) => { - const opts = { ...options }; - const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - const len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } - - input = REPLACEMENTS[input] || input; - const win32 = utils.isWindows(options); - - // create constants based on platform, for windows or posix - const { - DOT_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOTS_SLASH, - STAR, - START_ANCHOR - } = constants.globChars(win32); - - const nodot = opts.dot ? NO_DOTS : NO_DOT; - const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; - const capture = opts.capture ? '' : '?:'; - const state = { negated: false, prefix: '' }; - let star = opts.bash === true ? '.*?' : STAR; - - if (opts.capture) { - star = `(${star})`; - } - - const globstar = (opts) => { - if (opts.noglobstar === true) return star; - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; - - const create = str => { - switch (str) { - case '*': - return `${nodot}${ONE_CHAR}${star}`; - - case '.*': - return `${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '*.*': - return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '*/*': - return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; - - case '**': - return nodot + globstar(opts); - - case '**/*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; - - case '**/*.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '**/.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; - - default: { - const match = /^(.*?)\.(\w+)$/.exec(str); - if (!match) return; - - const source = create(match[1]); - if (!source) return; - - return source + DOT_LITERAL + match[2]; - } - } - }; - - const output = utils.removePrefix(input, state); - let source = create(output); - - if (source && opts.strictSlashes !== true) { - source += `${SLASH_LITERAL}?`; - } - - return source; -}; - -module.exports = parse; - - -/***/ }), -/* 333 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const merge2 = __webpack_require__(299); -function merge(streams) { - const mergedStream = merge2(streams); - streams.forEach((stream) => { - stream.once('error', (error) => mergedStream.emit('error', error)); - }); - mergedStream.once('close', () => propagateCloseEventToSources(streams)); - mergedStream.once('end', () => propagateCloseEventToSources(streams)); - return mergedStream; -} -exports.merge = merge; -function propagateCloseEventToSources(streams) { - streams.forEach((stream) => stream.emit('close')); -} - - -/***/ }), -/* 334 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function isString(input) { - return typeof input === 'string'; -} -exports.isString = isString; -function isEmpty(input) { - return input === ''; -} -exports.isEmpty = isEmpty; - - -/***/ }), -/* 335 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(336); -const provider_1 = __webpack_require__(363); -class ProviderAsync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = []; - return new Promise((resolve, reject) => { - const stream = this.api(root, task, options); - stream.once('error', reject); - stream.on('data', (entry) => entries.push(options.transform(entry))); - stream.once('end', () => resolve(entries)); - }); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderAsync; - - -/***/ }), -/* 336 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(137); -const fsStat = __webpack_require__(337); -const fsWalk = __webpack_require__(342); -const reader_1 = __webpack_require__(362); -class ReaderStream extends reader_1.default { - constructor() { - super(...arguments); - this._walkStream = fsWalk.walkStream; - this._stat = fsStat.stat; - } - dynamic(root, options) { - return this._walkStream(root, options); - } - static(patterns, options) { - const filepaths = patterns.map(this._getFullEntryPath, this); - const stream = new stream_1.PassThrough({ objectMode: true }); - stream._write = (index, _enc, done) => { - return this._getEntry(filepaths[index], patterns[index], options) - .then((entry) => { - if (entry !== null && options.entryFilter(entry)) { - stream.push(entry); - } - if (index === filepaths.length - 1) { - stream.end(); - } - done(); - }) - .catch(done); - }; - for (let i = 0; i < filepaths.length; i++) { - stream.write(i); - } - return stream; - } - _getEntry(filepath, pattern, options) { - return this._getStat(filepath) - .then((stats) => this._makeEntry(stats, pattern)) - .catch((error) => { - if (options.errorFilter(error)) { - return null; - } - throw error; - }); - } - _getStat(filepath) { - return new Promise((resolve, reject) => { - this._stat(filepath, this._fsStatSettings, (error, stats) => { - return error === null ? resolve(stats) : reject(error); - }); - }); - } -} -exports.default = ReaderStream; - - -/***/ }), -/* 337 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(338); -const sync = __webpack_require__(339); -const settings_1 = __webpack_require__(340); -exports.Settings = settings_1.default; -function stat(path, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return async.read(path, getSettings(), optionsOrSettingsOrCallback); - } - async.read(path, getSettings(optionsOrSettingsOrCallback), callback); -} -exports.stat = stat; -function statSync(path, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path, settings); -} -exports.statSync = statSync; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); -} - - -/***/ }), -/* 338 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function read(path, settings, callback) { - settings.fs.lstat(path, (lstatError, lstat) => { - if (lstatError !== null) { - return callFailureCallback(callback, lstatError); - } - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - return callSuccessCallback(callback, lstat); - } - settings.fs.stat(path, (statError, stat) => { - if (statError !== null) { - if (settings.throwErrorOnBrokenSymbolicLink) { - return callFailureCallback(callback, statError); - } - return callSuccessCallback(callback, lstat); - } - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; - } - callSuccessCallback(callback, stat); - }); - }); -} -exports.read = read; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, result) { - callback(null, result); -} - - -/***/ }), -/* 339 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function read(path, settings) { - const lstat = settings.fs.lstatSync(path); - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - return lstat; - } - try { - const stat = settings.fs.statSync(path); - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; - } - return stat; - } - catch (error) { - if (!settings.throwErrorOnBrokenSymbolicLink) { - return lstat; - } - throw error; - } -} -exports.read = read; - - -/***/ }), -/* 340 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(341); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); - this.fs = fs.createFileSystemAdapter(this._options.fs); - this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); - } - _getValue(option, value) { - return option === undefined ? value : option; - } -} -exports.default = Settings; - - -/***/ }), -/* 341 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(133); -exports.FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - stat: fs.stat, - lstatSync: fs.lstatSync, - statSync: fs.statSync -}; -function createFileSystemAdapter(fsMethods) { - if (fsMethods === undefined) { - return exports.FILE_SYSTEM_ADAPTER; - } - return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods); -} -exports.createFileSystemAdapter = createFileSystemAdapter; - - -/***/ }), -/* 342 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(343); -const stream_1 = __webpack_require__(358); -const sync_1 = __webpack_require__(359); -const settings_1 = __webpack_require__(361); -exports.Settings = settings_1.default; -function walk(directory, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback); - } - new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback); -} -exports.walk = walk; -function walkSync(directory, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new sync_1.default(directory, settings); - return provider.read(); -} -exports.walkSync = walkSync; -function walkStream(directory, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new stream_1.default(directory, settings); - return provider.read(); -} -exports.walkStream = walkStream; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); -} - - -/***/ }), -/* 343 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(344); -class AsyncProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._storage = new Set(); - } - read(callback) { - this._reader.onError((error) => { - callFailureCallback(callback, error); - }); - this._reader.onEntry((entry) => { - this._storage.add(entry); - }); - this._reader.onEnd(() => { - callSuccessCallback(callback, [...this._storage]); - }); - this._reader.read(); - } -} -exports.default = AsyncProvider; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, entries) { - callback(null, entries); -} - - -/***/ }), -/* 344 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const events_1 = __webpack_require__(155); -const fsScandir = __webpack_require__(345); -const fastq = __webpack_require__(354); -const common = __webpack_require__(356); -const reader_1 = __webpack_require__(357); -class AsyncReader extends reader_1.default { - constructor(_root, _settings) { - super(_root, _settings); - this._settings = _settings; - this._scandir = fsScandir.scandir; - this._emitter = new events_1.EventEmitter(); - this._queue = fastq(this._worker.bind(this), this._settings.concurrency); - this._isFatalError = false; - this._isDestroyed = false; - this._queue.drain = () => { - if (!this._isFatalError) { - this._emitter.emit('end'); - } - }; - } - read() { - this._isFatalError = false; - this._isDestroyed = false; - setImmediate(() => { - this._pushToQueue(this._root, this._settings.basePath); - }); - return this._emitter; - } - destroy() { - if (this._isDestroyed) { - throw new Error('The reader is already destroyed'); - } - this._isDestroyed = true; - this._queue.killAndDrain(); - } - onEntry(callback) { - this._emitter.on('entry', callback); - } - onError(callback) { - this._emitter.once('error', callback); - } - onEnd(callback) { - this._emitter.once('end', callback); - } - _pushToQueue(directory, base) { - const queueItem = { directory, base }; - this._queue.push(queueItem, (error) => { - if (error !== null) { - this._handleError(error); - } - }); - } - _worker(item, done) { - this._scandir(item.directory, this._settings.fsScandirSettings, (error, entries) => { - if (error !== null) { - return done(error, undefined); - } - for (const entry of entries) { - this._handleEntry(entry, item.base); - } - done(null, undefined); - }); - } - _handleError(error) { - if (!common.isFatalError(this._settings, error)) { - return; - } - this._isFatalError = true; - this._isDestroyed = true; - this._emitter.emit('error', error); - } - _handleEntry(entry, base) { - if (this._isDestroyed || this._isFatalError) { - return; - } - const fullpath = entry.path; - if (base !== undefined) { - entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); - } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._emitEntry(entry); - } - if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { - this._pushToQueue(fullpath, entry.path); - } - } - _emitEntry(entry) { - this._emitter.emit('entry', entry); - } -} -exports.default = AsyncReader; - - -/***/ }), -/* 345 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(346); -const sync = __webpack_require__(351); -const settings_1 = __webpack_require__(352); -exports.Settings = settings_1.default; -function scandir(path, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return async.read(path, getSettings(), optionsOrSettingsOrCallback); - } - async.read(path, getSettings(optionsOrSettingsOrCallback), callback); -} -exports.scandir = scandir; -function scandirSync(path, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path, settings); -} -exports.scandirSync = scandirSync; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); -} - - -/***/ }), -/* 346 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(337); -const rpl = __webpack_require__(347); -const constants_1 = __webpack_require__(348); -const utils = __webpack_require__(349); -function read(directory, settings, callback) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - return readdirWithFileTypes(directory, settings, callback); - } - return readdir(directory, settings, callback); -} -exports.read = read; -function readdirWithFileTypes(directory, settings, callback) { - settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => { - if (readdirError !== null) { - return callFailureCallback(callback, readdirError); - } - const entries = dirents.map((dirent) => ({ - dirent, - name: dirent.name, - path: `${directory}${settings.pathSegmentSeparator}${dirent.name}` - })); - if (!settings.followSymbolicLinks) { - return callSuccessCallback(callback, entries); - } - const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings)); - rpl(tasks, (rplError, rplEntries) => { - if (rplError !== null) { - return callFailureCallback(callback, rplError); - } - callSuccessCallback(callback, rplEntries); - }); - }); -} -exports.readdirWithFileTypes = readdirWithFileTypes; -function makeRplTaskEntry(entry, settings) { - return (done) => { - if (!entry.dirent.isSymbolicLink()) { - return done(null, entry); - } - settings.fs.stat(entry.path, (statError, stats) => { - if (statError !== null) { - if (settings.throwErrorOnBrokenSymbolicLink) { - return done(statError); - } - return done(null, entry); - } - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - return done(null, entry); - }); - }; -} -function readdir(directory, settings, callback) { - settings.fs.readdir(directory, (readdirError, names) => { - if (readdirError !== null) { - return callFailureCallback(callback, readdirError); - } - const filepaths = names.map((name) => `${directory}${settings.pathSegmentSeparator}${name}`); - const tasks = filepaths.map((filepath) => { - return (done) => fsStat.stat(filepath, settings.fsStatSettings, done); - }); - rpl(tasks, (rplError, results) => { - if (rplError !== null) { - return callFailureCallback(callback, rplError); - } - const entries = []; - names.forEach((name, index) => { - const stats = results[index]; - const entry = { - name, - path: filepaths[index], - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - entries.push(entry); - }); - callSuccessCallback(callback, entries); - }); - }); -} -exports.readdir = readdir; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, result) { - callback(null, result); -} - - -/***/ }), -/* 347 */ -/***/ (function(module, exports) { - -module.exports = runParallel - -function runParallel (tasks, cb) { - var results, pending, keys - var isSync = true - - if (Array.isArray(tasks)) { - results = [] - pending = tasks.length - } else { - keys = Object.keys(tasks) - results = {} - pending = keys.length - } - - function done (err) { - function end () { - if (cb) cb(err, results) - cb = null - } - if (isSync) process.nextTick(end) - else end() - } - - function each (i, err, result) { - results[i] = result - if (--pending === 0 || err) { - done(err) - } - } - - if (!pending) { - // empty - done(null) - } else if (keys) { - // object - keys.forEach(function (key) { - tasks[key](function (err, result) { each(key, err, result) }) - }) - } else { - // array - tasks.forEach(function (task, i) { - task(function (err, result) { each(i, err, result) }) - }) - } - - isSync = false -} - - -/***/ }), -/* 348 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.'); -const MAJOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); -const MINOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); -const SUPPORTED_MAJOR_VERSION = 10; -const SUPPORTED_MINOR_VERSION = 10; -const IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION; -const IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION; -/** - * IS `true` for Node.js 10.10 and greater. - */ -exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR; - - -/***/ }), -/* 349 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(350); -exports.fs = fs; - - -/***/ }), -/* 350 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -class DirentFromStats { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } -} -function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); -} -exports.createDirentFromStats = createDirentFromStats; - - -/***/ }), -/* 351 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(337); -const constants_1 = __webpack_require__(348); -const utils = __webpack_require__(349); -function read(directory, settings) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - return readdirWithFileTypes(directory, settings); - } - return readdir(directory, settings); -} -exports.read = read; -function readdirWithFileTypes(directory, settings) { - const dirents = settings.fs.readdirSync(directory, { withFileTypes: true }); - return dirents.map((dirent) => { - const entry = { - dirent, - name: dirent.name, - path: `${directory}${settings.pathSegmentSeparator}${dirent.name}` - }; - if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) { - try { - const stats = settings.fs.statSync(entry.path); - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - } - catch (error) { - if (settings.throwErrorOnBrokenSymbolicLink) { - throw error; - } - } - } - return entry; - }); -} -exports.readdirWithFileTypes = readdirWithFileTypes; -function readdir(directory, settings) { - const names = settings.fs.readdirSync(directory); - return names.map((name) => { - const entryPath = `${directory}${settings.pathSegmentSeparator}${name}`; - const stats = fsStat.statSync(entryPath, settings.fsStatSettings); - const entry = { - name, - path: entryPath, - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - return entry; - }); -} -exports.readdir = readdir; - - -/***/ }), -/* 352 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(4); -const fsStat = __webpack_require__(337); -const fs = __webpack_require__(353); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); - this.fs = fs.createFileSystemAdapter(this._options.fs); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); - this.stats = this._getValue(this._options.stats, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); - this.fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this.followSymbolicLinks, - fs: this.fs, - throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option === undefined ? value : option; - } -} -exports.default = Settings; - - -/***/ }), -/* 353 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(133); -exports.FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - stat: fs.stat, - lstatSync: fs.lstatSync, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -function createFileSystemAdapter(fsMethods) { - if (fsMethods === undefined) { - return exports.FILE_SYSTEM_ADAPTER; - } - return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods); -} -exports.createFileSystemAdapter = createFileSystemAdapter; - - -/***/ }), -/* 354 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var reusify = __webpack_require__(355) - -function fastqueue (context, worker, concurrency) { - if (typeof context === 'function') { - concurrency = worker - worker = context - context = null - } - - var cache = reusify(Task) - var queueHead = null - var queueTail = null - var _running = 0 - - var self = { - push: push, - drain: noop, - saturated: noop, - pause: pause, - paused: false, - concurrency: concurrency, - running: running, - resume: resume, - idle: idle, - length: length, - unshift: unshift, - empty: noop, - kill: kill, - killAndDrain: killAndDrain - } - - return self - - function running () { - return _running - } - - function pause () { - self.paused = true - } - - function length () { - var current = queueHead - var counter = 0 - - while (current) { - current = current.next - counter++ - } - - return counter - } - - function resume () { - if (!self.paused) return - self.paused = false - for (var i = 0; i < self.concurrency; i++) { - _running++ - release() - } - } - - function idle () { - return _running === 0 && self.length() === 0 - } - - function push (value, done) { - var current = cache.get() - - current.context = context - current.release = release - current.value = value - current.callback = done || noop - - if (_running === self.concurrency || self.paused) { - if (queueTail) { - queueTail.next = current - queueTail = current - } else { - queueHead = current - queueTail = current - self.saturated() - } - } else { - _running++ - worker.call(context, current.value, current.worked) - } - } - - function unshift (value, done) { - var current = cache.get() - - current.context = context - current.release = release - current.value = value - current.callback = done || noop - - if (_running === self.concurrency || self.paused) { - if (queueHead) { - current.next = queueHead - queueHead = current - } else { - queueHead = current - queueTail = current - self.saturated() - } - } else { - _running++ - worker.call(context, current.value, current.worked) - } - } - - function release (holder) { - if (holder) { - cache.release(holder) - } - var next = queueHead - if (next) { - if (!self.paused) { - if (queueTail === queueHead) { - queueTail = null - } - queueHead = next.next - next.next = null - worker.call(context, next.value, next.worked) - if (queueTail === null) { - self.empty() - } - } else { - _running-- - } - } else if (--_running === 0) { - self.drain() - } - } - - function kill () { - queueHead = null - queueTail = null - self.drain = noop - } - - function killAndDrain () { - queueHead = null - queueTail = null - self.drain() - self.drain = noop - } -} - -function noop () {} - -function Task () { - this.value = null - this.callback = noop - this.next = null - this.release = noop - this.context = null - - var self = this - - this.worked = function worked (err, result) { - var callback = self.callback - self.value = null - self.callback = noop - callback.call(self.context, err, result) - self.release(self) - } -} - -module.exports = fastqueue - - -/***/ }), -/* 355 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -function reusify (Constructor) { - var head = new Constructor() - var tail = head - - function get () { - var current = head - - if (current.next) { - head = current.next - } else { - head = new Constructor() - tail = head - } - - current.next = null - - return current - } - - function release (obj) { - tail.next = obj - tail = obj - } - - return { - get: get, - release: release - } -} - -module.exports = reusify - - -/***/ }), -/* 356 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function isFatalError(settings, error) { - if (settings.errorFilter === null) { - return true; - } - return !settings.errorFilter(error); -} -exports.isFatalError = isFatalError; -function isAppliedFilter(filter, value) { - return filter === null || filter(value); -} -exports.isAppliedFilter = isAppliedFilter; -function replacePathSegmentSeparator(filepath, separator) { - return filepath.split(/[\\/]/).join(separator); -} -exports.replacePathSegmentSeparator = replacePathSegmentSeparator; -function joinPathSegments(a, b, separator) { - if (a === '') { - return b; - } - return a + separator + b; -} -exports.joinPathSegments = joinPathSegments; - - -/***/ }), -/* 357 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const common = __webpack_require__(356); -class Reader { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); - } -} -exports.default = Reader; - - -/***/ }), -/* 358 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(137); -const async_1 = __webpack_require__(344); -class StreamProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._stream = new stream_1.Readable({ - objectMode: true, - read: () => { }, - destroy: this._reader.destroy.bind(this._reader) - }); - } - read() { - this._reader.onError((error) => { - this._stream.emit('error', error); - }); - this._reader.onEntry((entry) => { - this._stream.push(entry); - }); - this._reader.onEnd(() => { - this._stream.push(null); - }); - this._reader.read(); - return this._stream; - } -} -exports.default = StreamProvider; - - -/***/ }), -/* 359 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(360); -class SyncProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new sync_1.default(this._root, this._settings); - } - read() { - return this._reader.read(); - } -} -exports.default = SyncProvider; - - -/***/ }), -/* 360 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsScandir = __webpack_require__(345); -const common = __webpack_require__(356); -const reader_1 = __webpack_require__(357); -class SyncReader extends reader_1.default { - constructor() { - super(...arguments); - this._scandir = fsScandir.scandirSync; - this._storage = new Set(); - this._queue = new Set(); - } - read() { - this._pushToQueue(this._root, this._settings.basePath); - this._handleQueue(); - return [...this._storage]; - } - _pushToQueue(directory, base) { - this._queue.add({ directory, base }); - } - _handleQueue() { - for (const item of this._queue.values()) { - this._handleDirectory(item.directory, item.base); - } - } - _handleDirectory(directory, base) { - try { - const entries = this._scandir(directory, this._settings.fsScandirSettings); - for (const entry of entries) { - this._handleEntry(entry, base); - } - } - catch (error) { - this._handleError(error); - } - } - _handleError(error) { - if (!common.isFatalError(this._settings, error)) { - return; - } - throw error; - } - _handleEntry(entry, base) { - const fullpath = entry.path; - if (base !== undefined) { - entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); - } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._pushToStorage(entry); - } - if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { - this._pushToQueue(fullpath, entry.path); - } - } - _pushToStorage(entry) { - this._storage.add(entry); - } -} -exports.default = SyncReader; - - -/***/ }), -/* 361 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(4); -const fsScandir = __webpack_require__(345); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.basePath = this._getValue(this._options.basePath, undefined); - this.concurrency = this._getValue(this._options.concurrency, Infinity); - this.deepFilter = this._getValue(this._options.deepFilter, null); - this.entryFilter = this._getValue(this._options.entryFilter, null); - this.errorFilter = this._getValue(this._options.errorFilter, null); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); - this.fsScandirSettings = new fsScandir.Settings({ - followSymbolicLinks: this._options.followSymbolicLinks, - fs: this._options.fs, - pathSegmentSeparator: this._options.pathSegmentSeparator, - stats: this._options.stats, - throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option === undefined ? value : option; - } -} -exports.default = Settings; - - -/***/ }), -/* 362 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(4); -const fsStat = __webpack_require__(337); -const utils = __webpack_require__(307); -class Reader { - constructor(_settings) { - this._settings = _settings; - this._fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this._settings.followSymbolicLinks, - fs: this._settings.fs, - throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks - }); - } - _getFullEntryPath(filepath) { - return path.resolve(this._settings.cwd, filepath); - } - _makeEntry(stats, pattern) { - const entry = { - name: pattern, - path: pattern, - dirent: utils.fs.createDirentFromStats(pattern, stats) - }; - if (this._settings.stats) { - entry.stats = stats; - } - return entry; - } - _isFatalError(error) { - return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; - } -} -exports.default = Reader; - - -/***/ }), -/* 363 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(4); -const deep_1 = __webpack_require__(364); -const entry_1 = __webpack_require__(367); -const error_1 = __webpack_require__(368); -const entry_2 = __webpack_require__(369); -class Provider { - constructor(_settings) { - this._settings = _settings; - this.errorFilter = new error_1.default(this._settings); - this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); - this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); - this.entryTransformer = new entry_2.default(this._settings); - } - _getRootDirectory(task) { - return path.resolve(this._settings.cwd, task.base); - } - _getReaderOptions(task) { - const basePath = task.base === '.' ? '' : task.base; - return { - basePath, - pathSegmentSeparator: '/', - concurrency: this._settings.concurrency, - deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), - entryFilter: this.entryFilter.getFilter(task.positive, task.negative), - errorFilter: this.errorFilter.getFilter(), - followSymbolicLinks: this._settings.followSymbolicLinks, - fs: this._settings.fs, - stats: this._settings.stats, - throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, - transform: this.entryTransformer.getTransformer() - }; - } - _getMicromatchOptions() { - return { - dot: this._settings.dot, - matchBase: this._settings.baseNameMatch, - nobrace: !this._settings.braceExpansion, - nocase: !this._settings.caseSensitiveMatch, - noext: !this._settings.extglob, - noglobstar: !this._settings.globstar, - posix: true, - strictSlashes: false - }; - } -} -exports.default = Provider; - - -/***/ }), -/* 364 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(307); -const partial_1 = __webpack_require__(365); -class DeepFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - } - getFilter(basePath, positive, negative) { - const matcher = this._getMatcher(positive); - const negativeRe = this._getNegativePatternsRe(negative); - return (entry) => this._filter(basePath, entry, matcher, negativeRe); - } - _getMatcher(patterns) { - return new partial_1.default(patterns, this._settings, this._micromatchOptions); - } - _getNegativePatternsRe(patterns) { - const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); - return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); - } - _filter(basePath, entry, matcher, negativeRe) { - const depth = this._getEntryLevel(basePath, entry.path); - if (this._isSkippedByDeep(depth)) { - return false; - } - if (this._isSkippedSymbolicLink(entry)) { - return false; - } - const filepath = utils.path.removeLeadingDotSegment(entry.path); - if (this._isSkippedByPositivePatterns(filepath, matcher)) { - return false; - } - return this._isSkippedByNegativePatterns(filepath, negativeRe); - } - _isSkippedByDeep(entryDepth) { - return entryDepth >= this._settings.deep; - } - _isSkippedSymbolicLink(entry) { - return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); - } - _getEntryLevel(basePath, entryPath) { - const basePathDepth = basePath.split('/').length; - const entryPathDepth = entryPath.split('/').length; - return entryPathDepth - (basePath === '' ? 0 : basePathDepth); - } - _isSkippedByPositivePatterns(entryPath, matcher) { - return !this._settings.baseNameMatch && !matcher.match(entryPath); - } - _isSkippedByNegativePatterns(entryPath, negativeRe) { - return !utils.pattern.matchAny(entryPath, negativeRe); - } -} -exports.default = DeepFilter; - - -/***/ }), -/* 365 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const matcher_1 = __webpack_require__(366); -class PartialMatcher extends matcher_1.default { - match(filepath) { - const parts = filepath.split('/'); - const levels = parts.length; - const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels); - for (const pattern of patterns) { - const section = pattern.sections[0]; - /** - * In this case, the pattern has a globstar and we must read all directories unconditionally, - * but only if the level has reached the end of the first group. - * - * fixtures/{a,b}/** - * ^ true/false ^ always true - */ - if (!pattern.complete && levels > section.length) { - return true; - } - const match = parts.every((part, index) => { - const segment = pattern.segments[index]; - if (segment.dynamic && segment.patternRe.test(part)) { - return true; - } - if (!segment.dynamic && segment.pattern === part) { - return true; - } - return false; - }); - if (match) { - return true; - } - } - return false; - } -} -exports.default = PartialMatcher; - - -/***/ }), -/* 366 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(307); -class Matcher { - constructor(_patterns, _settings, _micromatchOptions) { - this._patterns = _patterns; - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this._storage = []; - this._fillStorage(); - } - _fillStorage() { - /** - * The original pattern may include `{,*,**,a/*}`, which will lead to problems with matching (unresolved level). - * So, before expand patterns with brace expansion into separated patterns. - */ - const patterns = utils.pattern.expandPatternsWithBraceExpansion(this._patterns); - for (const pattern of patterns) { - const segments = this._getPatternSegments(pattern); - const sections = this._splitSegmentsIntoSections(segments); - this._storage.push({ - complete: sections.length <= 1, - pattern, - segments, - sections - }); - } - } - _getPatternSegments(pattern) { - const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions); - return parts.map((part) => { - const dynamic = utils.pattern.isDynamicPattern(part, this._settings); - if (!dynamic) { - return { - dynamic: false, - pattern: part - }; - } - return { - dynamic: true, - pattern: part, - patternRe: utils.pattern.makeRe(part, this._micromatchOptions) - }; - }); - } - _splitSegmentsIntoSections(segments) { - return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern)); - } -} -exports.default = Matcher; - - -/***/ }), -/* 367 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(307); -class EntryFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this.index = new Map(); - } - getFilter(positive, negative) { - const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); - const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); - return (entry) => this._filter(entry, positiveRe, negativeRe); - } - _filter(entry, positiveRe, negativeRe) { - if (this._settings.unique) { - if (this._isDuplicateEntry(entry)) { - return false; - } - this._createIndexRecord(entry); - } - if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { - return false; - } - if (this._isSkippedByAbsoluteNegativePatterns(entry, negativeRe)) { - return false; - } - const filepath = this._settings.baseNameMatch ? entry.name : entry.path; - return this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); - } - _isDuplicateEntry(entry) { - return this.index.has(entry.path); - } - _createIndexRecord(entry) { - this.index.set(entry.path, undefined); - } - _onlyFileFilter(entry) { - return this._settings.onlyFiles && !entry.dirent.isFile(); - } - _onlyDirectoryFilter(entry) { - return this._settings.onlyDirectories && !entry.dirent.isDirectory(); - } - _isSkippedByAbsoluteNegativePatterns(entry, negativeRe) { - if (!this._settings.absolute) { - return false; - } - const fullpath = utils.path.makeAbsolute(this._settings.cwd, entry.path); - return this._isMatchToPatterns(fullpath, negativeRe); - } - _isMatchToPatterns(entryPath, patternsRe) { - const filepath = utils.path.removeLeadingDotSegment(entryPath); - return utils.pattern.matchAny(filepath, patternsRe); - } -} -exports.default = EntryFilter; - - -/***/ }), -/* 368 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(307); -class ErrorFilter { - constructor(_settings) { - this._settings = _settings; - } - getFilter() { - return (error) => this._isNonFatalError(error); - } - _isNonFatalError(error) { - return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; - } -} -exports.default = ErrorFilter; - - -/***/ }), -/* 369 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(307); -class EntryTransformer { - constructor(_settings) { - this._settings = _settings; - } - getTransformer() { - return (entry) => this._transform(entry); - } - _transform(entry) { - let filepath = entry.path; - if (this._settings.absolute) { - filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); - filepath = utils.path.unixify(filepath); - } - if (this._settings.markDirectories && entry.dirent.isDirectory()) { - filepath += '/'; - } - if (!this._settings.objectMode) { - return filepath; - } - return Object.assign(Object.assign({}, entry), { path: filepath }); - } -} -exports.default = EntryTransformer; - - -/***/ }), -/* 370 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(137); -const stream_2 = __webpack_require__(336); -const provider_1 = __webpack_require__(363); -class ProviderStream extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_2.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const source = this.api(root, task, options); - const destination = new stream_1.Readable({ objectMode: true, read: () => { } }); - source - .once('error', (error) => destination.emit('error', error)) - .on('data', (entry) => destination.emit('data', options.transform(entry))) - .once('end', () => destination.emit('end')); - destination - .once('close', () => source.destroy()); - return destination; - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderStream; - - -/***/ }), -/* 371 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(372); -const provider_1 = __webpack_require__(363); -class ProviderSync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new sync_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = this.api(root, task, options); - return entries.map(options.transform); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderSync; - - -/***/ }), -/* 372 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(337); -const fsWalk = __webpack_require__(342); -const reader_1 = __webpack_require__(362); -class ReaderSync extends reader_1.default { - constructor() { - super(...arguments); - this._walkSync = fsWalk.walkSync; - this._statSync = fsStat.statSync; - } - dynamic(root, options) { - return this._walkSync(root, options); - } - static(patterns, options) { - const entries = []; - for (const pattern of patterns) { - const filepath = this._getFullEntryPath(pattern); - const entry = this._getEntry(filepath, pattern, options); - if (entry === null || !options.entryFilter(entry)) { - continue; - } - entries.push(entry); - } - return entries; - } - _getEntry(filepath, pattern, options) { - try { - const stats = this._getStat(filepath); - return this._makeEntry(stats, pattern); - } - catch (error) { - if (options.errorFilter(error)) { - return null; - } - throw error; - } - } - _getStat(filepath) { - return this._statSync(filepath, this._fsStatSettings); - } -} -exports.default = ReaderSync; - - -/***/ }), -/* 373 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(133); -const os = __webpack_require__(120); -const CPU_COUNT = os.cpus().length; -exports.DEFAULT_FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - lstatSync: fs.lstatSync, - stat: fs.stat, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -class Settings { - constructor(_options = {}) { - this._options = _options; - this.absolute = this._getValue(this._options.absolute, false); - this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); - this.braceExpansion = this._getValue(this._options.braceExpansion, true); - this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); - this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); - this.cwd = this._getValue(this._options.cwd, process.cwd()); - this.deep = this._getValue(this._options.deep, Infinity); - this.dot = this._getValue(this._options.dot, false); - this.extglob = this._getValue(this._options.extglob, true); - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); - this.fs = this._getFileSystemMethods(this._options.fs); - this.globstar = this._getValue(this._options.globstar, true); - this.ignore = this._getValue(this._options.ignore, []); - this.markDirectories = this._getValue(this._options.markDirectories, false); - this.objectMode = this._getValue(this._options.objectMode, false); - this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); - this.onlyFiles = this._getValue(this._options.onlyFiles, true); - this.stats = this._getValue(this._options.stats, false); - this.suppressErrors = this._getValue(this._options.suppressErrors, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); - this.unique = this._getValue(this._options.unique, true); - if (this.onlyDirectories) { - this.onlyFiles = false; - } - if (this.stats) { - this.objectMode = true; - } - } - _getValue(option, value) { - return option === undefined ? value : option; - } - _getFileSystemMethods(methods = {}) { - return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods); - } -} -exports.default = Settings; - - -/***/ }), -/* 374 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const path = __webpack_require__(4); -const pathType = __webpack_require__(375); - -const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; - -const getPath = (filepath, cwd) => { - const pth = filepath[0] === '!' ? filepath.slice(1) : filepath; - return path.isAbsolute(pth) ? pth : path.join(cwd, pth); -}; - -const addExtensions = (file, extensions) => { - if (path.extname(file)) { - return `**/${file}`; - } - - return `**/${file}.${getExtensions(extensions)}`; -}; - -const getGlob = (directory, options) => { - if (options.files && !Array.isArray(options.files)) { - throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof options.files}\``); - } - - if (options.extensions && !Array.isArray(options.extensions)) { - throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof options.extensions}\``); - } - - if (options.files && options.extensions) { - return options.files.map(x => path.posix.join(directory, addExtensions(x, options.extensions))); - } - - if (options.files) { - return options.files.map(x => path.posix.join(directory, `**/${x}`)); - } - - if (options.extensions) { - return [path.posix.join(directory, `**/*.${getExtensions(options.extensions)}`)]; - } - - return [path.posix.join(directory, '**')]; -}; - -module.exports = async (input, options) => { - options = { - cwd: process.cwd(), - ...options - }; - - if (typeof options.cwd !== 'string') { - throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); - } - - const globs = await Promise.all([].concat(input).map(async x => { - const isDirectory = await pathType.isDirectory(getPath(x, options.cwd)); - return isDirectory ? getGlob(x, options) : x; - })); - - return [].concat.apply([], globs); // eslint-disable-line prefer-spread -}; - -module.exports.sync = (input, options) => { - options = { - cwd: process.cwd(), - ...options - }; - - if (typeof options.cwd !== 'string') { - throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); - } - - const globs = [].concat(input).map(x => pathType.isDirectorySync(getPath(x, options.cwd)) ? getGlob(x, options) : x); - - return [].concat.apply([], globs); // eslint-disable-line prefer-spread -}; - - -/***/ }), -/* 375 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const {promisify} = __webpack_require__(111); -const fs = __webpack_require__(133); - -async function isType(fsStatType, statsMethodName, filePath) { - if (typeof filePath !== 'string') { - throw new TypeError(`Expected a string, got ${typeof filePath}`); - } - - try { - const stats = await promisify(fs[fsStatType])(filePath); - return stats[statsMethodName](); - } catch (error) { - if (error.code === 'ENOENT') { - return false; - } - - throw error; - } -} - -function isTypeSync(fsStatType, statsMethodName, filePath) { - if (typeof filePath !== 'string') { - throw new TypeError(`Expected a string, got ${typeof filePath}`); - } - - try { - return fs[fsStatType](filePath)[statsMethodName](); - } catch (error) { - if (error.code === 'ENOENT') { - return false; - } - - throw error; - } -} - -exports.isFile = isType.bind(null, 'stat', 'isFile'); -exports.isDirectory = isType.bind(null, 'stat', 'isDirectory'); -exports.isSymlink = isType.bind(null, 'lstat', 'isSymbolicLink'); -exports.isFileSync = isTypeSync.bind(null, 'statSync', 'isFile'); -exports.isDirectorySync = isTypeSync.bind(null, 'statSync', 'isDirectory'); -exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink'); - - -/***/ }), -/* 376 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const {promisify} = __webpack_require__(111); -const fs = __webpack_require__(133); -const path = __webpack_require__(4); -const fastGlob = __webpack_require__(305); -const gitIgnore = __webpack_require__(377); -const slash = __webpack_require__(378); - -const DEFAULT_IGNORE = [ - '**/node_modules/**', - '**/flow-typed/**', - '**/coverage/**', - '**/.git' -]; - -const readFileP = promisify(fs.readFile); - -const mapGitIgnorePatternTo = base => ignore => { - if (ignore.startsWith('!')) { - return '!' + path.posix.join(base, ignore.slice(1)); - } - - return path.posix.join(base, ignore); -}; - -const parseGitIgnore = (content, options) => { - const base = slash(path.relative(options.cwd, path.dirname(options.fileName))); - - return content - .split(/\r?\n/) - .filter(Boolean) - .filter(line => !line.startsWith('#')) - .map(mapGitIgnorePatternTo(base)); -}; - -const reduceIgnore = files => { - return files.reduce((ignores, file) => { - ignores.add(parseGitIgnore(file.content, { - cwd: file.cwd, - fileName: file.filePath - })); - return ignores; - }, gitIgnore()); -}; - -const ensureAbsolutePathForCwd = (cwd, p) => { - if (path.isAbsolute(p)) { - if (p.startsWith(cwd)) { - return p; - } - - throw new Error(`Path ${p} is not in cwd ${cwd}`); - } - - return path.join(cwd, p); -}; - -const getIsIgnoredPredecate = (ignores, cwd) => { - return p => ignores.ignores(slash(path.relative(cwd, ensureAbsolutePathForCwd(cwd, p)))); -}; - -const getFile = async (file, cwd) => { - const filePath = path.join(cwd, file); - const content = await readFileP(filePath, 'utf8'); - - return { - cwd, - filePath, - content - }; -}; - -const getFileSync = (file, cwd) => { - const filePath = path.join(cwd, file); - const content = fs.readFileSync(filePath, 'utf8'); - - return { - cwd, - filePath, - content - }; -}; - -const normalizeOptions = ({ - ignore = [], - cwd = slash(process.cwd()) -} = {}) => { - return {ignore, cwd}; -}; - -module.exports = async options => { - options = normalizeOptions(options); - - const paths = await fastGlob('**/.gitignore', { - ignore: DEFAULT_IGNORE.concat(options.ignore), - cwd: options.cwd - }); - - const files = await Promise.all(paths.map(file => getFile(file, options.cwd))); - const ignores = reduceIgnore(files); - - return getIsIgnoredPredecate(ignores, options.cwd); -}; - -module.exports.sync = options => { - options = normalizeOptions(options); - - const paths = fastGlob.sync('**/.gitignore', { - ignore: DEFAULT_IGNORE.concat(options.ignore), - cwd: options.cwd - }); - - const files = paths.map(file => getFileSync(file, options.cwd)); - const ignores = reduceIgnore(files); - - return getIsIgnoredPredecate(ignores, options.cwd); -}; - - -/***/ }), -/* 377 */ -/***/ (function(module, exports) { - -// A simple implementation of make-array -function makeArray (subject) { - return Array.isArray(subject) - ? subject - : [subject] -} - -const EMPTY = '' -const SPACE = ' ' -const ESCAPE = '\\' -const REGEX_TEST_BLANK_LINE = /^\s+$/ -const REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\!/ -const REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\#/ -const REGEX_SPLITALL_CRLF = /\r?\n/g -// /foo, -// ./foo, -// ../foo, -// . -// .. -const REGEX_TEST_INVALID_PATH = /^\.*\/|^\.+$/ - -const SLASH = '/' -const KEY_IGNORE = typeof Symbol !== 'undefined' - ? Symbol.for('node-ignore') - /* istanbul ignore next */ - : 'node-ignore' - -const define = (object, key, value) => - Object.defineProperty(object, key, {value}) - -const REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g - -// Sanitize the range of a regular expression -// The cases are complicated, see test cases for details -const sanitizeRange = range => range.replace( - REGEX_REGEXP_RANGE, - (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0) - ? match - // Invalid range (out of order) which is ok for gitignore rules but - // fatal for JavaScript regular expression, so eliminate it. - : EMPTY -) - -// See fixtures #59 -const cleanRangeBackSlash = slashes => { - const {length} = slashes - return slashes.slice(0, length - length % 2) -} - -// > If the pattern ends with a slash, -// > it is removed for the purpose of the following description, -// > but it would only find a match with a directory. -// > In other words, foo/ will match a directory foo and paths underneath it, -// > but will not match a regular file or a symbolic link foo -// > (this is consistent with the way how pathspec works in general in Git). -// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`' -// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call -// you could use option `mark: true` with `glob` - -// '`foo/`' should not continue with the '`..`' -const REPLACERS = [ - - // > Trailing spaces are ignored unless they are quoted with backslash ("\") - [ - // (a\ ) -> (a ) - // (a ) -> (a) - // (a \ ) -> (a ) - /\\?\s+$/, - match => match.indexOf('\\') === 0 - ? SPACE - : EMPTY - ], - - // replace (\ ) with ' ' - [ - /\\\s/g, - () => SPACE - ], - - // Escape metacharacters - // which is written down by users but means special for regular expressions. - - // > There are 12 characters with special meanings: - // > - the backslash \, - // > - the caret ^, - // > - the dollar sign $, - // > - the period or dot ., - // > - the vertical bar or pipe symbol |, - // > - the question mark ?, - // > - the asterisk or star *, - // > - the plus sign +, - // > - the opening parenthesis (, - // > - the closing parenthesis ), - // > - and the opening square bracket [, - // > - the opening curly brace {, - // > These special characters are often called "metacharacters". - [ - /[\\$.|*+(){^]/g, - match => `\\${match}` - ], - - [ - // > a question mark (?) matches a single character - /(?!\\)\?/g, - () => '[^/]' - ], - - // leading slash - [ - - // > A leading slash matches the beginning of the pathname. - // > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c". - // A leading slash matches the beginning of the pathname - /^\//, - () => '^' - ], - - // replace special metacharacter slash after the leading slash - [ - /\//g, - () => '\\/' - ], - - [ - // > A leading "**" followed by a slash means match in all directories. - // > For example, "**/foo" matches file or directory "foo" anywhere, - // > the same as pattern "foo". - // > "**/foo/bar" matches file or directory "bar" anywhere that is directly - // > under directory "foo". - // Notice that the '*'s have been replaced as '\\*' - /^\^*\\\*\\\*\\\//, - - // '**/foo' <-> 'foo' - () => '^(?:.*\\/)?' - ], - - // starting - [ - // there will be no leading '/' - // (which has been replaced by section "leading slash") - // If starts with '**', adding a '^' to the regular expression also works - /^(?=[^^])/, - function startingReplacer () { - // If has a slash `/` at the beginning or middle - return !/\/(?!$)/.test(this) - // > Prior to 2.22.1 - // > If the pattern does not contain a slash /, - // > Git treats it as a shell glob pattern - // Actually, if there is only a trailing slash, - // git also treats it as a shell glob pattern - - // After 2.22.1 (compatible but clearer) - // > If there is a separator at the beginning or middle (or both) - // > of the pattern, then the pattern is relative to the directory - // > level of the particular .gitignore file itself. - // > Otherwise the pattern may also match at any level below - // > the .gitignore level. - ? '(?:^|\\/)' - - // > Otherwise, Git treats the pattern as a shell glob suitable for - // > consumption by fnmatch(3) - : '^' - } - ], - - // two globstars - [ - // Use lookahead assertions so that we could match more than one `'/**'` - /\\\/\\\*\\\*(?=\\\/|$)/g, - - // Zero, one or several directories - // should not use '*', or it will be replaced by the next replacer - - // Check if it is not the last `'/**'` - (_, index, str) => index + 6 < str.length - - // case: /**/ - // > A slash followed by two consecutive asterisks then a slash matches - // > zero or more directories. - // > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on. - // '/**/' - ? '(?:\\/[^\\/]+)*' - - // case: /** - // > A trailing `"/**"` matches everything inside. - - // #21: everything inside but it should not include the current folder - : '\\/.+' - ], - - // intermediate wildcards - [ - // Never replace escaped '*' - // ignore rule '\*' will match the path '*' - - // 'abc.*/' -> go - // 'abc.*' -> skip this rule - /(^|[^\\]+)\\\*(?=.+)/g, - - // '*.js' matches '.js' - // '*.js' doesn't match 'abc' - (_, p1) => `${p1}[^\\/]*` - ], - - [ - // unescape, revert step 3 except for back slash - // For example, if a user escape a '\\*', - // after step 3, the result will be '\\\\\\*' - /\\\\\\(?=[$.|*+(){^])/g, - () => ESCAPE - ], - - [ - // '\\\\' -> '\\' - /\\\\/g, - () => ESCAPE - ], - - [ - // > The range notation, e.g. [a-zA-Z], - // > can be used to match one of the characters in a range. - - // `\` is escaped by step 3 - /(\\)?\[([^\]/]*?)(\\*)($|\])/g, - (match, leadEscape, range, endEscape, close) => leadEscape === ESCAPE - // '\\[bar]' -> '\\\\[bar\\]' - ? `\\[${range}${cleanRangeBackSlash(endEscape)}${close}` - : close === ']' - ? endEscape.length % 2 === 0 - // A normal case, and it is a range notation - // '[bar]' - // '[bar\\\\]' - ? `[${sanitizeRange(range)}${endEscape}]` - // Invalid range notaton - // '[bar\\]' -> '[bar\\\\]' - : '[]' - : '[]' - ], - - // ending - [ - // 'js' will not match 'js.' - // 'ab' will not match 'abc' - /(?:[^*])$/, - - // WTF! - // https://git-scm.com/docs/gitignore - // changes in [2.22.1](https://git-scm.com/docs/gitignore/2.22.1) - // which re-fixes #24, #38 - - // > If there is a separator at the end of the pattern then the pattern - // > will only match directories, otherwise the pattern can match both - // > files and directories. - - // 'js*' will not match 'a.js' - // 'js/' will not match 'a.js' - // 'js' will match 'a.js' and 'a.js/' - match => /\/$/.test(match) - // foo/ will not match 'foo' - ? `${match}$` - // foo matches 'foo' and 'foo/' - : `${match}(?=$|\\/$)` - ], - - // trailing wildcard - [ - /(\^|\\\/)?\\\*$/, - (_, p1) => { - const prefix = p1 - // '\^': - // '/*' does not match EMPTY - // '/*' does not match everything - - // '\\\/': - // 'abc/*' does not match 'abc/' - ? `${p1}[^/]+` - - // 'a*' matches 'a' - // 'a*' matches 'aa' - : '[^/]*' - - return `${prefix}(?=$|\\/$)` - } - ], -] - -// A simple cache, because an ignore rule only has only one certain meaning -const regexCache = Object.create(null) - -// @param {pattern} -const makeRegex = (pattern, negative, ignorecase) => { - const r = regexCache[pattern] - if (r) { - return r - } - - // const replacers = negative - // ? NEGATIVE_REPLACERS - // : POSITIVE_REPLACERS - - const source = REPLACERS.reduce( - (prev, current) => prev.replace(current[0], current[1].bind(pattern)), - pattern - ) - - return regexCache[pattern] = ignorecase - ? new RegExp(source, 'i') - : new RegExp(source) -} - -const isString = subject => typeof subject === 'string' - -// > A blank line matches no files, so it can serve as a separator for readability. -const checkPattern = pattern => pattern - && isString(pattern) - && !REGEX_TEST_BLANK_LINE.test(pattern) - - // > A line starting with # serves as a comment. - && pattern.indexOf('#') !== 0 - -const splitPattern = pattern => pattern.split(REGEX_SPLITALL_CRLF) - -class IgnoreRule { - constructor ( - origin, - pattern, - negative, - regex - ) { - this.origin = origin - this.pattern = pattern - this.negative = negative - this.regex = regex - } -} - -const createRule = (pattern, ignorecase) => { - const origin = pattern - let negative = false - - // > An optional prefix "!" which negates the pattern; - if (pattern.indexOf('!') === 0) { - negative = true - pattern = pattern.substr(1) - } - - pattern = pattern - // > Put a backslash ("\") in front of the first "!" for patterns that - // > begin with a literal "!", for example, `"\!important!.txt"`. - .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!') - // > Put a backslash ("\") in front of the first hash for patterns that - // > begin with a hash. - .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#') - - const regex = makeRegex(pattern, negative, ignorecase) - - return new IgnoreRule( - origin, - pattern, - negative, - regex - ) -} - -const throwError = (message, Ctor) => { - throw new Ctor(message) -} - -const checkPath = (path, originalPath, doThrow) => { - if (!isString(path)) { - return doThrow( - `path must be a string, but got \`${originalPath}\``, - TypeError - ) - } - - // We don't know if we should ignore EMPTY, so throw - if (!path) { - return doThrow(`path must not be empty`, TypeError) - } - - // Check if it is a relative path - if (checkPath.isNotRelative(path)) { - const r = '`path.relative()`d' - return doThrow( - `path should be a ${r} string, but got "${originalPath}"`, - RangeError - ) - } - - return true -} - -const isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path) - -checkPath.isNotRelative = isNotRelative -checkPath.convert = p => p - -class Ignore { - constructor ({ - ignorecase = true - } = {}) { - this._rules = [] - this._ignorecase = ignorecase - define(this, KEY_IGNORE, true) - this._initCache() - } - - _initCache () { - this._ignoreCache = Object.create(null) - this._testCache = Object.create(null) - } - - _addPattern (pattern) { - // #32 - if (pattern && pattern[KEY_IGNORE]) { - this._rules = this._rules.concat(pattern._rules) - this._added = true - return - } - - if (checkPattern(pattern)) { - const rule = createRule(pattern, this._ignorecase) - this._added = true - this._rules.push(rule) - } - } - - // @param {Array | string | Ignore} pattern - add (pattern) { - this._added = false - - makeArray( - isString(pattern) - ? splitPattern(pattern) - : pattern - ).forEach(this._addPattern, this) - - // Some rules have just added to the ignore, - // making the behavior changed. - if (this._added) { - this._initCache() - } - - return this - } - - // legacy - addPattern (pattern) { - return this.add(pattern) - } - - // | ignored : unignored - // negative | 0:0 | 0:1 | 1:0 | 1:1 - // -------- | ------- | ------- | ------- | -------- - // 0 | TEST | TEST | SKIP | X - // 1 | TESTIF | SKIP | TEST | X - - // - SKIP: always skip - // - TEST: always test - // - TESTIF: only test if checkUnignored - // - X: that never happen - - // @param {boolean} whether should check if the path is unignored, - // setting `checkUnignored` to `false` could reduce additional - // path matching. - - // @returns {TestResult} true if a file is ignored - _testOne (path, checkUnignored) { - let ignored = false - let unignored = false - - this._rules.forEach(rule => { - const {negative} = rule - if ( - unignored === negative && ignored !== unignored - || negative && !ignored && !unignored && !checkUnignored - ) { - return - } - - const matched = rule.regex.test(path) - - if (matched) { - ignored = !negative - unignored = negative - } - }) - - return { - ignored, - unignored - } - } - - // @returns {TestResult} - _test (originalPath, cache, checkUnignored, slices) { - const path = originalPath - // Supports nullable path - && checkPath.convert(originalPath) - - checkPath(path, originalPath, throwError) - - return this._t(path, cache, checkUnignored, slices) - } - - _t (path, cache, checkUnignored, slices) { - if (path in cache) { - return cache[path] - } - - if (!slices) { - // path/to/a.js - // ['path', 'to', 'a.js'] - slices = path.split(SLASH) - } - - slices.pop() - - // If the path has no parent directory, just test it - if (!slices.length) { - return cache[path] = this._testOne(path, checkUnignored) - } - - const parent = this._t( - slices.join(SLASH) + SLASH, - cache, - checkUnignored, - slices - ) - - // If the path contains a parent directory, check the parent first - return cache[path] = parent.ignored - // > It is not possible to re-include a file if a parent directory of - // > that file is excluded. - ? parent - : this._testOne(path, checkUnignored) - } - - ignores (path) { - return this._test(path, this._ignoreCache, false).ignored - } - - createFilter () { - return path => !this.ignores(path) - } - - filter (paths) { - return makeArray(paths).filter(this.createFilter()) - } - - // @returns {TestResult} - test (path) { - return this._test(path, this._testCache, true) - } -} - -const factory = options => new Ignore(options) - -const returnFalse = () => false - -const isPathValid = path => - checkPath(path && checkPath.convert(path), path, returnFalse) - -factory.isPathValid = isPathValid - -// Fixes typescript -factory.default = factory - -module.exports = factory - -// Windows -// -------------------------------------------------------------- -/* istanbul ignore if */ -if ( - // Detect `process` so that it can run in browsers. - typeof process !== 'undefined' - && ( - process.env && process.env.IGNORE_TEST_WIN32 - || process.platform === 'win32' - ) -) { - /* eslint no-control-regex: "off" */ - const makePosix = str => /^\\\\\?\\/.test(str) - || /["<>|\u0000-\u001F]+/u.test(str) - ? str - : str.replace(/\\/g, '/') - - checkPath.convert = makePosix - - // 'C:\\foo' <- 'C:\\foo' has been converted to 'C:/' - // 'd:\\foo' - const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\//i - checkPath.isNotRelative = path => - REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path) - || isNotRelative(path) -} - - -/***/ }), -/* 378 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = path => { - const isExtendedLengthPath = /^\\\\\?\\/.test(path); - const hasNonAscii = /[^\u0000-\u0080]+/.test(path); // eslint-disable-line no-control-regex - - if (isExtendedLengthPath || hasNonAscii) { - return path; - } - - return path.replace(/\\/g, '/'); -}; - - -/***/ }), -/* 379 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const {Transform} = __webpack_require__(137); - -class ObjectTransform extends Transform { - constructor() { - super({ - objectMode: true - }); - } -} - -class FilterStream extends ObjectTransform { - constructor(filter) { - super(); - this._filter = filter; - } - - _transform(data, encoding, callback) { - if (this._filter(data)) { - this.push(data); - } - - callback(); - } -} - -class UniqueStream extends ObjectTransform { - constructor() { - super(); - this._pushed = new Set(); - } - - _transform(data, encoding, callback) { - if (!this._pushed.has(data)) { - this.push(data); - this._pushed.add(data); - } - - callback(); - } -} - -module.exports = { - FilterStream, - UniqueStream -}; - - -/***/ }), -/* 380 */ -/***/ (function(module, exports, __webpack_require__) { - -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ - -var isExtglob = __webpack_require__(315); -var chars = { '{': '}', '(': ')', '[': ']'}; -var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; -var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; - -module.exports = function isGlob(str, options) { - if (typeof str !== 'string' || str === '') { - return false; - } - - if (isExtglob(str)) { - return true; - } - - var regex = strictRegex; - var match; - - // optionally relax regex - if (options && options.strict === false) { - regex = relaxedRegex; - } - - while ((match = regex.exec(str))) { - if (match[2]) return true; - var idx = match.index + match[0].length; - - // if an open bracket/brace/paren is escaped, - // set the index to the next closing character - var open = match[1]; - var close = open ? chars[open] : null; - if (open && close) { - var n = str.indexOf(close, idx); - if (n !== -1) { - idx = n + 1; - } - } - - str = str.slice(idx); - } - return false; -}; - - -/***/ }), -/* 381 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const path = __webpack_require__(4); - -module.exports = path_ => { - let cwd = process.cwd(); - - path_ = path.resolve(path_); - - if (process.platform === 'win32') { - cwd = cwd.toLowerCase(); - path_ = path_.toLowerCase(); - } - - return path_ === cwd; -}; - - -/***/ }), -/* 382 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const path = __webpack_require__(4); - -module.exports = (childPath, parentPath) => { - childPath = path.resolve(childPath); - parentPath = path.resolve(parentPath); - - if (process.platform === 'win32') { - childPath = childPath.toLowerCase(); - parentPath = parentPath.toLowerCase(); - } - - if (childPath === parentPath) { - return false; - } - - childPath += path.sep; - parentPath += path.sep; - - return childPath.startsWith(parentPath); -}; - - -/***/ }), -/* 383 */ -/***/ (function(module, exports, __webpack_require__) { - -const assert = __webpack_require__(139) -const path = __webpack_require__(4) -const fs = __webpack_require__(133) -let glob = undefined -try { - glob = __webpack_require__(300) -} 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) - } +/***/ }), +/* 361 */ +/***/ (function(module, exports, __webpack_require__) { - 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 +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(302); +class Matcher { + constructor(_patterns, _settings, _micromatchOptions) { + this._patterns = _patterns; + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + this._storage = []; + this._fillStorage(); + } + _fillStorage() { + /** + * The original pattern may include `{,*,**,a/*}`, which will lead to problems with matching (unresolved level). + * So, before expand patterns with brace expansion into separated patterns. + */ + const patterns = utils.pattern.expandPatternsWithBraceExpansion(this._patterns); + for (const pattern of patterns) { + const segments = this._getPatternSegments(pattern); + const sections = this._splitSegmentsIntoSections(segments); + this._storage.push({ + complete: sections.length <= 1, + pattern, + segments, + sections + }); + } + } + _getPatternSegments(pattern) { + const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions); + return parts.map((part) => { + const dynamic = utils.pattern.isDynamicPattern(part, this._settings); + if (!dynamic) { + return { + dynamic: false, + pattern: part + }; + } + return { + dynamic: true, + pattern: part, + patternRe: utils.pattern.makeRe(part, this._micromatchOptions) + }; + }); + } + _splitSegmentsIntoSections(segments) { + return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern)); + } +} +exports.default = Matcher; - rmdirSync(p, options, er) - } - } -} -const rmdirSync = (p, options, originalEr) => { - assert(p) - assert(options) - if (originalEr) - assert(originalEr instanceof Error) +/***/ }), +/* 362 */ +/***/ (function(module, exports, __webpack_require__) { - 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) - } -} +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(302); +class EntryFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + this.index = new Map(); + } + getFilter(positive, negative) { + const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); + const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); + return (entry) => this._filter(entry, positiveRe, negativeRe); + } + _filter(entry, positiveRe, negativeRe) { + if (this._settings.unique) { + if (this._isDuplicateEntry(entry)) { + return false; + } + this._createIndexRecord(entry); + } + if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { + return false; + } + if (this._isSkippedByAbsoluteNegativePatterns(entry, negativeRe)) { + return false; + } + const filepath = this._settings.baseNameMatch ? entry.name : entry.path; + return this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); + } + _isDuplicateEntry(entry) { + return this.index.has(entry.path); + } + _createIndexRecord(entry) { + this.index.set(entry.path, undefined); + } + _onlyFileFilter(entry) { + return this._settings.onlyFiles && !entry.dirent.isFile(); + } + _onlyDirectoryFilter(entry) { + return this._settings.onlyDirectories && !entry.dirent.isDirectory(); + } + _isSkippedByAbsoluteNegativePatterns(entry, negativeRe) { + if (!this._settings.absolute) { + return false; + } + const fullpath = utils.path.makeAbsolute(this._settings.cwd, entry.path); + return this._isMatchToPatterns(fullpath, negativeRe); + } + _isMatchToPatterns(entryPath, patternsRe) { + const filepath = utils.path.removeLeadingDotSegment(entryPath); + return utils.pattern.matchAny(filepath, patternsRe); + } +} +exports.default = EntryFilter; -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) -} +/***/ }), +/* 363 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports = rimraf -rimraf.sync = rimrafSync +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(302); +class ErrorFilter { + constructor(_settings) { + this._settings = _settings; + } + getFilter() { + return (error) => this._isNonFatalError(error); + } + _isNonFatalError(error) { + return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; + } +} +exports.default = ErrorFilter; /***/ }), -/* 384 */ +/* 364 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(302); +class EntryTransformer { + constructor(_settings) { + this._settings = _settings; + } + getTransformer() { + return (entry) => this._transform(entry); + } + _transform(entry) { + let filepath = entry.path; + if (this._settings.absolute) { + filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); + filepath = utils.path.unixify(filepath); + } + if (this._settings.markDirectories && entry.dirent.isDirectory()) { + filepath += '/'; + } + if (!this._settings.objectMode) { + return filepath; + } + return Object.assign(Object.assign({}, entry), { path: filepath }); + } +} +exports.default = EntryTransformer; -const AggregateError = __webpack_require__(385); - -module.exports = async ( - iterable, - mapper, - { - concurrency = Infinity, - stopOnError = true - } = {} -) => { - return new Promise((resolve, reject) => { - if (typeof mapper !== 'function') { - throw new TypeError('Mapper function is required'); - } - if (!(typeof concurrency === 'number' && concurrency >= 1)) { - throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`); - } +/***/ }), +/* 365 */ +/***/ (function(module, exports, __webpack_require__) { - const ret = []; - const errors = []; - const iterator = iterable[Symbol.iterator](); - let isRejected = false; - let isIterableDone = false; - let resolvingCount = 0; - let currentIndex = 0; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(137); +const stream_2 = __webpack_require__(331); +const provider_1 = __webpack_require__(358); +class ProviderStream extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_2.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const source = this.api(root, task, options); + const destination = new stream_1.Readable({ objectMode: true, read: () => { } }); + source + .once('error', (error) => destination.emit('error', error)) + .on('data', (entry) => destination.emit('data', options.transform(entry))) + .once('end', () => destination.emit('end')); + destination + .once('close', () => source.destroy()); + return destination; + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderStream; - const next = () => { - if (isRejected) { - return; - } - const nextItem = iterator.next(); - const i = currentIndex; - currentIndex++; +/***/ }), +/* 366 */ +/***/ (function(module, exports, __webpack_require__) { - if (nextItem.done) { - isIterableDone = true; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const sync_1 = __webpack_require__(367); +const provider_1 = __webpack_require__(358); +class ProviderSync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new sync_1.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = this.api(root, task, options); + return entries.map(options.transform); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderSync; - if (resolvingCount === 0) { - if (!stopOnError && errors.length !== 0) { - reject(new AggregateError(errors)); - } else { - resolve(ret); - } - } - return; - } +/***/ }), +/* 367 */ +/***/ (function(module, exports, __webpack_require__) { - resolvingCount++; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(332); +const fsWalk = __webpack_require__(337); +const reader_1 = __webpack_require__(357); +class ReaderSync extends reader_1.default { + constructor() { + super(...arguments); + this._walkSync = fsWalk.walkSync; + this._statSync = fsStat.statSync; + } + dynamic(root, options) { + return this._walkSync(root, options); + } + static(patterns, options) { + const entries = []; + for (const pattern of patterns) { + const filepath = this._getFullEntryPath(pattern); + const entry = this._getEntry(filepath, pattern, options); + if (entry === null || !options.entryFilter(entry)) { + continue; + } + entries.push(entry); + } + return entries; + } + _getEntry(filepath, pattern, options) { + try { + const stats = this._getStat(filepath); + return this._makeEntry(stats, pattern); + } + catch (error) { + if (options.errorFilter(error)) { + return null; + } + throw error; + } + } + _getStat(filepath) { + return this._statSync(filepath, this._fsStatSettings); + } +} +exports.default = ReaderSync; - (async () => { - try { - const element = await nextItem.value; - ret[i] = await mapper(element, i); - resolvingCount--; - next(); - } catch (error) { - if (stopOnError) { - isRejected = true; - reject(error); - } else { - errors.push(error); - resolvingCount--; - next(); - } - } - })(); - }; - for (let i = 0; i < concurrency; i++) { - next(); +/***/ }), +/* 368 */ +/***/ (function(module, exports, __webpack_require__) { - if (isIterableDone) { - break; - } - } - }); -}; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(133); +const os = __webpack_require__(120); +const CPU_COUNT = os.cpus().length; +exports.DEFAULT_FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + lstatSync: fs.lstatSync, + stat: fs.stat, + statSync: fs.statSync, + readdir: fs.readdir, + readdirSync: fs.readdirSync +}; +class Settings { + constructor(_options = {}) { + this._options = _options; + this.absolute = this._getValue(this._options.absolute, false); + this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); + this.braceExpansion = this._getValue(this._options.braceExpansion, true); + this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); + this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); + this.cwd = this._getValue(this._options.cwd, process.cwd()); + this.deep = this._getValue(this._options.deep, Infinity); + this.dot = this._getValue(this._options.dot, false); + this.extglob = this._getValue(this._options.extglob, true); + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); + this.fs = this._getFileSystemMethods(this._options.fs); + this.globstar = this._getValue(this._options.globstar, true); + this.ignore = this._getValue(this._options.ignore, []); + this.markDirectories = this._getValue(this._options.markDirectories, false); + this.objectMode = this._getValue(this._options.objectMode, false); + this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); + this.onlyFiles = this._getValue(this._options.onlyFiles, true); + this.stats = this._getValue(this._options.stats, false); + this.suppressErrors = this._getValue(this._options.suppressErrors, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); + this.unique = this._getValue(this._options.unique, true); + if (this.onlyDirectories) { + this.onlyFiles = false; + } + if (this.stats) { + this.objectMode = true; + } + } + _getValue(option, value) { + return option === undefined ? value : option; + } + _getFileSystemMethods(methods = {}) { + return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods); + } +} +exports.default = Settings; /***/ }), -/* 385 */ +/* 369 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const indentString = __webpack_require__(386); -const cleanStack = __webpack_require__(387); - -const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); - -class AggregateError extends Error { - constructor(errors) { - if (!Array.isArray(errors)) { - throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); - } - - errors = [...errors].map(error => { - if (error instanceof Error) { - return error; - } +const path = __webpack_require__(4); +const pathType = __webpack_require__(370); - if (error !== null && typeof error === 'object') { - // Handle plain error objects with message property and/or possibly other metadata - return Object.assign(new Error(error.message), error); - } +const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; - return new Error(error); - }); +const getPath = (filepath, cwd) => { + const pth = filepath[0] === '!' ? filepath.slice(1) : filepath; + return path.isAbsolute(pth) ? pth : path.join(cwd, pth); +}; - let message = errors - .map(error => { - // The `stack` property is not standardized, so we can't assume it exists - return typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error); - }) - .join('\n'); - message = '\n' + indentString(message, 4); - super(message); +const addExtensions = (file, extensions) => { + if (path.extname(file)) { + return `**/${file}`; + } - this.name = 'AggregateError'; + return `**/${file}.${getExtensions(extensions)}`; +}; - Object.defineProperty(this, '_errors', {value: errors}); +const getGlob = (directory, options) => { + if (options.files && !Array.isArray(options.files)) { + throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof options.files}\``); } - * [Symbol.iterator]() { - for (const error of this._errors) { - yield error; - } + if (options.extensions && !Array.isArray(options.extensions)) { + throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof options.extensions}\``); } -} - -module.exports = AggregateError; + if (options.files && options.extensions) { + return options.files.map(x => path.posix.join(directory, addExtensions(x, options.extensions))); + } -/***/ }), -/* 386 */ -/***/ (function(module, exports, __webpack_require__) { + if (options.files) { + return options.files.map(x => path.posix.join(directory, `**/${x}`)); + } -"use strict"; + if (options.extensions) { + return [path.posix.join(directory, `**/*.${getExtensions(options.extensions)}`)]; + } + return [path.posix.join(directory, '**')]; +}; -module.exports = (string, count = 1, options) => { +module.exports = async (input, options) => { options = { - indent: ' ', - includeEmptyLines: false, + cwd: process.cwd(), ...options }; - if (typeof string !== 'string') { - throw new TypeError( - `Expected \`input\` to be a \`string\`, got \`${typeof string}\`` - ); - } - - if (typeof count !== 'number') { - throw new TypeError( - `Expected \`count\` to be a \`number\`, got \`${typeof count}\`` - ); - } - - if (typeof options.indent !== 'string') { - throw new TypeError( - `Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\`` - ); - } - - if (count === 0) { - return string; + if (typeof options.cwd !== 'string') { + throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); } - const regex = options.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; + const globs = await Promise.all([].concat(input).map(async x => { + const isDirectory = await pathType.isDirectory(getPath(x, options.cwd)); + return isDirectory ? getGlob(x, options) : x; + })); - return string.replace(regex, options.indent.repeat(count)); + return [].concat.apply([], globs); // eslint-disable-line prefer-spread }; +module.exports.sync = (input, options) => { + options = { + cwd: process.cwd(), + ...options + }; -/***/ }), -/* 387 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const os = __webpack_require__(120); - -const extractPathRegex = /\s+at.*(?:\(|\s)(.*)\)?/; -const pathRegex = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/; -const homeDir = typeof os.homedir === 'undefined' ? '' : os.homedir(); - -module.exports = (stack, options) => { - options = Object.assign({pretty: false}, options); - - return stack.replace(/\\/g, '/') - .split('\n') - .filter(line => { - const pathMatches = line.match(extractPathRegex); - if (pathMatches === null || !pathMatches[1]) { - return true; - } - - const match = pathMatches[1]; - - // Electron - if ( - match.includes('.app/Contents/Resources/electron.asar') || - match.includes('.app/Contents/Resources/default_app.asar') - ) { - return false; - } + if (typeof options.cwd !== 'string') { + throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); + } - return !pathRegex.test(match); - }) - .filter(line => line.trim() !== '') - .map(line => { - if (options.pretty) { - return line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, '~'))); - } + const globs = [].concat(input).map(x => pathType.isDirectorySync(getPath(x, options.cwd)) ? getGlob(x, options) : x); - return line; - }) - .join('\n'); + return [].concat.apply([], globs); // eslint-disable-line prefer-spread }; /***/ }), -/* 388 */ +/* 370 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const chalk = __webpack_require__(389); -const cliCursor = __webpack_require__(392); -const cliSpinners = __webpack_require__(396); -const logSymbols = __webpack_require__(398); - -class Ora { - constructor(options) { - if (typeof options === 'string') { - options = { - text: options - }; - } - - this.options = Object.assign({ - text: '', - color: 'cyan', - stream: process.stderr - }, options); - - const sp = this.options.spinner; - this.spinner = typeof sp === 'object' ? sp : (process.platform === 'win32' ? cliSpinners.line : (cliSpinners[sp] || cliSpinners.dots)); // eslint-disable-line no-nested-ternary - - if (this.spinner.frames === undefined) { - throw new Error('Spinner must define `frames`'); - } +const {promisify} = __webpack_require__(111); +const fs = __webpack_require__(133); - this.text = this.options.text; - this.color = this.options.color; - this.interval = this.options.interval || this.spinner.interval || 100; - this.stream = this.options.stream; - this.id = null; - this.frameIndex = 0; - this.enabled = typeof this.options.enabled === 'boolean' ? this.options.enabled : ((this.stream && this.stream.isTTY) && !process.env.CI); +async function isType(fsStatType, statsMethodName, filePath) { + if (typeof filePath !== 'string') { + throw new TypeError(`Expected a string, got ${typeof filePath}`); } - frame() { - const frames = this.spinner.frames; - let frame = frames[this.frameIndex]; - if (this.color) { - frame = chalk[this.color](frame); + try { + const stats = await promisify(fs[fsStatType])(filePath); + return stats[statsMethodName](); + } catch (error) { + if (error.code === 'ENOENT') { + return false; } - this.frameIndex = ++this.frameIndex % frames.length; - - return frame + ' ' + this.text; + throw error; } - clear() { - if (!this.enabled) { - return this; - } - - this.stream.clearLine(); - this.stream.cursorTo(0); +} - return this; +function isTypeSync(fsStatType, statsMethodName, filePath) { + if (typeof filePath !== 'string') { + throw new TypeError(`Expected a string, got ${typeof filePath}`); } - render() { - this.clear(); - this.stream.write(this.frame()); - return this; - } - start(text) { - if (text) { - this.text = text; + try { + return fs[fsStatType](filePath)[statsMethodName](); + } catch (error) { + if (error.code === 'ENOENT') { + return false; } - if (!this.enabled || this.id) { - return this; - } + throw error; + } +} - cliCursor.hide(this.stream); - this.render(); - this.id = setInterval(this.render.bind(this), this.interval); +exports.isFile = isType.bind(null, 'stat', 'isFile'); +exports.isDirectory = isType.bind(null, 'stat', 'isDirectory'); +exports.isSymlink = isType.bind(null, 'lstat', 'isSymbolicLink'); +exports.isFileSync = isTypeSync.bind(null, 'statSync', 'isFile'); +exports.isDirectorySync = isTypeSync.bind(null, 'statSync', 'isDirectory'); +exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink'); - return this; - } - stop() { - if (!this.enabled) { - return this; - } - clearInterval(this.id); - this.id = null; - this.frameIndex = 0; - this.clear(); - cliCursor.show(this.stream); +/***/ }), +/* 371 */ +/***/ (function(module, exports, __webpack_require__) { - return this; - } - succeed(text) { - return this.stopAndPersist({symbol: logSymbols.success, text}); - } - fail(text) { - return this.stopAndPersist({symbol: logSymbols.error, text}); - } - warn(text) { - return this.stopAndPersist({symbol: logSymbols.warning, text}); - } - info(text) { - return this.stopAndPersist({symbol: logSymbols.info, text}); - } - stopAndPersist(options) { - if (!this.enabled) { - return this; - } +"use strict"; - // Legacy argument - // TODO: Deprecate sometime in the future - if (typeof options === 'string') { - options = { - symbol: options - }; - } +const {promisify} = __webpack_require__(111); +const fs = __webpack_require__(133); +const path = __webpack_require__(4); +const fastGlob = __webpack_require__(300); +const gitIgnore = __webpack_require__(372); +const slash = __webpack_require__(373); - options = options || {}; +const DEFAULT_IGNORE = [ + '**/node_modules/**', + '**/flow-typed/**', + '**/coverage/**', + '**/.git' +]; - this.stop(); - this.stream.write(`${options.symbol || ' '} ${options.text || this.text}\n`); +const readFileP = promisify(fs.readFile); - return this; +const mapGitIgnorePatternTo = base => ignore => { + if (ignore.startsWith('!')) { + return '!' + path.posix.join(base, ignore.slice(1)); } -} -module.exports = function (opts) { - return new Ora(opts); + return path.posix.join(base, ignore); }; -module.exports.promise = (action, options) => { - if (typeof action.then !== 'function') { - throw new TypeError('Parameter `action` must be a Promise'); - } +const parseGitIgnore = (content, options) => { + const base = slash(path.relative(options.cwd, path.dirname(options.fileName))); - const spinner = new Ora(options); - spinner.start(); + return content + .split(/\r?\n/) + .filter(Boolean) + .filter(line => !line.startsWith('#')) + .map(mapGitIgnorePatternTo(base)); +}; - action.then( - () => { - spinner.succeed(); - }, - () => { - spinner.fail(); +const reduceIgnore = files => { + return files.reduce((ignores, file) => { + ignores.add(parseGitIgnore(file.content, { + cwd: file.cwd, + fileName: file.filePath + })); + return ignores; + }, gitIgnore()); +}; + +const ensureAbsolutePathForCwd = (cwd, p) => { + if (path.isAbsolute(p)) { + if (p.startsWith(cwd)) { + return p; } - ); - return spinner; -}; + throw new Error(`Path ${p} is not in cwd ${cwd}`); + } + return path.join(cwd, p); +}; -/***/ }), -/* 389 */ -/***/ (function(module, exports, __webpack_require__) { +const getIsIgnoredPredecate = (ignores, cwd) => { + return p => ignores.ignores(slash(path.relative(cwd, ensureAbsolutePathForCwd(cwd, p)))); +}; -"use strict"; +const getFile = async (file, cwd) => { + const filePath = path.join(cwd, file); + const content = await readFileP(filePath, 'utf8'); -const escapeStringRegexp = __webpack_require__(178); -const ansiStyles = __webpack_require__(390); -const stdoutColor = __webpack_require__(184).stdout; + return { + cwd, + filePath, + content + }; +}; -const template = __webpack_require__(391); +const getFileSync = (file, cwd) => { + const filePath = path.join(cwd, file); + const content = fs.readFileSync(filePath, 'utf8'); -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); + return { + cwd, + filePath, + content + }; +}; -// `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; +const normalizeOptions = ({ + ignore = [], + cwd = slash(process.cwd()) +} = {}) => { + return {ignore, cwd}; +}; -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); +module.exports = async options => { + options = normalizeOptions(options); -const styles = Object.create(null); + const paths = await fastGlob('**/.gitignore', { + ignore: DEFAULT_IGNORE.concat(options.ignore), + cwd: options.cwd + }); -function applyOptions(obj, options) { - options = options || {}; + const files = await Promise.all(paths.map(file => getFile(file, options.cwd))); + const ignores = reduceIgnore(files); - // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; -} + return getIsIgnoredPredecate(ignores, options.cwd); +}; -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); +module.exports.sync = options => { + options = normalizeOptions(options); - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; + const paths = fastGlob.sync('**/.gitignore', { + ignore: DEFAULT_IGNORE.concat(options.ignore), + cwd: options.cwd + }); - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); + const files = paths.map(file => getFileSync(file, options.cwd)); + const ignores = reduceIgnore(files); - chalk.template.constructor = Chalk; + return getIsIgnoredPredecate(ignores, options.cwd); +}; - return chalk.template; - } - applyOptions(this, options); -} +/***/ }), +/* 372 */ +/***/ (function(module, exports) { -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; +// A simple implementation of make-array +function makeArray (subject) { + return Array.isArray(subject) + ? subject + : [subject] } -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); +const EMPTY = '' +const SPACE = ' ' +const ESCAPE = '\\' +const REGEX_TEST_BLANK_LINE = /^\s+$/ +const REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\!/ +const REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\#/ +const REGEX_SPLITALL_CRLF = /\r?\n/g +// /foo, +// ./foo, +// ../foo, +// . +// .. +const REGEX_TEST_INVALID_PATH = /^\.*\/|^\.+$/ - styles[key] = { - get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); - } - }; -} +const SLASH = '/' +const KEY_IGNORE = typeof Symbol !== 'undefined' + ? Symbol.for('node-ignore') + /* istanbul ignore next */ + : 'node-ignore' -styles.visible = { - get() { - return build.call(this, this._styles || [], true, 'visible'); - } -}; +const define = (object, key, value) => + Object.defineProperty(object, key, {value}) -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } +const REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g - styles[model] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; +// Sanitize the range of a regular expression +// The cases are complicated, see test cases for details +const sanitizeRange = range => range.replace( + REGEX_REGEXP_RANGE, + (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0) + ? match + // Invalid range (out of order) which is ok for gitignore rules but + // fatal for JavaScript regular expression, so eliminate it. + : EMPTY +) + +// See fixtures #59 +const cleanRangeBackSlash = slashes => { + const {length} = slashes + return slashes.slice(0, length - length % 2) } -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; - } +// > If the pattern ends with a slash, +// > it is removed for the purpose of the following description, +// > but it would only find a match with a directory. +// > In other words, foo/ will match a directory foo and paths underneath it, +// > but will not match a regular file or a symbolic link foo +// > (this is consistent with the way how pathspec works in general in Git). +// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`' +// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call +// you could use option `mark: true` with `glob` - const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); - styles[bgModel] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} +// '`foo/`' should not continue with the '`..`' +const REPLACERS = [ -const proto = Object.defineProperties(() => {}, styles); + // > Trailing spaces are ignored unless they are quoted with backslash ("\") + [ + // (a\ ) -> (a ) + // (a ) -> (a) + // (a \ ) -> (a ) + /\\?\s+$/, + match => match.indexOf('\\') === 0 + ? SPACE + : EMPTY + ], -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; + // replace (\ ) with ' ' + [ + /\\\s/g, + () => SPACE + ], - builder._styles = _styles; - builder._empty = _empty; + // Escape metacharacters + // which is written down by users but means special for regular expressions. - const self = this; + // > There are 12 characters with special meanings: + // > - the backslash \, + // > - the caret ^, + // > - the dollar sign $, + // > - the period or dot ., + // > - the vertical bar or pipe symbol |, + // > - the question mark ?, + // > - the asterisk or star *, + // > - the plus sign +, + // > - the opening parenthesis (, + // > - the closing parenthesis ), + // > - and the opening square bracket [, + // > - the opening curly brace {, + // > These special characters are often called "metacharacters". + [ + /[\\$.|*+(){^]/g, + match => `\\${match}` + ], - Object.defineProperty(builder, 'level', { - enumerable: true, - get() { - return self.level; - }, - set(level) { - self.level = level; - } - }); + [ + // > a question mark (?) matches a single character + /(?!\\)\?/g, + () => '[^/]' + ], - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; - } - }); + // leading slash + [ - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + // > A leading slash matches the beginning of the pathname. + // > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c". + // A leading slash matches the beginning of the pathname + /^\//, + () => '^' + ], - // `__proto__` is used because we must return a function, but there is - // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto + // replace special metacharacter slash after the leading slash + [ + /\//g, + () => '\\/' + ], - return builder; -} + [ + // > A leading "**" followed by a slash means match in all directories. + // > For example, "**/foo" matches file or directory "foo" anywhere, + // > the same as pattern "foo". + // > "**/foo/bar" matches file or directory "bar" anywhere that is directly + // > under directory "foo". + // Notice that the '*'s have been replaced as '\\*' + /^\^*\\\*\\\*\\\//, -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); + // '**/foo' <-> 'foo' + () => '^(?:.*\\/)?' + ], - if (argsLen === 0) { - return ''; - } + // starting + [ + // there will be no leading '/' + // (which has been replaced by section "leading slash") + // If starts with '**', adding a '^' to the regular expression also works + /^(?=[^^])/, + function startingReplacer () { + // If has a slash `/` at the beginning or middle + return !/\/(?!$)/.test(this) + // > Prior to 2.22.1 + // > If the pattern does not contain a slash /, + // > Git treats it as a shell glob pattern + // Actually, if there is only a trailing slash, + // git also treats it as a shell glob pattern - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } + // After 2.22.1 (compatible but clearer) + // > If there is a separator at the beginning or middle (or both) + // > of the pattern, then the pattern is relative to the directory + // > level of the particular .gitignore file itself. + // > Otherwise the pattern may also match at any level below + // > the .gitignore level. + ? '(?:^|\\/)' - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; - } + // > Otherwise, Git treats the pattern as a shell glob suitable for + // > consumption by fnmatch(3) + : '^' + } + ], - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } + // two globstars + [ + // Use lookahead assertions so that we could match more than one `'/**'` + /\\\/\\\*\\\*(?=\\\/|$)/g, - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; + // Zero, one or several directories + // should not use '*', or it will be replaced by the next replacer - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); - } + // Check if it is not the last `'/**'` + (_, index, str) => index + 6 < str.length - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; + // case: /**/ + // > A slash followed by two consecutive asterisks then a slash matches + // > zero or more directories. + // > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on. + // '/**/' + ? '(?:\\/[^\\/]+)*' - return str; -} + // case: /** + // > A trailing `"/**"` matches everything inside. -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { - // If chalk() was called by itself or with a string, - // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); - } + // #21: everything inside but it should not include the current folder + : '\\/.+' + ], - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; + // intermediate wildcards + [ + // Never replace escaped '*' + // ignore rule '\*' will match the path '*' - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); - } + // 'abc.*/' -> go + // 'abc.*' -> skip this rule + /(^|[^\\]+)\\\*(?=.+)/g, - return template(chalk, parts.join('')); -} + // '*.js' matches '.js' + // '*.js' doesn't match 'abc' + (_, p1) => `${p1}[^\\/]*` + ], -Object.defineProperties(Chalk.prototype, styles); + [ + // unescape, revert step 3 except for back slash + // For example, if a user escape a '\\*', + // after step 3, the result will be '\\\\\\*' + /\\\\\\(?=[$.|*+(){^])/g, + () => ESCAPE + ], -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript + [ + // '\\\\' -> '\\' + /\\\\/g, + () => ESCAPE + ], + [ + // > The range notation, e.g. [a-zA-Z], + // > can be used to match one of the characters in a range. -/***/ }), -/* 390 */ -/***/ (function(module, exports, __webpack_require__) { + // `\` is escaped by step 3 + /(\\)?\[([^\]/]*?)(\\*)($|\])/g, + (match, leadEscape, range, endEscape, close) => leadEscape === ESCAPE + // '\\[bar]' -> '\\\\[bar\\]' + ? `\\[${range}${cleanRangeBackSlash(endEscape)}${close}` + : close === ']' + ? endEscape.length % 2 === 0 + // A normal case, and it is a range notation + // '[bar]' + // '[bar\\\\]' + ? `[${sanitizeRange(range)}${endEscape}]` + // Invalid range notaton + // '[bar\\]' -> '[bar\\\\]' + : '[]' + : '[]' + ], -"use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(180); + // ending + [ + // 'js' will not match 'js.' + // 'ab' will not match 'abc' + /(?:[^*])$/, -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; -}; + // WTF! + // https://git-scm.com/docs/gitignore + // changes in [2.22.1](https://git-scm.com/docs/gitignore/2.22.1) + // which re-fixes #24, #38 -const wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; -}; + // > If there is a separator at the end of the pattern then the pattern + // > will only match directories, otherwise the pattern can match both + // > files and directories. -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; -}; + // 'js*' will not match 'a.js' + // 'js/' will not match 'a.js' + // 'js' will match 'a.js' and 'a.js/' + match => /\/$/.test(match) + // foo/ will not match 'foo' + ? `${match}$` + // foo matches 'foo' and 'foo/' + : `${match}(?=$|\\/$)` + ], -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39], + // trailing wildcard + [ + /(\^|\\\/)?\\\*$/, + (_, p1) => { + const prefix = p1 + // '\^': + // '/*' does not match EMPTY + // '/*' does not match everything - // Bright color - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], + // '\\\/': + // 'abc/*' does not match 'abc/' + ? `${p1}[^/]+` - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; + // 'a*' matches 'a' + // 'a*' matches 'aa' + : '[^/]*' - // Fix humans - styles.color.grey = styles.color.gray; + return `${prefix}(?=$|\\/$)` + } + ], +] - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; +// A simple cache, because an ignore rule only has only one certain meaning +const regexCache = Object.create(null) - for (const styleName of Object.keys(group)) { - const style = group[styleName]; +// @param {pattern} +const makeRegex = (pattern, negative, ignorecase) => { + const r = regexCache[pattern] + if (r) { + return r + } - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; + // const replacers = negative + // ? NEGATIVE_REPLACERS + // : POSITIVE_REPLACERS - group[styleName] = styles[styleName]; + const source = REPLACERS.reduce( + (prev, current) => prev.replace(current[0], current[1].bind(pattern)), + pattern + ) - codes.set(style[0], style[1]); - } + return regexCache[pattern] = ignorecase + ? new RegExp(source, 'i') + : new RegExp(source) +} - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); +const isString = subject => typeof subject === 'string' - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); - } +// > A blank line matches no files, so it can serve as a separator for readability. +const checkPattern = pattern => pattern + && isString(pattern) + && !REGEX_TEST_BLANK_LINE.test(pattern) - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; + // > A line starting with # serves as a comment. + && pattern.indexOf('#') !== 0 - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; +const splitPattern = pattern => pattern.split(REGEX_SPLITALL_CRLF) - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; +class IgnoreRule { + constructor ( + origin, + pattern, + negative, + regex + ) { + this.origin = origin + this.pattern = pattern + this.negative = negative + this.regex = regex + } +} - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; +const createRule = (pattern, ignorecase) => { + const origin = pattern + let negative = false + + // > An optional prefix "!" which negates the pattern; + if (pattern.indexOf('!') === 0) { + negative = true + pattern = pattern.substr(1) + } - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; - } + pattern = pattern + // > Put a backslash ("\") in front of the first "!" for patterns that + // > begin with a literal "!", for example, `"\!important!.txt"`. + .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!') + // > Put a backslash ("\") in front of the first hash for patterns that + // > begin with a hash. + .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#') - const suite = colorConvert[key]; + const regex = makeRegex(pattern, negative, ignorecase) - if (key === 'ansi16') { - key = 'ansi'; - } + return new IgnoreRule( + origin, + pattern, + negative, + regex + ) +} - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } +const throwError = (message, Ctor) => { + throw new Ctor(message) +} - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } +const checkPath = (path, originalPath, doThrow) => { + if (!isString(path)) { + return doThrow( + `path must be a string, but got \`${originalPath}\``, + TypeError + ) + } - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); - } - } + // We don't know if we should ignore EMPTY, so throw + if (!path) { + return doThrow(`path must not be empty`, TypeError) + } - return styles; + // Check if it is a relative path + if (checkPath.isNotRelative(path)) { + const r = '`path.relative()`d' + return doThrow( + `path should be a ${r} string, but got "${originalPath}"`, + RangeError + ) + } + + return true } -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); +const isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path) -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) +checkPath.isNotRelative = isNotRelative +checkPath.convert = p => p -/***/ }), -/* 391 */ -/***/ (function(module, exports, __webpack_require__) { +class Ignore { + constructor ({ + ignorecase = true + } = {}) { + this._rules = [] + this._ignorecase = ignorecase + define(this, KEY_IGNORE, true) + this._initCache() + } -"use strict"; + _initCache () { + this._ignoreCache = Object.create(null) + this._testCache = Object.create(null) + } -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; -const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; -const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; + _addPattern (pattern) { + // #32 + if (pattern && pattern[KEY_IGNORE]) { + this._rules = this._rules.concat(pattern._rules) + this._added = true + return + } -const ESCAPES = new Map([ - ['n', '\n'], - ['r', '\r'], - ['t', '\t'], - ['b', '\b'], - ['f', '\f'], - ['v', '\v'], - ['0', '\0'], - ['\\', '\\'], - ['e', '\u001B'], - ['a', '\u0007'] -]); + if (checkPattern(pattern)) { + const rule = createRule(pattern, this._ignorecase) + this._added = true + this._rules.push(rule) + } + } -function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(parseInt(c.slice(1), 16)); - } + // @param {Array | string | Ignore} pattern + add (pattern) { + this._added = false - return ESCAPES.get(c) || c; -} + makeArray( + isString(pattern) + ? splitPattern(pattern) + : pattern + ).forEach(this._addPattern, this) -function parseArguments(name, args) { - const results = []; - const chunks = args.trim().split(/\s*,\s*/g); - let matches; + // Some rules have just added to the ignore, + // making the behavior changed. + if (this._added) { + this._initCache() + } - for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); - } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); - } - } + return this + } - return results; -} + // legacy + addPattern (pattern) { + return this.add(pattern) + } -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; + // | ignored : unignored + // negative | 0:0 | 0:1 | 1:0 | 1:1 + // -------- | ------- | ------- | ------- | -------- + // 0 | TEST | TEST | SKIP | X + // 1 | TESTIF | SKIP | TEST | X - const results = []; - let matches; + // - SKIP: always skip + // - TEST: always test + // - TESTIF: only test if checkUnignored + // - X: that never happen - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; + // @param {boolean} whether should check if the path is unignored, + // setting `checkUnignored` to `false` could reduce additional + // path matching. - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); - } - } + // @returns {TestResult} true if a file is ignored + _testOne (path, checkUnignored) { + let ignored = false + let unignored = false - return results; -} + this._rules.forEach(rule => { + const {negative} = rule + if ( + unignored === negative && ignored !== unignored + || negative && !ignored && !unignored && !checkUnignored + ) { + return + } -function buildStyle(chalk, styles) { - const enabled = {}; + const matched = rule.regex.test(path) - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } - } + if (matched) { + ignored = !negative + unignored = negative + } + }) - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } + return { + ignored, + unignored + } + } - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } - } + // @returns {TestResult} + _test (originalPath, cache, checkUnignored, slices) { + const path = originalPath + // Supports nullable path + && checkPath.convert(originalPath) - return current; -} + checkPath(path, originalPath, throwError) -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; + return this._t(path, cache, checkUnignored, slices) + } - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } + _t (path, cache, checkUnignored, slices) { + if (path in cache) { + return cache[path] + } - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); - } - }); + if (!slices) { + // path/to/a.js + // ['path', 'to', 'a.js'] + slices = path.split(SLASH) + } - chunks.push(chunk.join('')); + slices.pop() - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); - } + // If the path has no parent directory, just test it + if (!slices.length) { + return cache[path] = this._testOne(path, checkUnignored) + } - return chunks.join(''); -}; + const parent = this._t( + slices.join(SLASH) + SLASH, + cache, + checkUnignored, + slices + ) + // If the path contains a parent directory, check the parent first + return cache[path] = parent.ignored + // > It is not possible to re-include a file if a parent directory of + // > that file is excluded. + ? parent + : this._testOne(path, checkUnignored) + } -/***/ }), -/* 392 */ -/***/ (function(module, exports, __webpack_require__) { + ignores (path) { + return this._test(path, this._ignoreCache, false).ignored + } -"use strict"; + createFilter () { + return path => !this.ignores(path) + } -const restoreCursor = __webpack_require__(393); + filter (paths) { + return makeArray(paths).filter(this.createFilter()) + } -let hidden = false; + // @returns {TestResult} + test (path) { + return this._test(path, this._testCache, true) + } +} -exports.show = stream => { - const s = stream || process.stderr; +const factory = options => new Ignore(options) - if (!s.isTTY) { - return; - } +const returnFalse = () => false - hidden = false; - s.write('\u001b[?25h'); -}; +const isPathValid = path => + checkPath(path && checkPath.convert(path), path, returnFalse) -exports.hide = stream => { - const s = stream || process.stderr; +factory.isPathValid = isPathValid - if (!s.isTTY) { - return; - } +// Fixes typescript +factory.default = factory - restoreCursor(); - hidden = true; - s.write('\u001b[?25l'); -}; +module.exports = factory -exports.toggle = (force, stream) => { - if (force !== undefined) { - hidden = force; - } +// Windows +// -------------------------------------------------------------- +/* istanbul ignore if */ +if ( + // Detect `process` so that it can run in browsers. + typeof process !== 'undefined' + && ( + process.env && process.env.IGNORE_TEST_WIN32 + || process.platform === 'win32' + ) +) { + /* eslint no-control-regex: "off" */ + const makePosix = str => /^\\\\\?\\/.test(str) + || /["<>|\u0000-\u001F]+/u.test(str) + ? str + : str.replace(/\\/g, '/') - if (hidden) { - exports.show(stream); - } else { - exports.hide(stream); - } -}; + checkPath.convert = makePosix + + // 'C:\\foo' <- 'C:\\foo' has been converted to 'C:/' + // 'd:\\foo' + const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\//i + checkPath.isNotRelative = path => + REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path) + || isNotRelative(path) +} /***/ }), -/* 393 */ +/* 373 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const onetime = __webpack_require__(394); -const signalExit = __webpack_require__(225); +module.exports = path => { + const isExtendedLengthPath = /^\\\\\?\\/.test(path); + const hasNonAscii = /[^\u0000-\u0080]+/.test(path); // eslint-disable-line no-control-regex -module.exports = onetime(() => { - signalExit(() => { - process.stderr.write('\u001b[?25h'); - }, {alwaysLast: true}); -}); + if (isExtendedLengthPath || hasNonAscii) { + return path; + } + + return path.replace(/\\/g, '/'); +}; /***/ }), -/* 394 */ +/* 374 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const mimicFn = __webpack_require__(395); +const {Transform} = __webpack_require__(137); -module.exports = (fn, opts) => { - // TODO: Remove this in v3 - if (opts === true) { - throw new TypeError('The second argument is now an options object'); +class ObjectTransform extends Transform { + constructor() { + super({ + objectMode: true + }); } +} - if (typeof fn !== 'function') { - throw new TypeError('Expected a function'); +class FilterStream extends ObjectTransform { + constructor(filter) { + super(); + this._filter = filter; } - opts = opts || {}; - - let ret; - let called = false; - const fnName = fn.displayName || fn.name || ''; - - const onetime = function () { - if (called) { - if (opts.throw === true) { - throw new Error(`Function \`${fnName}\` can only be called once`); - } - - return ret; + _transform(data, encoding, callback) { + if (this._filter(data)) { + this.push(data); } - called = true; - ret = fn.apply(this, arguments); - fn = null; - - return ret; - }; - - mimicFn(onetime, fn); - - return onetime; -}; - + callback(); + } +} -/***/ }), -/* 395 */ -/***/ (function(module, exports, __webpack_require__) { +class UniqueStream extends ObjectTransform { + constructor() { + super(); + this._pushed = new Set(); + } -"use strict"; + _transform(data, encoding, callback) { + if (!this._pushed.has(data)) { + this.push(data); + this._pushed.add(data); + } -module.exports = (to, from) => { - // TODO: use `Reflect.ownKeys()` when targeting Node.js 6 - for (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) { - Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); + callback(); } +} - return to; +module.exports = { + FilterStream, + UniqueStream }; /***/ }), -/* 396 */ +/* 375 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -module.exports = __webpack_require__(397); - +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ -/***/ }), -/* 397 */ -/***/ (function(module) { +var isExtglob = __webpack_require__(310); +var chars = { '{': '}', '(': ')', '[': ']'}; +var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; +var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; -module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠹\",\"⠸\",\"⠼\",\"⠴\",\"⠦\",\"⠧\",\"⠇\",\"⠏\"]},\"dots2\":{\"interval\":80,\"frames\":[\"⣾\",\"⣽\",\"⣻\",\"⢿\",\"⡿\",\"⣟\",\"⣯\",\"⣷\"]},\"dots3\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠞\",\"⠖\",\"⠦\",\"⠴\",\"⠲\",\"⠳\",\"⠓\"]},\"dots4\":{\"interval\":80,\"frames\":[\"⠄\",\"⠆\",\"⠇\",\"⠋\",\"⠙\",\"⠸\",\"⠰\",\"⠠\",\"⠰\",\"⠸\",\"⠙\",\"⠋\",\"⠇\",\"⠆\"]},\"dots5\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\"]},\"dots6\":{\"interval\":80,\"frames\":[\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠴\",\"⠲\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠚\",\"⠙\",\"⠉\",\"⠁\"]},\"dots7\":{\"interval\":80,\"frames\":[\"⠈\",\"⠉\",\"⠋\",\"⠓\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠖\",\"⠦\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\"]},\"dots8\":{\"interval\":80,\"frames\":[\"⠁\",\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\",\"⠈\"]},\"dots9\":{\"interval\":80,\"frames\":[\"⢹\",\"⢺\",\"⢼\",\"⣸\",\"⣇\",\"⡧\",\"⡗\",\"⡏\"]},\"dots10\":{\"interval\":80,\"frames\":[\"⢄\",\"⢂\",\"⢁\",\"⡁\",\"⡈\",\"⡐\",\"⡠\"]},\"dots11\":{\"interval\":100,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⡀\",\"⢀\",\"⠠\",\"⠐\",\"⠈\"]},\"dots12\":{\"interval\":80,\"frames\":[\"⢀⠀\",\"⡀⠀\",\"⠄⠀\",\"⢂⠀\",\"⡂⠀\",\"⠅⠀\",\"⢃⠀\",\"⡃⠀\",\"⠍⠀\",\"⢋⠀\",\"⡋⠀\",\"⠍⠁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⢈⠩\",\"⡀⢙\",\"⠄⡙\",\"⢂⠩\",\"⡂⢘\",\"⠅⡘\",\"⢃⠨\",\"⡃⢐\",\"⠍⡐\",\"⢋⠠\",\"⡋⢀\",\"⠍⡁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⠈⠩\",\"⠀⢙\",\"⠀⡙\",\"⠀⠩\",\"⠀⢘\",\"⠀⡘\",\"⠀⠨\",\"⠀⢐\",\"⠀⡐\",\"⠀⠠\",\"⠀⢀\",\"⠀⡀\"]},\"line\":{\"interval\":130,\"frames\":[\"-\",\"\\\\\",\"|\",\"/\"]},\"line2\":{\"interval\":100,\"frames\":[\"⠂\",\"-\",\"–\",\"—\",\"–\",\"-\"]},\"pipe\":{\"interval\":100,\"frames\":[\"┤\",\"┘\",\"┴\",\"└\",\"├\",\"┌\",\"┬\",\"┐\"]},\"simpleDots\":{\"interval\":400,\"frames\":[\". \",\".. \",\"...\",\" \"]},\"simpleDotsScrolling\":{\"interval\":200,\"frames\":[\". \",\".. \",\"...\",\" ..\",\" .\",\" \"]},\"star\":{\"interval\":70,\"frames\":[\"✶\",\"✸\",\"✹\",\"✺\",\"✹\",\"✷\"]},\"star2\":{\"interval\":80,\"frames\":[\"+\",\"x\",\"*\"]},\"flip\":{\"interval\":70,\"frames\":[\"_\",\"_\",\"_\",\"-\",\"`\",\"`\",\"'\",\"´\",\"-\",\"_\",\"_\",\"_\"]},\"hamburger\":{\"interval\":100,\"frames\":[\"☱\",\"☲\",\"☴\"]},\"growVertical\":{\"interval\":120,\"frames\":[\"▁\",\"▃\",\"▄\",\"▅\",\"▆\",\"▇\",\"▆\",\"▅\",\"▄\",\"▃\"]},\"growHorizontal\":{\"interval\":120,\"frames\":[\"▏\",\"▎\",\"▍\",\"▌\",\"▋\",\"▊\",\"▉\",\"▊\",\"▋\",\"▌\",\"▍\",\"▎\"]},\"balloon\":{\"interval\":140,\"frames\":[\" \",\".\",\"o\",\"O\",\"@\",\"*\",\" \"]},\"balloon2\":{\"interval\":120,\"frames\":[\".\",\"o\",\"O\",\"°\",\"O\",\"o\",\".\"]},\"noise\":{\"interval\":100,\"frames\":[\"▓\",\"▒\",\"░\"]},\"bounce\":{\"interval\":120,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⠂\"]},\"boxBounce\":{\"interval\":120,\"frames\":[\"▖\",\"▘\",\"▝\",\"▗\"]},\"boxBounce2\":{\"interval\":100,\"frames\":[\"▌\",\"▀\",\"▐\",\"▄\"]},\"triangle\":{\"interval\":50,\"frames\":[\"◢\",\"◣\",\"◤\",\"◥\"]},\"arc\":{\"interval\":100,\"frames\":[\"◜\",\"◠\",\"◝\",\"◞\",\"◡\",\"◟\"]},\"circle\":{\"interval\":120,\"frames\":[\"◡\",\"⊙\",\"◠\"]},\"squareCorners\":{\"interval\":180,\"frames\":[\"◰\",\"◳\",\"◲\",\"◱\"]},\"circleQuarters\":{\"interval\":120,\"frames\":[\"◴\",\"◷\",\"◶\",\"◵\"]},\"circleHalves\":{\"interval\":50,\"frames\":[\"◐\",\"◓\",\"◑\",\"◒\"]},\"squish\":{\"interval\":100,\"frames\":[\"╫\",\"╪\"]},\"toggle\":{\"interval\":250,\"frames\":[\"⊶\",\"⊷\"]},\"toggle2\":{\"interval\":80,\"frames\":[\"▫\",\"▪\"]},\"toggle3\":{\"interval\":120,\"frames\":[\"□\",\"■\"]},\"toggle4\":{\"interval\":100,\"frames\":[\"■\",\"□\",\"▪\",\"▫\"]},\"toggle5\":{\"interval\":100,\"frames\":[\"▮\",\"▯\"]},\"toggle6\":{\"interval\":300,\"frames\":[\"ဝ\",\"၀\"]},\"toggle7\":{\"interval\":80,\"frames\":[\"⦾\",\"⦿\"]},\"toggle8\":{\"interval\":100,\"frames\":[\"◍\",\"◌\"]},\"toggle9\":{\"interval\":100,\"frames\":[\"◉\",\"◎\"]},\"toggle10\":{\"interval\":100,\"frames\":[\"㊂\",\"㊀\",\"㊁\"]},\"toggle11\":{\"interval\":50,\"frames\":[\"⧇\",\"⧆\"]},\"toggle12\":{\"interval\":120,\"frames\":[\"☗\",\"☖\"]},\"toggle13\":{\"interval\":80,\"frames\":[\"=\",\"*\",\"-\"]},\"arrow\":{\"interval\":100,\"frames\":[\"←\",\"↖\",\"↑\",\"↗\",\"→\",\"↘\",\"↓\",\"↙\"]},\"arrow2\":{\"interval\":80,\"frames\":[\"⬆️ \",\"↗️ \",\"➡️ \",\"↘️ \",\"⬇️ \",\"↙️ \",\"⬅️ \",\"↖️ \"]},\"arrow3\":{\"interval\":120,\"frames\":[\"▹▹▹▹▹\",\"▸▹▹▹▹\",\"▹▸▹▹▹\",\"▹▹▸▹▹\",\"▹▹▹▸▹\",\"▹▹▹▹▸\"]},\"bouncingBar\":{\"interval\":80,\"frames\":[\"[ ]\",\"[= ]\",\"[== ]\",\"[=== ]\",\"[ ===]\",\"[ ==]\",\"[ =]\",\"[ ]\",\"[ =]\",\"[ ==]\",\"[ ===]\",\"[====]\",\"[=== ]\",\"[== ]\",\"[= ]\"]},\"bouncingBall\":{\"interval\":80,\"frames\":[\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ●)\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"(● )\"]},\"smiley\":{\"interval\":200,\"frames\":[\"😄 \",\"😝 \"]},\"monkey\":{\"interval\":300,\"frames\":[\"🙈 \",\"🙈 \",\"🙉 \",\"🙊 \"]},\"hearts\":{\"interval\":100,\"frames\":[\"💛 \",\"💙 \",\"💜 \",\"💚 \",\"❤️ \"]},\"clock\":{\"interval\":100,\"frames\":[\"🕐 \",\"🕑 \",\"🕒 \",\"🕓 \",\"🕔 \",\"🕕 \",\"🕖 \",\"🕗 \",\"🕘 \",\"🕙 \",\"🕚 \"]},\"earth\":{\"interval\":180,\"frames\":[\"🌍 \",\"🌎 \",\"🌏 \"]},\"moon\":{\"interval\":80,\"frames\":[\"🌑 \",\"🌒 \",\"🌓 \",\"🌔 \",\"🌕 \",\"🌖 \",\"🌗 \",\"🌘 \"]},\"runner\":{\"interval\":140,\"frames\":[\"🚶 \",\"🏃 \"]},\"pong\":{\"interval\":80,\"frames\":[\"▐⠂ ▌\",\"▐⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂▌\",\"▐ ⠠▌\",\"▐ ⡀▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐⠠ ▌\"]},\"shark\":{\"interval\":120,\"frames\":[\"▐|\\\\____________▌\",\"▐_|\\\\___________▌\",\"▐__|\\\\__________▌\",\"▐___|\\\\_________▌\",\"▐____|\\\\________▌\",\"▐_____|\\\\_______▌\",\"▐______|\\\\______▌\",\"▐_______|\\\\_____▌\",\"▐________|\\\\____▌\",\"▐_________|\\\\___▌\",\"▐__________|\\\\__▌\",\"▐___________|\\\\_▌\",\"▐____________|\\\\▌\",\"▐____________/|▌\",\"▐___________/|_▌\",\"▐__________/|__▌\",\"▐_________/|___▌\",\"▐________/|____▌\",\"▐_______/|_____▌\",\"▐______/|______▌\",\"▐_____/|_______▌\",\"▐____/|________▌\",\"▐___/|_________▌\",\"▐__/|__________▌\",\"▐_/|___________▌\",\"▐/|____________▌\"]},\"dqpb\":{\"interval\":100,\"frames\":[\"d\",\"q\",\"p\",\"b\"]},\"weather\":{\"interval\":100,\"frames\":[\"☀️ \",\"☀️ \",\"☀️ \",\"🌤 \",\"⛅️ \",\"🌥 \",\"☁️ \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"⛈ \",\"🌨 \",\"🌧 \",\"🌨 \",\"☁️ \",\"🌥 \",\"⛅️ \",\"🌤 \",\"☀️ \",\"☀️ \"]},\"christmas\":{\"interval\":400,\"frames\":[\"🌲\",\"🎄\"]}}"); +module.exports = function isGlob(str, options) { + if (typeof str !== 'string' || str === '') { + return false; + } -/***/ }), -/* 398 */ -/***/ (function(module, exports, __webpack_require__) { + if (isExtglob(str)) { + return true; + } -"use strict"; + var regex = strictRegex; + var match; -const chalk = __webpack_require__(399); + // optionally relax regex + if (options && options.strict === false) { + regex = relaxedRegex; + } -const isSupported = process.platform !== 'win32' || process.env.CI || process.env.TERM === 'xterm-256color'; + while ((match = regex.exec(str))) { + if (match[2]) return true; + var idx = match.index + match[0].length; -const main = { - info: chalk.blue('ℹ'), - success: chalk.green('✔'), - warning: chalk.yellow('⚠'), - error: chalk.red('✖') -}; + // if an open bracket/brace/paren is escaped, + // set the index to the next closing character + var open = match[1]; + var close = open ? chars[open] : null; + if (open && close) { + var n = str.indexOf(close, idx); + if (n !== -1) { + idx = n + 1; + } + } -const fallbacks = { - info: chalk.blue('i'), - success: chalk.green('√'), - warning: chalk.yellow('‼'), - error: chalk.red('×') + str = str.slice(idx); + } + return false; }; -module.exports = isSupported ? main : fallbacks; - /***/ }), -/* 399 */ +/* 376 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(178); -const ansiStyles = __webpack_require__(400); -const stdoutColor = __webpack_require__(184).stdout; - -const template = __webpack_require__(401); - -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); +const path = __webpack_require__(4); -// `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; +module.exports = path_ => { + let cwd = process.cwd(); -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); + path_ = path.resolve(path_); -const styles = Object.create(null); + if (process.platform === 'win32') { + cwd = cwd.toLowerCase(); + path_ = path_.toLowerCase(); + } -function applyOptions(obj, options) { - options = options || {}; + return path_ === cwd; +}; - // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; -} -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); +/***/ }), +/* 377 */ +/***/ (function(module, exports, __webpack_require__) { - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; +"use strict"; - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); +const path = __webpack_require__(4); - chalk.template.constructor = Chalk; +module.exports = (childPath, parentPath) => { + childPath = path.resolve(childPath); + parentPath = path.resolve(parentPath); - return chalk.template; + if (process.platform === 'win32') { + childPath = childPath.toLowerCase(); + parentPath = parentPath.toLowerCase(); } - applyOptions(this, options); -} - -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; -} - -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + if (childPath === parentPath) { + return false; + } - styles[key] = { - get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); - } - }; -} + childPath += path.sep; + parentPath += path.sep; -styles.visible = { - get() { - return build.call(this, this._styles || [], true, 'visible'); - } + return childPath.startsWith(parentPath); }; -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } - - styles[model] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; - } +/***/ }), +/* 378 */ +/***/ (function(module, exports, __webpack_require__) { - const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); - styles[bgModel] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; +const assert = __webpack_require__(139) +const path = __webpack_require__(4) +const fs = __webpack_require__(133) +let glob = undefined +try { + glob = __webpack_require__(146) +} catch (_err) { + // treat glob as optional. } -const proto = Object.defineProperties(() => {}, styles); - -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; - - builder._styles = _styles; - builder._empty = _empty; +const defaultGlobOpts = { + nosort: true, + silent: true +} - const self = this; +// for EMFILE handling +let timeout = 0 - Object.defineProperty(builder, 'level', { - enumerable: true, - get() { - return self.level; - }, - set(level) { - self.level = level; - } - }); +const isWindows = (process.platform === "win32") - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; - } - }); +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] + }) - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + 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 +} - // `__proto__` is used because we must return a function, but there is - // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto +const rimraf = (p, options, cb) => { + if (typeof options === 'function') { + cb = options + options = {} + } - return builder; -} + 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') -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); + defaults(options) - if (argsLen === 0) { - return ''; - } + let busyTries = 0 + let errState = null + let n = 0 - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } + const next = (er) => { + errState = errState || er + if (--n === 0) + cb(errState) + } - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; - } + const afterGlob = (er, results) => { + if (er) + return cb(er) - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } + n = results.length + if (n === 0) + return cb() - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; + 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) + } - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); - } + // this one won't happen if graceful-fs is used. + if (er.code === "EMFILE" && timeout < options.emfileWait) { + return setTimeout(() => rimraf_(p, options, CB), timeout ++) + } - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; + // already gone + if (er.code === "ENOENT") er = null + } - return str; -} + timeout = 0 + next(er) + } + rimraf_(p, options, CB) + }) + } -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { - // If chalk() was called by itself or with a string, - // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); - } + if (options.disableGlob || !glob.hasMagic(p)) + return afterGlob(null, [p]) - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; + options.lstat(p, (er, stat) => { + if (!er) + return afterGlob(null, [p]) - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); - } + glob(p, options.glob, afterGlob) + }) - return template(chalk, parts.join('')); } -Object.defineProperties(Chalk.prototype, styles); - -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript +// 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) -/***/ }), -/* 400 */ -/***/ (function(module, exports, __webpack_require__) { + // Windows can EPERM on stat. Life is suffering. + if (er && er.code === "EPERM" && isWindows) + fixWinEPERM(p, options, er, cb) -"use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(180); + if (st && st.isDirectory()) + return rmdir(p, options, er, cb) -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; -}; + 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 wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; -}; +const fixWinEPERM = (p, options, er, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; -}; + 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) + }) + }) +} -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39], +const fixWinEPERMSync = (p, options, er) => { + assert(p) + assert(options) - // Bright color - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], + try { + options.chmodSync(p, 0o666) + } catch (er2) { + if (er2.code === "ENOENT") + return + else + throw er + } - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; + let stats + try { + stats = options.statSync(p) + } catch (er3) { + if (er3.code === "ENOENT") + return + else + throw er + } - // Fix humans - styles.color.grey = styles.color.gray; + if (stats.isDirectory()) + rmdirSync(p, options, er) + else + options.unlinkSync(p) +} - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; +const rmdir = (p, options, originalEr, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') - for (const styleName of Object.keys(group)) { - const style = group[styleName]; + // 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) + }) +} - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; +const rmkids = (p, options, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') - group[styleName] = styles[styleName]; + 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) + }) + }) + }) +} - codes.set(style[0], style[1]); - } +// 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) - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); + 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') - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); - } + let results - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; + if (options.disableGlob || !glob.hasMagic(p)) { + results = [p] + } else { + try { + options.lstatSync(p) + results = [p] + } catch (er) { + results = glob.sync(p, options.glob) + } + } - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; + if (!results.length) + return - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; + for (let i = 0; i < results.length; i++) { + const p = results[i] - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; + let st + try { + st = options.lstatSync(p) + } catch (er) { + if (er.code === "ENOENT") + return - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; - } + // Windows can EPERM on stat. Life is suffering. + if (er.code === "EPERM" && isWindows) + fixWinEPERMSync(p, options, er) + } - const suite = colorConvert[key]; + 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 - if (key === 'ansi16') { - key = 'ansi'; - } + rmdirSync(p, options, er) + } + } +} - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } +const rmdirSync = (p, options, originalEr) => { + assert(p) + assert(options) - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } + 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) + } +} - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); - } - } +const rmkidsSync = (p, options) => { + assert(p) + assert(options) + options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options)) - return styles; + // 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) } -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); +module.exports = rimraf +rimraf.sync = rimrafSync -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) /***/ }), -/* 401 */ +/* 379 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; -const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; -const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; - -const ESCAPES = new Map([ - ['n', '\n'], - ['r', '\r'], - ['t', '\t'], - ['b', '\b'], - ['f', '\f'], - ['v', '\v'], - ['0', '\0'], - ['\\', '\\'], - ['e', '\u001B'], - ['a', '\u0007'] -]); - -function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(parseInt(c.slice(1), 16)); - } - - return ESCAPES.get(c) || c; -} - -function parseArguments(name, args) { - const results = []; - const chunks = args.trim().split(/\s*,\s*/g); - let matches; +const AggregateError = __webpack_require__(380); - for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); - } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); +module.exports = async ( + iterable, + mapper, + { + concurrency = Infinity, + stopOnError = true + } = {} +) => { + return new Promise((resolve, reject) => { + if (typeof mapper !== 'function') { + throw new TypeError('Mapper function is required'); } - } - - return results; -} -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; - - const results = []; - let matches; + if (!(typeof concurrency === 'number' && concurrency >= 1)) { + throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`); + } - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; + const ret = []; + const errors = []; + const iterator = iterable[Symbol.iterator](); + let isRejected = false; + let isIterableDone = false; + let resolvingCount = 0; + let currentIndex = 0; - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); - } - } + const next = () => { + if (isRejected) { + return; + } - return results; -} + const nextItem = iterator.next(); + const i = currentIndex; + currentIndex++; -function buildStyle(chalk, styles) { - const enabled = {}; + if (nextItem.done) { + isIterableDone = true; - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } - } + if (resolvingCount === 0) { + if (!stopOnError && errors.length !== 0) { + reject(new AggregateError(errors)); + } else { + resolve(ret); + } + } - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); + return; } - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } - } + resolvingCount++; - return current; -} + (async () => { + try { + const element = await nextItem.value; + ret[i] = await mapper(element, i); + resolvingCount--; + next(); + } catch (error) { + if (stopOnError) { + isRejected = true; + reject(error); + } else { + errors.push(error); + resolvingCount--; + next(); + } + } + })(); + }; -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; + for (let i = 0; i < concurrency; i++) { + next(); - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); + if (isIterableDone) { + break; } - - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); } }); - - chunks.push(chunk.join('')); - - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); - } - - return chunks.join(''); }; /***/ }), -/* 402 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 380 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RunCommand", function() { return RunCommand; }); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ +const indentString = __webpack_require__(381); +const cleanStack = __webpack_require__(382); +const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); +class AggregateError extends Error { + constructor(errors) { + if (!Array.isArray(errors)) { + throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); + } -const RunCommand = { - description: 'Run script defined in package.json in each package that contains that script.', - name: 'run', + errors = [...errors].map(error => { + if (error instanceof Error) { + return error; + } - async run(projects, projectGraph, { - extraArgs - }) { - const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projects, projectGraph); + if (error !== null && typeof error === 'object') { + // Handle plain error objects with message property and/or possibly other metadata + return Object.assign(new Error(error.message), error); + } - if (extraArgs.length === 0) { - throw new _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"]('No script specified'); - } + return new Error(error); + }); - const scriptName = extraArgs[0]; - const scriptArgs = extraArgs.slice(1); - await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async project => { - if (project.hasScript(scriptName)) { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(`[${project.name}] running "${scriptName}" script`); - await project.runScriptStreaming(scriptName, { - args: scriptArgs - }); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`[${project.name}] complete`); - } - }); - } + let message = errors + .map(error => { + // The `stack` property is not standardized, so we can't assume it exists + return typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error); + }) + .join('\n'); + message = '\n' + indentString(message, 4); + super(message); + + this.name = 'AggregateError'; + + Object.defineProperty(this, '_errors', {value: errors}); + } + + * [Symbol.iterator]() { + for (const error of this._errors) { + yield error; + } + } +} + +module.exports = AggregateError; -}; /***/ }), -/* 403 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 381 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WatchCommand", function() { return WatchCommand; }); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); -/* harmony import */ var _utils_watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(404); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ +module.exports = (string, count = 1, options) => { + options = { + indent: ' ', + includeEmptyLines: false, + ...options + }; + + if (typeof string !== 'string') { + throw new TypeError( + `Expected \`input\` to be a \`string\`, got \`${typeof string}\`` + ); + } + + if (typeof count !== 'number') { + throw new TypeError( + `Expected \`count\` to be a \`number\`, got \`${typeof count}\`` + ); + } + if (typeof options.indent !== 'string') { + throw new TypeError( + `Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\`` + ); + } + if (count === 0) { + return string; + } + const regex = options.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; -/** - * Name of the script in the package/project package.json file to run during `kbn watch`. - */ -const watchScriptName = 'kbn:watch'; -/** - * Name of the Kibana project. - */ + return string.replace(regex, options.indent.repeat(count)); +}; -const kibanaProjectName = 'kibana'; -/** - * Command that traverses through list of available projects/packages that have `kbn:watch` script in their - * package.json files, groups them into topology aware batches and then processes theses batches one by one - * running `kbn:watch` scripts in parallel within the same batch. - * - * Command internally relies on the fact that most of the build systems that are triggered by `kbn:watch` - * will emit special "marker" once build/watch process is ready that we can use as completion condition for - * the `kbn:watch` script and eventually for the entire batch. Currently we support completion "markers" for - * `webpack` and `tsc` only, for the rest we rely on predefined timeouts. - */ -const WatchCommand = { - description: 'Runs `kbn:watch` script for every project.', - name: 'watch', +/***/ }), +/* 382 */ +/***/ (function(module, exports, __webpack_require__) { - async run(projects, projectGraph) { - const projectsToWatch = new Map(); +"use strict"; - for (const project of projects.values()) { - // We can't watch project that doesn't have `kbn:watch` script. - if (project.hasScript(watchScriptName)) { - projectsToWatch.set(project.name, project); - } - } +const os = __webpack_require__(120); - if (projectsToWatch.size === 0) { - throw new _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"](`There are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.`); - } +const extractPathRegex = /\s+at.*(?:\(|\s)(.*)\)?/; +const pathRegex = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/; +const homeDir = typeof os.homedir === 'undefined' ? '' : os.homedir(); - const projectNames = Array.from(projectsToWatch.keys()); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`); // Kibana should always be run the last, so we don't rely on automatic - // topological batching and push it to the last one-entry batch manually. +module.exports = (stack, options) => { + options = Object.assign({pretty: false}, options); - const shouldWatchKibanaProject = projectsToWatch.delete(kibanaProjectName); - const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projectsToWatch, projectGraph); + return stack.replace(/\\/g, '/') + .split('\n') + .filter(line => { + const pathMatches = line.match(extractPathRegex); + if (pathMatches === null || !pathMatches[1]) { + return true; + } - if (shouldWatchKibanaProject) { - batchedProjects.push([projects.get(kibanaProjectName)]); - } + const match = pathMatches[1]; - await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async pkg => { - const completionHint = await Object(_utils_watch__WEBPACK_IMPORTED_MODULE_4__["waitUntilWatchIsReady"])(pkg.runScriptStreaming(watchScriptName, { - debug: false - }).stdout); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`[${pkg.name}] Initial build completed (${completionHint}).`); - }); - } + // Electron + if ( + match.includes('.app/Contents/Resources/electron.asar') || + match.includes('.app/Contents/Resources/default_app.asar') + ) { + return false; + } + return !pathRegex.test(match); + }) + .filter(line => line.trim() !== '') + .map(line => { + if (options.pretty) { + return line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, '~'))); + } + + return line; + }) + .join('\n'); }; + /***/ }), -/* 404 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 383 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitUntilWatchIsReady", function() { return waitUntilWatchIsReady; }); -/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8); -/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(405); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -/** - * Number of milliseconds we wait before we fall back to the default watch handler. - */ -const defaultHandlerDelay = 3000; -/** - * If default watch handler is used, then it's the number of milliseconds we wait for - * any build output before we consider watch task ready. - */ +const chalk = __webpack_require__(384); +const cliCursor = __webpack_require__(387); +const cliSpinners = __webpack_require__(391); +const logSymbols = __webpack_require__(393); -const defaultHandlerReadinessTimeout = 2000; -/** - * Describes configurable watch options. - */ +class Ora { + constructor(options) { + if (typeof options === 'string') { + options = { + text: options + }; + } -function getWatchHandlers(buildOutput$, { - handlerDelay = defaultHandlerDelay, - handlerReadinessTimeout = defaultHandlerReadinessTimeout -}) { - const typescriptHandler = buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('$ tsc')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('Compilation complete.')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mapTo"])('tsc')))); - const webpackHandler = buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('$ webpack')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('Chunk Names')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mapTo"])('webpack')))); - const defaultHandler = rxjs__WEBPACK_IMPORTED_MODULE_0__["of"](undefined).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["delay"])(handlerReadinessTimeout), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["timeout"])(handlerDelay), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["catchError"])(() => rxjs__WEBPACK_IMPORTED_MODULE_0__["of"]('timeout'))))); - return [typescriptHandler, webpackHandler, defaultHandler]; -} + this.options = Object.assign({ + text: '', + color: 'cyan', + stream: process.stderr + }, options); -function waitUntilWatchIsReady(stream, opts = {}) { - const buildOutput$ = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"](); + const sp = this.options.spinner; + this.spinner = typeof sp === 'object' ? sp : (process.platform === 'win32' ? cliSpinners.line : (cliSpinners[sp] || cliSpinners.dots)); // eslint-disable-line no-nested-ternary - const onDataListener = data => buildOutput$.next(data.toString('utf-8')); + if (this.spinner.frames === undefined) { + throw new Error('Spinner must define `frames`'); + } - const onEndListener = () => buildOutput$.complete(); + this.text = this.options.text; + this.color = this.options.color; + this.interval = this.options.interval || this.spinner.interval || 100; + this.stream = this.options.stream; + this.id = null; + this.frameIndex = 0; + this.enabled = typeof this.options.enabled === 'boolean' ? this.options.enabled : ((this.stream && this.stream.isTTY) && !process.env.CI); + } + frame() { + const frames = this.spinner.frames; + let frame = frames[this.frameIndex]; - const onErrorListener = e => buildOutput$.error(e); + if (this.color) { + frame = chalk[this.color](frame); + } - stream.once('end', onEndListener); - stream.once('error', onErrorListener); - stream.on('data', onDataListener); - return rxjs__WEBPACK_IMPORTED_MODULE_0__["race"](getWatchHandlers(buildOutput$, opts)).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mergeMap"])(whenReady => whenReady), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["finalize"])(() => { - stream.removeListener('data', onDataListener); - stream.removeListener('end', onEndListener); - stream.removeListener('error', onErrorListener); - buildOutput$.complete(); - })).toPromise(); -} + this.frameIndex = ++this.frameIndex % frames.length; -/***/ }), -/* 405 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + return frame + ' ' + this.text; + } + clear() { + if (!this.enabled) { + return this; + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(406); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__["audit"]; }); + this.stream.clearLine(); + this.stream.cursorTo(0); -/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(407); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__["auditTime"]; }); + return this; + } + render() { + this.clear(); + this.stream.write(this.frame()); -/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(408); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__["buffer"]; }); + return this; + } + start(text) { + if (text) { + this.text = text; + } -/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(409); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__["bufferCount"]; }); + if (!this.enabled || this.id) { + return this; + } -/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(410); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__["bufferTime"]; }); + cliCursor.hide(this.stream); + this.render(); + this.id = setInterval(this.render.bind(this), this.interval); -/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(411); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__["bufferToggle"]; }); + return this; + } + stop() { + if (!this.enabled) { + return this; + } -/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(412); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__["bufferWhen"]; }); + clearInterval(this.id); + this.id = null; + this.frameIndex = 0; + this.clear(); + cliCursor.show(this.stream); -/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(413); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__["catchError"]; }); + return this; + } + succeed(text) { + return this.stopAndPersist({symbol: logSymbols.success, text}); + } + fail(text) { + return this.stopAndPersist({symbol: logSymbols.error, text}); + } + warn(text) { + return this.stopAndPersist({symbol: logSymbols.warning, text}); + } + info(text) { + return this.stopAndPersist({symbol: logSymbols.info, text}); + } + stopAndPersist(options) { + if (!this.enabled) { + return this; + } -/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(414); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__["combineAll"]; }); + // Legacy argument + // TODO: Deprecate sometime in the future + if (typeof options === 'string') { + options = { + symbol: options + }; + } -/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(415); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__["combineLatest"]; }); + options = options || {}; -/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(416); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__["concat"]; }); + this.stop(); + this.stream.write(`${options.symbol || ' '} ${options.text || this.text}\n`); -/* harmony import */ var _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(80); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__["concatAll"]; }); + return this; + } +} -/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(417); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__["concatMap"]; }); +module.exports = function (opts) { + return new Ora(opts); +}; -/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(418); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__["concatMapTo"]; }); +module.exports.promise = (action, options) => { + if (typeof action.then !== 'function') { + throw new TypeError('Parameter `action` must be a Promise'); + } -/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(419); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "count", function() { return _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__["count"]; }); + const spinner = new Ora(options); + spinner.start(); -/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(420); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__["debounce"]; }); + action.then( + () => { + spinner.succeed(); + }, + () => { + spinner.fail(); + } + ); -/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(421); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__["debounceTime"]; }); + return spinner; +}; -/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(422); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__["defaultIfEmpty"]; }); -/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(423); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__["delay"]; }); +/***/ }), +/* 384 */ +/***/ (function(module, exports, __webpack_require__) { -/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(425); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__["delayWhen"]; }); +"use strict"; -/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(426); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__["dematerialize"]; }); +const escapeStringRegexp = __webpack_require__(178); +const ansiStyles = __webpack_require__(385); +const stdoutColor = __webpack_require__(184).stdout; -/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(427); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__["distinct"]; }); +const template = __webpack_require__(386); -/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(428); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__["distinctUntilChanged"]; }); +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); -/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(429); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__["distinctUntilKeyChanged"]; }); +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; -/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(430); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__["elementAt"]; }); +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); -/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(433); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__["endWith"]; }); +const styles = Object.create(null); -/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(434); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "every", function() { return _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__["every"]; }); +function applyOptions(obj, options) { + options = options || {}; -/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(435); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__["exhaust"]; }); + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; +} -/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(436); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__["exhaustMap"]; }); +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); -/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(437); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__["expand"]; }); + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; -/* harmony import */ var _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(104); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__["filter"]; }); + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); -/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(438); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__["finalize"]; }); + chalk.template.constructor = Chalk; -/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(439); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "find", function() { return _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__["find"]; }); + return chalk.template; + } -/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(440); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__["findIndex"]; }); + applyOptions(this, options); +} -/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(441); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "first", function() { return _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__["first"]; }); +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} -/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(31); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__["groupBy"]; }); +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); -/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(442); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__["ignoreElements"]; }); + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; +} -/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(443); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__["isEmpty"]; }); +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; -/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(444); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "last", function() { return _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__["last"]; }); +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } -/* harmony import */ var _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(66); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__["map"]; }); + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} -/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(446); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__["mapTo"]; }); +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } -/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(447); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__["materialize"]; }); + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} -/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(448); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__["max"]; }); +const proto = Object.defineProperties(() => {}, styles); -/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(451); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__["merge"]; }); +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; -/* harmony import */ var _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(81); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__["mergeAll"]; }); + builder._styles = _styles; + builder._empty = _empty; -/* harmony import */ var _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(82); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); + const self = this; -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); -/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(452); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__["mergeMapTo"]; }); + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); -/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(453); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__["mergeScan"]; }); + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; -/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(454); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__["min"]; }); + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto -/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(455); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__["multicast"]; }); + return builder; +} -/* harmony import */ var _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(41); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__["observeOn"]; }); +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); -/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(456); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__["onErrorResumeNext"]; }); + if (argsLen === 0) { + return ''; + } -/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(457); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__["pairwise"]; }); + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } -/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(458); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__["partition"]; }); + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } -/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(459); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__["pluck"]; }); + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } -/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(460); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__["publish"]; }); + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; -/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(461); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__["publishBehavior"]; }); + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } -/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(462); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__["publishLast"]; }); + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; -/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(463); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__["publishReplay"]; }); + return str; +} -/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(464); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__["race"]; }); +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } -/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(449); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__["reduce"]; }); + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; -/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(465); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__["repeat"]; }); + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } -/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(466); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__["repeatWhen"]; }); + return template(chalk, parts.join('')); +} -/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(467); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__["retry"]; }); +Object.defineProperties(Chalk.prototype, styles); -/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(468); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__["retryWhen"]; }); +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript -/* harmony import */ var _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(30); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__["refCount"]; }); -/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(469); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__["sample"]; }); +/***/ }), +/* 385 */ +/***/ (function(module, exports, __webpack_require__) { -/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(470); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__["sampleTime"]; }); +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { +const colorConvert = __webpack_require__(180); -/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(450); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__["scan"]; }); +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; -/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(471); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__["sequenceEqual"]; }); +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; +}; -/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(472); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "share", function() { return _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__["share"]; }); +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; -/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(473); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__["shareReplay"]; }); +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], -/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(474); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "single", function() { return _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__["single"]; }); + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], -/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(475); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__["skip"]; }); + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; -/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(476); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__["skipLast"]; }); + // Fix humans + styles.color.grey = styles.color.gray; -/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(477); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__["skipUntil"]; }); + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; -/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(478); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__["skipWhile"]; }); + for (const styleName of Object.keys(group)) { + const style = group[styleName]; -/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(479); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__["startWith"]; }); + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; -/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(480); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__["subscribeOn"]; }); + group[styleName] = styles[styleName]; -/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(482); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__["switchAll"]; }); + codes.set(style[0], style[1]); + } -/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(483); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__["switchMap"]; }); + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); -/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(484); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__["switchMapTo"]; }); + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } -/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(432); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "take", function() { return _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__["take"]; }); + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; -/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(445); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__["takeLast"]; }); + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; -/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(485); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__["takeUntil"]; }); + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; -/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(486); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__["takeWhile"]; }); + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; -/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(487); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__["tap"]; }); + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } -/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(488); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__["throttle"]; }); + const suite = colorConvert[key]; -/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(489); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__["throttleTime"]; }); + if (key === 'ansi16') { + key = 'ansi'; + } -/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(431); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__["throwIfEmpty"]; }); + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } -/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(490); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__["timeInterval"]; }); + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } -/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(491); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__["timeout"]; }); + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } -/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(492); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__["timeoutWith"]; }); + return styles; +} -/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(493); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__["timestamp"]; }); +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); -/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(494); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__["toArray"]; }); +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) -/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(495); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__["window"]; }); +/***/ }), +/* 386 */ +/***/ (function(module, exports, __webpack_require__) { -/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(496); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__["windowCount"]; }); +"use strict"; -/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(497); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__["windowTime"]; }); +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; -/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(498); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__["windowToggle"]; }); +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); -/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(499); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__["windowWhen"]; }); +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } -/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(500); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__["withLatestFrom"]; }); + return ESCAPES.get(c) || c; +} -/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(501); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__["zip"]; }); +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; -/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(502); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__["zipAll"]; }); + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } -/** PURE_IMPORTS_START PURE_IMPORTS_END */ + return results; +} +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; + const results = []; + let matches; + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } + return results; +} +function buildStyle(chalk, styles) { + const enabled = {}; + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; + } + } + } + return current; +} +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); + } + }); + chunks.push(chunk.join('')); + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); + } + return chunks.join(''); +}; +/***/ }), +/* 387 */ +/***/ (function(module, exports, __webpack_require__) { +"use strict"; +const restoreCursor = __webpack_require__(388); +let hidden = false; +exports.show = stream => { + const s = stream || process.stderr; + if (!s.isTTY) { + return; + } + hidden = false; + s.write('\u001b[?25h'); +}; +exports.hide = stream => { + const s = stream || process.stderr; + if (!s.isTTY) { + return; + } + restoreCursor(); + hidden = true; + s.write('\u001b[?25l'); +}; +exports.toggle = (force, stream) => { + if (force !== undefined) { + hidden = force; + } + if (hidden) { + exports.show(stream); + } else { + exports.hide(stream); + } +}; +/***/ }), +/* 388 */ +/***/ (function(module, exports, __webpack_require__) { +"use strict"; +const onetime = __webpack_require__(389); +const signalExit = __webpack_require__(225); +module.exports = onetime(() => { + signalExit(() => { + process.stderr.write('\u001b[?25h'); + }, {alwaysLast: true}); +}); +/***/ }), +/* 389 */ +/***/ (function(module, exports, __webpack_require__) { +"use strict"; +const mimicFn = __webpack_require__(390); +module.exports = (fn, opts) => { + // TODO: Remove this in v3 + if (opts === true) { + throw new TypeError('The second argument is now an options object'); + } + if (typeof fn !== 'function') { + throw new TypeError('Expected a function'); + } + opts = opts || {}; + let ret; + let called = false; + const fnName = fn.displayName || fn.name || ''; + const onetime = function () { + if (called) { + if (opts.throw === true) { + throw new Error(`Function \`${fnName}\` can only be called once`); + } + return ret; + } + called = true; + ret = fn.apply(this, arguments); + fn = null; + return ret; + }; + mimicFn(onetime, fn); + return onetime; +}; +/***/ }), +/* 390 */ +/***/ (function(module, exports, __webpack_require__) { +"use strict"; +module.exports = (to, from) => { + // TODO: use `Reflect.ownKeys()` when targeting Node.js 6 + for (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) { + Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); + } + return to; +}; +/***/ }), +/* 391 */ +/***/ (function(module, exports, __webpack_require__) { +"use strict"; +module.exports = __webpack_require__(392); +/***/ }), +/* 392 */ +/***/ (function(module) { +module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠹\",\"⠸\",\"⠼\",\"⠴\",\"⠦\",\"⠧\",\"⠇\",\"⠏\"]},\"dots2\":{\"interval\":80,\"frames\":[\"⣾\",\"⣽\",\"⣻\",\"⢿\",\"⡿\",\"⣟\",\"⣯\",\"⣷\"]},\"dots3\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠞\",\"⠖\",\"⠦\",\"⠴\",\"⠲\",\"⠳\",\"⠓\"]},\"dots4\":{\"interval\":80,\"frames\":[\"⠄\",\"⠆\",\"⠇\",\"⠋\",\"⠙\",\"⠸\",\"⠰\",\"⠠\",\"⠰\",\"⠸\",\"⠙\",\"⠋\",\"⠇\",\"⠆\"]},\"dots5\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\"]},\"dots6\":{\"interval\":80,\"frames\":[\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠴\",\"⠲\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠚\",\"⠙\",\"⠉\",\"⠁\"]},\"dots7\":{\"interval\":80,\"frames\":[\"⠈\",\"⠉\",\"⠋\",\"⠓\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠖\",\"⠦\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\"]},\"dots8\":{\"interval\":80,\"frames\":[\"⠁\",\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\",\"⠈\"]},\"dots9\":{\"interval\":80,\"frames\":[\"⢹\",\"⢺\",\"⢼\",\"⣸\",\"⣇\",\"⡧\",\"⡗\",\"⡏\"]},\"dots10\":{\"interval\":80,\"frames\":[\"⢄\",\"⢂\",\"⢁\",\"⡁\",\"⡈\",\"⡐\",\"⡠\"]},\"dots11\":{\"interval\":100,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⡀\",\"⢀\",\"⠠\",\"⠐\",\"⠈\"]},\"dots12\":{\"interval\":80,\"frames\":[\"⢀⠀\",\"⡀⠀\",\"⠄⠀\",\"⢂⠀\",\"⡂⠀\",\"⠅⠀\",\"⢃⠀\",\"⡃⠀\",\"⠍⠀\",\"⢋⠀\",\"⡋⠀\",\"⠍⠁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⢈⠩\",\"⡀⢙\",\"⠄⡙\",\"⢂⠩\",\"⡂⢘\",\"⠅⡘\",\"⢃⠨\",\"⡃⢐\",\"⠍⡐\",\"⢋⠠\",\"⡋⢀\",\"⠍⡁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⠈⠩\",\"⠀⢙\",\"⠀⡙\",\"⠀⠩\",\"⠀⢘\",\"⠀⡘\",\"⠀⠨\",\"⠀⢐\",\"⠀⡐\",\"⠀⠠\",\"⠀⢀\",\"⠀⡀\"]},\"line\":{\"interval\":130,\"frames\":[\"-\",\"\\\\\",\"|\",\"/\"]},\"line2\":{\"interval\":100,\"frames\":[\"⠂\",\"-\",\"–\",\"—\",\"–\",\"-\"]},\"pipe\":{\"interval\":100,\"frames\":[\"┤\",\"┘\",\"┴\",\"└\",\"├\",\"┌\",\"┬\",\"┐\"]},\"simpleDots\":{\"interval\":400,\"frames\":[\". \",\".. \",\"...\",\" \"]},\"simpleDotsScrolling\":{\"interval\":200,\"frames\":[\". \",\".. \",\"...\",\" ..\",\" .\",\" \"]},\"star\":{\"interval\":70,\"frames\":[\"✶\",\"✸\",\"✹\",\"✺\",\"✹\",\"✷\"]},\"star2\":{\"interval\":80,\"frames\":[\"+\",\"x\",\"*\"]},\"flip\":{\"interval\":70,\"frames\":[\"_\",\"_\",\"_\",\"-\",\"`\",\"`\",\"'\",\"´\",\"-\",\"_\",\"_\",\"_\"]},\"hamburger\":{\"interval\":100,\"frames\":[\"☱\",\"☲\",\"☴\"]},\"growVertical\":{\"interval\":120,\"frames\":[\"▁\",\"▃\",\"▄\",\"▅\",\"▆\",\"▇\",\"▆\",\"▅\",\"▄\",\"▃\"]},\"growHorizontal\":{\"interval\":120,\"frames\":[\"▏\",\"▎\",\"▍\",\"▌\",\"▋\",\"▊\",\"▉\",\"▊\",\"▋\",\"▌\",\"▍\",\"▎\"]},\"balloon\":{\"interval\":140,\"frames\":[\" \",\".\",\"o\",\"O\",\"@\",\"*\",\" \"]},\"balloon2\":{\"interval\":120,\"frames\":[\".\",\"o\",\"O\",\"°\",\"O\",\"o\",\".\"]},\"noise\":{\"interval\":100,\"frames\":[\"▓\",\"▒\",\"░\"]},\"bounce\":{\"interval\":120,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⠂\"]},\"boxBounce\":{\"interval\":120,\"frames\":[\"▖\",\"▘\",\"▝\",\"▗\"]},\"boxBounce2\":{\"interval\":100,\"frames\":[\"▌\",\"▀\",\"▐\",\"▄\"]},\"triangle\":{\"interval\":50,\"frames\":[\"◢\",\"◣\",\"◤\",\"◥\"]},\"arc\":{\"interval\":100,\"frames\":[\"◜\",\"◠\",\"◝\",\"◞\",\"◡\",\"◟\"]},\"circle\":{\"interval\":120,\"frames\":[\"◡\",\"⊙\",\"◠\"]},\"squareCorners\":{\"interval\":180,\"frames\":[\"◰\",\"◳\",\"◲\",\"◱\"]},\"circleQuarters\":{\"interval\":120,\"frames\":[\"◴\",\"◷\",\"◶\",\"◵\"]},\"circleHalves\":{\"interval\":50,\"frames\":[\"◐\",\"◓\",\"◑\",\"◒\"]},\"squish\":{\"interval\":100,\"frames\":[\"╫\",\"╪\"]},\"toggle\":{\"interval\":250,\"frames\":[\"⊶\",\"⊷\"]},\"toggle2\":{\"interval\":80,\"frames\":[\"▫\",\"▪\"]},\"toggle3\":{\"interval\":120,\"frames\":[\"□\",\"■\"]},\"toggle4\":{\"interval\":100,\"frames\":[\"■\",\"□\",\"▪\",\"▫\"]},\"toggle5\":{\"interval\":100,\"frames\":[\"▮\",\"▯\"]},\"toggle6\":{\"interval\":300,\"frames\":[\"ဝ\",\"၀\"]},\"toggle7\":{\"interval\":80,\"frames\":[\"⦾\",\"⦿\"]},\"toggle8\":{\"interval\":100,\"frames\":[\"◍\",\"◌\"]},\"toggle9\":{\"interval\":100,\"frames\":[\"◉\",\"◎\"]},\"toggle10\":{\"interval\":100,\"frames\":[\"㊂\",\"㊀\",\"㊁\"]},\"toggle11\":{\"interval\":50,\"frames\":[\"⧇\",\"⧆\"]},\"toggle12\":{\"interval\":120,\"frames\":[\"☗\",\"☖\"]},\"toggle13\":{\"interval\":80,\"frames\":[\"=\",\"*\",\"-\"]},\"arrow\":{\"interval\":100,\"frames\":[\"←\",\"↖\",\"↑\",\"↗\",\"→\",\"↘\",\"↓\",\"↙\"]},\"arrow2\":{\"interval\":80,\"frames\":[\"⬆️ \",\"↗️ \",\"➡️ \",\"↘️ \",\"⬇️ \",\"↙️ \",\"⬅️ \",\"↖️ \"]},\"arrow3\":{\"interval\":120,\"frames\":[\"▹▹▹▹▹\",\"▸▹▹▹▹\",\"▹▸▹▹▹\",\"▹▹▸▹▹\",\"▹▹▹▸▹\",\"▹▹▹▹▸\"]},\"bouncingBar\":{\"interval\":80,\"frames\":[\"[ ]\",\"[= ]\",\"[== ]\",\"[=== ]\",\"[ ===]\",\"[ ==]\",\"[ =]\",\"[ ]\",\"[ =]\",\"[ ==]\",\"[ ===]\",\"[====]\",\"[=== ]\",\"[== ]\",\"[= ]\"]},\"bouncingBall\":{\"interval\":80,\"frames\":[\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ●)\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"(● )\"]},\"smiley\":{\"interval\":200,\"frames\":[\"😄 \",\"😝 \"]},\"monkey\":{\"interval\":300,\"frames\":[\"🙈 \",\"🙈 \",\"🙉 \",\"🙊 \"]},\"hearts\":{\"interval\":100,\"frames\":[\"💛 \",\"💙 \",\"💜 \",\"💚 \",\"❤️ \"]},\"clock\":{\"interval\":100,\"frames\":[\"🕐 \",\"🕑 \",\"🕒 \",\"🕓 \",\"🕔 \",\"🕕 \",\"🕖 \",\"🕗 \",\"🕘 \",\"🕙 \",\"🕚 \"]},\"earth\":{\"interval\":180,\"frames\":[\"🌍 \",\"🌎 \",\"🌏 \"]},\"moon\":{\"interval\":80,\"frames\":[\"🌑 \",\"🌒 \",\"🌓 \",\"🌔 \",\"🌕 \",\"🌖 \",\"🌗 \",\"🌘 \"]},\"runner\":{\"interval\":140,\"frames\":[\"🚶 \",\"🏃 \"]},\"pong\":{\"interval\":80,\"frames\":[\"▐⠂ ▌\",\"▐⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂▌\",\"▐ ⠠▌\",\"▐ ⡀▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐⠠ ▌\"]},\"shark\":{\"interval\":120,\"frames\":[\"▐|\\\\____________▌\",\"▐_|\\\\___________▌\",\"▐__|\\\\__________▌\",\"▐___|\\\\_________▌\",\"▐____|\\\\________▌\",\"▐_____|\\\\_______▌\",\"▐______|\\\\______▌\",\"▐_______|\\\\_____▌\",\"▐________|\\\\____▌\",\"▐_________|\\\\___▌\",\"▐__________|\\\\__▌\",\"▐___________|\\\\_▌\",\"▐____________|\\\\▌\",\"▐____________/|▌\",\"▐___________/|_▌\",\"▐__________/|__▌\",\"▐_________/|___▌\",\"▐________/|____▌\",\"▐_______/|_____▌\",\"▐______/|______▌\",\"▐_____/|_______▌\",\"▐____/|________▌\",\"▐___/|_________▌\",\"▐__/|__________▌\",\"▐_/|___________▌\",\"▐/|____________▌\"]},\"dqpb\":{\"interval\":100,\"frames\":[\"d\",\"q\",\"p\",\"b\"]},\"weather\":{\"interval\":100,\"frames\":[\"☀️ \",\"☀️ \",\"☀️ \",\"🌤 \",\"⛅️ \",\"🌥 \",\"☁️ \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"⛈ \",\"🌨 \",\"🌧 \",\"🌨 \",\"☁️ \",\"🌥 \",\"⛅️ \",\"🌤 \",\"☀️ \",\"☀️ \"]},\"christmas\":{\"interval\":400,\"frames\":[\"🌲\",\"🎄\"]}}"); +/***/ }), +/* 393 */ +/***/ (function(module, exports, __webpack_require__) { +"use strict"; +const chalk = __webpack_require__(394); +const isSupported = process.platform !== 'win32' || process.env.CI || process.env.TERM === 'xterm-256color'; +const main = { + info: chalk.blue('ℹ'), + success: chalk.green('✔'), + warning: chalk.yellow('⚠'), + error: chalk.red('✖') +}; +const fallbacks = { + info: chalk.blue('i'), + success: chalk.green('√'), + warning: chalk.yellow('‼'), + error: chalk.red('×') +}; +module.exports = isSupported ? main : fallbacks; +/***/ }), +/* 394 */ +/***/ (function(module, exports, __webpack_require__) { +"use strict"; +const escapeStringRegexp = __webpack_require__(178); +const ansiStyles = __webpack_require__(395); +const stdoutColor = __webpack_require__(184).stdout; +const template = __webpack_require__(396); +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); +const styles = Object.create(null); +function applyOptions(obj, options) { + options = options || {}; + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; +} +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); + chalk.template.constructor = Chalk; + return chalk.template; + } + applyOptions(this, options); +} +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; +} +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} +const proto = Object.defineProperties(() => {}, styles); +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; + builder._styles = _styles; + builder._empty = _empty; + const self = this; + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto + return builder; +} +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); + if (argsLen === 0) { + return ''; + } -//# sourceMappingURL=index.js.map + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } -/***/ }), -/* 406 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return audit; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; -function audit(durationSelector) { - return function auditOperatorFunction(source) { - return source.lift(new AuditOperator(durationSelector)); - }; + return str; } -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__WEBPACK_IMPORTED_MODULE_0__["__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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=audit.js.map - - -/***/ }), -/* 407 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return auditTime; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); -/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(406); -/* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(107); -/** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */ +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } -function auditTime(duration, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } - return Object(_audit__WEBPACK_IMPORTED_MODULE_1__["audit"])(function () { return Object(_observable_timer__WEBPACK_IMPORTED_MODULE_2__["timer"])(duration, scheduler); }); + return template(chalk, parts.join('')); } -//# sourceMappingURL=auditTime.js.map - - -/***/ }), -/* 408 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return buffer; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - +Object.defineProperties(Chalk.prototype, styles); -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__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSubscriber, _super); - function BufferSubscriber(destination, closingNotifier) { - var _this = _super.call(this, destination) || this; - _this.buffer = []; - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=buffer.js.map +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript /***/ }), -/* 409 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 395 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return bufferCount; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=bufferCount.js.map - +/* WEBPACK VAR INJECTION */(function(module) { +const colorConvert = __webpack_require__(180); -/***/ }), -/* 410 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return bufferTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(45); -/** PURE_IMPORTS_START tslib,_scheduler_async,_Subscriber,_util_isScheduler PURE_IMPORTS_END */ +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; +}; +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], -function bufferTime(bufferTimeSpan) { - var length = arguments.length; - var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_2__["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); + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + + // Fix humans + styles.color.grey = styles.color.gray; + + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; + + for (const styleName of Object.keys(group)) { + const style = group[styleName]; + + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } + + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; + + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; + + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } + + const suite = colorConvert[key]; + + if (key === 'ansi16') { + key = 'ansi'; + } + + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } + + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } + + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } + + return styles; } -//# sourceMappingURL=bufferTime.js.map +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) /***/ }), -/* 411 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 396 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return bufferToggle; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); -/** PURE_IMPORTS_START tslib,_Subscription,_util_subscribeToResult,_OuterSubscriber PURE_IMPORTS_END */ +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } -function bufferToggle(openings, closingSelector) { - return function bufferToggleOperatorFunction(source) { - return source.lift(new BufferToggleOperator(openings, closingSelector)); - }; + return ESCAPES.get(c) || c; } -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__WEBPACK_IMPORTED_MODULE_0__["__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(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - var context = { buffer: buffer, subscription: subscription }; - contexts.push(context); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, closingNotifier, context); - if (!innerSubscription || innerSubscription.closed) { - this.closeBuffer(context); - } - else { - innerSubscription.context = context; - this.add(innerSubscription); - subscription.add(innerSubscription); - } - }; - return BufferToggleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=bufferToggle.js.map +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; -/***/ }), -/* 412 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return bufferWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ + return results; +} +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; + const results = []; + let matches; + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; -function bufferWhen(closingSelector) { - return function (source) { - return source.lift(new BufferWhenOperator(closingSelector)); - }; + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } + + return results; } -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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - this.closingSubscription = closingSubscription; - this.add(closingSubscription); - this.subscribing = true; - closingSubscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); - this.subscribing = false; - }; - return BufferWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=bufferWhen.js.map + +function buildStyle(chalk, styles) { + const enabled = {}; + + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } + + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } + + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; + } + } + } + + return current; +} + +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; + + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } + + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); + } + }); + + chunks.push(chunk.join('')); + + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); + } + + return chunks.join(''); +}; /***/ }), -/* 413 */ +/* 397 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return catchError; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RunCommand", function() { return RunCommand; }); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ -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__WEBPACK_IMPORTED_MODULE_0__["__extends"](CatchSubscriber, _super); - function CatchSubscriber(destination, selector, caught) { - var _this = _super.call(this, destination) || this; - _this.selector = selector; - _this.caught = caught; - return _this; +const RunCommand = { + description: 'Run script defined in package.json in each package that contains that script.', + name: 'run', + + async run(projects, projectGraph, { + extraArgs + }) { + const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projects, projectGraph); + + if (extraArgs.length === 0) { + throw new _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"]('No script specified'); } - 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__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); - this.add(innerSubscriber); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, undefined, undefined, innerSubscriber); - if (innerSubscription !== innerSubscriber) { - this.add(innerSubscription); - } - } - }; - return CatchSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=catchError.js.map + const scriptName = extraArgs[0]; + const scriptArgs = extraArgs.slice(1); + await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async project => { + if (project.hasScript(scriptName)) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(`[${project.name}] running "${scriptName}" script`); + await project.runScriptStreaming(scriptName, { + args: scriptArgs + }); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`[${project.name}] complete`); + } + }); + } + +}; /***/ }), -/* 414 */ +/* 398 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return combineAll; }); -/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68); -/** PURE_IMPORTS_START _observable_combineLatest PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WatchCommand", function() { return WatchCommand; }); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); +/* harmony import */ var _utils_watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(399); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ -function combineAll(project) { - return function (source) { return source.lift(new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__["CombineLatestOperator"](project)); }; -} -//# sourceMappingURL=combineAll.js.map -/***/ }), -/* 415 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(18); -/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(68); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(83); -/** PURE_IMPORTS_START _util_isArray,_observable_combineLatest,_observable_from PURE_IMPORTS_END */ +/** + * Name of the script in the package/project package.json file to run during `kbn watch`. + */ +const watchScriptName = 'kbn:watch'; +/** + * Name of the Kibana project. + */ -var none = {}; -function combineLatest() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; +const kibanaProjectName = 'kibana'; +/** + * Command that traverses through list of available projects/packages that have `kbn:watch` script in their + * package.json files, groups them into topology aware batches and then processes theses batches one by one + * running `kbn:watch` scripts in parallel within the same batch. + * + * Command internally relies on the fact that most of the build systems that are triggered by `kbn:watch` + * will emit special "marker" once build/watch process is ready that we can use as completion condition for + * the `kbn:watch` script and eventually for the entire batch. Currently we support completion "markers" for + * `webpack` and `tsc` only, for the rest we rely on predefined timeouts. + */ + +const WatchCommand = { + description: 'Runs `kbn:watch` script for every project.', + name: 'watch', + + async run(projects, projectGraph) { + const projectsToWatch = new Map(); + + for (const project of projects.values()) { + // We can't watch project that doesn't have `kbn:watch` script. + if (project.hasScript(watchScriptName)) { + projectsToWatch.set(project.name, project); + } } - var project = null; - if (typeof observables[observables.length - 1] === 'function') { - project = observables.pop(); + + if (projectsToWatch.size === 0) { + throw new _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"](`There are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.`); } - if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { - observables = observables[0].slice(); + + const projectNames = Array.from(projectsToWatch.keys()); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`); // Kibana should always be run the last, so we don't rely on automatic + // topological batching and push it to the last one-entry batch manually. + + const shouldWatchKibanaProject = projectsToWatch.delete(kibanaProjectName); + const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projectsToWatch, projectGraph); + + if (shouldWatchKibanaProject) { + batchedProjects.push([projects.get(kibanaProjectName)]); } - return function (source) { return source.lift.call(Object(_observable_from__WEBPACK_IMPORTED_MODULE_2__["from"])([source].concat(observables)), new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__["CombineLatestOperator"](project)); }; -} -//# sourceMappingURL=combineLatest.js.map + await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async pkg => { + const completionHint = await Object(_utils_watch__WEBPACK_IMPORTED_MODULE_4__["waitUntilWatchIsReady"])(pkg.runScriptStreaming(watchScriptName, { + debug: false + }).stdout); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`[${pkg.name}] Initial build completed (${completionHint}).`); + }); + } + +}; /***/ }), -/* 416 */ +/* 399 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(79); -/** PURE_IMPORTS_START _observable_concat PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitUntilWatchIsReady", function() { return waitUntilWatchIsReady; }); +/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8); +/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(400); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ -function concat() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - return function (source) { return source.lift.call(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"].apply(void 0, [source].concat(observables))); }; -} -//# sourceMappingURL=concat.js.map +/** + * Number of milliseconds we wait before we fall back to the default watch handler. + */ -/***/ }), -/* 417 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +const defaultHandlerDelay = 3000; +/** + * If default watch handler is used, then it's the number of milliseconds we wait for + * any build output before we consider watch task ready. + */ -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return concatMap; }); -/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(82); -/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ +const defaultHandlerReadinessTimeout = 2000; +/** + * Describes configurable watch options. + */ -function concatMap(project, resultSelector) { - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(project, resultSelector, 1); +function getWatchHandlers(buildOutput$, { + handlerDelay = defaultHandlerDelay, + handlerReadinessTimeout = defaultHandlerReadinessTimeout +}) { + const typescriptHandler = buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('$ tsc')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('Compilation complete.')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mapTo"])('tsc')))); + const webpackHandler = buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('$ webpack')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["first"])(data => data.includes('Chunk Names')), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mapTo"])('webpack')))); + const defaultHandler = rxjs__WEBPACK_IMPORTED_MODULE_0__["of"](undefined).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["delay"])(handlerReadinessTimeout), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["map"])(() => buildOutput$.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["timeout"])(handlerDelay), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["catchError"])(() => rxjs__WEBPACK_IMPORTED_MODULE_0__["of"]('timeout'))))); + return [typescriptHandler, webpackHandler, defaultHandler]; } -//# sourceMappingURL=concatMap.js.map +function waitUntilWatchIsReady(stream, opts = {}) { + const buildOutput$ = new rxjs__WEBPACK_IMPORTED_MODULE_0__["Subject"](); -/***/ }), -/* 418 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + const onDataListener = data => buildOutput$.next(data.toString('utf-8')); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return concatMapTo; }); -/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(417); -/** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */ + const onEndListener = () => buildOutput$.complete(); -function concatMapTo(innerObservable, resultSelector) { - return Object(_concatMap__WEBPACK_IMPORTED_MODULE_0__["concatMap"])(function () { return innerObservable; }, resultSelector); -} -//# sourceMappingURL=concatMapTo.js.map + const onErrorListener = e => buildOutput$.error(e); + stream.once('end', onEndListener); + stream.once('error', onErrorListener); + stream.on('data', onDataListener); + return rxjs__WEBPACK_IMPORTED_MODULE_0__["race"](getWatchHandlers(buildOutput$, opts)).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["mergeMap"])(whenReady => whenReady), Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_1__["finalize"])(() => { + stream.removeListener('data', onDataListener); + stream.removeListener('end', onEndListener); + stream.removeListener('error', onErrorListener); + buildOutput$.complete(); + })).toPromise(); +} /***/ }), -/* 419 */ +/* 400 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "count", function() { return count; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(401); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__["audit"]; }); +/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(402); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__["auditTime"]; }); -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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=count.js.map +/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(403); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__["buffer"]; }); +/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(404); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__["bufferCount"]; }); -/***/ }), -/* 420 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(405); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__["bufferTime"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return debounce; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(406); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__["bufferToggle"]; }); +/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(407); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__["bufferWhen"]; }); +/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(408); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__["catchError"]; }); -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__WEBPACK_IMPORTED_MODULE_0__["__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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=debounce.js.map +/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(409); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__["combineAll"]; }); +/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(410); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__["combineLatest"]; }); -/***/ }), -/* 421 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(411); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__["concat"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return debounceTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55); -/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(80); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__["concatAll"]; }); +/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(412); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__["concatMap"]; }); +/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(413); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__["concatMapTo"]; }); -function debounceTime(dueTime, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNext(subscriber) { - subscriber.debouncedNext(); -} -//# sourceMappingURL=debounceTime.js.map +/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(414); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "count", function() { return _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__["count"]; }); +/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(415); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__["debounce"]; }); -/***/ }), -/* 422 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(416); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__["debounceTime"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return defaultIfEmpty; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(417); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__["defaultIfEmpty"]; }); +/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(418); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__["delay"]; }); -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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=defaultIfEmpty.js.map +/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(420); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__["delayWhen"]; }); +/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(421); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__["dematerialize"]; }); -/***/ }), -/* 423 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(422); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__["distinct"]; }); + +/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(423); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__["distinctUntilChanged"]; }); + +/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(424); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__["distinctUntilKeyChanged"]; }); + +/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(425); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__["elementAt"]; }); + +/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(428); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__["endWith"]; }); + +/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(429); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "every", function() { return _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__["every"]; }); + +/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(430); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__["exhaust"]; }); + +/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(431); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__["exhaustMap"]; }); + +/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(432); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__["expand"]; }); + +/* harmony import */ var _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(104); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__["filter"]; }); + +/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(433); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__["finalize"]; }); + +/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(434); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "find", function() { return _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__["find"]; }); + +/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(435); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__["findIndex"]; }); + +/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(436); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "first", function() { return _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__["first"]; }); + +/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(31); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__["groupBy"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return delay; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(424); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11); -/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(42); -/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(437); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__["ignoreElements"]; }); +/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(438); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__["isEmpty"]; }); +/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(439); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "last", function() { return _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__["last"]; }); +/* harmony import */ var _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(66); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__["map"]; }); +/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(441); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__["mapTo"]; }); -function delay(delay, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - } - var absoluteDelay = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_4__["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__WEBPACK_IMPORTED_MODULE_4__["Notification"].createComplete()); - this.unsubscribe(); - }; - return DelaySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); -var DelayMessage = /*@__PURE__*/ (function () { - function DelayMessage(time, notification) { - this.time = time; - this.notification = notification; - } - return DelayMessage; -}()); -//# sourceMappingURL=delay.js.map +/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(442); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__["materialize"]; }); +/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(443); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__["max"]; }); -/***/ }), -/* 424 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(446); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__["merge"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDate", function() { return isDate; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isDate(value) { - return value instanceof Date && !isNaN(+value); -} -//# sourceMappingURL=isDate.js.map +/* harmony import */ var _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(81); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__["mergeAll"]; }); +/* harmony import */ var _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(82); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); -/***/ }), -/* 425 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return delayWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_Subscriber,_Observable,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(447); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__["mergeMapTo"]; }); +/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(448); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__["mergeScan"]; }); +/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(449); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__["min"]; }); +/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(450); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__["multicast"]; }); +/* harmony import */ var _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(41); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__["observeOn"]; }); -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__WEBPACK_IMPORTED_MODULE_0__["__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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["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__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -var SubscriptionDelayObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_2__["Observable"])); -var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=delayWhen.js.map +/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(451); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__["onErrorResumeNext"]; }); +/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(452); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__["pairwise"]; }); -/***/ }), -/* 426 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(453); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__["partition"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return dematerialize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(454); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__["pluck"]; }); +/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(455); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__["publish"]; }); -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__WEBPACK_IMPORTED_MODULE_0__["__extends"](DeMaterializeSubscriber, _super); - function DeMaterializeSubscriber(destination) { - return _super.call(this, destination) || this; - } - DeMaterializeSubscriber.prototype._next = function (value) { - value.observe(this.destination); - }; - return DeMaterializeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=dematerialize.js.map +/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(456); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__["publishBehavior"]; }); +/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(457); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__["publishLast"]; }); -/***/ }), -/* 427 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(458); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__["publishReplay"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return distinct; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DistinctSubscriber", function() { return DistinctSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(459); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__["race"]; }); +/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(444); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__["reduce"]; }); +/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(460); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__["repeat"]; }); -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__WEBPACK_IMPORTED_MODULE_0__["__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(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(461); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__["repeatWhen"]; }); -//# sourceMappingURL=distinct.js.map +/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(462); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__["retry"]; }); +/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(463); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__["retryWhen"]; }); -/***/ }), -/* 428 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(30); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__["refCount"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return distinctUntilChanged; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(464); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__["sample"]; }); +/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(465); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__["sampleTime"]; }); -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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=distinctUntilChanged.js.map +/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(445); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__["scan"]; }); +/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(466); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__["sequenceEqual"]; }); -/***/ }), -/* 429 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(467); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "share", function() { return _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__["share"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return distinctUntilKeyChanged; }); -/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(428); -/** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(468); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__["shareReplay"]; }); -function distinctUntilKeyChanged(key, compare) { - return Object(_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__["distinctUntilChanged"])(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; }); -} -//# sourceMappingURL=distinctUntilKeyChanged.js.map +/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(469); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "single", function() { return _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__["single"]; }); +/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(470); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__["skip"]; }); -/***/ }), -/* 430 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(471); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__["skipLast"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return elementAt; }); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(431); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(422); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(432); -/** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(472); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__["skipUntil"]; }); +/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(473); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__["skipWhile"]; }); +/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(474); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__["startWith"]; }); +/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(475); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__["subscribeOn"]; }); +/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(477); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__["switchAll"]; }); -function elementAt(index, defaultValue) { - if (index < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); - } - var hasDefaultValue = arguments.length >= 2; - return function (source) { - return source.pipe(Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return i === index; }), Object(_take__WEBPACK_IMPORTED_MODULE_4__["take"])(1), hasDefaultValue - ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) - : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__["throwIfEmpty"])(function () { return new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); })); - }; -} -//# sourceMappingURL=elementAt.js.map +/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(478); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__["switchMap"]; }); +/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(479); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__["switchMapTo"]; }); -/***/ }), -/* 431 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(427); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "take", function() { return _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__["take"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return throwIfEmpty; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(63); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_util_EmptyError,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(440); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__["takeLast"]; }); +/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(480); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__["takeUntil"]; }); +/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(481); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__["takeWhile"]; }); -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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); -function defaultErrorFactory() { - return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__["EmptyError"](); -} -//# sourceMappingURL=throwIfEmpty.js.map +/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(482); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__["tap"]; }); +/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(483); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__["throttle"]; }); -/***/ }), -/* 432 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(484); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__["throttleTime"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "take", function() { return take; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(43); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(426); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__["throwIfEmpty"]; }); +/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(485); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__["timeInterval"]; }); +/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(486); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__["timeout"]; }); +/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(487); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__["timeoutWith"]; }); -function take(count) { - return function (source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); - } - else { - return source.lift(new TakeOperator(count)); - } - }; -} -var TakeOperator = /*@__PURE__*/ (function () { - function TakeOperator(total) { - this.total = total; - if (this.total < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; - } - } - TakeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeSubscriber(subscriber, this.total)); - }; - return TakeOperator; -}()); -var TakeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=take.js.map +/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(488); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__["timestamp"]; }); +/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(489); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__["toArray"]; }); -/***/ }), -/* 433 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(490); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__["window"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return endWith; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(79); -/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44); -/** PURE_IMPORTS_START _observable_concat,_observable_of PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(491); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__["windowCount"]; }); +/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(492); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__["windowTime"]; }); -function endWith() { - var array = []; - for (var _i = 0; _i < arguments.length; _i++) { - array[_i] = arguments[_i]; - } - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(source, _observable_of__WEBPACK_IMPORTED_MODULE_1__["of"].apply(void 0, array)); }; -} -//# sourceMappingURL=endWith.js.map +/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(493); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__["windowToggle"]; }); +/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(494); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__["windowWhen"]; }); -/***/ }), -/* 434 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(495); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__["withLatestFrom"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "every", function() { return every; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(496); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__["zip"]; }); +/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(497); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__["zipAll"]; }); -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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=every.js.map +/** PURE_IMPORTS_START PURE_IMPORTS_END */ -/***/ }), -/* 435 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return exhaust; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -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__WEBPACK_IMPORTED_MODULE_0__["__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(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=exhaust.js.map -/***/ }), -/* 436 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return exhaustMap; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(66); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(83); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ -function exhaustMap(project, resultSelector) { - if (resultSelector) { - return function (source) { return source.pipe(exhaustMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, value, index); - var destination = this.destination; - destination.add(innerSubscriber); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=exhaustMap.js.map -/***/ }), -/* 437 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return expand; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandOperator", function() { return ExpandOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandSubscriber", function() { return ExpandSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -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; -}()); -var ExpandSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=expand.js.map -/***/ }), -/* 438 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return finalize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); -/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription PURE_IMPORTS_END */ -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__WEBPACK_IMPORTED_MODULE_0__["__extends"](FinallySubscriber, _super); - function FinallySubscriber(destination, callback) { - var _this = _super.call(this, destination) || this; - _this.add(new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](callback)); - return _this; - } - return FinallySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=finalize.js.map -/***/ }), -/* 439 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "find", function() { return find; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueOperator", function() { return FindValueOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueSubscriber", function() { return FindValueSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -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; -}()); -var FindValueSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=find.js.map -/***/ }), -/* 440 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return findIndex; }); -/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(439); -/** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */ -function findIndex(predicate, thisArg) { - return function (source) { return source.lift(new _operators_find__WEBPACK_IMPORTED_MODULE_0__["FindValueOperator"](predicate, source, true, thisArg)); }; -} -//# sourceMappingURL=findIndex.js.map -/***/ }), -/* 441 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "first", function() { return first; }); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(63); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(432); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(422); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(431); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25); -/** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ -function first(predicate, defaultValue) { - var hasDefaultValue = arguments.length >= 2; - return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_take__WEBPACK_IMPORTED_MODULE_2__["take"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; -} -//# sourceMappingURL=first.js.map -/***/ }), -/* 442 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return ignoreElements; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -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__WEBPACK_IMPORTED_MODULE_0__["__extends"](IgnoreElementsSubscriber, _super); - function IgnoreElementsSubscriber() { - return _super !== null && _super.apply(this, arguments) || this; - } - IgnoreElementsSubscriber.prototype._next = function (unused) { - }; - return IgnoreElementsSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=ignoreElements.js.map -/***/ }), -/* 443 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return isEmpty; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=isEmpty.js.map -/***/ }), -/* 444 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "last", function() { return last; }); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(63); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(445); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(431); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(422); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25); -/** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ -function last(predicate, defaultValue) { - var hasDefaultValue = arguments.length >= 2; - return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_takeLast__WEBPACK_IMPORTED_MODULE_2__["takeLast"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; -} -//# sourceMappingURL=last.js.map -/***/ }), -/* 445 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return takeLast; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(43); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ -function takeLast(count) { - return function takeLastOperatorFunction(source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); - } - else { - return source.lift(new TakeLastOperator(count)); - } - }; -} -var TakeLastOperator = /*@__PURE__*/ (function () { - function TakeLastOperator(total) { - this.total = total; - if (this.total < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; - } - } - TakeLastOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeLastSubscriber(subscriber, this.total)); - }; - return TakeLastOperator; -}()); -var TakeLastSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=takeLast.js.map -/***/ }), -/* 446 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return mapTo; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=mapTo.js.map -/***/ }), -/* 447 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return materialize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(42); -/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ -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__WEBPACK_IMPORTED_MODULE_0__["__extends"](MaterializeSubscriber, _super); - function MaterializeSubscriber(destination) { - return _super.call(this, destination) || this; - } - MaterializeSubscriber.prototype._next = function (value) { - this.destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); - }; - MaterializeSubscriber.prototype._error = function (err) { - var destination = this.destination; - destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); - destination.complete(); - }; - MaterializeSubscriber.prototype._complete = function () { - var destination = this.destination; - destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); - destination.complete(); - }; - return MaterializeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=materialize.js.map -/***/ }), -/* 448 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(449); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ -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 Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(max); -} -//# sourceMappingURL=max.js.map -/***/ }), -/* 449 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(450); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(445); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(422); -/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24); -/** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */ -function reduce(accumulator, seed) { - if (arguments.length >= 2) { - return function reduceOperatorFunctionWithSeed(source) { - return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(accumulator, seed), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1), Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__["defaultIfEmpty"])(seed))(source); - }; - } - return function reduceOperatorFunction(source) { - return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(function (acc, value, index) { return accumulator(acc, value, index + 1); }), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1))(source); - }; -} -//# sourceMappingURL=reduce.js.map + + + + + + + +//# sourceMappingURL=index.js.map /***/ }), -/* 450 */ +/* 401 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return scan; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return audit; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -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)); + +function audit(durationSelector) { + return function auditOperatorFunction(source) { + return source.lift(new AuditOperator(durationSelector)); }; } -var ScanOperator = /*@__PURE__*/ (function () { - function ScanOperator(accumulator, seed, hasSeed) { - if (hasSeed === void 0) { - hasSeed = false; - } - this.accumulator = accumulator; - this.seed = seed; - this.hasSeed = hasSeed; +var AuditOperator = /*@__PURE__*/ (function () { + function AuditOperator(durationSelector) { + this.durationSelector = durationSelector; } - ScanOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); + AuditOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector)); }; - return ScanOperator; + return AuditOperator; }()); -var ScanSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ScanSubscriber, _super); - function ScanSubscriber(destination, accumulator, _seed, hasSeed) { +var AuditSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AuditSubscriber, _super); + function AuditSubscriber(destination, durationSelector) { var _this = _super.call(this, destination) || this; - _this.accumulator = accumulator; - _this._seed = _seed; - _this.hasSeed = hasSeed; - _this.index = 0; + _this.durationSelector = durationSelector; + _this.hasValue = false; 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); + 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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); + if (!innerSubscription || innerSubscription.closed) { + this.clearThrottle(); + } + else { + this.add(this.throttled = innerSubscription); + } } }; - ScanSubscriber.prototype._tryNext = function (value) { - var index = this.index++; - var result; - try { - result = this.accumulator(this.seed, value, index); + 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(); } - catch (err) { - this.destination.error(err); + if (hasValue) { + this.value = null; + this.hasValue = false; + this.destination.next(value); } - this.seed = result; - this.destination.next(result); }; - return ScanSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=scan.js.map + AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) { + this.clearThrottle(); + }; + AuditSubscriber.prototype.notifyComplete = function () { + this.clearThrottle(); + }; + return AuditSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=audit.js.map /***/ }), -/* 451 */ +/* 402 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); -/* harmony import */ var _observable_merge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(98); -/** PURE_IMPORTS_START _observable_merge PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return auditTime; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); +/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(401); +/* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(107); +/** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */ -function merge() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; + + +function auditTime(duration, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; } - return function (source) { return source.lift.call(_observable_merge__WEBPACK_IMPORTED_MODULE_0__["merge"].apply(void 0, [source].concat(observables))); }; + return Object(_audit__WEBPACK_IMPORTED_MODULE_1__["audit"])(function () { return Object(_observable_timer__WEBPACK_IMPORTED_MODULE_2__["timer"])(duration, scheduler); }); } -//# sourceMappingURL=merge.js.map +//# sourceMappingURL=auditTime.js.map /***/ }), -/* 452 */ +/* 403 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return mergeMapTo; }); -/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(82); -/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return buffer; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function mergeMapTo(innerObservable, resultSelector, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - if (typeof resultSelector === 'function') { - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, resultSelector, concurrent); + + +function buffer(closingNotifier) { + return function bufferOperatorFunction(source) { + return source.lift(new BufferOperator(closingNotifier)); + }; +} +var BufferOperator = /*@__PURE__*/ (function () { + function BufferOperator(closingNotifier) { + this.closingNotifier = closingNotifier; } - if (typeof resultSelector === 'number') { - concurrent = resultSelector; + BufferOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier)); + }; + return BufferOperator; +}()); +var BufferSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSubscriber, _super); + function BufferSubscriber(destination, closingNotifier) { + var _this = _super.call(this, destination) || this; + _this.buffer = []; + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, closingNotifier)); + return _this; } - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, concurrent); -} -//# sourceMappingURL=mergeMapTo.js.map + 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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=buffer.js.map /***/ }), -/* 453 */ +/* 404 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return mergeScan; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanOperator", function() { return MergeScanOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanSubscriber", function() { return MergeScanSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return bufferCount; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(70); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(71); -/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber PURE_IMPORTS_END */ - - +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function mergeScan(accumulator, seed, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; +function bufferCount(bufferSize, startBufferEvery) { + if (startBufferEvery === void 0) { + startBufferEvery = null; } - return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); }; + return function bufferCountOperatorFunction(source) { + return source.lift(new BufferCountOperator(bufferSize, startBufferEvery)); + }; } -var MergeScanOperator = /*@__PURE__*/ (function () { - function MergeScanOperator(accumulator, seed, concurrent) { - this.accumulator = accumulator; - this.seed = seed; - this.concurrent = concurrent; +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; + } } - MergeScanOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent)); + BufferCountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery)); }; - return MergeScanOperator; + return BufferCountOperator; }()); - -var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeScanSubscriber, _super); - function MergeScanSubscriber(destination, accumulator, acc, concurrent) { +var BufferCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferCountSubscriber, _super); + function BufferCountSubscriber(destination, bufferSize) { var _this = _super.call(this, destination) || this; - _this.accumulator = accumulator; - _this.acc = acc; - _this.concurrent = concurrent; - _this.hasValue = false; - _this.hasCompleted = false; + _this.bufferSize = bufferSize; _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); + BufferCountSubscriber.prototype._next = function (value) { + var buffer = this.buffer; + buffer.push(value); + if (buffer.length == this.bufferSize) { + this.destination.next(buffer); + this.buffer = []; } }; - MergeScanSubscriber.prototype._innerSub = function (ish, value, index) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, value, index); - var destination = this.destination; - destination.add(innerSubscriber); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, undefined, undefined, innerSubscriber); - if (innerSubscription !== innerSubscriber) { - destination.add(innerSubscription); + BufferCountSubscriber.prototype._complete = function () { + var buffer = this.buffer; + if (buffer.length > 0) { + this.destination.next(buffer); } + _super.prototype._complete.call(this); }; - MergeScanSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.active === 0 && this.buffer.length === 0) { - if (this.hasValue === false) { - this.destination.next(this.acc); + return BufferCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__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); } - 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); + 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); } - this.destination.complete(); } + _super.prototype._complete.call(this); }; - return MergeScanSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); - -//# sourceMappingURL=mergeScan.js.map + return BufferSkipCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=bufferCount.js.map /***/ }), -/* 454 */ +/* 405 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(449); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ - -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 Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(min); -} -//# sourceMappingURL=min.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return bufferTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(45); +/** PURE_IMPORTS_START tslib,_scheduler_async,_Subscriber,_util_isScheduler PURE_IMPORTS_END */ -/***/ }), -/* 455 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return multicast; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MulticastOperator", function() { return MulticastOperator; }); -/* harmony import */ var _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(26); -/** PURE_IMPORTS_START _observable_ConnectableObservable PURE_IMPORTS_END */ -function multicast(subjectOrSubjectFactory, selector) { - return function multicastOperatorFunction(source) { - var subjectFactory; - if (typeof subjectOrSubjectFactory === 'function') { - subjectFactory = subjectOrSubjectFactory; +function bufferTime(bufferTimeSpan) { + var length = arguments.length; + var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["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__WEBPACK_IMPORTED_MODULE_0__["__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 { - subjectFactory = function subjectFactory() { - return subjectOrSubjectFactory; - }; + 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)); } - if (typeof selector === 'function') { - return source.lift(new MulticastOperator(subjectFactory, selector)); + 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; + } } - var connectable = Object.create(source, _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__["connectableObservableDescriptor"]); - connectable.source = source; - connectable.subjectFactory = subjectFactory; - return connectable; + 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__WEBPACK_IMPORTED_MODULE_2__["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); + } } -var MulticastOperator = /*@__PURE__*/ (function () { - function MulticastOperator(subjectFactory, selector) { - this.subjectFactory = subjectFactory; - this.selector = selector; +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); } - 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; -}()); - -//# sourceMappingURL=multicast.js.map +} +function dispatchBufferClose(arg) { + var subscriber = arg.subscriber, context = arg.context; + subscriber.closeContext(context); +} +//# sourceMappingURL=bufferTime.js.map /***/ }), -/* 456 */ +/* 406 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNextStatic", function() { return onErrorResumeNextStatic; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return bufferToggle; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(83); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(18); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); /* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(71); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_observable_from,_util_isArray,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - +/** PURE_IMPORTS_START tslib,_Subscription,_util_subscribeToResult,_OuterSubscriber PURE_IMPORTS_END */ -function onErrorResumeNext() { - var nextSources = []; - for (var _i = 0; _i < arguments.length; _i++) { - nextSources[_i] = arguments[_i]; - } - if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { - nextSources = nextSources[0]; - } - return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); }; -} -function onErrorResumeNextStatic() { - var nextSources = []; - for (var _i = 0; _i < arguments.length; _i++) { - nextSources[_i] = arguments[_i]; - } - var source = null; - if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { - nextSources = nextSources[0]; - } - source = nextSources.shift(); - return Object(_observable_from__WEBPACK_IMPORTED_MODULE_1__["from"])(source, null).lift(new OnErrorResumeNextOperator(nextSources)); +function bufferToggle(openings, closingSelector) { + return function bufferToggleOperatorFunction(source) { + return source.lift(new BufferToggleOperator(openings, closingSelector)); + }; } -var OnErrorResumeNextOperator = /*@__PURE__*/ (function () { - function OnErrorResumeNextOperator(nextSources) { - this.nextSources = nextSources; +var BufferToggleOperator = /*@__PURE__*/ (function () { + function BufferToggleOperator(openings, closingSelector) { + this.openings = openings; + this.closingSelector = closingSelector; } - OnErrorResumeNextOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources)); + BufferToggleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector)); }; - return OnErrorResumeNextOperator; + return BufferToggleOperator; }()); -var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OnErrorResumeNextSubscriber, _super); - function OnErrorResumeNextSubscriber(destination, nextSources) { +var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferToggleSubscriber, _super); + function BufferToggleSubscriber(destination, openings, closingSelector) { var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.nextSources = nextSources; + _this.openings = openings; + _this.closingSelector = closingSelector; + _this.contexts = []; + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, openings)); return _this; } - OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) { - this.subscribeToNextSource(); + 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); + } }; - OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) { - this.subscribeToNextSource(); + 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); }; - OnErrorResumeNextSubscriber.prototype._error = function (err) { - this.subscribeToNextSource(); - this.unsubscribe(); + 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); }; - OnErrorResumeNextSubscriber.prototype._complete = function () { - this.subscribeToNextSource(); - this.unsubscribe(); + BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue); }; - OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () { - var next = this.nextSources.shift(); - if (!!next) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, next, undefined, undefined, innerSubscriber); - if (innerSubscription !== innerSubscriber) { - destination.add(innerSubscription); + 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__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + var context = { buffer: buffer, subscription: subscription }; + contexts.push(context); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, closingNotifier, context); + if (!innerSubscription || innerSubscription.closed) { + this.closeBuffer(context); + } else { - this.destination.complete(); + innerSubscription.context = context; + this.add(innerSubscription); + subscription.add(innerSubscription); } }; - return OnErrorResumeNextSubscriber; + return BufferToggleSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=onErrorResumeNext.js.map +//# sourceMappingURL=bufferToggle.js.map /***/ }), -/* 457 */ +/* 407 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return pairwise; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return bufferWhen; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function pairwise() { - return function (source) { return source.lift(new PairwiseOperator()); }; + + +function bufferWhen(closingSelector) { + return function (source) { + return source.lift(new BufferWhenOperator(closingSelector)); + }; } -var PairwiseOperator = /*@__PURE__*/ (function () { - function PairwiseOperator() { +var BufferWhenOperator = /*@__PURE__*/ (function () { + function BufferWhenOperator(closingSelector) { + this.closingSelector = closingSelector; } - PairwiseOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new PairwiseSubscriber(subscriber)); + BufferWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector)); }; - return PairwiseOperator; + return BufferWhenOperator; }()); -var PairwiseSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](PairwiseSubscriber, _super); - function PairwiseSubscriber(destination) { +var BufferWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferWhenSubscriber, _super); + function BufferWhenSubscriber(destination, closingSelector) { var _this = _super.call(this, destination) || this; - _this.hasPrev = false; + _this.closingSelector = closingSelector; + _this.subscribing = false; + _this.openBuffer(); return _this; } - PairwiseSubscriber.prototype._next = function (value) { - var pair; - if (this.hasPrev) { - pair = [this.prev, value]; + 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.hasPrev = true; + this.openBuffer(); } - this.prev = value; - if (pair) { - this.destination.next(pair); + }; + 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__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + this.closingSubscription = closingSubscription; + this.add(closingSubscription); + this.subscribing = true; + closingSubscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); + this.subscribing = false; }; - return PairwiseSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=pairwise.js.map + return BufferWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=bufferWhen.js.map /***/ }), -/* 458 */ +/* 408 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); -/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(103); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); -/** PURE_IMPORTS_START _util_not,_filter PURE_IMPORTS_END */ - - -function partition(predicate, thisArg) { - return function (source) { - return [ - Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(predicate, thisArg)(source), - Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(source) - ]; - }; -} -//# sourceMappingURL=partition.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return catchError; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -/***/ }), -/* 459 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return pluck; }); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(66); -/** PURE_IMPORTS_START _map PURE_IMPORTS_END */ -function pluck() { - var properties = []; - for (var _i = 0; _i < arguments.length; _i++) { - properties[_i] = arguments[_i]; +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; } - var length = properties.length; - if (length === 0) { - throw new Error('list of properties cannot be empty.'); + CatchOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught)); + }; + return CatchOperator; +}()); +var CatchSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CatchSubscriber, _super); + function CatchSubscriber(destination, selector, caught) { + var _this = _super.call(this, destination) || this; + _this.selector = selector; + _this.caught = caught; + return _this; } - return function (source) { return Object(_map__WEBPACK_IMPORTED_MODULE_0__["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; + CatchSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var result = void 0; + try { + result = this.selector(err, this.caught); } - else { - return undefined; + catch (err2) { + _super.prototype.error.call(this, err2); + return; + } + this._unsubscribeAndRecycle(); + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); + this.add(innerSubscriber); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, undefined, undefined, innerSubscriber); + if (innerSubscription !== innerSubscriber) { + this.add(innerSubscription); } } - return currentProp; }; - return mapper; -} -//# sourceMappingURL=pluck.js.map - - -/***/ }), -/* 460 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return publish; }); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(27); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); -/** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ - - -function publish(selector) { - return selector ? - Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"](); }, selector) : - Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"]()); -} -//# sourceMappingURL=publish.js.map - - -/***/ }), -/* 461 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return publishBehavior; }); -/* harmony import */ var _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(32); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); -/** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ - - -function publishBehavior(value) { - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__["BehaviorSubject"](value))(source); }; -} -//# sourceMappingURL=publishBehavior.js.map - - -/***/ }), -/* 462 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return publishLast; }); -/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(50); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); -/** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ - - -function publishLast() { - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__["AsyncSubject"]())(source); }; -} -//# sourceMappingURL=publishLast.js.map + return CatchSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=catchError.js.map /***/ }), -/* 463 */ +/* 409 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return publishReplay; }); -/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); -/** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return combineAll; }); +/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68); +/** PURE_IMPORTS_START _observable_combineLatest PURE_IMPORTS_END */ -function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { - if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') { - scheduler = selectorOrScheduler; - } - var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined; - var subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return subject; }, selector)(source); }; +function combineAll(project) { + return function (source) { return source.lift(new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__["CombineLatestOperator"](project)); }; } -//# sourceMappingURL=publishReplay.js.map +//# sourceMappingURL=combineAll.js.map /***/ }), -/* 464 */ +/* 410 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); /* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(18); -/* harmony import */ var _observable_race__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(105); -/** PURE_IMPORTS_START _util_isArray,_observable_race PURE_IMPORTS_END */ +/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(68); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(83); +/** PURE_IMPORTS_START _util_isArray,_observable_combineLatest,_observable_from PURE_IMPORTS_END */ -function race() { + +var none = {}; +function combineLatest() { var observables = []; for (var _i = 0; _i < arguments.length; _i++) { observables[_i] = arguments[_i]; } - return function raceOperatorFunction(source) { - if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { - observables = observables[0]; - } - return source.lift.call(_observable_race__WEBPACK_IMPORTED_MODULE_1__["race"].apply(void 0, [source].concat(observables))); - }; -} -//# sourceMappingURL=race.js.map - - -/***/ }), -/* 465 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return repeat; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(43); -/** PURE_IMPORTS_START tslib,_Subscriber,_observable_empty PURE_IMPORTS_END */ - - - -function repeat(count) { - if (count === void 0) { - count = -1; - } - return function (source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_2__["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; + var project = null; + if (typeof observables[observables.length - 1] === 'function') { + project = observables.pop(); } - RepeatOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source)); - }; - return RepeatOperator; -}()); -var RepeatSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatSubscriber, _super); - function RepeatSubscriber(destination, count, source) { - var _this = _super.call(this, destination) || this; - _this.count = count; - _this.source = source; - return _this; + if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { + observables = observables[0].slice(); } - 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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=repeat.js.map + return function (source) { return source.lift.call(Object(_observable_from__WEBPACK_IMPORTED_MODULE_2__["from"])([source].concat(observables)), new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__["CombineLatestOperator"](project)); }; +} +//# sourceMappingURL=combineLatest.js.map /***/ }), -/* 466 */ +/* 411 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return repeatWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(79); +/** PURE_IMPORTS_START _observable_concat PURE_IMPORTS_END */ -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__WEBPACK_IMPORTED_MODULE_0__["__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; +function concat() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - 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__WEBPACK_IMPORTED_MODULE_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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); - }; - return RepeatWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=repeatWhen.js.map + return function (source) { return source.lift.call(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"].apply(void 0, [source].concat(observables))); }; +} +//# sourceMappingURL=concat.js.map /***/ }), -/* 467 */ +/* 412 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return retry; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=retry.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return concatMap; }); +/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(82); +/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ + +function concatMap(project, resultSelector) { + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(project, resultSelector, 1); +} +//# sourceMappingURL=concatMap.js.map /***/ }), -/* 468 */ +/* 413 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return retryWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return concatMapTo; }); +/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(412); +/** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */ +function concatMapTo(innerObservable, resultSelector) { + return Object(_concatMap__WEBPACK_IMPORTED_MODULE_0__["concatMap"])(function () { return innerObservable; }, resultSelector); +} +//# sourceMappingURL=concatMapTo.js.map +/***/ }), +/* 414 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -function retryWhen(notifier) { - return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); }; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "count", function() { return count; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function count(predicate) { + return function (source) { return source.lift(new CountOperator(predicate, source)); }; } -var RetryWhenOperator = /*@__PURE__*/ (function () { - function RetryWhenOperator(notifier, source) { - this.notifier = notifier; +var CountOperator = /*@__PURE__*/ (function () { + function CountOperator(predicate, source) { + this.predicate = predicate; this.source = source; } - RetryWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source)); + CountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source)); }; - return RetryWhenOperator; + return CountOperator; }()); -var RetryWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetryWhenSubscriber, _super); - function RetryWhenSubscriber(destination, notifier, source) { +var CountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountSubscriber, _super); + function CountSubscriber(destination, predicate, source) { var _this = _super.call(this, destination) || this; - _this.notifier = notifier; + _this.predicate = predicate; _this.source = source; + _this.count = 0; + _this.index = 0; 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__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - try { - var notifier = this.notifier; - retries = notifier(errors); - } - catch (e) { - return _super.prototype.error.call(this, e); - } - retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); - } - else { - this.errors = null; - this.retriesSubscription = null; - } - this._unsubscribeAndRecycle(); - this.errors = errors; - this.retries = retries; - this.retriesSubscription = retriesSubscription; - errors.next(err); + CountSubscriber.prototype._next = function (value) { + if (this.predicate) { + this._tryPredicate(value); + } + else { + this.count++; } }; - RetryWhenSubscriber.prototype._unsubscribe = function () { - var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription; - if (errors) { - errors.unsubscribe(); - this.errors = null; + CountSubscriber.prototype._tryPredicate = function (value) { + var result; + try { + result = this.predicate(value, this.index++, this.source); } - if (retriesSubscription) { - retriesSubscription.unsubscribe(); - this.retriesSubscription = null; + catch (err) { + this.destination.error(err); + return; + } + if (result) { + this.count++; } - 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); + CountSubscriber.prototype._complete = function () { + this.destination.next(this.count); + this.destination.complete(); }; - return RetryWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=retryWhen.js.map + return CountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=count.js.map /***/ }), -/* 469 */ +/* 415 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return sample; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return debounce; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); /* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); @@ -56758,56 +52575,87 @@ __webpack_require__.r(__webpack_exports__); -function sample(notifier) { - return function (source) { return source.lift(new SampleOperator(notifier)); }; +function debounce(durationSelector) { + return function (source) { return source.lift(new DebounceOperator(durationSelector)); }; } -var SampleOperator = /*@__PURE__*/ (function () { - function SampleOperator(notifier) { - this.notifier = notifier; +var DebounceOperator = /*@__PURE__*/ (function () { + function DebounceOperator(durationSelector) { + this.durationSelector = durationSelector; } - SampleOperator.prototype.call = function (subscriber, source) { - var sampleSubscriber = new SampleSubscriber(subscriber); - var subscription = source.subscribe(sampleSubscriber); - subscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(sampleSubscriber, this.notifier)); - return subscription; + DebounceOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector)); }; - return SampleOperator; + return DebounceOperator; }()); -var SampleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleSubscriber, _super); - function SampleSubscriber() { - var _this = _super !== null && _super.apply(this, arguments) || this; +var DebounceSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__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; } - SampleSubscriber.prototype._next = function (value) { + 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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); + if (subscription && !subscription.closed) { + this.add(this.durationSubscription = subscription); + } }; - SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { this.emitValue(); }; - SampleSubscriber.prototype.notifyComplete = function () { + DebounceSubscriber.prototype.notifyComplete = function () { this.emitValue(); }; - SampleSubscriber.prototype.emitValue = function () { + 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; - this.destination.next(this.value); + _super.prototype._next.call(this, value); } }; - return SampleSubscriber; + return DebounceSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=sample.js.map +//# sourceMappingURL=debounce.js.map /***/ }), -/* 470 */ +/* 416 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return sampleTime; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return debounceTime; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55); @@ -56815,823 +52663,839 @@ __webpack_require__.r(__webpack_exports__); -function sampleTime(period, scheduler) { +function debounceTime(dueTime, scheduler) { if (scheduler === void 0) { scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; } - return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); }; + return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); }; } -var SampleTimeOperator = /*@__PURE__*/ (function () { - function SampleTimeOperator(period, scheduler) { - this.period = period; +var DebounceTimeOperator = /*@__PURE__*/ (function () { + function DebounceTimeOperator(dueTime, scheduler) { + this.dueTime = dueTime; this.scheduler = scheduler; } - SampleTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler)); + DebounceTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); }; - return SampleTimeOperator; + return DebounceTimeOperator; }()); -var SampleTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleTimeSubscriber, _super); - function SampleTimeSubscriber(destination, period, scheduler) { +var DebounceTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceTimeSubscriber, _super); + function DebounceTimeSubscriber(destination, dueTime, scheduler) { var _this = _super.call(this, destination) || this; - _this.period = period; + _this.dueTime = dueTime; _this.scheduler = scheduler; + _this.debouncedSubscription = null; + _this.lastValue = null; _this.hasValue = false; - _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period })); return _this; } - SampleTimeSubscriber.prototype._next = function (value) { + DebounceTimeSubscriber.prototype._next = function (value) { + this.clearDebounce(); this.lastValue = value; this.hasValue = true; + this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this)); }; - SampleTimeSubscriber.prototype.notifyNext = function () { + 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(this.lastValue); + this.destination.next(lastValue); } }; - return SampleTimeSubscriber; + DebounceTimeSubscriber.prototype.clearDebounce = function () { + var debouncedSubscription = this.debouncedSubscription; + if (debouncedSubscription !== null) { + this.remove(debouncedSubscription); + debouncedSubscription.unsubscribe(); + this.debouncedSubscription = null; + } + }; + return DebounceTimeSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNotification(state) { - var subscriber = state.subscriber, period = state.period; - subscriber.notifyNext(); - this.schedule(state, period); +function dispatchNext(subscriber) { + subscriber.debouncedNext(); } -//# sourceMappingURL=sampleTime.js.map +//# sourceMappingURL=debounceTime.js.map /***/ }), -/* 471 */ +/* 417 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return sequenceEqual; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualOperator", function() { return SequenceEqualOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualSubscriber", function() { return SequenceEqualSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return defaultIfEmpty; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); /** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function sequenceEqual(compareTo, comparator) { - return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); }; +function defaultIfEmpty(defaultValue) { + if (defaultValue === void 0) { + defaultValue = null; + } + return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); }; } -var SequenceEqualOperator = /*@__PURE__*/ (function () { - function SequenceEqualOperator(compareTo, comparator) { - this.compareTo = compareTo; - this.comparator = comparator; +var DefaultIfEmptyOperator = /*@__PURE__*/ (function () { + function DefaultIfEmptyOperator(defaultValue) { + this.defaultValue = defaultValue; } - SequenceEqualOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator)); + DefaultIfEmptyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue)); }; - return SequenceEqualOperator; + return DefaultIfEmptyOperator; }()); - -var SequenceEqualSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualSubscriber, _super); - function SequenceEqualSubscriber(destination, compareTo, comparator) { +var DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DefaultIfEmptySubscriber, _super); + function DefaultIfEmptySubscriber(destination, defaultValue) { 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))); + _this.defaultValue = defaultValue; + _this.isEmpty = true; 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(); - } + DefaultIfEmptySubscriber.prototype._next = function (value) { + this.isEmpty = false; + this.destination.next(value); }; - SequenceEqualSubscriber.prototype.completeB = function () { - if (this._oneComplete) { - this.emit(this._a.length === 0 && this._b.length === 0); - } - else { - this._oneComplete = true; + DefaultIfEmptySubscriber.prototype._complete = function () { + if (this.isEmpty) { + this.destination.next(this.defaultValue); } + this.destination.complete(); }; - return SequenceEqualSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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; + return DefaultIfEmptySubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=sequenceEqual.js.map +//# sourceMappingURL=defaultIfEmpty.js.map /***/ }), -/* 472 */ +/* 418 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "share", function() { return share; }); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(455); -/* harmony import */ var _refCount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(30); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27); -/** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return delay; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(419); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11); +/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(42); +/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ -function shareSubjectFactory() { - return new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); -} -function share() { - return function (source) { return Object(_refCount__WEBPACK_IMPORTED_MODULE_1__["refCount"])()(Object(_multicast__WEBPACK_IMPORTED_MODULE_0__["multicast"])(shareSubjectFactory)(source)); }; -} -//# sourceMappingURL=share.js.map -/***/ }), -/* 473 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return shareReplay; }); -/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33); -/** PURE_IMPORTS_START _ReplaySubject PURE_IMPORTS_END */ -function shareReplay(configOrBufferSize, windowTime, scheduler) { - var config; - if (configOrBufferSize && typeof configOrBufferSize === 'object') { - config = configOrBufferSize; - } - else { - config = { - bufferSize: configOrBufferSize, - windowTime: windowTime, - refCount: false, - scheduler: scheduler - }; +function delay(delay, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; } - return function (source) { return source.lift(shareReplayOperator(config)); }; + var absoluteDelay = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(delay); + var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay); + return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); }; } -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__WEBPACK_IMPORTED_MODULE_0__["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 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__WEBPACK_IMPORTED_MODULE_0__["__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 innerSub = subject.subscribe(this); - this.add(function () { - refCount--; - innerSub.unsubscribe(); - if (subscription && !isComplete && useRefCount && refCount === 0) { - subscription.unsubscribe(); - subscription = undefined; - subject = undefined; - } - }); + 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__WEBPACK_IMPORTED_MODULE_4__["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__WEBPACK_IMPORTED_MODULE_4__["Notification"].createComplete()); + this.unsubscribe(); }; + return DelaySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); +var DelayMessage = /*@__PURE__*/ (function () { + function DelayMessage(time, notification) { + this.time = time; + this.notification = notification; + } + return DelayMessage; +}()); +//# sourceMappingURL=delay.js.map + + +/***/ }), +/* 419 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDate", function() { return isDate; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isDate(value) { + return value instanceof Date && !isNaN(+value); } -//# sourceMappingURL=shareReplay.js.map +//# sourceMappingURL=isDate.js.map /***/ }), -/* 474 */ +/* 420 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "single", function() { return single; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return delayWhen; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(63); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_EmptyError PURE_IMPORTS_END */ +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_Subscriber,_Observable,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function single(predicate) { - return function (source) { return source.lift(new SingleOperator(predicate, source)); }; + + +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 SingleOperator = /*@__PURE__*/ (function () { - function SingleOperator(predicate, source) { - this.predicate = predicate; - this.source = source; +var DelayWhenOperator = /*@__PURE__*/ (function () { + function DelayWhenOperator(delayDurationSelector) { + this.delayDurationSelector = delayDurationSelector; } - SingleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source)); + DelayWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector)); }; - return SingleOperator; + return DelayWhenOperator; }()); -var SingleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SingleSubscriber, _super); - function SingleSubscriber(destination, predicate, source) { +var DelayWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelayWhenSubscriber, _super); + function DelayWhenSubscriber(destination, delayDurationSelector) { var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.source = source; - _this.seenValue = false; + _this.delayDurationSelector = delayDurationSelector; + _this.completed = false; + _this.delayNotifierSubscriptions = []; _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; - } + DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(outerValue); + this.removeSubscription(innerSub); + this.tryComplete(); }; - SingleSubscriber.prototype._next = function (value) { - var index = this.index++; - if (this.predicate) { - this.tryNext(value, index); - } - else { - this.applySingleValue(value); + 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(); }; - SingleSubscriber.prototype.tryNext = function (value, index) { + DelayWhenSubscriber.prototype._next = function (value) { + var index = this.index++; try { - if (this.predicate(value, index, this.source)) { - this.applySingleValue(value); + var delayNotifier = this.delayDurationSelector(value, index); + if (delayNotifier) { + this.tryDelay(delayNotifier, 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(); + 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); } - else { - destination.error(new _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__["EmptyError"]); + return subscription.outerValue; + }; + DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) { + var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, delayNotifier, value); + if (notifierSubscription && !notifierSubscription.closed) { + var destination = this.destination; + destination.add(notifierSubscription); + this.delayNotifierSubscriptions.push(notifierSubscription); } }; - return SingleSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=single.js.map - - -/***/ }), -/* 475 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return skip; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -function skip(count) { - return function (source) { return source.lift(new SkipOperator(count)); }; -} -var SkipOperator = /*@__PURE__*/ (function () { - function SkipOperator(total) { - this.total = total; + DelayWhenSubscriber.prototype.tryComplete = function () { + if (this.completed && this.delayNotifierSubscriptions.length === 0) { + this.destination.complete(); + } + }; + return DelayWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +var SubscriptionDelayObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelayObservable, _super); + function SubscriptionDelayObservable(source, subscriptionDelay) { + var _this = _super.call(this) || this; + _this.source = source; + _this.subscriptionDelay = subscriptionDelay; + return _this; } - SkipOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipSubscriber(subscriber, this.total)); + SubscriptionDelayObservable.prototype._subscribe = function (subscriber) { + this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source)); }; - return SkipOperator; -}()); -var SkipSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipSubscriber, _super); - function SkipSubscriber(destination, total) { - var _this = _super.call(this, destination) || this; - _this.total = total; - _this.count = 0; + return SubscriptionDelayObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); +var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelaySubscriber, _super); + function SubscriptionDelaySubscriber(parent, source) { + var _this = _super.call(this) || this; + _this.parent = parent; + _this.source = source; + _this.sourceSubscribed = false; return _this; } - SkipSubscriber.prototype._next = function (x) { - if (++this.count > this.total) { - this.destination.next(x); + 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 SkipSubscriber; + return SubscriptionDelaySubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skip.js.map +//# sourceMappingURL=delayWhen.js.map /***/ }), -/* 476 */ +/* 421 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return skipLast; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return dematerialize; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError PURE_IMPORTS_END */ - +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function skipLast(count) { - return function (source) { return source.lift(new SkipLastOperator(count)); }; +function dematerialize() { + return function dematerializeOperatorFunction(source) { + return source.lift(new DeMaterializeOperator()); + }; } -var SkipLastOperator = /*@__PURE__*/ (function () { - function SkipLastOperator(_skipCount) { - this._skipCount = _skipCount; - if (this._skipCount < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; - } +var DeMaterializeOperator = /*@__PURE__*/ (function () { + function DeMaterializeOperator() { } - SkipLastOperator.prototype.call = function (subscriber, source) { - if (this._skipCount === 0) { - return source.subscribe(new _Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"](subscriber)); - } - else { - return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount)); - } + DeMaterializeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DeMaterializeSubscriber(subscriber)); }; - return SkipLastOperator; + return DeMaterializeOperator; }()); -var SkipLastSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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; +var DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DeMaterializeSubscriber, _super); + function DeMaterializeSubscriber(destination) { + return _super.call(this, destination) || 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); - } + DeMaterializeSubscriber.prototype._next = function (value) { + value.observe(this.destination); }; - return SkipLastSubscriber; + return DeMaterializeSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skipLast.js.map +//# sourceMappingURL=dematerialize.js.map /***/ }), -/* 477 */ +/* 422 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return skipUntil; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return distinct; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DistinctSubscriber", function() { return DistinctSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function skipUntil(notifier) { - return function (source) { return source.lift(new SkipUntilOperator(notifier)); }; +function distinct(keySelector, flushes) { + return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); }; } -var SkipUntilOperator = /*@__PURE__*/ (function () { - function SkipUntilOperator(notifier) { - this.notifier = notifier; +var DistinctOperator = /*@__PURE__*/ (function () { + function DistinctOperator(keySelector, flushes) { + this.keySelector = keySelector; + this.flushes = flushes; } - SkipUntilOperator.prototype.call = function (destination, source) { - return source.subscribe(new SkipUntilSubscriber(destination, this.notifier)); + DistinctOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes)); }; - return SkipUntilOperator; + return DistinctOperator; }()); -var SkipUntilSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipUntilSubscriber, _super); - function SkipUntilSubscriber(destination, notifier) { +var DistinctSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctSubscriber, _super); + function DistinctSubscriber(destination, keySelector, flushes) { var _this = _super.call(this, destination) || this; - _this.hasValue = false; - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](_this, undefined, undefined); - _this.add(innerSubscriber); - _this.innerSubscription = innerSubscriber; - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(_this, notifier, undefined, undefined, innerSubscriber); - if (innerSubscription !== innerSubscriber) { - _this.add(innerSubscription); - _this.innerSubscription = innerSubscription; + _this.keySelector = keySelector; + _this.values = new Set(); + if (flushes) { + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, flushes)); } return _this; } - SkipUntilSubscriber.prototype._next = function (value) { - if (this.hasValue) { - _super.prototype._next.call(this, value); + 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); } }; - SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.hasValue = true; - if (this.innerSubscription) { - this.innerSubscription.unsubscribe(); + 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); }; - SkipUntilSubscriber.prototype.notifyComplete = function () { + DistinctSubscriber.prototype._finalizeNext = function (key, value) { + var values = this.values; + if (!values.has(key)) { + values.add(key); + this.destination.next(value); + } }; - return SkipUntilSubscriber; + return DistinctSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=skipUntil.js.map + +//# sourceMappingURL=distinct.js.map /***/ }), -/* 478 */ +/* 423 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return skipWhile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return distinctUntilChanged; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); /** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function skipWhile(predicate) { - return function (source) { return source.lift(new SkipWhileOperator(predicate)); }; +function distinctUntilChanged(compare, keySelector) { + return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); }; } -var SkipWhileOperator = /*@__PURE__*/ (function () { - function SkipWhileOperator(predicate) { - this.predicate = predicate; +var DistinctUntilChangedOperator = /*@__PURE__*/ (function () { + function DistinctUntilChangedOperator(compare, keySelector) { + this.compare = compare; + this.keySelector = keySelector; } - SkipWhileOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate)); + DistinctUntilChangedOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector)); }; - return SkipWhileOperator; + return DistinctUntilChangedOperator; }()); -var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipWhileSubscriber, _super); - function SkipWhileSubscriber(destination, predicate) { +var DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctUntilChangedSubscriber, _super); + function DistinctUntilChangedSubscriber(destination, compare, keySelector) { var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.skipping = true; - _this.index = 0; + _this.keySelector = keySelector; + _this.hasKey = false; + if (typeof compare === 'function') { + _this.compare = compare; + } return _this; } - SkipWhileSubscriber.prototype._next = function (value) { - var destination = this.destination; - if (this.skipping) { - this.tryCallPredicate(value); - } - if (!this.skipping) { - destination.next(value); - } + DistinctUntilChangedSubscriber.prototype.compare = function (x, y) { + return x === y; }; - SkipWhileSubscriber.prototype.tryCallPredicate = function (value) { + DistinctUntilChangedSubscriber.prototype._next = function (value) { + var key; try { - var result = this.predicate(value, this.index++); - this.skipping = Boolean(result); + var keySelector = this.keySelector; + key = keySelector ? keySelector(value) : value; } catch (err) { - this.destination.error(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 SkipWhileSubscriber; + return DistinctUntilChangedSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skipWhile.js.map +//# sourceMappingURL=distinctUntilChanged.js.map /***/ }), -/* 479 */ +/* 424 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return startWith; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(79); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(45); -/** PURE_IMPORTS_START _observable_concat,_util_isScheduler PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return distinctUntilKeyChanged; }); +/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(423); +/** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */ + +function distinctUntilKeyChanged(key, compare) { + return Object(_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__["distinctUntilChanged"])(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; }); +} +//# sourceMappingURL=distinctUntilKeyChanged.js.map -function startWith() { - var array = []; - for (var _i = 0; _i < arguments.length; _i++) { - array[_i] = arguments[_i]; - } - var scheduler = array[array.length - 1]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(scheduler)) { - array.pop(); - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source, scheduler); }; - } - else { - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source); }; +/***/ }), +/* 425 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return elementAt; }); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(426); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(417); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(427); +/** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ + + + + + +function elementAt(index, defaultValue) { + if (index < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); } + var hasDefaultValue = arguments.length >= 2; + return function (source) { + return source.pipe(Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return i === index; }), Object(_take__WEBPACK_IMPORTED_MODULE_4__["take"])(1), hasDefaultValue + ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) + : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__["throwIfEmpty"])(function () { return new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); })); + }; } -//# sourceMappingURL=startWith.js.map +//# sourceMappingURL=elementAt.js.map /***/ }), -/* 480 */ +/* 426 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return subscribeOn; }); -/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(481); -/** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return throwIfEmpty; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(63); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_util_EmptyError,_Subscriber PURE_IMPORTS_END */ -function subscribeOn(scheduler, delay) { - if (delay === void 0) { - delay = 0; + + +function throwIfEmpty(errorFactory) { + if (errorFactory === void 0) { + errorFactory = defaultErrorFactory; } - return function subscribeOnOperatorFunction(source) { - return source.lift(new SubscribeOnOperator(scheduler, delay)); + return function (source) { + return source.lift(new ThrowIfEmptyOperator(errorFactory)); }; } -var SubscribeOnOperator = /*@__PURE__*/ (function () { - function SubscribeOnOperator(scheduler, delay) { - this.scheduler = scheduler; - this.delay = delay; +var ThrowIfEmptyOperator = /*@__PURE__*/ (function () { + function ThrowIfEmptyOperator(errorFactory) { + this.errorFactory = errorFactory; } - SubscribeOnOperator.prototype.call = function (subscriber, source) { - return new _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__["SubscribeOnObservable"](source, this.delay, this.scheduler).subscribe(subscriber); + ThrowIfEmptyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory)); }; - return SubscribeOnOperator; + return ThrowIfEmptyOperator; }()); -//# sourceMappingURL=subscribeOn.js.map +var ThrowIfEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); +function defaultErrorFactory() { + return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__["EmptyError"](); +} +//# sourceMappingURL=throwIfEmpty.js.map /***/ }), -/* 481 */ +/* 427 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubscribeOnObservable", function() { return SubscribeOnObservable; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "take", function() { return take; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9); -/* harmony import */ var _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(51); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(97); -/** PURE_IMPORTS_START tslib,_Observable,_scheduler_asap,_util_isNumeric PURE_IMPORTS_END */ +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(43); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ -var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscribeOnObservable, _super); - function SubscribeOnObservable(source, delayTime, scheduler) { - if (delayTime === void 0) { - delayTime = 0; - } - if (scheduler === void 0) { - scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; +function take(count) { + return function (source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); } - var _this = _super.call(this) || this; - _this.source = source; - _this.delayTime = delayTime; - _this.scheduler = scheduler; - if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_3__["isNumeric"])(delayTime) || delayTime < 0) { - _this.delayTime = 0; + else { + return source.lift(new TakeOperator(count)); } - if (!scheduler || typeof scheduler.schedule !== 'function') { - _this.scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + }; +} +var TakeOperator = /*@__PURE__*/ (function () { + function TakeOperator(total) { + this.total = total; + if (this.total < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; } + } + TakeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeSubscriber(subscriber, this.total)); + }; + return TakeOperator; +}()); +var TakeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeSubscriber, _super); + function TakeSubscriber(destination, total) { + var _this = _super.call(this, destination) || this; + _this.total = total; + _this.count = 0; return _this; } - SubscribeOnObservable.create = function (source, delay, scheduler) { - if (delay === void 0) { - delay = 0; - } - if (scheduler === void 0) { - scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + 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 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__WEBPACK_IMPORTED_MODULE_1__["Observable"])); - -//# sourceMappingURL=SubscribeOnObservable.js.map + return TakeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=take.js.map /***/ }), -/* 482 */ +/* 428 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return switchAll; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(483); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); -/** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return endWith; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(79); +/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44); +/** PURE_IMPORTS_START _observable_concat,_observable_of PURE_IMPORTS_END */ -function switchAll() { - return Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]); +function endWith() { + var array = []; + for (var _i = 0; _i < arguments.length; _i++) { + array[_i] = arguments[_i]; + } + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(source, _observable_of__WEBPACK_IMPORTED_MODULE_1__["of"].apply(void 0, array)); }; } -//# sourceMappingURL=switchAll.js.map +//# sourceMappingURL=endWith.js.map /***/ }), -/* 483 */ +/* 429 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return switchMap; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "every", function() { return every; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(66); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(83); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ - - - - +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function switchMap(project, resultSelector) { - if (typeof resultSelector === 'function') { - return function (source) { return source.pipe(switchMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; - } - return function (source) { return source.lift(new SwitchMapOperator(project)); }; +function every(predicate, thisArg) { + return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); }; } -var SwitchMapOperator = /*@__PURE__*/ (function () { - function SwitchMapOperator(project) { - this.project = project; +var EveryOperator = /*@__PURE__*/ (function () { + function EveryOperator(predicate, thisArg, source) { + this.predicate = predicate; + this.thisArg = thisArg; + this.source = source; } - SwitchMapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SwitchMapSubscriber(subscriber, this.project)); + EveryOperator.prototype.call = function (observer, source) { + return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source)); }; - return SwitchMapOperator; + return EveryOperator; }()); -var SwitchMapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchMapSubscriber, _super); - function SwitchMapSubscriber(destination, project) { +var EverySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](EverySubscriber, _super); + function EverySubscriber(destination, predicate, thisArg, source) { var _this = _super.call(this, destination) || this; - _this.project = project; + _this.predicate = predicate; + _this.thisArg = thisArg; + _this.source = source; _this.index = 0; + _this.thisArg = thisArg || _this; return _this; } - SwitchMapSubscriber.prototype._next = function (value) { - var result; - var index = this.index++; + EverySubscriber.prototype.notifyComplete = function (everyValueMatch) { + this.destination.next(everyValueMatch); + this.destination.complete(); + }; + EverySubscriber.prototype._next = function (value) { + var result = false; try { - result = this.project(value, index); + result = this.predicate.call(this.thisArg, value, this.index++, this.source); } - catch (error) { - this.destination.error(error); + catch (err) { + this.destination.error(err); 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__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, value, index); - var destination = this.destination; - destination.add(innerSubscriber); - this.innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["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); + if (!result) { + this.notifyComplete(false); } }; - SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); + EverySubscriber.prototype._complete = function () { + this.notifyComplete(true); }; - return SwitchMapSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=switchMap.js.map - - -/***/ }), -/* 484 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return switchMapTo; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(483); -/** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */ - -function switchMapTo(innerObservable, resultSelector) { - return resultSelector ? Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }, resultSelector) : Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }); -} -//# sourceMappingURL=switchMapTo.js.map + return EverySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=every.js.map /***/ }), -/* 485 */ +/* 430 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return takeUntil; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return exhaust; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); /* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); @@ -57639,206 +53503,158 @@ __webpack_require__.r(__webpack_exports__); -function takeUntil(notifier) { - return function (source) { return source.lift(new TakeUntilOperator(notifier)); }; +function exhaust() { + return function (source) { return source.lift(new SwitchFirstOperator()); }; } -var TakeUntilOperator = /*@__PURE__*/ (function () { - function TakeUntilOperator(notifier) { - this.notifier = notifier; +var SwitchFirstOperator = /*@__PURE__*/ (function () { + function SwitchFirstOperator() { } - TakeUntilOperator.prototype.call = function (subscriber, source) { - var takeUntilSubscriber = new TakeUntilSubscriber(subscriber); - var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(takeUntilSubscriber, this.notifier); - if (notifierSubscription && !takeUntilSubscriber.seenValue) { - takeUntilSubscriber.add(notifierSubscription); - return source.subscribe(takeUntilSubscriber); - } - return takeUntilSubscriber; + SwitchFirstOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SwitchFirstSubscriber(subscriber)); }; - return TakeUntilOperator; + return SwitchFirstOperator; }()); -var TakeUntilSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeUntilSubscriber, _super); - function TakeUntilSubscriber(destination) { +var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchFirstSubscriber, _super); + function SwitchFirstSubscriber(destination) { var _this = _super.call(this, destination) || this; - _this.seenValue = false; + _this.hasCompleted = false; + _this.hasSubscription = false; return _this; } - TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.seenValue = true; - this.complete(); + SwitchFirstSubscriber.prototype._next = function (value) { + if (!this.hasSubscription) { + this.hasSubscription = true; + this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, value)); + } }; - TakeUntilSubscriber.prototype.notifyComplete = function () { + SwitchFirstSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (!this.hasSubscription) { + this.destination.complete(); + } }; - return TakeUntilSubscriber; + SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) { + this.remove(innerSub); + this.hasSubscription = false; + if (this.hasCompleted) { + this.destination.complete(); + } + }; + return SwitchFirstSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=takeUntil.js.map +//# sourceMappingURL=exhaust.js.map /***/ }), -/* 486 */ +/* 431 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return takeWhile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return exhaustMap; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(66); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(83); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ -function takeWhile(predicate, inclusive) { - if (inclusive === void 0) { - inclusive = false; + + + + +function exhaustMap(project, resultSelector) { + if (resultSelector) { + return function (source) { return source.pipe(exhaustMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; } return function (source) { - return source.lift(new TakeWhileOperator(predicate, inclusive)); + return source.lift(new ExhaustMapOperator(project)); }; } -var TakeWhileOperator = /*@__PURE__*/ (function () { - function TakeWhileOperator(predicate, inclusive) { - this.predicate = predicate; - this.inclusive = inclusive; +var ExhaustMapOperator = /*@__PURE__*/ (function () { + function ExhaustMapOperator(project) { + this.project = project; } - TakeWhileOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive)); + ExhaustMapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project)); }; - return TakeWhileOperator; + return ExhaustMapOperator; }()); -var TakeWhileSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeWhileSubscriber, _super); - function TakeWhileSubscriber(destination, predicate, inclusive) { +var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExhaustMapSubscriber, _super); + function ExhaustMapSubscriber(destination, project) { var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.inclusive = inclusive; + _this.project = project; + _this.hasSubscription = false; + _this.hasCompleted = false; _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(); + ExhaustMapSubscriber.prototype._next = function (value) { + if (!this.hasSubscription) { + this.tryNext(value); } }; - return TakeWhileSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=takeWhile.js.map - - -/***/ }), -/* 487 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return tap; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(60); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(13); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_noop,_util_isFunction PURE_IMPORTS_END */ - - - - -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__WEBPACK_IMPORTED_MODULE_0__["__extends"](TapSubscriber, _super); - function TapSubscriber(destination, observerOrNext, error, complete) { - var _this = _super.call(this, destination) || this; - _this._tapNext = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_3__["isFunction"])(observerOrNext)) { - _this._context = _this; - _this._tapNext = observerOrNext; - } - else if (observerOrNext) { - _this._context = observerOrNext; - _this._tapNext = observerOrNext.next || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = observerOrNext.error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = observerOrNext.complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - } - return _this; - } - TapSubscriber.prototype._next = function (value) { + ExhaustMapSubscriber.prototype.tryNext = function (value) { + var result; + var index = this.index++; try { - this._tapNext.call(this._context, value); + result = this.project(value, index); } catch (err) { this.destination.error(err); return; } - this.destination.next(value); + this.hasSubscription = true; + this._innerSub(result, value, index); }; - TapSubscriber.prototype._error = function (err) { - try { - this._tapError.call(this._context, err); + ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, value, index); + var destination = this.destination; + destination.add(innerSubscriber); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, undefined, undefined, innerSubscriber); + if (innerSubscription !== innerSubscriber) { + destination.add(innerSubscription); } - catch (err) { - this.destination.error(err); - return; + }; + 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); }; - TapSubscriber.prototype._complete = function () { - try { - this._tapComplete.call(this._context); - } - catch (err) { - this.destination.error(err); - return; + ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) { + var destination = this.destination; + destination.remove(innerSub); + this.hasSubscription = false; + if (this.hasCompleted) { + this.destination.complete(); } - return this.destination.complete(); }; - return TapSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=tap.js.map + return ExhaustMapSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=exhaustMap.js.map /***/ }), -/* 488 */ +/* 432 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultThrottleConfig", function() { return defaultThrottleConfig; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return throttle; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return expand; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandOperator", function() { return ExpandOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandSubscriber", function() { return ExpandSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); /* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); @@ -57846,3882 +53662,4875 @@ __webpack_require__.r(__webpack_exports__); -var defaultThrottleConfig = { - leading: true, - trailing: false -}; -function throttle(durationSelector, config) { - if (config === void 0) { - config = defaultThrottleConfig; +function expand(project, concurrent, scheduler) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } - return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); }; + 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 ThrottleOperator = /*@__PURE__*/ (function () { - function ThrottleOperator(durationSelector, leading, trailing) { - this.durationSelector = durationSelector; - this.leading = leading; - this.trailing = trailing; +var ExpandOperator = /*@__PURE__*/ (function () { + function ExpandOperator(project, concurrent, scheduler) { + this.project = project; + this.concurrent = concurrent; + this.scheduler = scheduler; } - ThrottleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing)); + ExpandOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); }; - return ThrottleOperator; + return ExpandOperator; }()); -var ThrottleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleSubscriber, _super); - function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) { + +var ExpandSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExpandSubscriber, _super); + function ExpandSubscriber(destination, project, concurrent, scheduler) { var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.durationSelector = durationSelector; - _this._leading = _leading; - _this._trailing = _trailing; - _this._hasValue = false; + _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; } - ThrottleSubscriber.prototype._next = function (value) { - this._hasValue = true; - this._sendValue = value; - if (!this._throttled) { - if (this._leading) { - this.send(); + 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)); + } } - else { - this.throttle(value); + catch (e) { + destination.error(e); } } - }; - ThrottleSubscriber.prototype.send = function () { - var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue; - if (_hasValue) { - this.destination.next(_sendValue); - this.throttle(_sendValue); + else { + this.buffer.push(value); } - this._hasValue = false; - this._sendValue = null; }; - ThrottleSubscriber.prototype.throttle = function (value) { - var duration = this.tryDurationSelector(value); - if (!!duration) { - this.add(this._throttled = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration)); - } + ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) { + this.active++; + var destination = this.destination; + destination.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, result, value, index)); }; - ThrottleSubscriber.prototype.tryDurationSelector = function (value) { - try { - return this.durationSelector(value); - } - catch (err) { - this.destination.error(err); - return null; + ExpandSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.hasCompleted && this.active === 0) { + this.destination.complete(); } + this.unsubscribe(); }; - ThrottleSubscriber.prototype.throttlingDone = function () { - var _a = this, _throttled = _a._throttled, _trailing = _a._trailing; - if (_throttled) { - _throttled.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()); } - this._throttled = null; - if (_trailing) { - this.send(); + if (this.hasCompleted && this.active === 0) { + this.destination.complete(); } }; - ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.throttlingDone(); - }; - ThrottleSubscriber.prototype.notifyComplete = function () { - this.throttlingDone(); - }; - return ThrottleSubscriber; + return ExpandSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=throttle.js.map + +//# sourceMappingURL=expand.js.map /***/ }), -/* 489 */ +/* 433 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return throttleTime; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return finalize; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55); -/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(488); -/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */ - +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription PURE_IMPORTS_END */ -function throttleTime(duration, scheduler, config) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; +function finalize(callback) { + return function (source) { return source.lift(new FinallyOperator(callback)); }; +} +var FinallyOperator = /*@__PURE__*/ (function () { + function FinallyOperator(callback) { + this.callback = callback; } - if (config === void 0) { - config = _throttle__WEBPACK_IMPORTED_MODULE_3__["defaultThrottleConfig"]; + FinallyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new FinallySubscriber(subscriber, this.callback)); + }; + return FinallyOperator; +}()); +var FinallySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FinallySubscriber, _super); + function FinallySubscriber(destination, callback) { + var _this = _super.call(this, destination) || this; + _this.add(new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](callback)); + return _this; } - return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); }; + return FinallySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=finalize.js.map + + +/***/ }), +/* 434 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "find", function() { return find; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueOperator", function() { return FindValueOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueSubscriber", function() { return FindValueSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +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 ThrottleTimeOperator = /*@__PURE__*/ (function () { - function ThrottleTimeOperator(duration, scheduler, leading, trailing) { - this.duration = duration; - this.scheduler = scheduler; - this.leading = leading; - this.trailing = trailing; +var FindValueOperator = /*@__PURE__*/ (function () { + function FindValueOperator(predicate, source, yieldIndex, thisArg) { + this.predicate = predicate; + this.source = source; + this.yieldIndex = yieldIndex; + this.thisArg = thisArg; } - ThrottleTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing)); + FindValueOperator.prototype.call = function (observer, source) { + return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg)); }; - return ThrottleTimeOperator; + return FindValueOperator; }()); -var ThrottleTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleTimeSubscriber, _super); - function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) { + +var FindValueSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FindValueSubscriber, _super); + function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) { 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; + _this.predicate = predicate; + _this.source = source; + _this.yieldIndex = yieldIndex; + _this.thisArg = thisArg; + _this.index = 0; 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; - } - } + FindValueSubscriber.prototype.notifyComplete = function (value) { + var destination = this.destination; + destination.next(value); + destination.complete(); + this.unsubscribe(); }; - ThrottleTimeSubscriber.prototype._complete = function () { - if (this._hasTrailingValue) { - this.destination.next(this._trailingValue); - this.destination.complete(); + 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); + } } - else { - this.destination.complete(); + catch (err) { + this.destination.error(err); } }; - 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; - } + FindValueSubscriber.prototype._complete = function () { + this.notifyComplete(this.yieldIndex ? -1 : undefined); }; - return ThrottleTimeSubscriber; + return FindValueSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNext(arg) { - var subscriber = arg.subscriber; - subscriber.clearThrottle(); -} -//# sourceMappingURL=throttleTime.js.map + +//# sourceMappingURL=find.js.map /***/ }), -/* 490 */ +/* 435 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return timeInterval; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeInterval", function() { return TimeInterval; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(450); -/* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(90); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(66); -/** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */ - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return findIndex; }); +/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(434); +/** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */ -function timeInterval(scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } - return function (source) { - return Object(_observable_defer__WEBPACK_IMPORTED_MODULE_2__["defer"])(function () { - return source.pipe(Object(_scan__WEBPACK_IMPORTED_MODULE_1__["scan"])(function (_a, value) { - var current = _a.current; - return ({ value: value, current: scheduler.now(), last: current }); - }, { current: scheduler.now(), value: undefined, last: undefined }), Object(_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (_a) { - var current = _a.current, last = _a.last, value = _a.value; - return new TimeInterval(value, current - last); - })); - }); - }; +function findIndex(predicate, thisArg) { + return function (source) { return source.lift(new _operators_find__WEBPACK_IMPORTED_MODULE_0__["FindValueOperator"](predicate, source, true, thisArg)); }; } -var TimeInterval = /*@__PURE__*/ (function () { - function TimeInterval(value, interval) { - this.value = value; - this.interval = interval; - } - return TimeInterval; -}()); - -//# sourceMappingURL=timeInterval.js.map +//# sourceMappingURL=findIndex.js.map /***/ }), -/* 491 */ +/* 436 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return timeout; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); -/* harmony import */ var _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64); -/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(492); -/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(49); -/** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "first", function() { return first; }); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(63); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(427); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(417); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(426); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25); +/** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ -function timeout(due, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } - return Object(_timeoutWith__WEBPACK_IMPORTED_MODULE_2__["timeoutWith"])(due, Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_3__["throwError"])(new _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]()), scheduler); + + +function first(predicate, defaultValue) { + var hasDefaultValue = arguments.length >= 2; + return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_take__WEBPACK_IMPORTED_MODULE_2__["take"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; } -//# sourceMappingURL=timeout.js.map +//# sourceMappingURL=first.js.map /***/ }), -/* 492 */ +/* 437 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return timeoutWith; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return ignoreElements; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(424); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - - +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function timeoutWith(due, withObservable, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - } - return function (source) { - var absoluteTimeout = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(due); - var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due); - return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler)); +function ignoreElements() { + return function ignoreElementsOperatorFunction(source) { + return source.lift(new IgnoreElementsOperator()); }; } -var TimeoutWithOperator = /*@__PURE__*/ (function () { - function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) { - this.waitFor = waitFor; - this.absoluteTimeout = absoluteTimeout; - this.withObservable = withObservable; - this.scheduler = scheduler; +var IgnoreElementsOperator = /*@__PURE__*/ (function () { + function IgnoreElementsOperator() { } - TimeoutWithOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler)); + IgnoreElementsOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new IgnoreElementsSubscriber(subscriber)); }; - return TimeoutWithOperator; + return IgnoreElementsOperator; }()); -var TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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; +var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IgnoreElementsSubscriber, _super); + function IgnoreElementsSubscriber() { + return _super !== null && _super.apply(this, arguments) || this; } - TimeoutWithSubscriber.dispatchTimeout = function (subscriber) { - var withObservable = subscriber.withObservable; - subscriber._unsubscribeAndRecycle(); - subscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(subscriber, withObservable)); + IgnoreElementsSubscriber.prototype._next = function (unused) { }; - 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)); - } + return IgnoreElementsSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=ignoreElements.js.map + + +/***/ }), +/* 438 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return isEmpty; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +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)); }; - TimeoutWithSubscriber.prototype._next = function (value) { - if (!this.absoluteTimeout) { - this.scheduleTimeout(); - } - _super.prototype._next.call(this, value); + return IsEmptyOperator; +}()); +var IsEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__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(); }; - TimeoutWithSubscriber.prototype._unsubscribe = function () { - this.action = null; - this.scheduler = null; - this.withObservable = null; + IsEmptySubscriber.prototype._next = function (value) { + this.notifyComplete(false); }; - return TimeoutWithSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=timeoutWith.js.map + IsEmptySubscriber.prototype._complete = function () { + this.notifyComplete(true); + }; + return IsEmptySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=isEmpty.js.map /***/ }), -/* 493 */ +/* 439 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return timestamp; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timestamp", function() { return Timestamp; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(66); -/** PURE_IMPORTS_START _scheduler_async,_map PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "last", function() { return last; }); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(63); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(440); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(426); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(417); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25); +/** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ -function timestamp(scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } - return Object(_map__WEBPACK_IMPORTED_MODULE_1__["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; -}()); -//# sourceMappingURL=timestamp.js.map -/***/ }), -/* 494 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(449); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ -function toArrayReducer(arr, item, index) { - if (index === 0) { - return [item]; - } - arr.push(item); - return arr; -} -function toArray() { - return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(toArrayReducer, []); +function last(predicate, defaultValue) { + var hasDefaultValue = arguments.length >= 2; + return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_takeLast__WEBPACK_IMPORTED_MODULE_2__["takeLast"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; } -//# sourceMappingURL=toArray.js.map +//# sourceMappingURL=last.js.map /***/ }), -/* 495 */ +/* 440 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "window", function() { return window; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return takeLast; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(43); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ -function window(windowBoundaries) { - return function windowOperatorFunction(source) { - return source.lift(new WindowOperator(windowBoundaries)); +function takeLast(count) { + return function takeLastOperatorFunction(source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); + } + else { + return source.lift(new TakeLastOperator(count)); + } }; } -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(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(windowSubscriber, this.windowBoundaries)); +var TakeLastOperator = /*@__PURE__*/ (function () { + function TakeLastOperator(total) { + this.total = total; + if (this.total < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; } - return sourceSubscription; + } + TakeLastOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeLastSubscriber(subscriber, this.total)); }; - return WindowOperator; + return TakeLastOperator; }()); -var WindowSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); - function WindowSubscriber(destination) { +var TakeLastSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeLastSubscriber, _super); + function TakeLastSubscriber(destination, total) { var _this = _super.call(this, destination) || this; - _this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - destination.next(_this.window); + _this.total = total; + _this.ring = new Array(); + _this.count = 0; 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(); + 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 newWindow = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - destination.next(newWindow); + 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 WindowSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=window.js.map + return TakeLastSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=takeLast.js.map /***/ }), -/* 496 */ +/* 441 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return windowCount; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return mapTo; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27); -/** PURE_IMPORTS_START tslib,_Subscriber,_Subject PURE_IMPORTS_END */ - +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function windowCount(windowSize, startWindowEvery) { - if (startWindowEvery === void 0) { - startWindowEvery = 0; - } - return function windowCountOperatorFunction(source) { - return source.lift(new WindowCountOperator(windowSize, startWindowEvery)); - }; +function mapTo(value) { + return function (source) { return source.lift(new MapToOperator(value)); }; } -var WindowCountOperator = /*@__PURE__*/ (function () { - function WindowCountOperator(windowSize, startWindowEvery) { - this.windowSize = windowSize; - this.startWindowEvery = startWindowEvery; +var MapToOperator = /*@__PURE__*/ (function () { + function MapToOperator(value) { + this.value = value; } - WindowCountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery)); + MapToOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MapToSubscriber(subscriber, this.value)); }; - return WindowCountOperator; + return MapToOperator; }()); -var WindowCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowCountSubscriber, _super); - function WindowCountSubscriber(destination, windowSize, startWindowEvery) { +var MapToSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MapToSubscriber, _super); + function MapToSubscriber(destination, value) { var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.windowSize = windowSize; - _this.startWindowEvery = startWindowEvery; - _this.windows = [new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"]()]; - _this.count = 0; - destination.next(_this.windows[0]); + _this.value = value; 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__WEBPACK_IMPORTED_MODULE_2__["Subject"](); - windows.push(window_1); - destination.next(window_1); - } + MapToSubscriber.prototype._next = function (x) { + this.destination.next(this.value); }; - 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); + return MapToSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=mapTo.js.map + + +/***/ }), +/* 442 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return materialize; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(42); +/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ + + + +function materialize() { + return function materializeOperatorFunction(source) { + return source.lift(new MaterializeOperator()); }; - WindowCountSubscriber.prototype._complete = function () { - var windows = this.windows; - if (windows) { - while (windows.length > 0 && !this.closed) { - windows.shift().complete(); - } - } - this.destination.complete(); +} +var MaterializeOperator = /*@__PURE__*/ (function () { + function MaterializeOperator() { + } + MaterializeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MaterializeSubscriber(subscriber)); }; - WindowCountSubscriber.prototype._unsubscribe = function () { - this.count = 0; - this.windows = null; + return MaterializeOperator; +}()); +var MaterializeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MaterializeSubscriber, _super); + function MaterializeSubscriber(destination) { + return _super.call(this, destination) || this; + } + MaterializeSubscriber.prototype._next = function (value) { + this.destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); }; - return WindowCountSubscriber; + MaterializeSubscriber.prototype._error = function (err) { + var destination = this.destination; + destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); + destination.complete(); + }; + MaterializeSubscriber.prototype._complete = function () { + var destination = this.destination; + destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); + destination.complete(); + }; + return MaterializeSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=windowCount.js.map +//# sourceMappingURL=materialize.js.map /***/ }), -/* 497 */ +/* 443 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return windowTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(97); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(45); -/** PURE_IMPORTS_START tslib,_Subject,_scheduler_async,_Subscriber,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(444); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ + +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 Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(max); +} +//# sourceMappingURL=max.js.map +/***/ }), +/* 444 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(445); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(440); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(417); +/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24); +/** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */ -function windowTime(windowTimeSpan) { - var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - var windowCreationInterval = null; - var maxWindowSize = Number.POSITIVE_INFINITY; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[3])) { - scheduler = arguments[3]; - } - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[2])) { - scheduler = arguments[2]; - } - else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[2])) { - maxWindowSize = arguments[2]; - } - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[1])) { - scheduler = arguments[1]; + +function reduce(accumulator, seed) { + if (arguments.length >= 2) { + return function reduceOperatorFunctionWithSeed(source) { + return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(accumulator, seed), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1), Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__["defaultIfEmpty"])(seed))(source); + }; } - else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[1])) { - windowCreationInterval = arguments[1]; + return function reduceOperatorFunction(source) { + return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(function (acc, value, index) { return accumulator(acc, value, index + 1); }), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1))(source); + }; +} +//# sourceMappingURL=reduce.js.map + + +/***/ }), +/* 445 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return scan; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function scan(accumulator, seed) { + var hasSeed = false; + if (arguments.length >= 2) { + hasSeed = true; } - return function windowTimeOperatorFunction(source) { - return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler)); + return function scanOperatorFunction(source) { + return source.lift(new ScanOperator(accumulator, seed, hasSeed)); }; } -var WindowTimeOperator = /*@__PURE__*/ (function () { - function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { - this.windowTimeSpan = windowTimeSpan; - this.windowCreationInterval = windowCreationInterval; - this.maxWindowSize = maxWindowSize; - this.scheduler = scheduler; +var ScanOperator = /*@__PURE__*/ (function () { + function ScanOperator(accumulator, seed, hasSeed) { + if (hasSeed === void 0) { + hasSeed = false; + } + this.accumulator = accumulator; + this.seed = seed; + this.hasSeed = hasSeed; } - WindowTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler)); + ScanOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); }; - return WindowTimeOperator; + return ScanOperator; }()); -var CountedSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountedSubject, _super); - function CountedSubject() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this._numberOfNextedValues = 0; +var ScanSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__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; } - CountedSubject.prototype.next = function (value) { - this._numberOfNextedValues++; - _super.prototype.next.call(this, value); - }; - Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", { + Object.defineProperty(ScanSubscriber.prototype, "seed", { get: function () { - return this._numberOfNextedValues; + return this._seed; + }, + set: function (value) { + this.hasSeed = true; + this._seed = value; }, enumerable: true, configurable: true }); - return CountedSubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -var WindowTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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)); + ScanSubscriber.prototype._next = function (value) { + if (!this.hasSeed) { + this.seed = value; + this.destination.next(value); } 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); + return this._tryNext(value); } - 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(); - } + ScanSubscriber.prototype._tryNext = function (value) { + var index = this.index++; + var result; + try { + result = this.accumulator(this.seed, value, index); } - 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__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); -function dispatchWindowTimeSpanOnly(state) { - var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window; - if (window) { - subscriber.closeWindow(window); + catch (err) { + this.destination.error(err); + } + this.seed = result; + this.destination.next(result); + }; + return ScanSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=scan.js.map + + +/***/ }), +/* 446 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); +/* harmony import */ var _observable_merge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(98); +/** PURE_IMPORTS_START _observable_merge PURE_IMPORTS_END */ + +function merge() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - 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); + return function (source) { return source.lift.call(_observable_merge__WEBPACK_IMPORTED_MODULE_0__["merge"].apply(void 0, [source].concat(observables))); }; } -function dispatchWindowClose(state) { - var subscriber = state.subscriber, window = state.window, context = state.context; - if (context && context.action && context.subscription) { - context.action.remove(context.subscription); +//# sourceMappingURL=merge.js.map + + +/***/ }), +/* 447 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return mergeMapTo; }); +/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(82); +/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ + +function mergeMapTo(innerObservable, resultSelector, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } - subscriber.closeWindow(window); + if (typeof resultSelector === 'function') { + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, resultSelector, concurrent); + } + if (typeof resultSelector === 'number') { + concurrent = resultSelector; + } + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, concurrent); } -//# sourceMappingURL=windowTime.js.map +//# sourceMappingURL=mergeMapTo.js.map /***/ }), -/* 498 */ +/* 448 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return windowToggle; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return mergeScan; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanOperator", function() { return MergeScanOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanSubscriber", function() { return MergeScanSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_Subject,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(70); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(71); +/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber PURE_IMPORTS_END */ -function windowToggle(openings, closingSelector) { - return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); }; +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 WindowToggleOperator = /*@__PURE__*/ (function () { - function WindowToggleOperator(openings, closingSelector) { - this.openings = openings; - this.closingSelector = closingSelector; +var MergeScanOperator = /*@__PURE__*/ (function () { + function MergeScanOperator(accumulator, seed, concurrent) { + this.accumulator = accumulator; + this.seed = seed; + this.concurrent = concurrent; } - WindowToggleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector)); + MergeScanOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent)); }; - return WindowToggleOperator; + return MergeScanOperator; }()); -var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowToggleSubscriber, _super); - function WindowToggleSubscriber(destination, openings, closingSelector) { + +var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeScanSubscriber, _super); + function MergeScanSubscriber(destination, accumulator, acc, concurrent) { var _this = _super.call(this, destination) || this; - _this.openings = openings; - _this.closingSelector = closingSelector; - _this.contexts = []; - _this.add(_this.openSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(_this, openings, openings)); + _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; } - 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); + 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); } - } - }; - 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(); + catch (e) { + return destination.error(e); } + this.active++; + this._innerSub(ish, value, index); } - _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(); - } + else { + this.buffer.push(value); } - _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(); - } + MergeScanSubscriber.prototype._innerSub = function (ish, value, index) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, value, index); + var destination = this.destination; + destination.add(innerSubscriber); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, undefined, undefined, innerSubscriber); + if (innerSubscription !== innerSubscriber) { + destination.add(innerSubscription); } }; - 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__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); - var context_4 = { window: window_1, subscription: subscription }; - this.contexts.push(context_4); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, closingNotifier, context_4); - if (innerSubscription.closed) { - this.closeWindow(this.contexts.length - 1); - } - else { - innerSubscription.context = context_4; - subscription.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.next(window_1); - } - else { - this.closeWindow(this.contexts.indexOf(outerValue)); + this.destination.complete(); } + this.unsubscribe(); }; - WindowToggleSubscriber.prototype.notifyError = function (err) { - this.error(err); + MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var destination = this.destination; + this.acc = innerValue; + this.hasValue = true; + destination.next(innerValue); }; - WindowToggleSubscriber.prototype.notifyComplete = function (inner) { - if (inner !== this.openSubscription) { - this.closeWindow(this.contexts.indexOf(inner.context)); + 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()); } - }; - WindowToggleSubscriber.prototype.closeWindow = function (index) { - if (index === -1) { - return; + else if (this.active === 0 && this.hasCompleted) { + if (this.hasValue === false) { + this.destination.next(this.acc); + } + this.destination.complete(); } - 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__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=windowToggle.js.map + return MergeScanSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); + +//# sourceMappingURL=mergeScan.js.map /***/ }), -/* 499 */ +/* 449 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return windowWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(444); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ + +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 Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(min); +} +//# sourceMappingURL=min.js.map +/***/ }), +/* 450 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return multicast; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MulticastOperator", function() { return MulticastOperator; }); +/* harmony import */ var _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(26); +/** PURE_IMPORTS_START _observable_ConnectableObservable PURE_IMPORTS_END */ -function windowWhen(closingSelector) { - return function windowWhenOperatorFunction(source) { - return source.lift(new WindowOperator(closingSelector)); +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, _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__["connectableObservableDescriptor"]); + connectable.source = source; + connectable.subjectFactory = subjectFactory; + return connectable; }; } -var WindowOperator = /*@__PURE__*/ (function () { - function WindowOperator(closingSelector) { - this.closingSelector = closingSelector; +var MulticastOperator = /*@__PURE__*/ (function () { + function MulticastOperator(subjectFactory, selector) { + this.subjectFactory = subjectFactory; + this.selector = selector; } - WindowOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector)); + 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 WindowOperator; + return MulticastOperator; }()); -var WindowSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); - }; - return WindowSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=windowWhen.js.map + +//# sourceMappingURL=multicast.js.map /***/ }), -/* 500 */ +/* 451 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return withLatestFrom; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNextStatic", function() { return onErrorResumeNextStatic; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(83); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(18); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(71); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_observable_from,_util_isArray,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function withLatestFrom() { - var args = []; + + + +function onErrorResumeNext() { + var nextSources = []; for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; + nextSources[_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)); - }; + if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { + nextSources = nextSources[0]; + } + return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); }; } -var WithLatestFromOperator = /*@__PURE__*/ (function () { - function WithLatestFromOperator(observables, project) { - this.observables = observables; - this.project = project; +function onErrorResumeNextStatic() { + var nextSources = []; + for (var _i = 0; _i < arguments.length; _i++) { + nextSources[_i] = arguments[_i]; } - WithLatestFromOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project)); + var source = null; + if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { + nextSources = nextSources[0]; + } + source = nextSources.shift(); + return Object(_observable_from__WEBPACK_IMPORTED_MODULE_1__["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 WithLatestFromOperator; + return OnErrorResumeNextOperator; }()); -var WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WithLatestFromSubscriber, _super); - function WithLatestFromSubscriber(destination, observables, project) { +var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OnErrorResumeNextSubscriber, _super); + function OnErrorResumeNextSubscriber(destination, nextSources) { 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(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, observable, observable, i)); - } + _this.destination = destination; + _this.nextSources = nextSources; 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); - } - } + OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) { + this.subscribeToNextSource(); }; - WithLatestFromSubscriber.prototype.notifyComplete = function () { + OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) { + this.subscribeToNextSource(); }; - 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); - } - } + OnErrorResumeNextSubscriber.prototype._error = function (err) { + this.subscribeToNextSource(); + this.unsubscribe(); }; - WithLatestFromSubscriber.prototype._tryProject = function (args) { - var result; - try { - result = this.project.apply(this, args); + OnErrorResumeNextSubscriber.prototype._complete = function () { + this.subscribeToNextSource(); + this.unsubscribe(); + }; + OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () { + var next = this.nextSources.shift(); + if (!!next) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, next, undefined, undefined, innerSubscriber); + if (innerSubscription !== innerSubscriber) { + destination.add(innerSubscription); + } } - catch (err) { - this.destination.error(err); - return; + else { + this.destination.complete(); } - this.destination.next(result); }; - return WithLatestFromSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=withLatestFrom.js.map + return OnErrorResumeNextSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=onErrorResumeNext.js.map /***/ }), -/* 501 */ +/* 452 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); -/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109); -/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return pairwise; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function zip() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; + +function pairwise() { + return function (source) { return source.lift(new PairwiseOperator()); }; +} +var PairwiseOperator = /*@__PURE__*/ (function () { + function PairwiseOperator() { } - return function zipOperatorFunction(source) { - return source.lift.call(_observable_zip__WEBPACK_IMPORTED_MODULE_0__["zip"].apply(void 0, [source].concat(observables))); + PairwiseOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new PairwiseSubscriber(subscriber)); }; -} -//# sourceMappingURL=zip.js.map + return PairwiseOperator; +}()); +var PairwiseSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=pairwise.js.map /***/ }), -/* 502 */ +/* 453 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return zipAll; }); -/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109); -/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); +/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(103); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); +/** PURE_IMPORTS_START _util_not,_filter PURE_IMPORTS_END */ -function zipAll(project) { - return function (source) { return source.lift(new _observable_zip__WEBPACK_IMPORTED_MODULE_0__["ZipOperator"](project)); }; + +function partition(predicate, thisArg) { + return function (source) { + return [ + Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(predicate, thisArg)(source), + Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(source) + ]; + }; } -//# sourceMappingURL=zipAll.js.map +//# sourceMappingURL=partition.js.map /***/ }), -/* 503 */ +/* 454 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runCommand", function() { return runCommand; }); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); -/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(504); -/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(505); -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; } - -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - - - - -async function runCommand(command, config) { - try { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(`Running [${command.name}] command from [${config.rootPath}]`); - const kbn = await _utils_kibana__WEBPACK_IMPORTED_MODULE_4__["Kibana"].loadFrom(config.rootPath); - const projects = kbn.getFilteredProjects({ - skipKibanaPlugins: Boolean(config.options['skip-kibana-plugins']), - ossOnly: Boolean(config.options.oss), - exclude: toArray(config.options.exclude), - include: toArray(config.options.include) - }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return pluck; }); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(66); +/** PURE_IMPORTS_START _map PURE_IMPORTS_END */ - if (projects.size === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(`There are no projects found. Double check project name(s) in '-i/--include' and '-e/--exclude' filters.`); - return process.exit(1); +function pluck() { + var properties = []; + for (var _i = 0; _i < arguments.length; _i++) { + properties[_i] = arguments[_i]; } - - const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_2__["buildProjectGraph"])(projects); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(`Found ${projects.size.toString()} projects`); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(Object(_utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__["renderProjectsTree"])(config.rootPath, projects)); - await command.run(projects, projectGraph, _objectSpread(_objectSpread({}, config), {}, { - kbn - })); - } catch (error) { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(`[${command.name}] failed:`); - - if (error instanceof _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"]) { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(error.message); - const metaOutput = Object.entries(error.meta).map(([key, value]) => `${key}: ${value}`).join('\n'); - - if (metaOutput) { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info('Additional debugging info:\n'); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].indent(2); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(metaOutput); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].indent(-2); - } - } else { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(error); + var length = properties.length; + if (length === 0) { + throw new Error('list of properties cannot be empty.'); } - - process.exit(1); - } + return function (source) { return Object(_map__WEBPACK_IMPORTED_MODULE_0__["map"])(plucker(properties, length))(source); }; } - -function toArray(value) { - if (value == null) { - return []; - } - - return Array.isArray(value) ? value : [value]; +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 + /***/ }), -/* 504 */ +/* 455 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderProjectsTree", function() { return renderProjectsTree; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(235); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -const projectKey = Symbol('__project'); -function renderProjectsTree(rootPath, projects) { - const projectsTree = buildProjectsTree(rootPath, projects); - return treeToString(createTreeStructure(projectsTree)); -} - -function treeToString(tree) { - return [tree.name].concat(childrenToStrings(tree.children, '')).join('\n'); -} +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return publish; }); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(27); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(450); +/** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ -function childrenToStrings(tree, treePrefix) { - if (tree === undefined) { - return []; - } - let strings = []; - tree.forEach((node, index) => { - const isLastNode = tree.length - 1 === index; - const nodePrefix = isLastNode ? '└── ' : '├── '; - const childPrefix = isLastNode ? ' ' : '│ '; - const childrenPrefix = treePrefix + childPrefix; - strings.push(`${treePrefix}${nodePrefix}${node.name}`); - strings = strings.concat(childrenToStrings(node.children, childrenPrefix)); - }); - return strings; +function publish(selector) { + return selector ? + Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"](); }, selector) : + Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"]()); } +//# sourceMappingURL=publish.js.map -function createTreeStructure(tree) { - let name; - const children = []; - - for (const [dir, project] of tree.entries()) { - // This is a leaf node (aka a project) - if (typeof project === 'string') { - name = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(project); - continue; - } // If there's only one project and the key indicates it's a leaf node, we - // know that we're at a package folder that contains a package.json, so we - // "inline it" so we don't get unnecessary levels, i.e. we'll just see - // `foo` instead of `foo -> foo`. +/***/ }), +/* 456 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (project.size === 1 && project.has(projectKey)) { - const projectName = project.get(projectKey); - children.push({ - children: [], - name: dirOrProjectName(dir, projectName) - }); - continue; - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return publishBehavior; }); +/* harmony import */ var _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(32); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(450); +/** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ - const subtree = createTreeStructure(project); // If the name is specified, we know there's a package at the "root" of the - // subtree itself. - if (subtree.name !== undefined) { - const projectName = subtree.name; - children.push({ - children: subtree.children, - name: dirOrProjectName(dir, projectName) - }); - continue; - } // Special-case whenever we have one child, so we don't get unnecessary - // folders in the output. E.g. instead of `foo -> bar -> baz` we get - // `foo/bar/baz` instead. +function publishBehavior(value) { + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__["BehaviorSubject"](value))(source); }; +} +//# sourceMappingURL=publishBehavior.js.map - if (subtree.children && subtree.children.length === 1) { - const child = subtree.children[0]; - const newName = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.dim(path__WEBPACK_IMPORTED_MODULE_1___default.a.join(dir.toString(), child.name)); - children.push({ - children: child.children, - name: newName - }); - continue; - } +/***/ }), +/* 457 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - children.push({ - children: subtree.children, - name: chalk__WEBPACK_IMPORTED_MODULE_0___default.a.dim(dir.toString()) - }); - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return publishLast; }); +/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(50); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(450); +/** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ - return { - name, - children - }; -} -function dirOrProjectName(dir, projectName) { - return dir === projectName ? chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(dir) : chalk__WEBPACK_IMPORTED_MODULE_0___default.a`{dim ${dir.toString()} ({reset.green ${projectName}})}`; +function publishLast() { + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__["AsyncSubject"]())(source); }; } +//# sourceMappingURL=publishLast.js.map -function buildProjectsTree(rootPath, projects) { - const tree = new Map(); - for (const project of projects.values()) { - if (rootPath === project.path) { - tree.set(projectKey, project.name); - } else { - const relativeProjectPath = path__WEBPACK_IMPORTED_MODULE_1___default.a.relative(rootPath, project.path); - addProjectToTree(tree, relativeProjectPath.split(path__WEBPACK_IMPORTED_MODULE_1___default.a.sep), project); - } - } +/***/ }), +/* 458 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return tree; -} +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return publishReplay; }); +/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(450); +/** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ -function addProjectToTree(tree, pathParts, project) { - if (pathParts.length === 0) { - tree.set(projectKey, project.name); - } else { - const [currentDir, ...rest] = pathParts; - if (!tree.has(currentDir)) { - tree.set(currentDir, new Map()); +function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { + if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') { + scheduler = selectorOrScheduler; } - - const subtree = tree.get(currentDir); - addProjectToTree(subtree, rest, project); - } + var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined; + var subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return subject; }, selector)(source); }; } +//# sourceMappingURL=publishReplay.js.map + /***/ }), -/* 505 */ +/* 459 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Kibana", function() { return Kibana; }); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(506); -/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(multimatch__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(510); -/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(is_path_inside__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(288); -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; } - -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(18); +/* harmony import */ var _observable_race__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(105); +/** PURE_IMPORTS_START _util_isArray,_observable_race PURE_IMPORTS_END */ +function race() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + return function raceOperatorFunction(source) { + if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { + observables = observables[0]; + } + return source.lift.call(_observable_race__WEBPACK_IMPORTED_MODULE_1__["race"].apply(void 0, [source].concat(observables))); + }; +} +//# sourceMappingURL=race.js.map -/** - * Helper class for dealing with a set of projects as children of - * the Kibana project. The kbn/pm is currently implemented to be - * more generic, where everything is an operation of generic projects, - * but that leads to exceptions where we need the kibana project and - * do things like `project.get('kibana')!`. - * - * Using this helper we can restructre the generic list of projects - * as a Kibana object which encapulates all the projects in the - * workspace and knows about the root Kibana project. - */ -class Kibana { - static async loadFrom(rootPath) { - return new Kibana(await Object(_projects__WEBPACK_IMPORTED_MODULE_3__["getProjects"])(rootPath, Object(_config__WEBPACK_IMPORTED_MODULE_4__["getProjectPaths"])({ - rootPath - }))); - } +/***/ }), +/* 460 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - constructor(allWorkspaceProjects) { - this.allWorkspaceProjects = allWorkspaceProjects; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return repeat; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(43); +/** PURE_IMPORTS_START tslib,_Subscriber,_observable_empty PURE_IMPORTS_END */ - _defineProperty(this, "kibanaProject", void 0); - const kibanaProject = allWorkspaceProjects.get('kibana'); - if (!kibanaProject) { - throw new TypeError('Unable to create Kibana object without all projects, including the Kibana project.'); +function repeat(count) { + if (count === void 0) { + count = -1; } - - this.kibanaProject = kibanaProject; - } - /** make an absolute path by resolving subPath relative to the kibana repo */ - - - getAbsolute(...subPath) { - return path__WEBPACK_IMPORTED_MODULE_0___default.a.resolve(this.kibanaProject.path, ...subPath); - } - /** convert an absolute path to a relative path, relative to the kibana repo */ - - - getRelative(absolute) { - return path__WEBPACK_IMPORTED_MODULE_0___default.a.relative(this.kibanaProject.path, absolute); - } - /** get a copy of the map of all projects in the kibana workspace */ + return function (source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=repeat.js.map - getAllProjects() { - return new Map(this.allWorkspaceProjects); - } - /** determine if a project with the given name exists */ +/***/ }), +/* 461 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return repeatWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - hasProject(name) { - return this.allWorkspaceProjects.has(name); - } - /** get a specific project, throws if the name is not known (use hasProject() first) */ - getProject(name) { - const project = this.allWorkspaceProjects.get(name); - if (!project) { - throw new Error(`No package with name "${name}" in the workspace`); +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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); + }; + return RepeatWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=repeatWhen.js.map - return project; - } - /** get a project and all of the projects it depends on in a ProjectMap */ +/***/ }), +/* 462 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - getProjectAndDeps(name) { - const project = this.getProject(name); - return Object(_projects__WEBPACK_IMPORTED_MODULE_3__["includeTransitiveProjects"])([project], this.allWorkspaceProjects); - } - /** filter the projects to just those matching certain paths/include/exclude tags */ +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return retry; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - getFilteredProjects(options) { - const allProjects = this.getAllProjects(); - const filteredProjects = new Map(); - const pkgJsonPaths = Array.from(allProjects.values()).map(p => p.packageJsonLocation); - const filteredPkgJsonGlobs = Object(_config__WEBPACK_IMPORTED_MODULE_4__["getProjectPaths"])(_objectSpread(_objectSpread({}, options), {}, { - rootPath: this.kibanaProject.path - })).map(g => path__WEBPACK_IMPORTED_MODULE_0___default.a.resolve(g, 'package.json')); - const matchingPkgJsonPaths = multimatch__WEBPACK_IMPORTED_MODULE_1___default()(pkgJsonPaths, filteredPkgJsonGlobs); +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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=retry.js.map - for (const project of allProjects.values()) { - const pathMatches = matchingPkgJsonPaths.includes(project.packageJsonLocation); - const notExcluded = !options.exclude.includes(project.name); - const isIncluded = !options.include.length || options.include.includes(project.name); - if (pathMatches && notExcluded && isIncluded) { - filteredProjects.set(project.name, project); - } - } +/***/ }), +/* 463 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return filteredProjects; - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return retryWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - isPartOfRepo(project) { - return project.path === this.kibanaProject.path || is_path_inside__WEBPACK_IMPORTED_MODULE_2___default()(project.path, this.kibanaProject.path); - } - isOutsideRepo(project) { - return !this.isPartOfRepo(project); - } + +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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + try { + var notifier = this.notifier; + retries = notifier(errors); + } + catch (e) { + return _super.prototype.error.call(this, e); + } + retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["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__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=retryWhen.js.map + /***/ }), -/* 506 */ -/***/ (function(module, exports, __webpack_require__) { +/* 464 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return sample; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -const minimatch = __webpack_require__(149); -const arrayUnion = __webpack_require__(507); -const arrayDiffer = __webpack_require__(508); -const arrify = __webpack_require__(509); - -module.exports = (list, patterns, options = {}) => { - list = arrify(list); - patterns = arrify(patterns); - - if (list.length === 0 || patterns.length === 0) { - return []; - } - - return patterns.reduce((result, pattern) => { - let process = arrayUnion; - if (pattern[0] === '!') { - pattern = pattern.slice(1); - process = arrayDiffer; - } - return process(result, minimatch.match(list, pattern, options)); - }, []); -}; +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(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(sampleSubscriber, this.notifier)); + return subscription; + }; + return SampleOperator; +}()); +var SampleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=sample.js.map /***/ }), -/* 507 */ -/***/ (function(module, exports, __webpack_require__) { +/* 465 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return sampleTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55); +/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ -module.exports = (...arguments_) => { - return [...new Set([].concat(...arguments_))]; -}; + +function sampleTime(period, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +function dispatchNotification(state) { + var subscriber = state.subscriber, period = state.period; + subscriber.notifyNext(); + this.schedule(state, period); +} +//# sourceMappingURL=sampleTime.js.map /***/ }), -/* 508 */ -/***/ (function(module, exports, __webpack_require__) { +/* 466 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return sequenceEqual; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualOperator", function() { return SequenceEqualOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualSubscriber", function() { return SequenceEqualSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -const arrayDiffer = (array, ...values) => { - const rest = new Set([].concat(...values)); - return array.filter(element => !rest.has(element)); -}; +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; +}()); -module.exports = arrayDiffer; +var SequenceEqualSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); + +var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=sequenceEqual.js.map /***/ }), -/* 509 */ -/***/ (function(module, exports, __webpack_require__) { +/* 467 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "share", function() { return share; }); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(450); +/* harmony import */ var _refCount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(30); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27); +/** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ -const arrify = value => { - if (value === null || value === undefined) { - return []; - } - if (Array.isArray(value)) { - return value; - } +function shareSubjectFactory() { + return new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); +} +function share() { + return function (source) { return Object(_refCount__WEBPACK_IMPORTED_MODULE_1__["refCount"])()(Object(_multicast__WEBPACK_IMPORTED_MODULE_0__["multicast"])(shareSubjectFactory)(source)); }; +} +//# sourceMappingURL=share.js.map - if (typeof value === 'string') { - return [value]; - } - if (typeof value[Symbol.iterator] === 'function') { - return [...value]; - } +/***/ }), +/* 468 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return [value]; -}; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return shareReplay; }); +/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33); +/** PURE_IMPORTS_START _ReplaySubject PURE_IMPORTS_END */ -module.exports = arrify; +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__WEBPACK_IMPORTED_MODULE_0__["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 /***/ }), -/* 510 */ -/***/ (function(module, exports, __webpack_require__) { +/* 469 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "single", function() { return single; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(63); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_EmptyError PURE_IMPORTS_END */ -const path = __webpack_require__(4); - -module.exports = (childPath, parentPath) => { - childPath = path.resolve(childPath); - parentPath = path.resolve(parentPath); - - if (process.platform === 'win32') { - childPath = childPath.toLowerCase(); - parentPath = parentPath.toLowerCase(); - } - - if (childPath === parentPath) { - return false; - } - childPath += path.sep; - parentPath += path.sep; - return childPath.startsWith(parentPath); -}; +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__WEBPACK_IMPORTED_MODULE_0__["__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 _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__["EmptyError"]); + } + }; + return SingleSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=single.js.map /***/ }), -/* 511 */ +/* 470 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(512); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _build_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildProductionProjects"]; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return skip; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ + +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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=skip.js.map /***/ }), -/* 512 */ +/* 471 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return buildProductionProjects; }); -/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(513); -/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cpy__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(296); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(288); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(130); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(143); -/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(164); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(145); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return skipLast; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError PURE_IMPORTS_END */ +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 _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; + } + } + SkipLastOperator.prototype.call = function (subscriber, source) { + if (this._skipCount === 0) { + return source.subscribe(new _Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"](subscriber)); + } + else { + return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount)); + } + }; + return SkipLastOperator; +}()); +var SkipLastSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=skipLast.js.map + +/***/ }), +/* 472 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return skipUntil; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -async function buildProductionProjects({ - kibanaRoot, - buildRoot, - onlyOSS -}) { - const projects = await getProductionProjects(kibanaRoot, onlyOSS); - const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["buildProjectGraph"])(projects); - const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["topologicallyBatchProjects"])(projects, projectGraph); - const projectNames = [...projects.values()].map(project => project.name); - _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].info(`Preparing production build for [${projectNames.join(', ')}]`); - for (const batch of batchedProjects) { - for (const project of batch) { - await deleteTarget(project); - await buildProject(project); - await copyToBuild(project, kibanaRoot, buildRoot); - } - } +function skipUntil(notifier) { + return function (source) { return source.lift(new SkipUntilOperator(notifier)); }; } -/** - * Returns the subset of projects that should be built into the production - * bundle. As we copy these into Kibana's `node_modules` during the build step, - * and let Kibana's build process be responsible for installing dependencies, - * we only include Kibana's transitive _production_ dependencies. If onlyOSS - * is supplied, we omit projects with build.oss in their package.json set to false. - */ - -async function getProductionProjects(rootPath, onlyOSS) { - const projectPaths = Object(_config__WEBPACK_IMPORTED_MODULE_3__["getProjectPaths"])({ - rootPath - }); - const projects = await Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["getProjects"])(rootPath, projectPaths); - const projectsSubset = [projects.get('kibana')]; +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__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipUntilSubscriber, _super); + function SkipUntilSubscriber(destination, notifier) { + var _this = _super.call(this, destination) || this; + _this.hasValue = false; + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](_this, undefined, undefined); + _this.add(innerSubscriber); + _this.innerSubscription = innerSubscriber; + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=skipUntil.js.map - if (projects.has('x-pack')) { - projectsSubset.push(projects.get('x-pack')); - } - const productionProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["includeTransitiveProjects"])(projectsSubset, projects, { - onlyProductionDependencies: true - }); // We remove Kibana, as we're already building Kibana +/***/ }), +/* 473 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - productionProjects.delete('kibana'); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return skipWhile; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - if (onlyOSS) { - productionProjects.forEach(project => { - if (project.getBuildConfig().oss === false) { - productionProjects.delete(project.json.name); - } - }); - } - return productionProjects; +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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=skipWhile.js.map -async function deleteTarget(project) { - const targetDir = project.targetLocation; - if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isDirectory"])(targetDir)) { - await del__WEBPACK_IMPORTED_MODULE_1___default()(targetDir, { - force: true - }); - } -} +/***/ }), +/* 474 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -async function buildProject(project) { - if (project.hasScript('build')) { - await project.runScript('build'); - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return startWith; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(79); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(45); +/** PURE_IMPORTS_START _observable_concat,_util_isScheduler PURE_IMPORTS_END */ + + +function startWith() { + var array = []; + for (var _i = 0; _i < arguments.length; _i++) { + array[_i] = arguments[_i]; + } + var scheduler = array[array.length - 1]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(scheduler)) { + array.pop(); + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source, scheduler); }; + } + else { + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source); }; + } } -/** - * Copy all the project's files from its "intermediate build directory" and - * into the build. The intermediate directory can either be the root of the - * project or some other location defined in the project's `package.json`. - * - * When copying all the files into the build, we exclude `node_modules` because - * we want the Kibana build to be responsible for actually installing all - * dependencies. The primary reason for allowing the Kibana build process to - * manage dependencies is that it will "dedupe" them, so we don't include - * unnecessary copies of dependencies. - */ +//# sourceMappingURL=startWith.js.map -async function copyToBuild(project, kibanaRoot, buildRoot) { - // We want the package to have the same relative location within the build - const relativeProjectPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["relative"])(kibanaRoot, project.path); - const buildProjectPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["resolve"])(buildRoot, relativeProjectPath); - await cpy__WEBPACK_IMPORTED_MODULE_0___default()(['**/*', '!node_modules/**'], buildProjectPath, { - cwd: project.getIntermediateBuildDirectory(), - dot: true, - nodir: true, - parents: true - }); // If a project is using an intermediate build directory, we special-case our - // handling of `package.json`, as the project build process might have copied - // (a potentially modified) `package.json` into the intermediate build - // directory already. If so, we want to use that `package.json` as the basis - // for creating the production-ready `package.json`. If it's not present in - // the intermediate build, we fall back to using the project's already defined - // `package.json`. +/***/ }), +/* 475 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - const packageJson = (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isFile"])(Object(path__WEBPACK_IMPORTED_MODULE_2__["join"])(buildProjectPath, 'package.json'))) ? await Object(_utils_package_json__WEBPACK_IMPORTED_MODULE_6__["readPackageJson"])(buildProjectPath) : project.json; - await Object(_utils_package_json__WEBPACK_IMPORTED_MODULE_6__["writePackageJson"])(buildProjectPath, packageJson); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return subscribeOn; }); +/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(476); +/** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */ + +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 _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__["SubscribeOnObservable"](source, this.delay, this.scheduler).subscribe(subscriber); + }; + return SubscribeOnOperator; +}()); +//# sourceMappingURL=subscribeOn.js.map + /***/ }), -/* 513 */ -/***/ (function(module, exports, __webpack_require__) { +/* 476 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubscribeOnObservable", function() { return SubscribeOnObservable; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9); +/* harmony import */ var _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(51); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(97); +/** PURE_IMPORTS_START tslib,_Observable,_scheduler_asap,_util_isNumeric PURE_IMPORTS_END */ -const EventEmitter = __webpack_require__(155); -const path = __webpack_require__(4); -const os = __webpack_require__(120); -const pAll = __webpack_require__(514); -const arrify = __webpack_require__(516); -const globby = __webpack_require__(517); -const isGlob = __webpack_require__(732); -const cpFile = __webpack_require__(733); -const junk = __webpack_require__(745); -const CpyError = __webpack_require__(746); -const defaultOptions = { - ignoreJunk: true -}; -const preprocessSourcePath = (source, options) => options.cwd ? path.resolve(options.cwd, source) : source; -const preprocessDestinationPath = (source, destination, options) => { - let basename = path.basename(source); - const dirname = path.dirname(source); +var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscribeOnObservable, _super); + function SubscribeOnObservable(source, delayTime, scheduler) { + if (delayTime === void 0) { + delayTime = 0; + } + if (scheduler === void 0) { + scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + } + var _this = _super.call(this) || this; + _this.source = source; + _this.delayTime = delayTime; + _this.scheduler = scheduler; + if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_3__["isNumeric"])(delayTime) || delayTime < 0) { + _this.delayTime = 0; + } + if (!scheduler || typeof scheduler.schedule !== 'function') { + _this.scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + } + return _this; + } + SubscribeOnObservable.create = function (source, delay, scheduler) { + if (delay === void 0) { + delay = 0; + } + if (scheduler === void 0) { + scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["Observable"])); - if (typeof options.rename === 'string') { - basename = options.rename; - } else if (typeof options.rename === 'function') { - basename = options.rename(basename); - } +//# sourceMappingURL=SubscribeOnObservable.js.map - if (options.cwd) { - destination = path.resolve(options.cwd, destination); - } - if (options.parents) { - return path.join(destination, dirname, basename); - } +/***/ }), +/* 477 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return path.join(destination, basename); -}; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return switchAll; }); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(478); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); +/** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ -module.exports = (source, destination, { - concurrency = (os.cpus().length || 1) * 2, - ...options -} = {}) => { - const progressEmitter = new EventEmitter(); - options = { - ...defaultOptions, - ...options - }; +function switchAll() { + return Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]); +} +//# sourceMappingURL=switchAll.js.map - const promise = (async () => { - source = arrify(source); - if (source.length === 0 || !destination) { - throw new CpyError('`source` and `destination` required'); - } +/***/ }), +/* 478 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - const copyStatus = new Map(); - let completedFiles = 0; - let completedSize = 0; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return switchMap; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(66); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(83); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ - let files; - try { - files = await globby(source, options); - if (options.ignoreJunk) { - files = files.filter(file => junk.not(path.basename(file))); - } - } catch (error) { - throw new CpyError(`Cannot glob \`${source}\`: ${error.message}`, error); - } - const sourcePaths = source.filter(value => !isGlob(value)); - if (files.length === 0 || (sourcePaths.length > 0 && !sourcePaths.every(value => files.includes(value)))) { - throw new CpyError(`Cannot copy \`${source}\`: the file doesn't exist`); - } - const fileProgressHandler = event => { - const fileStatus = copyStatus.get(event.src) || {written: 0, percent: 0}; - if (fileStatus.written !== event.written || fileStatus.percent !== event.percent) { - completedSize -= fileStatus.written; - completedSize += event.written; +function switchMap(project, resultSelector) { + if (typeof resultSelector === 'function') { + return function (source) { return source.pipe(switchMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, value, index); + var destination = this.destination; + destination.add(innerSubscriber); + this.innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=switchMap.js.map - if (event.percent === 1 && fileStatus.percent !== 1) { - completedFiles++; - } - copyStatus.set(event.src, { - written: event.written, - percent: event.percent - }); +/***/ }), +/* 479 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - progressEmitter.emit('progress', { - totalFiles: files.length, - percent: completedFiles / files.length, - completedFiles, - completedSize - }); - } - }; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return switchMapTo; }); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(478); +/** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */ - return pAll(files.map(sourcePath => { - return async () => { - const from = preprocessSourcePath(sourcePath, options); - const to = preprocessDestinationPath(sourcePath, destination, options); +function switchMapTo(innerObservable, resultSelector) { + return resultSelector ? Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }, resultSelector) : Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }); +} +//# sourceMappingURL=switchMapTo.js.map - try { - await cpFile(from, to, options).on('progress', fileProgressHandler); - } catch (error) { - throw new CpyError(`Cannot copy from \`${from}\` to \`${to}\`: ${error.message}`, error); - } - return to; - }; - }), {concurrency}); - })(); +/***/ }), +/* 480 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - promise.on = (...arguments_) => { - progressEmitter.on(...arguments_); - return promise; - }; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return takeUntil; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - return promise; -}; + + +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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=takeUntil.js.map /***/ }), -/* 514 */ -/***/ (function(module, exports, __webpack_require__) { +/* 481 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return takeWhile; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -const pMap = __webpack_require__(515); -module.exports = (iterable, options) => pMap(iterable, element => element(), options); -// TODO: Remove this for the next major release -module.exports.default = module.exports; +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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=takeWhile.js.map /***/ }), -/* 515 */ -/***/ (function(module, exports, __webpack_require__) { +/* 482 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return tap; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(60); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(13); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_noop,_util_isFunction PURE_IMPORTS_END */ -const pMap = (iterable, mapper, options) => new Promise((resolve, reject) => { - options = Object.assign({ - concurrency: Infinity - }, options); - if (typeof mapper !== 'function') { - throw new TypeError('Mapper function is required'); - } - const {concurrency} = options; +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__WEBPACK_IMPORTED_MODULE_0__["__extends"](TapSubscriber, _super); + function TapSubscriber(destination, observerOrNext, error, complete) { + var _this = _super.call(this, destination) || this; + _this._tapNext = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_3__["isFunction"])(observerOrNext)) { + _this._context = _this; + _this._tapNext = observerOrNext; + } + else if (observerOrNext) { + _this._context = observerOrNext; + _this._tapNext = observerOrNext.next || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = observerOrNext.error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = observerOrNext.complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=tap.js.map + - if (!(typeof concurrency === 'number' && concurrency >= 1)) { - throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`); - } +/***/ }), +/* 483 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - const ret = []; - const iterator = iterable[Symbol.iterator](); - let isRejected = false; - let isIterableDone = false; - let resolvingCount = 0; - let currentIndex = 0; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultThrottleConfig", function() { return defaultThrottleConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return throttle; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - const next = () => { - if (isRejected) { - return; - } - const nextItem = iterator.next(); - const i = currentIndex; - currentIndex++; - if (nextItem.done) { - isIterableDone = true; +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 = /*@__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__WEBPACK_IMPORTED_MODULE_0__["__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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=throttle.js.map - if (resolvingCount === 0) { - resolve(ret); - } - return; - } +/***/ }), +/* 484 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - resolvingCount++; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return throttleTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55); +/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(483); +/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */ - Promise.resolve(nextItem.value) - .then(element => mapper(element, i)) - .then( - value => { - ret[i] = value; - resolvingCount--; - next(); - }, - error => { - isRejected = true; - reject(error); - } - ); - }; - for (let i = 0; i < concurrency; i++) { - next(); - if (isIterableDone) { - break; - } - } -}); -module.exports = pMap; -// TODO: Remove this for the next major release -module.exports.default = pMap; +function throttleTime(duration, scheduler, config) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + } + if (config === void 0) { + config = _throttle__WEBPACK_IMPORTED_MODULE_3__["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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +function dispatchNext(arg) { + var subscriber = arg.subscriber; + subscriber.clearThrottle(); +} +//# sourceMappingURL=throttleTime.js.map /***/ }), -/* 516 */ -/***/ (function(module, exports, __webpack_require__) { +/* 485 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return timeInterval; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeInterval", function() { return TimeInterval; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(445); +/* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(90); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(66); +/** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */ -const arrify = value => { - if (value === null || value === undefined) { - return []; - } - - if (Array.isArray(value)) { - return value; - } - - if (typeof value === 'string') { - return [value]; - } - if (typeof value[Symbol.iterator] === 'function') { - return [...value]; - } - return [value]; -}; +function timeInterval(scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return function (source) { + return Object(_observable_defer__WEBPACK_IMPORTED_MODULE_2__["defer"])(function () { + return source.pipe(Object(_scan__WEBPACK_IMPORTED_MODULE_1__["scan"])(function (_a, value) { + var current = _a.current; + return ({ value: value, current: scheduler.now(), last: current }); + }, { current: scheduler.now(), value: undefined, last: undefined }), Object(_map__WEBPACK_IMPORTED_MODULE_3__["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; +}()); -module.exports = arrify; +//# sourceMappingURL=timeInterval.js.map /***/ }), -/* 517 */ -/***/ (function(module, exports, __webpack_require__) { +/* 486 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return timeout; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); +/* harmony import */ var _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64); +/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(487); +/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(49); +/** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */ -const fs = __webpack_require__(133); -const arrayUnion = __webpack_require__(518); -const glob = __webpack_require__(520); -const fastGlob = __webpack_require__(525); -const dirGlob = __webpack_require__(725); -const gitignore = __webpack_require__(728); - -const DEFAULT_FILTER = () => false; - -const isNegative = pattern => pattern[0] === '!'; - -const assertPatternsInput = patterns => { - if (!patterns.every(x => typeof x === 'string')) { - throw new TypeError('Patterns must be a string or an array of strings'); - } -}; -const checkCwdOption = options => { - if (options && options.cwd && !fs.statSync(options.cwd).isDirectory()) { - throw new Error('The `cwd` option must be a path to a directory'); - } -}; -const generateGlobTasks = (patterns, taskOptions) => { - patterns = arrayUnion([].concat(patterns)); - assertPatternsInput(patterns); - checkCwdOption(taskOptions); - const globTasks = []; +function timeout(due, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return Object(_timeoutWith__WEBPACK_IMPORTED_MODULE_2__["timeoutWith"])(due, Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_3__["throwError"])(new _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]()), scheduler); +} +//# sourceMappingURL=timeout.js.map - taskOptions = Object.assign({ - ignore: [], - expandDirectories: true - }, taskOptions); - patterns.forEach((pattern, i) => { - if (isNegative(pattern)) { - return; - } +/***/ }), +/* 487 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - const ignore = patterns - .slice(i) - .filter(isNegative) - .map(pattern => pattern.slice(1)); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return timeoutWith; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(419); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - const options = Object.assign({}, taskOptions, { - ignore: taskOptions.ignore.concat(ignore) - }); - globTasks.push({pattern, options}); - }); - return globTasks; -}; -const globDirs = (task, fn) => { - let options = {}; - if (task.options.cwd) { - options.cwd = task.options.cwd; - } - if (Array.isArray(task.options.expandDirectories)) { - options = Object.assign(options, {files: task.options.expandDirectories}); - } else if (typeof task.options.expandDirectories === 'object') { - options = Object.assign(options, task.options.expandDirectories); - } +function timeoutWith(due, withObservable, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + } + return function (source) { + var absoluteTimeout = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_0__["__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(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["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__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=timeoutWith.js.map - return fn(task.pattern, options); -}; -const getPattern = (task, fn) => task.options.expandDirectories ? globDirs(task, fn) : [task.pattern]; +/***/ }), +/* 488 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -const globToTask = task => glob => { - const {options} = task; - if (options.ignore && Array.isArray(options.ignore) && options.expandDirectories) { - options.ignore = dirGlob.sync(options.ignore); - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return timestamp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timestamp", function() { return Timestamp; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(66); +/** PURE_IMPORTS_START _scheduler_async,_map PURE_IMPORTS_END */ - return { - pattern: glob, - options - }; -}; -const globby = (patterns, options) => { - let globTasks; +function timestamp(scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return Object(_map__WEBPACK_IMPORTED_MODULE_1__["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; +}()); - try { - globTasks = generateGlobTasks(patterns, options); - } catch (error) { - return Promise.reject(error); - } +//# sourceMappingURL=timestamp.js.map - const getTasks = Promise.all(globTasks.map(task => Promise.resolve(getPattern(task, dirGlob)) - .then(globs => Promise.all(globs.map(globToTask(task)))) - )) - .then(tasks => arrayUnion(...tasks)); - const getFilter = () => { - return Promise.resolve( - options && options.gitignore ? - gitignore({cwd: options.cwd, ignore: options.ignore}) : - DEFAULT_FILTER - ); - }; +/***/ }), +/* 489 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return getFilter() - .then(filter => { - return getTasks - .then(tasks => Promise.all(tasks.map(task => fastGlob(task.pattern, task.options)))) - .then(paths => arrayUnion(...paths)) - .then(paths => paths.filter(p => !filter(p))); - }); -}; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; }); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(444); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ -module.exports = globby; -// TODO: Remove this for the next major release -module.exports.default = globby; +function toArrayReducer(arr, item, index) { + if (index === 0) { + return [item]; + } + arr.push(item); + return arr; +} +function toArray() { + return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(toArrayReducer, []); +} +//# sourceMappingURL=toArray.js.map -module.exports.sync = (patterns, options) => { - const globTasks = generateGlobTasks(patterns, options); - const getFilter = () => { - return options && options.gitignore ? - gitignore.sync({cwd: options.cwd, ignore: options.ignore}) : - DEFAULT_FILTER; - }; +/***/ }), +/* 490 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - const tasks = globTasks.reduce((tasks, task) => { - const newTask = getPattern(task, dirGlob.sync).map(globToTask(task)); - return tasks.concat(newTask); - }, []); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "window", function() { return window; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - const filter = getFilter(); - return tasks.reduce( - (matches, task) => arrayUnion(matches, fastGlob.sync(task.pattern, task.options)), - [] - ).filter(p => !filter(p)); -}; -module.exports.generateGlobTasks = generateGlobTasks; -module.exports.hasMagic = (patterns, options) => [] - .concat(patterns) - .some(pattern => glob.hasMagic(pattern, options)); -module.exports.gitignore = gitignore; +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(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(windowSubscriber, this.windowBoundaries)); + } + return sourceSubscription; + }; + return WindowOperator; +}()); +var WindowSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); + function WindowSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.window = new _Subject__WEBPACK_IMPORTED_MODULE_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__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + destination.next(newWindow); + }; + return WindowSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=window.js.map /***/ }), -/* 518 */ -/***/ (function(module, exports, __webpack_require__) { +/* 491 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return windowCount; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27); +/** PURE_IMPORTS_START tslib,_Subscriber,_Subject PURE_IMPORTS_END */ -var arrayUniq = __webpack_require__(519); -module.exports = function () { - return arrayUniq([].concat.apply([], arguments)); -}; + +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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=windowCount.js.map /***/ }), -/* 519 */ -/***/ (function(module, exports, __webpack_require__) { +/* 492 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return windowTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(97); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(45); +/** PURE_IMPORTS_START tslib,_Subject,_scheduler_async,_Subscriber,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ -// there's 3 implementations written in increasing order of efficiency - -// 1 - no Set type is defined -function uniqNoSet(arr) { - var ret = []; - for (var i = 0; i < arr.length; i++) { - if (ret.indexOf(arr[i]) === -1) { - ret.push(arr[i]); - } - } - return ret; -} -// 2 - a simple Set type is defined -function uniqSet(arr) { - var seen = new Set(); - return arr.filter(function (el) { - if (!seen.has(el)) { - seen.add(el); - return true; - } - return false; - }); +function windowTime(windowTimeSpan) { + var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + var windowCreationInterval = null; + var maxWindowSize = Number.POSITIVE_INFINITY; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[3])) { + scheduler = arguments[3]; + } + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[2])) { + scheduler = arguments[2]; + } + else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[2])) { + maxWindowSize = arguments[2]; + } + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[1])) { + scheduler = arguments[1]; + } + else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_1__["Subject"])); +var WindowTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_3__["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 -// 3 - a standard Set type is defined and it has a forEach method -function uniqSetWithForEach(arr) { - var ret = []; - (new Set(arr)).forEach(function (el) { - ret.push(el); - }); +/***/ }), +/* 493 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return ret; -} +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return windowToggle; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_Subject,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -// V8 currently has a broken implementation -// https://github.com/joyent/node/issues/8449 -function doesForEachActuallyWork() { - var ret = false; - (new Set([true])).forEach(function (el) { - ret = el; - }); - return ret === true; -} -if ('Set' in global) { - if (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) { - module.exports = uniqSetWithForEach; - } else { - module.exports = uniqSet; - } -} else { - module.exports = uniqNoSet; + +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__WEBPACK_IMPORTED_MODULE_0__["__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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["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__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); + var context_4 = { window: window_1, subscription: subscription }; + this.contexts.push(context_4); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["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__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=windowToggle.js.map /***/ }), -/* 520 */ -/***/ (function(module, exports, __webpack_require__) { - -// Approach: -// -// 1. Get the minimatch set -// 2. For each pattern in the set, PROCESS(pattern, false) -// 3. Store matches per-set, then uniq them -// -// PROCESS(pattern, inGlobStar) -// Get the first [n] items from pattern that are all strings -// Join these together. This is PREFIX. -// If there is no more remaining, then stat(PREFIX) and -// add to matches if it succeeds. END. -// -// If inGlobStar and PREFIX is symlink and points to dir -// set ENTRIES = [] -// else readdir(PREFIX) as ENTRIES -// If fail, END -// -// with ENTRIES -// If pattern[n] is GLOBSTAR -// // handle the case where the globstar match is empty -// // by pruning it out, and testing the resulting pattern -// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) -// // handle other cases. -// for ENTRY in ENTRIES (not dotfiles) -// // attach globstar + tail onto the entry -// // Mark that this entry is a globstar match -// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) -// -// else // not globstar -// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) -// Test ENTRY against pattern[n] -// If fails, continue -// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) -// -// Caveat: -// Cache all stats and readdirs results to minimize syscall. Since all -// we ever care about is existence and directory-ness, we can just keep -// `true` for files, and [children,...] for directories, or `false` for -// things that don't exist. - -module.exports = glob - -var fs = __webpack_require__(133) -var rp = __webpack_require__(147) -var minimatch = __webpack_require__(149) -var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(521) -var EE = __webpack_require__(155).EventEmitter -var path = __webpack_require__(4) -var assert = __webpack_require__(139) -var isAbsolute = __webpack_require__(156) -var globSync = __webpack_require__(523) -var common = __webpack_require__(524) -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var inflight = __webpack_require__(159) -var util = __webpack_require__(111) -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored - -var once = __webpack_require__(161) - -function glob (pattern, options, cb) { - if (typeof options === 'function') cb = options, options = {} - if (!options) options = {} - - if (options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return globSync(pattern, options) - } +/* 494 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return new Glob(pattern, options, cb) -} +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return windowWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -glob.sync = globSync -var GlobSync = glob.GlobSync = globSync.GlobSync -// old api surface -glob.glob = glob -function extend (origin, add) { - if (add === null || typeof add !== 'object') { - return origin - } - var keys = Object.keys(add) - var i = keys.length - while (i--) { - origin[keys[i]] = add[keys[i]] - } - return origin +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__WEBPACK_IMPORTED_MODULE_0__["__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__WEBPACK_IMPORTED_MODULE_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 = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); + }; + return WindowSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=windowWhen.js.map -glob.hasMagic = function (pattern, options_) { - var options = extend({}, options_) - options.noprocess = true - var g = new Glob(pattern, options) - var set = g.minimatch.set +/***/ }), +/* 495 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (!pattern) - return false +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return withLatestFrom; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(69); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(70); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - if (set.length > 1) - return true - for (var j = 0; j < set[0].length; j++) { - if (typeof set[0][j] !== 'string') - return true - } - return false +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__WEBPACK_IMPORTED_MODULE_0__["__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(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["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__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=withLatestFrom.js.map -glob.Glob = Glob -inherits(Glob, EE) -function Glob (pattern, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } - - if (options && options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return new GlobSync(pattern, options) - } - - if (!(this instanceof Glob)) - return new Glob(pattern, options, cb) - - setopts(this, pattern, options) - this._didRealPath = false - - // process each pattern in the minimatch set - var n = this.minimatch.set.length - - // The matches are stored as {: true,...} so that - // duplicates are automagically pruned. - // Later, we do an Object.keys() on these. - // Keep them as a list so we can fill in when nonull is set. - this.matches = new Array(n) - - if (typeof cb === 'function') { - cb = once(cb) - this.on('error', cb) - this.on('end', function (matches) { - cb(null, matches) - }) - } - - var self = this - this._processing = 0 - - this._emitQueue = [] - this._processQueue = [] - this.paused = false - - if (this.noprocess) - return this - if (n === 0) - return done() +/***/ }), +/* 496 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var sync = true - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false, done) - } - sync = false +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); +/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109); +/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ - function done () { - --self._processing - if (self._processing <= 0) { - if (sync) { - process.nextTick(function () { - self._finish() - }) - } else { - self._finish() - } +function zip() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - } + return function zipOperatorFunction(source) { + return source.lift.call(_observable_zip__WEBPACK_IMPORTED_MODULE_0__["zip"].apply(void 0, [source].concat(observables))); + }; } +//# sourceMappingURL=zip.js.map -Glob.prototype._finish = function () { - assert(this instanceof Glob) - if (this.aborted) - return - - if (this.realpath && !this._didRealpath) - return this._realpath() - - common.finish(this) - this.emit('end', this.found) -} -Glob.prototype._realpath = function () { - if (this._didRealpath) - return +/***/ }), +/* 497 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - this._didRealpath = true +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return zipAll; }); +/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109); +/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ - var n = this.matches.length - if (n === 0) - return this._finish() +function zipAll(project) { + return function (source) { return source.lift(new _observable_zip__WEBPACK_IMPORTED_MODULE_0__["ZipOperator"](project)); }; +} +//# sourceMappingURL=zipAll.js.map - var self = this - for (var i = 0; i < this.matches.length; i++) - this._realpathSet(i, next) - function next () { - if (--n === 0) - self._finish() - } -} +/***/ }), +/* 498 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -Glob.prototype._realpathSet = function (index, cb) { - var matchset = this.matches[index] - if (!matchset) - return cb() +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runCommand", function() { return runCommand; }); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); +/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(499); +/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(500); +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; } - var found = Object.keys(matchset) - var self = this - var n = found.length +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; } - if (n === 0) - return cb() +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 set = this.matches[index] = Object.create(null) - found.forEach(function (p, i) { - // If there's a problem with the stat, then it means that - // one or more of the links in the realpath couldn't be - // resolved. just return the abs value in that case. - p = self._makeAbs(p) - rp.realpath(p, self.realpathCache, function (er, real) { - if (!er) - set[real] = true - else if (er.syscall === 'stat') - set[p] = true - else - self.emit('error', er) // srsly wtf right here +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ - if (--n === 0) { - self.matches[index] = set - cb() - } - }) - }) -} -Glob.prototype._mark = function (p) { - return common.mark(this, p) -} -Glob.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} -Glob.prototype.abort = function () { - this.aborted = true - this.emit('abort') -} -Glob.prototype.pause = function () { - if (!this.paused) { - this.paused = true - this.emit('pause') - } -} +async function runCommand(command, config) { + try { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(`Running [${command.name}] command from [${config.rootPath}]`); + const kbn = await _utils_kibana__WEBPACK_IMPORTED_MODULE_4__["Kibana"].loadFrom(config.rootPath); + const projects = kbn.getFilteredProjects({ + skipKibanaPlugins: Boolean(config.options['skip-kibana-plugins']), + ossOnly: Boolean(config.options.oss), + exclude: toArray(config.options.exclude), + include: toArray(config.options.include) + }); -Glob.prototype.resume = function () { - if (this.paused) { - this.emit('resume') - this.paused = false - if (this._emitQueue.length) { - var eq = this._emitQueue.slice(0) - this._emitQueue.length = 0 - for (var i = 0; i < eq.length; i ++) { - var e = eq[i] - this._emitMatch(e[0], e[1]) - } + if (projects.size === 0) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(`There are no projects found. Double check project name(s) in '-i/--include' and '-e/--exclude' filters.`); + return process.exit(1); } - if (this._processQueue.length) { - var pq = this._processQueue.slice(0) - this._processQueue.length = 0 - for (var i = 0; i < pq.length; i ++) { - var p = pq[i] - this._processing-- - this._process(p[0], p[1], p[2], p[3]) + + const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_2__["buildProjectGraph"])(projects); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(`Found ${projects.size.toString()} projects`); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(Object(_utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__["renderProjectsTree"])(config.rootPath, projects)); + await command.run(projects, projectGraph, _objectSpread(_objectSpread({}, config), {}, { + kbn + })); + } catch (error) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(`[${command.name}] failed:`); + + if (error instanceof _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"]) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(error.message); + const metaOutput = Object.entries(error.meta).map(([key, value]) => `${key}: ${value}`).join('\n'); + + if (metaOutput) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info('Additional debugging info:\n'); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].indent(2); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(metaOutput); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].indent(-2); } + } else { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(error); } + + process.exit(1); } } -Glob.prototype._process = function (pattern, index, inGlobStar, cb) { - assert(this instanceof Glob) - assert(typeof cb === 'function') +function toArray(value) { + if (value == null) { + return []; + } - if (this.aborted) - return + return Array.isArray(value) ? value : [value]; +} - this._processing++ - if (this.paused) { - this._processQueue.push([pattern, index, inGlobStar, cb]) - return - } +/***/ }), +/* 499 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - //console.error('PROCESS %d', this._processing, pattern) +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderProjectsTree", function() { return renderProjectsTree; }); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(235); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ - } - // now n is the index of the first one that is *not* a string. - // see if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index, cb) - return +const projectKey = Symbol('__project'); +function renderProjectsTree(rootPath, projects) { + const projectsTree = buildProjectsTree(rootPath, projects); + return treeToString(createTreeStructure(projectsTree)); +} - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break +function treeToString(tree) { + return [tree.name].concat(childrenToStrings(tree.children, '')).join('\n'); +} - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break +function childrenToStrings(tree, treePrefix) { + if (tree === undefined) { + return []; } - var remain = pattern.slice(n) - - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix + let strings = []; + tree.forEach((node, index) => { + const isLastNode = tree.length - 1 === index; + const nodePrefix = isLastNode ? '└── ' : '├── '; + const childPrefix = isLastNode ? ' ' : '│ '; + const childrenPrefix = treePrefix + childPrefix; + strings.push(`${treePrefix}${nodePrefix}${node.name}`); + strings = strings.concat(childrenToStrings(node.children, childrenPrefix)); + }); + return strings; +} - var abs = this._makeAbs(read) +function createTreeStructure(tree) { + let name; + const children = []; - //if ignored, skip _processing - if (childrenIgnored(this, read)) - return cb() + for (const [dir, project] of tree.entries()) { + // This is a leaf node (aka a project) + if (typeof project === 'string') { + name = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(project); + continue; + } // If there's only one project and the key indicates it's a leaf node, we + // know that we're at a package folder that contains a package.json, so we + // "inline it" so we don't get unnecessary levels, i.e. we'll just see + // `foo` instead of `foo -> foo`. - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) -} -Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} + if (project.size === 1 && project.has(projectKey)) { + const projectName = project.get(projectKey); + children.push({ + children: [], + name: dirOrProjectName(dir, projectName) + }); + continue; + } -Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + const subtree = createTreeStructure(project); // If the name is specified, we know there's a package at the "root" of the + // subtree itself. - // if the abs isn't a dir, then nothing can match! - if (!entries) - return cb() + if (subtree.name !== undefined) { + const projectName = subtree.name; + children.push({ + children: subtree.children, + name: dirOrProjectName(dir, projectName) + }); + continue; + } // Special-case whenever we have one child, so we don't get unnecessary + // folders in the output. E.g. instead of `foo -> bar -> baz` we get + // `foo/bar/baz` instead. - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) + if (subtree.children && subtree.children.length === 1) { + const child = subtree.children[0]; + const newName = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.dim(path__WEBPACK_IMPORTED_MODULE_1___default.a.join(dir.toString(), child.name)); + children.push({ + children: child.children, + name: newName + }); + continue; } - } - - //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return cb() + children.push({ + children: subtree.children, + name: chalk__WEBPACK_IMPORTED_MODULE_0___default.a.dim(dir.toString()) + }); + } - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. + return { + name, + children + }; +} - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) +function dirOrProjectName(dir, projectName) { + return dir === projectName ? chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(dir) : chalk__WEBPACK_IMPORTED_MODULE_0___default.a`{dim ${dir.toString()} ({reset.green ${projectName}})}`; +} - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } +function buildProjectsTree(rootPath, projects) { + const tree = new Map(); - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this._emitMatch(index, e) + for (const project of projects.values()) { + if (rootPath === project.path) { + tree.set(projectKey, project.name); + } else { + const relativeProjectPath = path__WEBPACK_IMPORTED_MODULE_1___default.a.relative(rootPath, project.path); + addProjectToTree(tree, relativeProjectPath.split(path__WEBPACK_IMPORTED_MODULE_1___default.a.sep), project); } - // This was the last one, and no stats were needed - return cb() } - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - this._process([e].concat(remain), index, inGlobStar, cb) - } - cb() + return tree; } -Glob.prototype._emitMatch = function (index, e) { - if (this.aborted) - return +function addProjectToTree(tree, pathParts, project) { + if (pathParts.length === 0) { + tree.set(projectKey, project.name); + } else { + const [currentDir, ...rest] = pathParts; - if (isIgnored(this, e)) - return + if (!tree.has(currentDir)) { + tree.set(currentDir, new Map()); + } - if (this.paused) { - this._emitQueue.push([index, e]) - return + const subtree = tree.get(currentDir); + addProjectToTree(subtree, rest, project); } +} - var abs = isAbsolute(e) ? e : this._makeAbs(e) +/***/ }), +/* 500 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (this.mark) - e = this._mark(e) +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Kibana", function() { return Kibana; }); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(501); +/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(multimatch__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(377); +/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(is_path_inside__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(288); +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; } - if (this.absolute) - e = abs +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; } - if (this.matches[index][e]) - return +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; } - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ - this.matches[index][e] = true - var st = this.statCache[abs] - if (st) - this.emit('stat', e, st) - this.emit('match', e) -} -Glob.prototype._readdirInGlobStar = function (abs, cb) { - if (this.aborted) - return - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false, cb) +/** + * Helper class for dealing with a set of projects as children of + * the Kibana project. The kbn/pm is currently implemented to be + * more generic, where everything is an operation of generic projects, + * but that leads to exceptions where we need the kibana project and + * do things like `project.get('kibana')!`. + * + * Using this helper we can restructre the generic list of projects + * as a Kibana object which encapulates all the projects in the + * workspace and knows about the root Kibana project. + */ - var lstatkey = 'lstat\0' + abs - var self = this - var lstatcb = inflight(lstatkey, lstatcb_) +class Kibana { + static async loadFrom(rootPath) { + return new Kibana(await Object(_projects__WEBPACK_IMPORTED_MODULE_3__["getProjects"])(rootPath, Object(_config__WEBPACK_IMPORTED_MODULE_4__["getProjectPaths"])({ + rootPath + }))); + } - if (lstatcb) - fs.lstat(abs, lstatcb) + constructor(allWorkspaceProjects) { + this.allWorkspaceProjects = allWorkspaceProjects; - function lstatcb_ (er, lstat) { - if (er && er.code === 'ENOENT') - return cb() + _defineProperty(this, "kibanaProject", void 0); - var isSym = lstat && lstat.isSymbolicLink() - self.symlinks[abs] = isSym + const kibanaProject = allWorkspaceProjects.get('kibana'); - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) { - self.cache[abs] = 'FILE' - cb() - } else - self._readdir(abs, false, cb) + if (!kibanaProject) { + throw new TypeError('Unable to create Kibana object without all projects, including the Kibana project.'); + } + + this.kibanaProject = kibanaProject; } -} + /** make an absolute path by resolving subPath relative to the kibana repo */ -Glob.prototype._readdir = function (abs, inGlobStar, cb) { - if (this.aborted) - return - cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) - if (!cb) - return + getAbsolute(...subPath) { + return path__WEBPACK_IMPORTED_MODULE_0___default.a.resolve(this.kibanaProject.path, ...subPath); + } + /** convert an absolute path to a relative path, relative to the kibana repo */ - //console.error('RD %j %j', +inGlobStar, abs) - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs, cb) - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return cb() + getRelative(absolute) { + return path__WEBPACK_IMPORTED_MODULE_0___default.a.relative(this.kibanaProject.path, absolute); + } + /** get a copy of the map of all projects in the kibana workspace */ - if (Array.isArray(c)) - return cb(null, c) + + getAllProjects() { + return new Map(this.allWorkspaceProjects); } + /** determine if a project with the given name exists */ - var self = this - fs.readdir(abs, readdirCb(this, abs, cb)) -} -function readdirCb (self, abs, cb) { - return function (er, entries) { - if (er) - self._readdirError(abs, er, cb) - else - self._readdirEntries(abs, entries, cb) + hasProject(name) { + return this.allWorkspaceProjects.has(name); } -} + /** get a specific project, throws if the name is not known (use hasProject() first) */ -Glob.prototype._readdirEntries = function (abs, entries, cb) { - if (this.aborted) - return - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true + getProject(name) { + const project = this.allWorkspaceProjects.get(name); + + if (!project) { + throw new Error(`No package with name "${name}" in the workspace`); } + + return project; } + /** get a project and all of the projects it depends on in a ProjectMap */ - this.cache[abs] = entries - return cb(null, entries) -} -Glob.prototype._readdirError = function (f, er, cb) { - if (this.aborted) - return + getProjectAndDeps(name) { + const project = this.getProject(name); + return Object(_projects__WEBPACK_IMPORTED_MODULE_3__["includeTransitiveProjects"])([project], this.allWorkspaceProjects); + } + /** filter the projects to just those matching certain paths/include/exclude tags */ - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - this.emit('error', error) - this.abort() - } - break - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break + getFilteredProjects(options) { + const allProjects = this.getAllProjects(); + const filteredProjects = new Map(); + const pkgJsonPaths = Array.from(allProjects.values()).map(p => p.packageJsonLocation); + const filteredPkgJsonGlobs = Object(_config__WEBPACK_IMPORTED_MODULE_4__["getProjectPaths"])(_objectSpread(_objectSpread({}, options), {}, { + rootPath: this.kibanaProject.path + })).map(g => path__WEBPACK_IMPORTED_MODULE_0___default.a.resolve(g, 'package.json')); + const matchingPkgJsonPaths = multimatch__WEBPACK_IMPORTED_MODULE_1___default()(pkgJsonPaths, filteredPkgJsonGlobs); - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) { - this.emit('error', er) - // If the error is handled, then we abort - // if not, we threw out of here - this.abort() + for (const project of allProjects.values()) { + const pathMatches = matchingPkgJsonPaths.includes(project.packageJsonLocation); + const notExcluded = !options.exclude.includes(project.name); + const isIncluded = !options.include.length || options.include.includes(project.name); + + if (pathMatches && notExcluded && isIncluded) { + filteredProjects.set(project.name, project); } - if (!this.silent) - console.error('glob error', er) - break + } + + return filteredProjects; } - return cb() -} + isPartOfRepo(project) { + return project.path === this.kibanaProject.path || is_path_inside__WEBPACK_IMPORTED_MODULE_2___default()(project.path, this.kibanaProject.path); + } -Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} + isOutsideRepo(project) { + return !this.isPartOfRepo(project); + } +} -Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - //console.error('pgs2', prefix, remain[0], entries) +/***/ }), +/* 501 */ +/***/ (function(module, exports, __webpack_require__) { - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return cb() +"use strict"; - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) +const minimatch = __webpack_require__(149); +const arrayUnion = __webpack_require__(502); +const arrayDiffer = __webpack_require__(503); +const arrify = __webpack_require__(504); - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false, cb) +module.exports = (list, patterns, options = {}) => { + list = arrify(list); + patterns = arrify(patterns); - var isSym = this.symlinks[abs] - var len = entries.length + if (list.length === 0 || patterns.length === 0) { + return []; + } - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return cb() + return patterns.reduce((result, pattern) => { + let process = arrayUnion; - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue + if (pattern[0] === '!') { + pattern = pattern.slice(1); + process = arrayDiffer; + } - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true, cb) + return process(result, minimatch.match(list, pattern, options)); + }, []); +}; - var below = gspref.concat(entries[i], remain) - this._process(below, index, true, cb) - } - cb() -} +/***/ }), +/* 502 */ +/***/ (function(module, exports, __webpack_require__) { -Glob.prototype._processSimple = function (prefix, index, cb) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var self = this - this._stat(prefix, function (er, exists) { - self._processSimple2(prefix, index, er, exists, cb) - }) -} -Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { +"use strict"; - //console.error('ps2', prefix, exists) - if (!this.matches[index]) - this.matches[index] = Object.create(null) +module.exports = (...arguments_) => { + return [...new Set([].concat(...arguments_))]; +}; - // If it doesn't exist, then just mark the lack of results - if (!exists) - return cb() - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } +/***/ }), +/* 503 */ +/***/ (function(module, exports, __webpack_require__) { - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') +"use strict"; - // Mark this as a match - this._emitMatch(index, prefix) - cb() -} -// Returns either 'DIR', 'FILE', or false -Glob.prototype._stat = function (f, cb) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' +const arrayDiffer = (array, ...values) => { + const rest = new Set([].concat(...values)); + return array.filter(element => !rest.has(element)); +}; - if (f.length > this.maxLength) - return cb() +module.exports = arrayDiffer; - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (Array.isArray(c)) - c = 'DIR' +/***/ }), +/* 504 */ +/***/ (function(module, exports, __webpack_require__) { - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return cb(null, c) +"use strict"; - if (needDir && c === 'FILE') - return cb() - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } +const arrify = value => { + if (value === null || value === undefined) { + return []; + } - var exists - var stat = this.statCache[abs] - if (stat !== undefined) { - if (stat === false) - return cb(null, stat) - else { - var type = stat.isDirectory() ? 'DIR' : 'FILE' - if (needDir && type === 'FILE') - return cb() - else - return cb(null, type, stat) - } - } + if (Array.isArray(value)) { + return value; + } - var self = this - var statcb = inflight('stat\0' + abs, lstatcb_) - if (statcb) - fs.lstat(abs, statcb) + if (typeof value === 'string') { + return [value]; + } - function lstatcb_ (er, lstat) { - if (lstat && lstat.isSymbolicLink()) { - // If it's a symlink, then treat it as the target, unless - // the target does not exist, then treat it as a file. - return fs.stat(abs, function (er, stat) { - if (er) - self._stat2(f, abs, null, lstat, cb) - else - self._stat2(f, abs, er, stat, cb) - }) - } else { - self._stat2(f, abs, er, lstat, cb) - } - } -} + if (typeof value[Symbol.iterator] === 'function') { + return [...value]; + } -Glob.prototype._stat2 = function (f, abs, er, stat, cb) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return cb() - } + return [value]; +}; - var needDir = f.slice(-1) === '/' - this.statCache[abs] = stat +module.exports = arrify; - if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) - return cb(null, false, stat) - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' - this.cache[abs] = this.cache[abs] || c +/***/ }), +/* 505 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (needDir && c === 'FILE') - return cb() +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(506); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _build_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildProductionProjects"]; }); - return cb(null, c, stat) -} +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ /***/ }), -/* 521 */ -/***/ (function(module, exports, __webpack_require__) { +/* 506 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -try { - var util = __webpack_require__(111); - /* istanbul ignore next */ - if (typeof util.inherits !== 'function') throw ''; - module.exports = util.inherits; -} catch (e) { - /* istanbul ignore next */ - module.exports = __webpack_require__(522); -} +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return buildProductionProjects; }); +/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(507); +/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cpy__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(296); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(288); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(130); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(143); +/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(164); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(145); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ -/***/ }), -/* 522 */ -/***/ (function(module, exports) { -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }) - } - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } - } -} -/***/ }), -/* 523 */ -/***/ (function(module, exports, __webpack_require__) { -module.exports = globSync -globSync.GlobSync = GlobSync -var fs = __webpack_require__(133) -var rp = __webpack_require__(147) -var minimatch = __webpack_require__(149) -var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(520).Glob -var util = __webpack_require__(111) -var path = __webpack_require__(4) -var assert = __webpack_require__(139) -var isAbsolute = __webpack_require__(156) -var common = __webpack_require__(524) -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored -function globSync (pattern, options) { - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') +async function buildProductionProjects({ + kibanaRoot, + buildRoot, + onlyOSS +}) { + const projects = await getProductionProjects(kibanaRoot, onlyOSS); + const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["buildProjectGraph"])(projects); + const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["topologicallyBatchProjects"])(projects, projectGraph); + const projectNames = [...projects.values()].map(project => project.name); + _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].info(`Preparing production build for [${projectNames.join(', ')}]`); - return new GlobSync(pattern, options).found + for (const batch of batchedProjects) { + for (const project of batch) { + await deleteTarget(project); + await buildProject(project); + await copyToBuild(project, kibanaRoot, buildRoot); + } + } } +/** + * Returns the subset of projects that should be built into the production + * bundle. As we copy these into Kibana's `node_modules` during the build step, + * and let Kibana's build process be responsible for installing dependencies, + * we only include Kibana's transitive _production_ dependencies. If onlyOSS + * is supplied, we omit projects with build.oss in their package.json set to false. + */ -function GlobSync (pattern, options) { - if (!pattern) - throw new Error('must provide pattern') +async function getProductionProjects(rootPath, onlyOSS) { + const projectPaths = Object(_config__WEBPACK_IMPORTED_MODULE_3__["getProjectPaths"])({ + rootPath + }); + const projects = await Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["getProjects"])(rootPath, projectPaths); + const projectsSubset = [projects.get('kibana')]; - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') + if (projects.has('x-pack')) { + projectsSubset.push(projects.get('x-pack')); + } - if (!(this instanceof GlobSync)) - return new GlobSync(pattern, options) + const productionProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["includeTransitiveProjects"])(projectsSubset, projects, { + onlyProductionDependencies: true + }); // We remove Kibana, as we're already building Kibana - setopts(this, pattern, options) + productionProjects.delete('kibana'); - if (this.noprocess) - return this + if (onlyOSS) { + productionProjects.forEach(project => { + if (project.getBuildConfig().oss === false) { + productionProjects.delete(project.json.name); + } + }); + } - var n = this.minimatch.set.length - this.matches = new Array(n) - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false) + return productionProjects; +} + +async function deleteTarget(project) { + const targetDir = project.targetLocation; + + if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isDirectory"])(targetDir)) { + await del__WEBPACK_IMPORTED_MODULE_1___default()(targetDir, { + force: true + }); } - this._finish() } -GlobSync.prototype._finish = function () { - assert(this instanceof GlobSync) - if (this.realpath) { - var self = this - this.matches.forEach(function (matchset, index) { - var set = self.matches[index] = Object.create(null) - for (var p in matchset) { - try { - p = self._makeAbs(p) - var real = rp.realpathSync(p, self.realpathCache) - set[real] = true - } catch (er) { - if (er.syscall === 'stat') - set[self._makeAbs(p)] = true - else - throw er - } - } - }) +async function buildProject(project) { + if (project.hasScript('build')) { + await project.runScript('build'); } - common.finish(this) } +/** + * Copy all the project's files from its "intermediate build directory" and + * into the build. The intermediate directory can either be the root of the + * project or some other location defined in the project's `package.json`. + * + * When copying all the files into the build, we exclude `node_modules` because + * we want the Kibana build to be responsible for actually installing all + * dependencies. The primary reason for allowing the Kibana build process to + * manage dependencies is that it will "dedupe" them, so we don't include + * unnecessary copies of dependencies. + */ -GlobSync.prototype._process = function (pattern, index, inGlobStar) { - assert(this instanceof GlobSync) +async function copyToBuild(project, kibanaRoot, buildRoot) { + // We want the package to have the same relative location within the build + const relativeProjectPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["relative"])(kibanaRoot, project.path); + const buildProjectPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["resolve"])(buildRoot, relativeProjectPath); + await cpy__WEBPACK_IMPORTED_MODULE_0___default()(['**/*', '!node_modules/**'], buildProjectPath, { + cwd: project.getIntermediateBuildDirectory(), + dot: true, + nodir: true, + parents: true + }); // If a project is using an intermediate build directory, we special-case our + // handling of `package.json`, as the project build process might have copied + // (a potentially modified) `package.json` into the intermediate build + // directory already. If so, we want to use that `package.json` as the basis + // for creating the production-ready `package.json`. If it's not present in + // the intermediate build, we fall back to using the project's already defined + // `package.json`. - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ - } - // now n is the index of the first one that is *not* a string. + const packageJson = (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isFile"])(Object(path__WEBPACK_IMPORTED_MODULE_2__["join"])(buildProjectPath, 'package.json'))) ? await Object(_utils_package_json__WEBPACK_IMPORTED_MODULE_6__["readPackageJson"])(buildProjectPath) : project.json; + await Object(_utils_package_json__WEBPACK_IMPORTED_MODULE_6__["writePackageJson"])(buildProjectPath, packageJson); +} - // See if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index) - return +/***/ }), +/* 507 */ +/***/ (function(module, exports, __webpack_require__) { - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break +"use strict"; - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break - } +const EventEmitter = __webpack_require__(155); +const path = __webpack_require__(4); +const os = __webpack_require__(120); +const pAll = __webpack_require__(508); +const arrify = __webpack_require__(510); +const globby = __webpack_require__(511); +const isGlob = __webpack_require__(721); +const cpFile = __webpack_require__(722); +const junk = __webpack_require__(734); +const CpyError = __webpack_require__(735); - var remain = pattern.slice(n) +const defaultOptions = { + ignoreJunk: true +}; - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix +const preprocessSourcePath = (source, options) => options.cwd ? path.resolve(options.cwd, source) : source; + +const preprocessDestinationPath = (source, destination, options) => { + let basename = path.basename(source); + const dirname = path.dirname(source); + + if (typeof options.rename === 'string') { + basename = options.rename; + } else if (typeof options.rename === 'function') { + basename = options.rename(basename); + } + + if (options.cwd) { + destination = path.resolve(options.cwd, destination); + } - var abs = this._makeAbs(read) + if (options.parents) { + return path.join(destination, dirname, basename); + } - //if ignored, skip processing - if (childrenIgnored(this, read)) - return + return path.join(destination, basename); +}; - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar) -} +module.exports = (source, destination, { + concurrency = (os.cpus().length || 1) * 2, + ...options +} = {}) => { + const progressEmitter = new EventEmitter(); + options = { + ...defaultOptions, + ...options + }; -GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { - var entries = this._readdir(abs, inGlobStar) + const promise = (async () => { + source = arrify(source); - // if the abs isn't a dir, then nothing can match! - if (!entries) - return + if (source.length === 0 || !destination) { + throw new CpyError('`source` and `destination` required'); + } - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' + const copyStatus = new Map(); + let completedFiles = 0; + let completedSize = 0; - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } + let files; + try { + files = await globby(source, options); - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return + if (options.ignoreJunk) { + files = files.filter(file => junk.not(path.basename(file))); + } + } catch (error) { + throw new CpyError(`Cannot glob \`${source}\`: ${error.message}`, error); + } - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. + const sourcePaths = source.filter(value => !isGlob(value)); - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) + if (files.length === 0 || (sourcePaths.length > 0 && !sourcePaths.every(value => files.includes(value)))) { + throw new CpyError(`Cannot copy \`${source}\`: the file doesn't exist`); + } - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix.slice(-1) !== '/') - e = prefix + '/' + e - else - e = prefix + e - } + const fileProgressHandler = event => { + const fileStatus = copyStatus.get(event.src) || {written: 0, percent: 0}; - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this._emitMatch(index, e) - } - // This was the last one, and no stats were needed - return - } + if (fileStatus.written !== event.written || fileStatus.percent !== event.percent) { + completedSize -= fileStatus.written; + completedSize += event.written; - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) - newPattern = [prefix, e] - else - newPattern = [e] - this._process(newPattern.concat(remain), index, inGlobStar) - } -} + if (event.percent === 1 && fileStatus.percent !== 1) { + completedFiles++; + } + copyStatus.set(event.src, { + written: event.written, + percent: event.percent + }); -GlobSync.prototype._emitMatch = function (index, e) { - if (isIgnored(this, e)) - return + progressEmitter.emit('progress', { + totalFiles: files.length, + percent: completedFiles / files.length, + completedFiles, + completedSize + }); + } + }; - var abs = this._makeAbs(e) + return pAll(files.map(sourcePath => { + return async () => { + const from = preprocessSourcePath(sourcePath, options); + const to = preprocessDestinationPath(sourcePath, destination, options); - if (this.mark) - e = this._mark(e) + try { + await cpFile(from, to, options).on('progress', fileProgressHandler); + } catch (error) { + throw new CpyError(`Cannot copy from \`${from}\` to \`${to}\`: ${error.message}`, error); + } - if (this.absolute) { - e = abs - } + return to; + }; + }), {concurrency}); + })(); - if (this.matches[index][e]) - return + promise.on = (...arguments_) => { + progressEmitter.on(...arguments_); + return promise; + }; - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } + return promise; +}; - this.matches[index][e] = true - if (this.stat) - this._stat(e) -} +/***/ }), +/* 508 */ +/***/ (function(module, exports, __webpack_require__) { +"use strict"; -GlobSync.prototype._readdirInGlobStar = function (abs) { - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false) +const pMap = __webpack_require__(509); - var entries - var lstat - var stat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er.code === 'ENOENT') { - // lstat failed, doesn't exist - return null - } - } +module.exports = (iterable, options) => pMap(iterable, element => element(), options); +// TODO: Remove this for the next major release +module.exports.default = module.exports; - var isSym = lstat && lstat.isSymbolicLink() - this.symlinks[abs] = isSym - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) - this.cache[abs] = 'FILE' - else - entries = this._readdir(abs, false) +/***/ }), +/* 509 */ +/***/ (function(module, exports, __webpack_require__) { - return entries -} +"use strict"; -GlobSync.prototype._readdir = function (abs, inGlobStar) { - var entries - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs) +const pMap = (iterable, mapper, options) => new Promise((resolve, reject) => { + options = Object.assign({ + concurrency: Infinity + }, options); - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return null + if (typeof mapper !== 'function') { + throw new TypeError('Mapper function is required'); + } - if (Array.isArray(c)) - return c - } + const {concurrency} = options; - try { - return this._readdirEntries(abs, fs.readdirSync(abs)) - } catch (er) { - this._readdirError(abs, er) - return null - } -} + if (!(typeof concurrency === 'number' && concurrency >= 1)) { + throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`); + } -GlobSync.prototype._readdirEntries = function (abs, entries) { - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } + const ret = []; + const iterator = iterable[Symbol.iterator](); + let isRejected = false; + let isIterableDone = false; + let resolvingCount = 0; + let currentIndex = 0; - this.cache[abs] = entries + const next = () => { + if (isRejected) { + return; + } - // mark and cache dir-ness - return entries -} + const nextItem = iterator.next(); + const i = currentIndex; + currentIndex++; -GlobSync.prototype._readdirError = function (f, er) { - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - throw error - } - break + if (nextItem.done) { + isIterableDone = true; - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break + if (resolvingCount === 0) { + resolve(ret); + } - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) - throw er - if (!this.silent) - console.error('glob error', er) - break - } -} + return; + } -GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + resolvingCount++; - var entries = this._readdir(abs, inGlobStar) + Promise.resolve(nextItem.value) + .then(element => mapper(element, i)) + .then( + value => { + ret[i] = value; + resolvingCount--; + next(); + }, + error => { + isRejected = true; + reject(error); + } + ); + }; - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return + for (let i = 0; i < concurrency; i++) { + next(); - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) + if (isIterableDone) { + break; + } + } +}); - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false) +module.exports = pMap; +// TODO: Remove this for the next major release +module.exports.default = pMap; - var len = entries.length - var isSym = this.symlinks[abs] - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return +/***/ }), +/* 510 */ +/***/ (function(module, exports, __webpack_require__) { - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue +"use strict"; - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true) - var below = gspref.concat(entries[i], remain) - this._process(below, index, true) - } -} +const arrify = value => { + if (value === null || value === undefined) { + return []; + } -GlobSync.prototype._processSimple = function (prefix, index) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var exists = this._stat(prefix) + if (Array.isArray(value)) { + return value; + } - if (!this.matches[index]) - this.matches[index] = Object.create(null) + if (typeof value === 'string') { + return [value]; + } - // If it doesn't exist, then just mark the lack of results - if (!exists) - return + if (typeof value[Symbol.iterator] === 'function') { + return [...value]; + } - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } + return [value]; +}; - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') +module.exports = arrify; - // Mark this as a match - this._emitMatch(index, prefix) -} -// Returns either 'DIR', 'FILE', or false -GlobSync.prototype._stat = function (f) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' +/***/ }), +/* 511 */ +/***/ (function(module, exports, __webpack_require__) { - if (f.length > this.maxLength) - return false +"use strict"; - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] +const fs = __webpack_require__(133); +const arrayUnion = __webpack_require__(512); +const glob = __webpack_require__(146); +const fastGlob = __webpack_require__(514); +const dirGlob = __webpack_require__(714); +const gitignore = __webpack_require__(717); - if (Array.isArray(c)) - c = 'DIR' +const DEFAULT_FILTER = () => false; - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return c +const isNegative = pattern => pattern[0] === '!'; - if (needDir && c === 'FILE') - return false +const assertPatternsInput = patterns => { + if (!patterns.every(x => typeof x === 'string')) { + throw new TypeError('Patterns must be a string or an array of strings'); + } +}; - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } +const checkCwdOption = options => { + if (options && options.cwd && !fs.statSync(options.cwd).isDirectory()) { + throw new Error('The `cwd` option must be a path to a directory'); + } +}; - var exists - var stat = this.statCache[abs] - if (!stat) { - var lstat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return false - } - } +const generateGlobTasks = (patterns, taskOptions) => { + patterns = arrayUnion([].concat(patterns)); + assertPatternsInput(patterns); + checkCwdOption(taskOptions); - if (lstat && lstat.isSymbolicLink()) { - try { - stat = fs.statSync(abs) - } catch (er) { - stat = lstat - } - } else { - stat = lstat - } - } + const globTasks = []; - this.statCache[abs] = stat + taskOptions = Object.assign({ + ignore: [], + expandDirectories: true + }, taskOptions); - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' + patterns.forEach((pattern, i) => { + if (isNegative(pattern)) { + return; + } - this.cache[abs] = this.cache[abs] || c + const ignore = patterns + .slice(i) + .filter(isNegative) + .map(pattern => pattern.slice(1)); - if (needDir && c === 'FILE') - return false + const options = Object.assign({}, taskOptions, { + ignore: taskOptions.ignore.concat(ignore) + }); - return c -} + globTasks.push({pattern, options}); + }); -GlobSync.prototype._mark = function (p) { - return common.mark(this, p) -} + return globTasks; +}; -GlobSync.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} +const globDirs = (task, fn) => { + let options = {}; + if (task.options.cwd) { + options.cwd = task.options.cwd; + } + + if (Array.isArray(task.options.expandDirectories)) { + options = Object.assign(options, {files: task.options.expandDirectories}); + } else if (typeof task.options.expandDirectories === 'object') { + options = Object.assign(options, task.options.expandDirectories); + } + + return fn(task.pattern, options); +}; +const getPattern = (task, fn) => task.options.expandDirectories ? globDirs(task, fn) : [task.pattern]; -/***/ }), -/* 524 */ -/***/ (function(module, exports, __webpack_require__) { +const globToTask = task => glob => { + const {options} = task; + if (options.ignore && Array.isArray(options.ignore) && options.expandDirectories) { + options.ignore = dirGlob.sync(options.ignore); + } -exports.alphasort = alphasort -exports.alphasorti = alphasorti -exports.setopts = setopts -exports.ownProp = ownProp -exports.makeAbs = makeAbs -exports.finish = finish -exports.mark = mark -exports.isIgnored = isIgnored -exports.childrenIgnored = childrenIgnored + return { + pattern: glob, + options + }; +}; -function ownProp (obj, field) { - return Object.prototype.hasOwnProperty.call(obj, field) -} +const globby = (patterns, options) => { + let globTasks; -var path = __webpack_require__(4) -var minimatch = __webpack_require__(149) -var isAbsolute = __webpack_require__(156) -var Minimatch = minimatch.Minimatch + try { + globTasks = generateGlobTasks(patterns, options); + } catch (error) { + return Promise.reject(error); + } -function alphasorti (a, b) { - return a.toLowerCase().localeCompare(b.toLowerCase()) -} + const getTasks = Promise.all(globTasks.map(task => Promise.resolve(getPattern(task, dirGlob)) + .then(globs => Promise.all(globs.map(globToTask(task)))) + )) + .then(tasks => arrayUnion(...tasks)); -function alphasort (a, b) { - return a.localeCompare(b) -} + const getFilter = () => { + return Promise.resolve( + options && options.gitignore ? + gitignore({cwd: options.cwd, ignore: options.ignore}) : + DEFAULT_FILTER + ); + }; -function setupIgnores (self, options) { - self.ignore = options.ignore || [] + return getFilter() + .then(filter => { + return getTasks + .then(tasks => Promise.all(tasks.map(task => fastGlob(task.pattern, task.options)))) + .then(paths => arrayUnion(...paths)) + .then(paths => paths.filter(p => !filter(p))); + }); +}; - if (!Array.isArray(self.ignore)) - self.ignore = [self.ignore] +module.exports = globby; +// TODO: Remove this for the next major release +module.exports.default = globby; - if (self.ignore.length) { - self.ignore = self.ignore.map(ignoreMap) - } -} +module.exports.sync = (patterns, options) => { + const globTasks = generateGlobTasks(patterns, options); -// ignore patterns are always in dot:true mode. -function ignoreMap (pattern) { - var gmatcher = null - if (pattern.slice(-3) === '/**') { - var gpattern = pattern.replace(/(\/\*\*)+$/, '') - gmatcher = new Minimatch(gpattern, { dot: true }) - } + const getFilter = () => { + return options && options.gitignore ? + gitignore.sync({cwd: options.cwd, ignore: options.ignore}) : + DEFAULT_FILTER; + }; - return { - matcher: new Minimatch(pattern, { dot: true }), - gmatcher: gmatcher - } -} + const tasks = globTasks.reduce((tasks, task) => { + const newTask = getPattern(task, dirGlob.sync).map(globToTask(task)); + return tasks.concat(newTask); + }, []); -function setopts (self, pattern, options) { - if (!options) - options = {} + const filter = getFilter(); + return tasks.reduce( + (matches, task) => arrayUnion(matches, fastGlob.sync(task.pattern, task.options)), + [] + ).filter(p => !filter(p)); +}; - // base-matching: just use globstar for that. - if (options.matchBase && -1 === pattern.indexOf("/")) { - if (options.noglobstar) { - throw new Error("base matching requires globstar") - } - pattern = "**/" + pattern - } +module.exports.generateGlobTasks = generateGlobTasks; - self.silent = !!options.silent - self.pattern = pattern - self.strict = options.strict !== false - self.realpath = !!options.realpath - self.realpathCache = options.realpathCache || Object.create(null) - self.follow = !!options.follow - self.dot = !!options.dot - self.mark = !!options.mark - self.nodir = !!options.nodir - if (self.nodir) - self.mark = true - self.sync = !!options.sync - self.nounique = !!options.nounique - self.nonull = !!options.nonull - self.nosort = !!options.nosort - self.nocase = !!options.nocase - self.stat = !!options.stat - self.noprocess = !!options.noprocess - self.absolute = !!options.absolute +module.exports.hasMagic = (patterns, options) => [] + .concat(patterns) + .some(pattern => glob.hasMagic(pattern, options)); - self.maxLength = options.maxLength || Infinity - self.cache = options.cache || Object.create(null) - self.statCache = options.statCache || Object.create(null) - self.symlinks = options.symlinks || Object.create(null) +module.exports.gitignore = gitignore; - setupIgnores(self, options) - self.changedCwd = false - var cwd = process.cwd() - if (!ownProp(options, "cwd")) - self.cwd = cwd - else { - self.cwd = path.resolve(options.cwd) - self.changedCwd = self.cwd !== cwd - } +/***/ }), +/* 512 */ +/***/ (function(module, exports, __webpack_require__) { - self.root = options.root || path.resolve(self.cwd, "/") - self.root = path.resolve(self.root) - if (process.platform === "win32") - self.root = self.root.replace(/\\/g, "/") +"use strict"; - // TODO: is an absolute `cwd` supposed to be resolved against `root`? - // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') - self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) - if (process.platform === "win32") - self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") - self.nomount = !!options.nomount +var arrayUniq = __webpack_require__(513); - // disable comments and negation in Minimatch. - // Note that they are not supported in Glob itself anyway. - options.nonegate = true - options.nocomment = true +module.exports = function () { + return arrayUniq([].concat.apply([], arguments)); +}; - self.minimatch = new Minimatch(pattern, options) - self.options = self.minimatch.options -} -function finish (self) { - var nou = self.nounique - var all = nou ? [] : Object.create(null) +/***/ }), +/* 513 */ +/***/ (function(module, exports, __webpack_require__) { - for (var i = 0, l = self.matches.length; i < l; i ++) { - var matches = self.matches[i] - if (!matches || Object.keys(matches).length === 0) { - if (self.nonull) { - // do like the shell, and spit out the literal glob - var literal = self.minimatch.globSet[i] - if (nou) - all.push(literal) - else - all[literal] = true - } - } else { - // had matches - var m = Object.keys(matches) - if (nou) - all.push.apply(all, m) - else - m.forEach(function (m) { - all[m] = true - }) - } - } +"use strict"; - if (!nou) - all = Object.keys(all) - if (!self.nosort) - all = all.sort(self.nocase ? alphasorti : alphasort) +// there's 3 implementations written in increasing order of efficiency - // at *some* point we statted all of these - if (self.mark) { - for (var i = 0; i < all.length; i++) { - all[i] = self._mark(all[i]) - } - if (self.nodir) { - all = all.filter(function (e) { - var notDir = !(/\/$/.test(e)) - var c = self.cache[e] || self.cache[makeAbs(self, e)] - if (notDir && c) - notDir = c !== 'DIR' && !Array.isArray(c) - return notDir - }) - } - } +// 1 - no Set type is defined +function uniqNoSet(arr) { + var ret = []; - if (self.ignore.length) - all = all.filter(function(m) { - return !isIgnored(self, m) - }) + for (var i = 0; i < arr.length; i++) { + if (ret.indexOf(arr[i]) === -1) { + ret.push(arr[i]); + } + } - self.found = all + return ret; } -function mark (self, p) { - var abs = makeAbs(self, p) - var c = self.cache[abs] - var m = p - if (c) { - var isDir = c === 'DIR' || Array.isArray(c) - var slash = p.slice(-1) === '/' - - if (isDir && !slash) - m += '/' - else if (!isDir && slash) - m = m.slice(0, -1) - - if (m !== p) { - var mabs = makeAbs(self, m) - self.statCache[mabs] = self.statCache[abs] - self.cache[mabs] = self.cache[abs] - } - } +// 2 - a simple Set type is defined +function uniqSet(arr) { + var seen = new Set(); + return arr.filter(function (el) { + if (!seen.has(el)) { + seen.add(el); + return true; + } - return m + return false; + }); } -// lotta situps... -function makeAbs (self, f) { - var abs = f - if (f.charAt(0) === '/') { - abs = path.join(self.root, f) - } else if (isAbsolute(f) || f === '') { - abs = f - } else if (self.changedCwd) { - abs = path.resolve(self.cwd, f) - } else { - abs = path.resolve(f) - } +// 3 - a standard Set type is defined and it has a forEach method +function uniqSetWithForEach(arr) { + var ret = []; - if (process.platform === 'win32') - abs = abs.replace(/\\/g, '/') + (new Set(arr)).forEach(function (el) { + ret.push(el); + }); - return abs + return ret; } +// V8 currently has a broken implementation +// https://github.com/joyent/node/issues/8449 +function doesForEachActuallyWork() { + var ret = false; -// Return true, if pattern ends with globstar '**', for the accompanying parent directory. -// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents -function isIgnored (self, path) { - if (!self.ignore.length) - return false + (new Set([true])).forEach(function (el) { + ret = el; + }); - return self.ignore.some(function(item) { - return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) - }) + return ret === true; } -function childrenIgnored (self, path) { - if (!self.ignore.length) - return false - - return self.ignore.some(function(item) { - return !!(item.gmatcher && item.gmatcher.match(path)) - }) +if ('Set' in global) { + if (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) { + module.exports = uniqSetWithForEach; + } else { + module.exports = uniqSet; + } +} else { + module.exports = uniqNoSet; } /***/ }), -/* 525 */ +/* 514 */ /***/ (function(module, exports, __webpack_require__) { -const pkg = __webpack_require__(526); +const pkg = __webpack_require__(515); module.exports = pkg.async; module.exports.default = pkg.async; @@ -61734,19 +58543,19 @@ module.exports.generateTasks = pkg.generateTasks; /***/ }), -/* 526 */ +/* 515 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var optionsManager = __webpack_require__(527); -var taskManager = __webpack_require__(528); -var reader_async_1 = __webpack_require__(696); -var reader_stream_1 = __webpack_require__(720); -var reader_sync_1 = __webpack_require__(721); -var arrayUtils = __webpack_require__(723); -var streamUtils = __webpack_require__(724); +var optionsManager = __webpack_require__(516); +var taskManager = __webpack_require__(517); +var reader_async_1 = __webpack_require__(685); +var reader_stream_1 = __webpack_require__(709); +var reader_sync_1 = __webpack_require__(710); +var arrayUtils = __webpack_require__(712); +var streamUtils = __webpack_require__(713); /** * Synchronous API. */ @@ -61812,7 +58621,7 @@ function isString(source) { /***/ }), -/* 527 */ +/* 516 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61850,13 +58659,13 @@ exports.prepare = prepare; /***/ }), -/* 528 */ +/* 517 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var patternUtils = __webpack_require__(529); +var patternUtils = __webpack_require__(518); /** * Generate tasks based on parent directory of each pattern. */ @@ -61947,16 +58756,16 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 529 */ +/* 518 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var path = __webpack_require__(4); -var globParent = __webpack_require__(530); -var isGlob = __webpack_require__(533); -var micromatch = __webpack_require__(534); +var globParent = __webpack_require__(519); +var isGlob = __webpack_require__(522); +var micromatch = __webpack_require__(523); var GLOBSTAR = '**'; /** * Return true for static pattern. @@ -62102,15 +58911,15 @@ exports.matchAny = matchAny; /***/ }), -/* 530 */ +/* 519 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var path = __webpack_require__(4); -var isglob = __webpack_require__(531); -var pathDirname = __webpack_require__(532); +var isglob = __webpack_require__(520); +var pathDirname = __webpack_require__(521); var isWin32 = __webpack_require__(120).platform() === 'win32'; module.exports = function globParent(str) { @@ -62133,7 +58942,7 @@ module.exports = function globParent(str) { /***/ }), -/* 531 */ +/* 520 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -62143,7 +58952,7 @@ module.exports = function globParent(str) { * Licensed under the MIT License. */ -var isExtglob = __webpack_require__(315); +var isExtglob = __webpack_require__(310); module.exports = function isGlob(str) { if (typeof str !== 'string' || str === '') { @@ -62164,7 +58973,7 @@ module.exports = function isGlob(str) { /***/ }), -/* 532 */ +/* 521 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62314,7 +59123,7 @@ module.exports.win32 = win32; /***/ }), -/* 533 */ +/* 522 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -62324,7 +59133,7 @@ module.exports.win32 = win32; * Released under the MIT License. */ -var isExtglob = __webpack_require__(315); +var isExtglob = __webpack_require__(310); var chars = { '{': '}', '(': ')', '[': ']'}; module.exports = function isGlob(str, options) { @@ -62366,7 +59175,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 534 */ +/* 523 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62377,18 +59186,18 @@ module.exports = function isGlob(str, options) { */ var util = __webpack_require__(111); -var braces = __webpack_require__(535); -var toRegex = __webpack_require__(648); -var extend = __webpack_require__(656); +var braces = __webpack_require__(524); +var toRegex = __webpack_require__(637); +var extend = __webpack_require__(645); /** * Local dependencies */ -var compilers = __webpack_require__(659); -var parsers = __webpack_require__(692); -var cache = __webpack_require__(693); -var utils = __webpack_require__(694); +var compilers = __webpack_require__(648); +var parsers = __webpack_require__(681); +var cache = __webpack_require__(682); +var utils = __webpack_require__(683); var MAX_LENGTH = 1024 * 64; /** @@ -63250,7 +60059,7 @@ module.exports = micromatch; /***/ }), -/* 535 */ +/* 524 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63260,18 +60069,18 @@ module.exports = micromatch; * Module dependencies */ -var toRegex = __webpack_require__(536); -var unique = __webpack_require__(550); -var extend = __webpack_require__(545); +var toRegex = __webpack_require__(525); +var unique = __webpack_require__(539); +var extend = __webpack_require__(534); /** * Local dependencies */ -var compilers = __webpack_require__(551); -var parsers = __webpack_require__(568); -var Braces = __webpack_require__(578); -var utils = __webpack_require__(552); +var compilers = __webpack_require__(540); +var parsers = __webpack_require__(557); +var Braces = __webpack_require__(567); +var utils = __webpack_require__(541); var MAX_LENGTH = 1024 * 64; var cache = {}; @@ -63575,15 +60384,15 @@ module.exports = braces; /***/ }), -/* 536 */ +/* 525 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(537); -var extend = __webpack_require__(545); -var not = __webpack_require__(547); +var define = __webpack_require__(526); +var extend = __webpack_require__(534); +var not = __webpack_require__(536); var MAX_LENGTH = 1024 * 64; /** @@ -63730,7 +60539,7 @@ module.exports.makeRe = makeRe; /***/ }), -/* 537 */ +/* 526 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63743,7 +60552,7 @@ module.exports.makeRe = makeRe; -var isDescriptor = __webpack_require__(538); +var isDescriptor = __webpack_require__(527); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -63768,7 +60577,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 538 */ +/* 527 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63781,9 +60590,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(539); -var isAccessor = __webpack_require__(540); -var isData = __webpack_require__(543); +var typeOf = __webpack_require__(528); +var isAccessor = __webpack_require__(529); +var isData = __webpack_require__(532); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -63797,7 +60606,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 539 */ +/* 528 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -63950,7 +60759,7 @@ function isBuffer(val) { /***/ }), -/* 540 */ +/* 529 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63963,7 +60772,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(541); +var typeOf = __webpack_require__(530); // accessor descriptor properties var accessor = { @@ -64026,10 +60835,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 541 */ +/* 530 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(542); +var isBuffer = __webpack_require__(531); var toString = Object.prototype.toString; /** @@ -64148,7 +60957,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 542 */ +/* 531 */ /***/ (function(module, exports) { /*! @@ -64175,7 +60984,7 @@ function isSlowBuffer (obj) { /***/ }), -/* 543 */ +/* 532 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64188,7 +60997,7 @@ function isSlowBuffer (obj) { -var typeOf = __webpack_require__(544); +var typeOf = __webpack_require__(533); // data descriptor properties var data = { @@ -64237,10 +61046,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 544 */ +/* 533 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(542); +var isBuffer = __webpack_require__(531); var toString = Object.prototype.toString; /** @@ -64359,13 +61168,13 @@ module.exports = function kindOf(val) { /***/ }), -/* 545 */ +/* 534 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(546); +var isObject = __webpack_require__(535); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -64399,7 +61208,7 @@ function hasOwn(obj, key) { /***/ }), -/* 546 */ +/* 535 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64419,13 +61228,13 @@ module.exports = function isExtendable(val) { /***/ }), -/* 547 */ +/* 536 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(548); +var extend = __webpack_require__(537); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -64492,13 +61301,13 @@ module.exports = toRegex; /***/ }), -/* 548 */ +/* 537 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(549); +var isObject = __webpack_require__(538); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -64532,7 +61341,7 @@ function hasOwn(obj, key) { /***/ }), -/* 549 */ +/* 538 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64552,7 +61361,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 550 */ +/* 539 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64602,13 +61411,13 @@ module.exports.immutable = function uniqueImmutable(arr) { /***/ }), -/* 551 */ +/* 540 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(552); +var utils = __webpack_require__(541); module.exports = function(braces, options) { braces.compiler @@ -64891,25 +61700,25 @@ function hasQueue(node) { /***/ }), -/* 552 */ +/* 541 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var splitString = __webpack_require__(553); +var splitString = __webpack_require__(542); var utils = module.exports; /** * Module dependencies */ -utils.extend = __webpack_require__(545); -utils.flatten = __webpack_require__(559); -utils.isObject = __webpack_require__(557); -utils.fillRange = __webpack_require__(560); -utils.repeat = __webpack_require__(567); -utils.unique = __webpack_require__(550); +utils.extend = __webpack_require__(534); +utils.flatten = __webpack_require__(548); +utils.isObject = __webpack_require__(546); +utils.fillRange = __webpack_require__(549); +utils.repeat = __webpack_require__(556); +utils.unique = __webpack_require__(539); utils.define = function(obj, key, val) { Object.defineProperty(obj, key, { @@ -65241,7 +62050,7 @@ utils.escapeRegex = function(str) { /***/ }), -/* 553 */ +/* 542 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65254,7 +62063,7 @@ utils.escapeRegex = function(str) { -var extend = __webpack_require__(554); +var extend = __webpack_require__(543); module.exports = function(str, options, fn) { if (typeof str !== 'string') { @@ -65419,14 +62228,14 @@ function keepEscaping(opts, str, idx) { /***/ }), -/* 554 */ +/* 543 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(555); -var assignSymbols = __webpack_require__(558); +var isExtendable = __webpack_require__(544); +var assignSymbols = __webpack_require__(547); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -65486,7 +62295,7 @@ function isEnum(obj, key) { /***/ }), -/* 555 */ +/* 544 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65499,7 +62308,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(556); +var isPlainObject = __webpack_require__(545); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -65507,7 +62316,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 556 */ +/* 545 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65520,7 +62329,7 @@ module.exports = function isExtendable(val) { -var isObject = __webpack_require__(557); +var isObject = __webpack_require__(546); function isObjectObject(o) { return isObject(o) === true @@ -65551,7 +62360,7 @@ module.exports = function isPlainObject(o) { /***/ }), -/* 557 */ +/* 546 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65570,7 +62379,7 @@ module.exports = function isObject(val) { /***/ }), -/* 558 */ +/* 547 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65617,7 +62426,7 @@ module.exports = function(receiver, objects) { /***/ }), -/* 559 */ +/* 548 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65646,7 +62455,7 @@ function flat(arr, res) { /***/ }), -/* 560 */ +/* 549 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65660,10 +62469,10 @@ function flat(arr, res) { var util = __webpack_require__(111); -var isNumber = __webpack_require__(561); -var extend = __webpack_require__(563); -var repeat = __webpack_require__(565); -var toRegex = __webpack_require__(566); +var isNumber = __webpack_require__(550); +var extend = __webpack_require__(552); +var repeat = __webpack_require__(554); +var toRegex = __webpack_require__(555); /** * Return a range of numbers or letters. @@ -65861,7 +62670,7 @@ module.exports = fillRange; /***/ }), -/* 561 */ +/* 550 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65874,7 +62683,7 @@ module.exports = fillRange; -var typeOf = __webpack_require__(562); +var typeOf = __webpack_require__(551); module.exports = function isNumber(num) { var type = typeOf(num); @@ -65890,10 +62699,10 @@ module.exports = function isNumber(num) { /***/ }), -/* 562 */ +/* 551 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(542); +var isBuffer = __webpack_require__(531); var toString = Object.prototype.toString; /** @@ -66012,13 +62821,13 @@ module.exports = function kindOf(val) { /***/ }), -/* 563 */ +/* 552 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(564); +var isObject = __webpack_require__(553); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -66052,7 +62861,7 @@ function hasOwn(obj, key) { /***/ }), -/* 564 */ +/* 553 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -66072,7 +62881,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 565 */ +/* 554 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -66149,7 +62958,7 @@ function repeat(str, num) { /***/ }), -/* 566 */ +/* 555 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -66162,8 +62971,8 @@ function repeat(str, num) { -var repeat = __webpack_require__(565); -var isNumber = __webpack_require__(561); +var repeat = __webpack_require__(554); +var isNumber = __webpack_require__(550); var cache = {}; function toRegexRange(min, max, options) { @@ -66450,7 +63259,7 @@ module.exports = toRegexRange; /***/ }), -/* 567 */ +/* 556 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -66475,14 +63284,14 @@ module.exports = function repeat(ele, num) { /***/ }), -/* 568 */ +/* 557 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Node = __webpack_require__(569); -var utils = __webpack_require__(552); +var Node = __webpack_require__(558); +var utils = __webpack_require__(541); /** * Braces parsers @@ -66842,15 +63651,15 @@ function concatNodes(pos, node, parent, options) { /***/ }), -/* 569 */ +/* 558 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(557); -var define = __webpack_require__(570); -var utils = __webpack_require__(577); +var isObject = __webpack_require__(546); +var define = __webpack_require__(559); +var utils = __webpack_require__(566); var ownNames; /** @@ -67341,7 +64150,7 @@ exports = module.exports = Node; /***/ }), -/* 570 */ +/* 559 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67354,7 +64163,7 @@ exports = module.exports = Node; -var isDescriptor = __webpack_require__(571); +var isDescriptor = __webpack_require__(560); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -67379,7 +64188,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 571 */ +/* 560 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67392,9 +64201,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(572); -var isAccessor = __webpack_require__(573); -var isData = __webpack_require__(575); +var typeOf = __webpack_require__(561); +var isAccessor = __webpack_require__(562); +var isData = __webpack_require__(564); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -67408,7 +64217,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 572 */ +/* 561 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -67543,7 +64352,7 @@ function isBuffer(val) { /***/ }), -/* 573 */ +/* 562 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67556,7 +64365,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(574); +var typeOf = __webpack_require__(563); // accessor descriptor properties var accessor = { @@ -67619,7 +64428,7 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 574 */ +/* 563 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -67754,7 +64563,7 @@ function isBuffer(val) { /***/ }), -/* 575 */ +/* 564 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67767,7 +64576,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(576); +var typeOf = __webpack_require__(565); module.exports = function isDataDescriptor(obj, prop) { // data descriptor properties @@ -67810,7 +64619,7 @@ module.exports = function isDataDescriptor(obj, prop) { /***/ }), -/* 576 */ +/* 565 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -67945,13 +64754,13 @@ function isBuffer(val) { /***/ }), -/* 577 */ +/* 566 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(562); +var typeOf = __webpack_require__(551); var utils = module.exports; /** @@ -68971,17 +65780,17 @@ function assert(val, message) { /***/ }), -/* 578 */ +/* 567 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(545); -var Snapdragon = __webpack_require__(579); -var compilers = __webpack_require__(551); -var parsers = __webpack_require__(568); -var utils = __webpack_require__(552); +var extend = __webpack_require__(534); +var Snapdragon = __webpack_require__(568); +var compilers = __webpack_require__(540); +var parsers = __webpack_require__(557); +var utils = __webpack_require__(541); /** * Customize Snapdragon parser and renderer @@ -69082,17 +65891,17 @@ module.exports = Braces; /***/ }), -/* 579 */ +/* 568 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Base = __webpack_require__(580); -var define = __webpack_require__(606); -var Compiler = __webpack_require__(616); -var Parser = __webpack_require__(645); -var utils = __webpack_require__(625); +var Base = __webpack_require__(569); +var define = __webpack_require__(595); +var Compiler = __webpack_require__(605); +var Parser = __webpack_require__(634); +var utils = __webpack_require__(614); var regexCache = {}; var cache = {}; @@ -69263,20 +66072,20 @@ module.exports.Parser = Parser; /***/ }), -/* 580 */ +/* 569 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(111); -var define = __webpack_require__(581); -var CacheBase = __webpack_require__(582); -var Emitter = __webpack_require__(583); -var isObject = __webpack_require__(557); -var merge = __webpack_require__(600); -var pascal = __webpack_require__(603); -var cu = __webpack_require__(604); +var define = __webpack_require__(570); +var CacheBase = __webpack_require__(571); +var Emitter = __webpack_require__(572); +var isObject = __webpack_require__(546); +var merge = __webpack_require__(589); +var pascal = __webpack_require__(592); +var cu = __webpack_require__(593); /** * Optionally define a custom `cache` namespace to use. @@ -69705,7 +66514,7 @@ module.exports.namespace = namespace; /***/ }), -/* 581 */ +/* 570 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69718,7 +66527,7 @@ module.exports.namespace = namespace; -var isDescriptor = __webpack_require__(571); +var isDescriptor = __webpack_require__(560); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -69743,21 +66552,21 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 582 */ +/* 571 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(557); -var Emitter = __webpack_require__(583); -var visit = __webpack_require__(584); -var toPath = __webpack_require__(587); -var union = __webpack_require__(588); -var del = __webpack_require__(592); -var get = __webpack_require__(590); -var has = __webpack_require__(597); -var set = __webpack_require__(591); +var isObject = __webpack_require__(546); +var Emitter = __webpack_require__(572); +var visit = __webpack_require__(573); +var toPath = __webpack_require__(576); +var union = __webpack_require__(577); +var del = __webpack_require__(581); +var get = __webpack_require__(579); +var has = __webpack_require__(586); +var set = __webpack_require__(580); /** * Create a `Cache` constructor that when instantiated will @@ -70011,7 +66820,7 @@ module.exports.namespace = namespace; /***/ }), -/* 583 */ +/* 572 */ /***/ (function(module, exports, __webpack_require__) { @@ -70180,7 +66989,7 @@ Emitter.prototype.hasListeners = function(event){ /***/ }), -/* 584 */ +/* 573 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70193,8 +67002,8 @@ Emitter.prototype.hasListeners = function(event){ -var visit = __webpack_require__(585); -var mapVisit = __webpack_require__(586); +var visit = __webpack_require__(574); +var mapVisit = __webpack_require__(575); module.exports = function(collection, method, val) { var result; @@ -70217,7 +67026,7 @@ module.exports = function(collection, method, val) { /***/ }), -/* 585 */ +/* 574 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70230,7 +67039,7 @@ module.exports = function(collection, method, val) { -var isObject = __webpack_require__(557); +var isObject = __webpack_require__(546); module.exports = function visit(thisArg, method, target, val) { if (!isObject(thisArg) && typeof thisArg !== 'function') { @@ -70257,14 +67066,14 @@ module.exports = function visit(thisArg, method, target, val) { /***/ }), -/* 586 */ +/* 575 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(111); -var visit = __webpack_require__(585); +var visit = __webpack_require__(574); /** * Map `visit` over an array of objects. @@ -70301,7 +67110,7 @@ function isObject(val) { /***/ }), -/* 587 */ +/* 576 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70314,7 +67123,7 @@ function isObject(val) { -var typeOf = __webpack_require__(562); +var typeOf = __webpack_require__(551); module.exports = function toPath(args) { if (typeOf(args) !== 'arguments') { @@ -70341,16 +67150,16 @@ function filter(arr) { /***/ }), -/* 588 */ +/* 577 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(549); -var union = __webpack_require__(589); -var get = __webpack_require__(590); -var set = __webpack_require__(591); +var isObject = __webpack_require__(538); +var union = __webpack_require__(578); +var get = __webpack_require__(579); +var set = __webpack_require__(580); module.exports = function unionValue(obj, prop, value) { if (!isObject(obj)) { @@ -70378,7 +67187,7 @@ function arrayify(val) { /***/ }), -/* 589 */ +/* 578 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70414,7 +67223,7 @@ module.exports = function union(init) { /***/ }), -/* 590 */ +/* 579 */ /***/ (function(module, exports) { /*! @@ -70470,7 +67279,7 @@ function toString(val) { /***/ }), -/* 591 */ +/* 580 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70483,10 +67292,10 @@ function toString(val) { -var split = __webpack_require__(553); -var extend = __webpack_require__(548); -var isPlainObject = __webpack_require__(556); -var isObject = __webpack_require__(549); +var split = __webpack_require__(542); +var extend = __webpack_require__(537); +var isPlainObject = __webpack_require__(545); +var isObject = __webpack_require__(538); module.exports = function(obj, prop, val) { if (!isObject(obj)) { @@ -70532,7 +67341,7 @@ function isValidKey(key) { /***/ }), -/* 592 */ +/* 581 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70545,8 +67354,8 @@ function isValidKey(key) { -var isObject = __webpack_require__(557); -var has = __webpack_require__(593); +var isObject = __webpack_require__(546); +var has = __webpack_require__(582); module.exports = function unset(obj, prop) { if (!isObject(obj)) { @@ -70571,7 +67380,7 @@ module.exports = function unset(obj, prop) { /***/ }), -/* 593 */ +/* 582 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70584,9 +67393,9 @@ module.exports = function unset(obj, prop) { -var isObject = __webpack_require__(594); -var hasValues = __webpack_require__(596); -var get = __webpack_require__(590); +var isObject = __webpack_require__(583); +var hasValues = __webpack_require__(585); +var get = __webpack_require__(579); module.exports = function(obj, prop, noZero) { if (isObject(obj)) { @@ -70597,7 +67406,7 @@ module.exports = function(obj, prop, noZero) { /***/ }), -/* 594 */ +/* 583 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70610,7 +67419,7 @@ module.exports = function(obj, prop, noZero) { -var isArray = __webpack_require__(595); +var isArray = __webpack_require__(584); module.exports = function isObject(val) { return val != null && typeof val === 'object' && isArray(val) === false; @@ -70618,7 +67427,7 @@ module.exports = function isObject(val) { /***/ }), -/* 595 */ +/* 584 */ /***/ (function(module, exports) { var toString = {}.toString; @@ -70629,7 +67438,7 @@ module.exports = Array.isArray || function (arr) { /***/ }), -/* 596 */ +/* 585 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70672,7 +67481,7 @@ module.exports = function hasValue(o, noZero) { /***/ }), -/* 597 */ +/* 586 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70685,9 +67494,9 @@ module.exports = function hasValue(o, noZero) { -var isObject = __webpack_require__(557); -var hasValues = __webpack_require__(598); -var get = __webpack_require__(590); +var isObject = __webpack_require__(546); +var hasValues = __webpack_require__(587); +var get = __webpack_require__(579); module.exports = function(val, prop) { return hasValues(isObject(val) && prop ? get(val, prop) : val); @@ -70695,7 +67504,7 @@ module.exports = function(val, prop) { /***/ }), -/* 598 */ +/* 587 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70708,8 +67517,8 @@ module.exports = function(val, prop) { -var typeOf = __webpack_require__(599); -var isNumber = __webpack_require__(561); +var typeOf = __webpack_require__(588); +var isNumber = __webpack_require__(550); module.exports = function hasValue(val) { // is-number checks for NaN and other edge cases @@ -70762,10 +67571,10 @@ module.exports = function hasValue(val) { /***/ }), -/* 599 */ +/* 588 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(542); +var isBuffer = __webpack_require__(531); var toString = Object.prototype.toString; /** @@ -70887,14 +67696,14 @@ module.exports = function kindOf(val) { /***/ }), -/* 600 */ +/* 589 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(601); -var forIn = __webpack_require__(602); +var isExtendable = __webpack_require__(590); +var forIn = __webpack_require__(591); function mixinDeep(target, objects) { var len = arguments.length, i = 0; @@ -70958,7 +67767,7 @@ module.exports = mixinDeep; /***/ }), -/* 601 */ +/* 590 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70971,7 +67780,7 @@ module.exports = mixinDeep; -var isPlainObject = __webpack_require__(556); +var isPlainObject = __webpack_require__(545); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -70979,7 +67788,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 602 */ +/* 591 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71002,7 +67811,7 @@ module.exports = function forIn(obj, fn, thisArg) { /***/ }), -/* 603 */ +/* 592 */ /***/ (function(module, exports) { /*! @@ -71029,14 +67838,14 @@ module.exports = pascalcase; /***/ }), -/* 604 */ +/* 593 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(111); -var utils = __webpack_require__(605); +var utils = __webpack_require__(594); /** * Expose class utils @@ -71401,7 +68210,7 @@ cu.bubble = function(Parent, events) { /***/ }), -/* 605 */ +/* 594 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71415,10 +68224,10 @@ var utils = {}; * Lazily required module dependencies */ -utils.union = __webpack_require__(589); -utils.define = __webpack_require__(606); -utils.isObj = __webpack_require__(557); -utils.staticExtend = __webpack_require__(613); +utils.union = __webpack_require__(578); +utils.define = __webpack_require__(595); +utils.isObj = __webpack_require__(546); +utils.staticExtend = __webpack_require__(602); /** @@ -71429,7 +68238,7 @@ module.exports = utils; /***/ }), -/* 606 */ +/* 595 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71442,7 +68251,7 @@ module.exports = utils; -var isDescriptor = __webpack_require__(607); +var isDescriptor = __webpack_require__(596); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -71467,7 +68276,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 607 */ +/* 596 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71480,9 +68289,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(608); -var isAccessor = __webpack_require__(609); -var isData = __webpack_require__(611); +var typeOf = __webpack_require__(597); +var isAccessor = __webpack_require__(598); +var isData = __webpack_require__(600); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -71496,7 +68305,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 608 */ +/* 597 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -71649,7 +68458,7 @@ function isBuffer(val) { /***/ }), -/* 609 */ +/* 598 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71662,7 +68471,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(610); +var typeOf = __webpack_require__(599); // accessor descriptor properties var accessor = { @@ -71725,10 +68534,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 610 */ +/* 599 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(542); +var isBuffer = __webpack_require__(531); var toString = Object.prototype.toString; /** @@ -71847,7 +68656,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 611 */ +/* 600 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71860,7 +68669,7 @@ module.exports = function kindOf(val) { -var typeOf = __webpack_require__(612); +var typeOf = __webpack_require__(601); // data descriptor properties var data = { @@ -71909,10 +68718,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 612 */ +/* 601 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(542); +var isBuffer = __webpack_require__(531); var toString = Object.prototype.toString; /** @@ -72031,7 +68840,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 613 */ +/* 602 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -72044,8 +68853,8 @@ module.exports = function kindOf(val) { -var copy = __webpack_require__(614); -var define = __webpack_require__(606); +var copy = __webpack_require__(603); +var define = __webpack_require__(595); var util = __webpack_require__(111); /** @@ -72128,15 +68937,15 @@ module.exports = extend; /***/ }), -/* 614 */ +/* 603 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(562); -var copyDescriptor = __webpack_require__(615); -var define = __webpack_require__(606); +var typeOf = __webpack_require__(551); +var copyDescriptor = __webpack_require__(604); +var define = __webpack_require__(595); /** * Copy static properties, prototype properties, and descriptors from one object to another. @@ -72309,7 +69118,7 @@ module.exports.has = has; /***/ }), -/* 615 */ +/* 604 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -72397,16 +69206,16 @@ function isObject(val) { /***/ }), -/* 616 */ +/* 605 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(617); -var define = __webpack_require__(606); -var debug = __webpack_require__(619)('snapdragon:compiler'); -var utils = __webpack_require__(625); +var use = __webpack_require__(606); +var define = __webpack_require__(595); +var debug = __webpack_require__(608)('snapdragon:compiler'); +var utils = __webpack_require__(614); /** * Create a new `Compiler` with the given `options`. @@ -72560,7 +69369,7 @@ Compiler.prototype = { // source map support if (opts.sourcemap) { - var sourcemaps = __webpack_require__(644); + var sourcemaps = __webpack_require__(633); sourcemaps(this); this.mapVisit(this.ast.nodes); this.applySourceMaps(); @@ -72581,7 +69390,7 @@ module.exports = Compiler; /***/ }), -/* 617 */ +/* 606 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -72594,7 +69403,7 @@ module.exports = Compiler; -var utils = __webpack_require__(618); +var utils = __webpack_require__(607); module.exports = function base(app, opts) { if (!utils.isObject(app) && typeof app !== 'function') { @@ -72709,7 +69518,7 @@ module.exports = function base(app, opts) { /***/ }), -/* 618 */ +/* 607 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -72723,8 +69532,8 @@ var utils = {}; * Lazily required module dependencies */ -utils.define = __webpack_require__(606); -utils.isObject = __webpack_require__(557); +utils.define = __webpack_require__(595); +utils.isObject = __webpack_require__(546); utils.isString = function(val) { @@ -72739,7 +69548,7 @@ module.exports = utils; /***/ }), -/* 619 */ +/* 608 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -72748,14 +69557,14 @@ module.exports = utils; */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(620); + module.exports = __webpack_require__(609); } else { - module.exports = __webpack_require__(623); + module.exports = __webpack_require__(612); } /***/ }), -/* 620 */ +/* 609 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -72764,7 +69573,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(621); +exports = module.exports = __webpack_require__(610); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -72946,7 +69755,7 @@ function localstorage() { /***/ }), -/* 621 */ +/* 610 */ /***/ (function(module, exports, __webpack_require__) { @@ -72962,7 +69771,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(622); +exports.humanize = __webpack_require__(611); /** * The currently active debug mode names, and names to skip. @@ -73154,7 +69963,7 @@ function coerce(val) { /***/ }), -/* 622 */ +/* 611 */ /***/ (function(module, exports) { /** @@ -73312,7 +70121,7 @@ function plural(ms, n, name) { /***/ }), -/* 623 */ +/* 612 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -73328,7 +70137,7 @@ var util = __webpack_require__(111); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(621); +exports = module.exports = __webpack_require__(610); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -73507,7 +70316,7 @@ function createWritableStdioStream (fd) { case 'PIPE': case 'TCP': - var net = __webpack_require__(624); + var net = __webpack_require__(613); stream = new net.Socket({ fd: fd, readable: false, @@ -73566,13 +70375,13 @@ exports.enable(load()); /***/ }), -/* 624 */ +/* 613 */ /***/ (function(module, exports) { module.exports = require("net"); /***/ }), -/* 625 */ +/* 614 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73582,9 +70391,9 @@ module.exports = require("net"); * Module dependencies */ -exports.extend = __webpack_require__(548); -exports.SourceMap = __webpack_require__(626); -exports.sourceMapResolve = __webpack_require__(637); +exports.extend = __webpack_require__(537); +exports.SourceMap = __webpack_require__(615); +exports.sourceMapResolve = __webpack_require__(626); /** * Convert backslash in the given string to forward slashes @@ -73627,7 +70436,7 @@ exports.last = function(arr, n) { /***/ }), -/* 626 */ +/* 615 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -73635,13 +70444,13 @@ exports.last = function(arr, n) { * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ -exports.SourceMapGenerator = __webpack_require__(627).SourceMapGenerator; -exports.SourceMapConsumer = __webpack_require__(633).SourceMapConsumer; -exports.SourceNode = __webpack_require__(636).SourceNode; +exports.SourceMapGenerator = __webpack_require__(616).SourceMapGenerator; +exports.SourceMapConsumer = __webpack_require__(622).SourceMapConsumer; +exports.SourceNode = __webpack_require__(625).SourceNode; /***/ }), -/* 627 */ +/* 616 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -73651,10 +70460,10 @@ exports.SourceNode = __webpack_require__(636).SourceNode; * http://opensource.org/licenses/BSD-3-Clause */ -var base64VLQ = __webpack_require__(628); -var util = __webpack_require__(630); -var ArraySet = __webpack_require__(631).ArraySet; -var MappingList = __webpack_require__(632).MappingList; +var base64VLQ = __webpack_require__(617); +var util = __webpack_require__(619); +var ArraySet = __webpack_require__(620).ArraySet; +var MappingList = __webpack_require__(621).MappingList; /** * An instance of the SourceMapGenerator represents a source map which is @@ -74063,7 +70872,7 @@ exports.SourceMapGenerator = SourceMapGenerator; /***/ }), -/* 628 */ +/* 617 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -74103,7 +70912,7 @@ exports.SourceMapGenerator = SourceMapGenerator; * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var base64 = __webpack_require__(629); +var base64 = __webpack_require__(618); // A single base 64 digit can contain 6 bits of data. For the base 64 variable // length quantities we use in the source map spec, the first bit is the sign, @@ -74209,7 +71018,7 @@ exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { /***/ }), -/* 629 */ +/* 618 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -74282,7 +71091,7 @@ exports.decode = function (charCode) { /***/ }), -/* 630 */ +/* 619 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -74705,7 +71514,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate /***/ }), -/* 631 */ +/* 620 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -74715,7 +71524,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(630); +var util = __webpack_require__(619); var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; @@ -74832,7 +71641,7 @@ exports.ArraySet = ArraySet; /***/ }), -/* 632 */ +/* 621 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -74842,7 +71651,7 @@ exports.ArraySet = ArraySet; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(630); +var util = __webpack_require__(619); /** * Determine whether mappingB is after mappingA with respect to generated @@ -74917,7 +71726,7 @@ exports.MappingList = MappingList; /***/ }), -/* 633 */ +/* 622 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -74927,11 +71736,11 @@ exports.MappingList = MappingList; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(630); -var binarySearch = __webpack_require__(634); -var ArraySet = __webpack_require__(631).ArraySet; -var base64VLQ = __webpack_require__(628); -var quickSort = __webpack_require__(635).quickSort; +var util = __webpack_require__(619); +var binarySearch = __webpack_require__(623); +var ArraySet = __webpack_require__(620).ArraySet; +var base64VLQ = __webpack_require__(617); +var quickSort = __webpack_require__(624).quickSort; function SourceMapConsumer(aSourceMap) { var sourceMap = aSourceMap; @@ -76005,7 +72814,7 @@ exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; /***/ }), -/* 634 */ +/* 623 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -76122,7 +72931,7 @@ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { /***/ }), -/* 635 */ +/* 624 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -76242,7 +73051,7 @@ exports.quickSort = function (ary, comparator) { /***/ }), -/* 636 */ +/* 625 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -76252,8 +73061,8 @@ exports.quickSort = function (ary, comparator) { * http://opensource.org/licenses/BSD-3-Clause */ -var SourceMapGenerator = __webpack_require__(627).SourceMapGenerator; -var util = __webpack_require__(630); +var SourceMapGenerator = __webpack_require__(616).SourceMapGenerator; +var util = __webpack_require__(619); // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other // operating systems these days (capturing the result). @@ -76661,17 +73470,17 @@ exports.SourceNode = SourceNode; /***/ }), -/* 637 */ +/* 626 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014, 2015, 2016, 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var sourceMappingURL = __webpack_require__(638) -var resolveUrl = __webpack_require__(639) -var decodeUriComponent = __webpack_require__(640) -var urix = __webpack_require__(642) -var atob = __webpack_require__(643) +var sourceMappingURL = __webpack_require__(627) +var resolveUrl = __webpack_require__(628) +var decodeUriComponent = __webpack_require__(629) +var urix = __webpack_require__(631) +var atob = __webpack_require__(632) @@ -76969,7 +73778,7 @@ module.exports = { /***/ }), -/* 638 */ +/* 627 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright 2014 Simon Lydell @@ -77032,7 +73841,7 @@ void (function(root, factory) { /***/ }), -/* 639 */ +/* 628 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell @@ -77050,13 +73859,13 @@ module.exports = resolveUrl /***/ }), -/* 640 */ +/* 629 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var decodeUriComponent = __webpack_require__(641) +var decodeUriComponent = __webpack_require__(630) function customDecodeUriComponent(string) { // `decodeUriComponent` turns `+` into ` `, but that's not wanted. @@ -77067,7 +73876,7 @@ module.exports = customDecodeUriComponent /***/ }), -/* 641 */ +/* 630 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77168,7 +73977,7 @@ module.exports = function (encodedURI) { /***/ }), -/* 642 */ +/* 631 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell @@ -77191,7 +74000,7 @@ module.exports = urix /***/ }), -/* 643 */ +/* 632 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77205,7 +74014,7 @@ module.exports = atob.atob = atob; /***/ }), -/* 644 */ +/* 633 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77213,8 +74022,8 @@ module.exports = atob.atob = atob; var fs = __webpack_require__(133); var path = __webpack_require__(4); -var define = __webpack_require__(606); -var utils = __webpack_require__(625); +var define = __webpack_require__(595); +var utils = __webpack_require__(614); /** * Expose `mixin()`. @@ -77357,19 +74166,19 @@ exports.comment = function(node) { /***/ }), -/* 645 */ +/* 634 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(617); +var use = __webpack_require__(606); var util = __webpack_require__(111); -var Cache = __webpack_require__(646); -var define = __webpack_require__(606); -var debug = __webpack_require__(619)('snapdragon:parser'); -var Position = __webpack_require__(647); -var utils = __webpack_require__(625); +var Cache = __webpack_require__(635); +var define = __webpack_require__(595); +var debug = __webpack_require__(608)('snapdragon:parser'); +var Position = __webpack_require__(636); +var utils = __webpack_require__(614); /** * Create a new `Parser` with the given `input` and `options`. @@ -77897,7 +74706,7 @@ module.exports = Parser; /***/ }), -/* 646 */ +/* 635 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78004,13 +74813,13 @@ MapCache.prototype.del = function mapDelete(key) { /***/ }), -/* 647 */ +/* 636 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(606); +var define = __webpack_require__(595); /** * Store position for a node @@ -78025,16 +74834,16 @@ module.exports = function Position(start, parser) { /***/ }), -/* 648 */ +/* 637 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var safe = __webpack_require__(649); -var define = __webpack_require__(655); -var extend = __webpack_require__(656); -var not = __webpack_require__(658); +var safe = __webpack_require__(638); +var define = __webpack_require__(644); +var extend = __webpack_require__(645); +var not = __webpack_require__(647); var MAX_LENGTH = 1024 * 64; /** @@ -78187,10 +74996,10 @@ module.exports.makeRe = makeRe; /***/ }), -/* 649 */ +/* 638 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(650); +var parse = __webpack_require__(639); var types = parse.types; module.exports = function (re, opts) { @@ -78236,13 +75045,13 @@ function isRegExp (x) { /***/ }), -/* 650 */ +/* 639 */ /***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(651); -var types = __webpack_require__(652); -var sets = __webpack_require__(653); -var positions = __webpack_require__(654); +var util = __webpack_require__(640); +var types = __webpack_require__(641); +var sets = __webpack_require__(642); +var positions = __webpack_require__(643); module.exports = function(regexpStr) { @@ -78524,11 +75333,11 @@ module.exports.types = types; /***/ }), -/* 651 */ +/* 640 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(652); -var sets = __webpack_require__(653); +var types = __webpack_require__(641); +var sets = __webpack_require__(642); // All of these are private and only used by randexp. @@ -78641,7 +75450,7 @@ exports.error = function(regexp, msg) { /***/ }), -/* 652 */ +/* 641 */ /***/ (function(module, exports) { module.exports = { @@ -78657,10 +75466,10 @@ module.exports = { /***/ }), -/* 653 */ +/* 642 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(652); +var types = __webpack_require__(641); var INTS = function() { return [{ type: types.RANGE , from: 48, to: 57 }]; @@ -78745,10 +75554,10 @@ exports.anyChar = function() { /***/ }), -/* 654 */ +/* 643 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(652); +var types = __webpack_require__(641); exports.wordBoundary = function() { return { type: types.POSITION, value: 'b' }; @@ -78768,7 +75577,7 @@ exports.end = function() { /***/ }), -/* 655 */ +/* 644 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78781,8 +75590,8 @@ exports.end = function() { -var isobject = __webpack_require__(557); -var isDescriptor = __webpack_require__(571); +var isobject = __webpack_require__(546); +var isDescriptor = __webpack_require__(560); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -78813,14 +75622,14 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 656 */ +/* 645 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(657); -var assignSymbols = __webpack_require__(558); +var isExtendable = __webpack_require__(646); +var assignSymbols = __webpack_require__(547); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -78880,7 +75689,7 @@ function isEnum(obj, key) { /***/ }), -/* 657 */ +/* 646 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78893,7 +75702,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(556); +var isPlainObject = __webpack_require__(545); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -78901,14 +75710,14 @@ module.exports = function isExtendable(val) { /***/ }), -/* 658 */ +/* 647 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(656); -var safe = __webpack_require__(649); +var extend = __webpack_require__(645); +var safe = __webpack_require__(638); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -78980,14 +75789,14 @@ module.exports = toRegex; /***/ }), -/* 659 */ +/* 648 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var nanomatch = __webpack_require__(660); -var extglob = __webpack_require__(676); +var nanomatch = __webpack_require__(649); +var extglob = __webpack_require__(665); module.exports = function(snapdragon) { var compilers = snapdragon.compiler.compilers; @@ -79064,7 +75873,7 @@ function escapeExtglobs(compiler) { /***/ }), -/* 660 */ +/* 649 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79075,17 +75884,17 @@ function escapeExtglobs(compiler) { */ var util = __webpack_require__(111); -var toRegex = __webpack_require__(661); -var extend = __webpack_require__(662); +var toRegex = __webpack_require__(650); +var extend = __webpack_require__(651); /** * Local dependencies */ -var compilers = __webpack_require__(664); -var parsers = __webpack_require__(665); -var cache = __webpack_require__(668); -var utils = __webpack_require__(670); +var compilers = __webpack_require__(653); +var parsers = __webpack_require__(654); +var cache = __webpack_require__(657); +var utils = __webpack_require__(659); var MAX_LENGTH = 1024 * 64; /** @@ -79909,15 +76718,15 @@ module.exports = nanomatch; /***/ }), -/* 661 */ +/* 650 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(606); -var extend = __webpack_require__(548); -var not = __webpack_require__(547); +var define = __webpack_require__(595); +var extend = __webpack_require__(537); +var not = __webpack_require__(536); var MAX_LENGTH = 1024 * 64; /** @@ -80064,14 +76873,14 @@ module.exports.makeRe = makeRe; /***/ }), -/* 662 */ +/* 651 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(663); -var assignSymbols = __webpack_require__(558); +var isExtendable = __webpack_require__(652); +var assignSymbols = __webpack_require__(547); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -80131,7 +76940,7 @@ function isEnum(obj, key) { /***/ }), -/* 663 */ +/* 652 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -80144,7 +76953,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(556); +var isPlainObject = __webpack_require__(545); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -80152,7 +76961,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 664 */ +/* 653 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -80498,15 +77307,15 @@ module.exports = function(nanomatch, options) { /***/ }), -/* 665 */ +/* 654 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regexNot = __webpack_require__(547); -var toRegex = __webpack_require__(661); -var isOdd = __webpack_require__(666); +var regexNot = __webpack_require__(536); +var toRegex = __webpack_require__(650); +var isOdd = __webpack_require__(655); /** * Characters to use in negation regex (we want to "not" match @@ -80892,7 +77701,7 @@ module.exports.not = NOT_REGEX; /***/ }), -/* 666 */ +/* 655 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -80905,7 +77714,7 @@ module.exports.not = NOT_REGEX; -var isNumber = __webpack_require__(667); +var isNumber = __webpack_require__(656); module.exports = function isOdd(i) { if (!isNumber(i)) { @@ -80919,7 +77728,7 @@ module.exports = function isOdd(i) { /***/ }), -/* 667 */ +/* 656 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -80947,14 +77756,14 @@ module.exports = function isNumber(num) { /***/ }), -/* 668 */ +/* 657 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(669))(); +module.exports = new (__webpack_require__(658))(); /***/ }), -/* 669 */ +/* 658 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -80967,7 +77776,7 @@ module.exports = new (__webpack_require__(669))(); -var MapCache = __webpack_require__(646); +var MapCache = __webpack_require__(635); /** * Create a new `FragmentCache` with an optional object to use for `caches`. @@ -81089,7 +77898,7 @@ exports = module.exports = FragmentCache; /***/ }), -/* 670 */ +/* 659 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81102,14 +77911,14 @@ var path = __webpack_require__(4); * Module dependencies */ -var isWindows = __webpack_require__(671)(); -var Snapdragon = __webpack_require__(579); -utils.define = __webpack_require__(672); -utils.diff = __webpack_require__(673); -utils.extend = __webpack_require__(662); -utils.pick = __webpack_require__(674); -utils.typeOf = __webpack_require__(675); -utils.unique = __webpack_require__(550); +var isWindows = __webpack_require__(660)(); +var Snapdragon = __webpack_require__(568); +utils.define = __webpack_require__(661); +utils.diff = __webpack_require__(662); +utils.extend = __webpack_require__(651); +utils.pick = __webpack_require__(663); +utils.typeOf = __webpack_require__(664); +utils.unique = __webpack_require__(539); /** * Returns true if the given value is effectively an empty string @@ -81475,7 +78284,7 @@ utils.unixify = function(options) { /***/ }), -/* 671 */ +/* 660 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -81503,7 +78312,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ /***/ }), -/* 672 */ +/* 661 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81516,8 +78325,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ -var isobject = __webpack_require__(557); -var isDescriptor = __webpack_require__(571); +var isobject = __webpack_require__(546); +var isDescriptor = __webpack_require__(560); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -81548,7 +78357,7 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 673 */ +/* 662 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81602,7 +78411,7 @@ function diffArray(one, two) { /***/ }), -/* 674 */ +/* 663 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81615,7 +78424,7 @@ function diffArray(one, two) { -var isObject = __webpack_require__(557); +var isObject = __webpack_require__(546); module.exports = function pick(obj, keys) { if (!isObject(obj) && typeof obj !== 'function') { @@ -81644,7 +78453,7 @@ module.exports = function pick(obj, keys) { /***/ }), -/* 675 */ +/* 664 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -81779,7 +78588,7 @@ function isBuffer(val) { /***/ }), -/* 676 */ +/* 665 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81789,18 +78598,18 @@ function isBuffer(val) { * Module dependencies */ -var extend = __webpack_require__(548); -var unique = __webpack_require__(550); -var toRegex = __webpack_require__(661); +var extend = __webpack_require__(537); +var unique = __webpack_require__(539); +var toRegex = __webpack_require__(650); /** * Local dependencies */ -var compilers = __webpack_require__(677); -var parsers = __webpack_require__(688); -var Extglob = __webpack_require__(691); -var utils = __webpack_require__(690); +var compilers = __webpack_require__(666); +var parsers = __webpack_require__(677); +var Extglob = __webpack_require__(680); +var utils = __webpack_require__(679); var MAX_LENGTH = 1024 * 64; /** @@ -82117,13 +78926,13 @@ module.exports = extglob; /***/ }), -/* 677 */ +/* 666 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(678); +var brackets = __webpack_require__(667); /** * Extglob compilers @@ -82293,7 +79102,7 @@ module.exports = function(extglob) { /***/ }), -/* 678 */ +/* 667 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82303,17 +79112,17 @@ module.exports = function(extglob) { * Local dependencies */ -var compilers = __webpack_require__(679); -var parsers = __webpack_require__(681); +var compilers = __webpack_require__(668); +var parsers = __webpack_require__(670); /** * Module dependencies */ -var debug = __webpack_require__(683)('expand-brackets'); -var extend = __webpack_require__(548); -var Snapdragon = __webpack_require__(579); -var toRegex = __webpack_require__(661); +var debug = __webpack_require__(672)('expand-brackets'); +var extend = __webpack_require__(537); +var Snapdragon = __webpack_require__(568); +var toRegex = __webpack_require__(650); /** * Parses the given POSIX character class `pattern` and returns a @@ -82511,13 +79320,13 @@ module.exports = brackets; /***/ }), -/* 679 */ +/* 668 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var posix = __webpack_require__(680); +var posix = __webpack_require__(669); module.exports = function(brackets) { brackets.compiler @@ -82605,7 +79414,7 @@ module.exports = function(brackets) { /***/ }), -/* 680 */ +/* 669 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82634,14 +79443,14 @@ module.exports = { /***/ }), -/* 681 */ +/* 670 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(682); -var define = __webpack_require__(606); +var utils = __webpack_require__(671); +var define = __webpack_require__(595); /** * Text regex @@ -82860,14 +79669,14 @@ module.exports.TEXT_REGEX = TEXT_REGEX; /***/ }), -/* 682 */ +/* 671 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var toRegex = __webpack_require__(661); -var regexNot = __webpack_require__(547); +var toRegex = __webpack_require__(650); +var regexNot = __webpack_require__(536); var cached; /** @@ -82901,7 +79710,7 @@ exports.createRegex = function(pattern, include) { /***/ }), -/* 683 */ +/* 672 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -82910,14 +79719,14 @@ exports.createRegex = function(pattern, include) { */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(684); + module.exports = __webpack_require__(673); } else { - module.exports = __webpack_require__(687); + module.exports = __webpack_require__(676); } /***/ }), -/* 684 */ +/* 673 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -82926,7 +79735,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(685); +exports = module.exports = __webpack_require__(674); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -83108,7 +79917,7 @@ function localstorage() { /***/ }), -/* 685 */ +/* 674 */ /***/ (function(module, exports, __webpack_require__) { @@ -83124,7 +79933,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(686); +exports.humanize = __webpack_require__(675); /** * The currently active debug mode names, and names to skip. @@ -83316,7 +80125,7 @@ function coerce(val) { /***/ }), -/* 686 */ +/* 675 */ /***/ (function(module, exports) { /** @@ -83474,7 +80283,7 @@ function plural(ms, n, name) { /***/ }), -/* 687 */ +/* 676 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -83490,7 +80299,7 @@ var util = __webpack_require__(111); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(685); +exports = module.exports = __webpack_require__(674); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -83669,7 +80478,7 @@ function createWritableStdioStream (fd) { case 'PIPE': case 'TCP': - var net = __webpack_require__(624); + var net = __webpack_require__(613); stream = new net.Socket({ fd: fd, readable: false, @@ -83728,15 +80537,15 @@ exports.enable(load()); /***/ }), -/* 688 */ +/* 677 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(678); -var define = __webpack_require__(689); -var utils = __webpack_require__(690); +var brackets = __webpack_require__(667); +var define = __webpack_require__(678); +var utils = __webpack_require__(679); /** * Characters to use in text regex (we want to "not" match @@ -83891,7 +80700,7 @@ module.exports = parsers; /***/ }), -/* 689 */ +/* 678 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83904,7 +80713,7 @@ module.exports = parsers; -var isDescriptor = __webpack_require__(571); +var isDescriptor = __webpack_require__(560); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -83929,14 +80738,14 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 690 */ +/* 679 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regex = __webpack_require__(547); -var Cache = __webpack_require__(669); +var regex = __webpack_require__(536); +var Cache = __webpack_require__(658); /** * Utils @@ -84005,7 +80814,7 @@ utils.createRegex = function(str) { /***/ }), -/* 691 */ +/* 680 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84015,16 +80824,16 @@ utils.createRegex = function(str) { * Module dependencies */ -var Snapdragon = __webpack_require__(579); -var define = __webpack_require__(689); -var extend = __webpack_require__(548); +var Snapdragon = __webpack_require__(568); +var define = __webpack_require__(678); +var extend = __webpack_require__(537); /** * Local dependencies */ -var compilers = __webpack_require__(677); -var parsers = __webpack_require__(688); +var compilers = __webpack_require__(666); +var parsers = __webpack_require__(677); /** * Customize Snapdragon parser and renderer @@ -84090,16 +80899,16 @@ module.exports = Extglob; /***/ }), -/* 692 */ +/* 681 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extglob = __webpack_require__(676); -var nanomatch = __webpack_require__(660); -var regexNot = __webpack_require__(547); -var toRegex = __webpack_require__(648); +var extglob = __webpack_require__(665); +var nanomatch = __webpack_require__(649); +var regexNot = __webpack_require__(536); +var toRegex = __webpack_require__(637); var not; /** @@ -84180,14 +80989,14 @@ function textRegex(pattern) { /***/ }), -/* 693 */ +/* 682 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(669))(); +module.exports = new (__webpack_require__(658))(); /***/ }), -/* 694 */ +/* 683 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84200,13 +81009,13 @@ var path = __webpack_require__(4); * Module dependencies */ -var Snapdragon = __webpack_require__(579); -utils.define = __webpack_require__(655); -utils.diff = __webpack_require__(673); -utils.extend = __webpack_require__(656); -utils.pick = __webpack_require__(674); -utils.typeOf = __webpack_require__(695); -utils.unique = __webpack_require__(550); +var Snapdragon = __webpack_require__(568); +utils.define = __webpack_require__(644); +utils.diff = __webpack_require__(662); +utils.extend = __webpack_require__(645); +utils.pick = __webpack_require__(663); +utils.typeOf = __webpack_require__(684); +utils.unique = __webpack_require__(539); /** * Returns true if the platform is windows, or `path.sep` is `\\`. @@ -84503,7 +81312,7 @@ utils.unixify = function(options) { /***/ }), -/* 695 */ +/* 684 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -84638,7 +81447,7 @@ function isBuffer(val) { /***/ }), -/* 696 */ +/* 685 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84657,9 +81466,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(697); -var reader_1 = __webpack_require__(710); -var fs_stream_1 = __webpack_require__(714); +var readdir = __webpack_require__(686); +var reader_1 = __webpack_require__(699); +var fs_stream_1 = __webpack_require__(703); var ReaderAsync = /** @class */ (function (_super) { __extends(ReaderAsync, _super); function ReaderAsync() { @@ -84720,15 +81529,15 @@ exports.default = ReaderAsync; /***/ }), -/* 697 */ +/* 686 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const readdirSync = __webpack_require__(698); -const readdirAsync = __webpack_require__(706); -const readdirStream = __webpack_require__(709); +const readdirSync = __webpack_require__(687); +const readdirAsync = __webpack_require__(695); +const readdirStream = __webpack_require__(698); module.exports = exports = readdirAsyncPath; exports.readdir = exports.readdirAsync = exports.async = readdirAsyncPath; @@ -84812,7 +81621,7 @@ function readdirStreamStat (dir, options) { /***/ }), -/* 698 */ +/* 687 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84820,11 +81629,11 @@ function readdirStreamStat (dir, options) { module.exports = readdirSync; -const DirectoryReader = __webpack_require__(699); +const DirectoryReader = __webpack_require__(688); let syncFacade = { - fs: __webpack_require__(704), - forEach: __webpack_require__(705), + fs: __webpack_require__(693), + forEach: __webpack_require__(694), sync: true }; @@ -84853,7 +81662,7 @@ function readdirSync (dir, options, internalOptions) { /***/ }), -/* 699 */ +/* 688 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84862,9 +81671,9 @@ function readdirSync (dir, options, internalOptions) { const Readable = __webpack_require__(137).Readable; const EventEmitter = __webpack_require__(155).EventEmitter; const path = __webpack_require__(4); -const normalizeOptions = __webpack_require__(700); -const stat = __webpack_require__(702); -const call = __webpack_require__(703); +const normalizeOptions = __webpack_require__(689); +const stat = __webpack_require__(691); +const call = __webpack_require__(692); /** * Asynchronously reads the contents of a directory and streams the results @@ -85240,14 +82049,14 @@ module.exports = DirectoryReader; /***/ }), -/* 700 */ +/* 689 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const globToRegExp = __webpack_require__(701); +const globToRegExp = __webpack_require__(690); module.exports = normalizeOptions; @@ -85424,7 +82233,7 @@ function normalizeOptions (options, internalOptions) { /***/ }), -/* 701 */ +/* 690 */ /***/ (function(module, exports) { module.exports = function (glob, opts) { @@ -85561,13 +82370,13 @@ module.exports = function (glob, opts) { /***/ }), -/* 702 */ +/* 691 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const call = __webpack_require__(703); +const call = __webpack_require__(692); module.exports = stat; @@ -85642,7 +82451,7 @@ function symlinkStat (fs, path, lstats, callback) { /***/ }), -/* 703 */ +/* 692 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85703,14 +82512,14 @@ function callOnce (fn) { /***/ }), -/* 704 */ +/* 693 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(133); -const call = __webpack_require__(703); +const call = __webpack_require__(692); /** * A facade around {@link fs.readdirSync} that allows it to be called @@ -85774,7 +82583,7 @@ exports.lstat = function (path, callback) { /***/ }), -/* 705 */ +/* 694 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85803,7 +82612,7 @@ function syncForEach (array, iterator, done) { /***/ }), -/* 706 */ +/* 695 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85811,12 +82620,12 @@ function syncForEach (array, iterator, done) { module.exports = readdirAsync; -const maybe = __webpack_require__(707); -const DirectoryReader = __webpack_require__(699); +const maybe = __webpack_require__(696); +const DirectoryReader = __webpack_require__(688); let asyncFacade = { fs: __webpack_require__(133), - forEach: __webpack_require__(708), + forEach: __webpack_require__(697), async: true }; @@ -85858,7 +82667,7 @@ function readdirAsync (dir, options, callback, internalOptions) { /***/ }), -/* 707 */ +/* 696 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85885,7 +82694,7 @@ module.exports = function maybe (cb, promise) { /***/ }), -/* 708 */ +/* 697 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85921,7 +82730,7 @@ function asyncForEach (array, iterator, done) { /***/ }), -/* 709 */ +/* 698 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85929,11 +82738,11 @@ function asyncForEach (array, iterator, done) { module.exports = readdirStream; -const DirectoryReader = __webpack_require__(699); +const DirectoryReader = __webpack_require__(688); let streamFacade = { fs: __webpack_require__(133), - forEach: __webpack_require__(708), + forEach: __webpack_require__(697), async: true }; @@ -85953,16 +82762,16 @@ function readdirStream (dir, options, internalOptions) { /***/ }), -/* 710 */ +/* 699 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var path = __webpack_require__(4); -var deep_1 = __webpack_require__(711); -var entry_1 = __webpack_require__(713); -var pathUtil = __webpack_require__(712); +var deep_1 = __webpack_require__(700); +var entry_1 = __webpack_require__(702); +var pathUtil = __webpack_require__(701); var Reader = /** @class */ (function () { function Reader(options) { this.options = options; @@ -86028,14 +82837,14 @@ exports.default = Reader; /***/ }), -/* 711 */ +/* 700 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(712); -var patternUtils = __webpack_require__(529); +var pathUtils = __webpack_require__(701); +var patternUtils = __webpack_require__(518); var DeepFilter = /** @class */ (function () { function DeepFilter(options, micromatchOptions) { this.options = options; @@ -86118,7 +82927,7 @@ exports.default = DeepFilter; /***/ }), -/* 712 */ +/* 701 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86149,14 +82958,14 @@ exports.makeAbsolute = makeAbsolute; /***/ }), -/* 713 */ +/* 702 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(712); -var patternUtils = __webpack_require__(529); +var pathUtils = __webpack_require__(701); +var patternUtils = __webpack_require__(518); var EntryFilter = /** @class */ (function () { function EntryFilter(options, micromatchOptions) { this.options = options; @@ -86241,7 +83050,7 @@ exports.default = EntryFilter; /***/ }), -/* 714 */ +/* 703 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86261,8 +83070,8 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var stream = __webpack_require__(137); -var fsStat = __webpack_require__(715); -var fs_1 = __webpack_require__(719); +var fsStat = __webpack_require__(704); +var fs_1 = __webpack_require__(708); var FileSystemStream = /** @class */ (function (_super) { __extends(FileSystemStream, _super); function FileSystemStream() { @@ -86312,14 +83121,14 @@ exports.default = FileSystemStream; /***/ }), -/* 715 */ +/* 704 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const optionsManager = __webpack_require__(716); -const statProvider = __webpack_require__(718); +const optionsManager = __webpack_require__(705); +const statProvider = __webpack_require__(707); /** * Asynchronous API. */ @@ -86350,13 +83159,13 @@ exports.statSync = statSync; /***/ }), -/* 716 */ +/* 705 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsAdapter = __webpack_require__(717); +const fsAdapter = __webpack_require__(706); function prepare(opts) { const options = Object.assign({ fs: fsAdapter.getFileSystemAdapter(opts ? opts.fs : undefined), @@ -86369,7 +83178,7 @@ exports.prepare = prepare; /***/ }), -/* 717 */ +/* 706 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86392,7 +83201,7 @@ exports.getFileSystemAdapter = getFileSystemAdapter; /***/ }), -/* 718 */ +/* 707 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86444,7 +83253,7 @@ exports.isFollowedSymlink = isFollowedSymlink; /***/ }), -/* 719 */ +/* 708 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86475,7 +83284,7 @@ exports.default = FileSystem; /***/ }), -/* 720 */ +/* 709 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86495,9 +83304,9 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var stream = __webpack_require__(137); -var readdir = __webpack_require__(697); -var reader_1 = __webpack_require__(710); -var fs_stream_1 = __webpack_require__(714); +var readdir = __webpack_require__(686); +var reader_1 = __webpack_require__(699); +var fs_stream_1 = __webpack_require__(703); var TransformStream = /** @class */ (function (_super) { __extends(TransformStream, _super); function TransformStream(reader) { @@ -86565,7 +83374,7 @@ exports.default = ReaderStream; /***/ }), -/* 721 */ +/* 710 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86584,9 +83393,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(697); -var reader_1 = __webpack_require__(710); -var fs_sync_1 = __webpack_require__(722); +var readdir = __webpack_require__(686); +var reader_1 = __webpack_require__(699); +var fs_sync_1 = __webpack_require__(711); var ReaderSync = /** @class */ (function (_super) { __extends(ReaderSync, _super); function ReaderSync() { @@ -86646,7 +83455,7 @@ exports.default = ReaderSync; /***/ }), -/* 722 */ +/* 711 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86665,8 +83474,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var fsStat = __webpack_require__(715); -var fs_1 = __webpack_require__(719); +var fsStat = __webpack_require__(704); +var fs_1 = __webpack_require__(708); var FileSystemSync = /** @class */ (function (_super) { __extends(FileSystemSync, _super); function FileSystemSync() { @@ -86712,7 +83521,7 @@ exports.default = FileSystemSync; /***/ }), -/* 723 */ +/* 712 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86728,7 +83537,7 @@ exports.flatten = flatten; /***/ }), -/* 724 */ +/* 713 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86749,13 +83558,13 @@ exports.merge = merge; /***/ }), -/* 725 */ +/* 714 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const pathType = __webpack_require__(726); +const pathType = __webpack_require__(715); const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; @@ -86821,13 +83630,13 @@ module.exports.sync = (input, opts) => { /***/ }), -/* 726 */ +/* 715 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(133); -const pify = __webpack_require__(727); +const pify = __webpack_require__(716); function type(fn, fn2, fp) { if (typeof fp !== 'string') { @@ -86870,7 +83679,7 @@ exports.symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 727 */ +/* 716 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86961,17 +83770,17 @@ module.exports = (obj, opts) => { /***/ }), -/* 728 */ +/* 717 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(133); const path = __webpack_require__(4); -const fastGlob = __webpack_require__(525); -const gitIgnore = __webpack_require__(729); -const pify = __webpack_require__(730); -const slash = __webpack_require__(731); +const fastGlob = __webpack_require__(514); +const gitIgnore = __webpack_require__(718); +const pify = __webpack_require__(719); +const slash = __webpack_require__(720); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -87069,7 +83878,7 @@ module.exports.sync = options => { /***/ }), -/* 729 */ +/* 718 */ /***/ (function(module, exports) { // A simple implementation of make-array @@ -87538,7 +84347,7 @@ module.exports = options => new IgnoreBase(options) /***/ }), -/* 730 */ +/* 719 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87613,7 +84422,7 @@ module.exports = (input, options) => { /***/ }), -/* 731 */ +/* 720 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87631,7 +84440,7 @@ module.exports = input => { /***/ }), -/* 732 */ +/* 721 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -87641,7 +84450,7 @@ module.exports = input => { * Released under the MIT License. */ -var isExtglob = __webpack_require__(315); +var isExtglob = __webpack_require__(310); var chars = { '{': '}', '(': ')', '[': ']'}; var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; @@ -87685,17 +84494,17 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 733 */ +/* 722 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); const {constants: fsConstants} = __webpack_require__(133); -const pEvent = __webpack_require__(734); -const CpFileError = __webpack_require__(737); -const fs = __webpack_require__(741); -const ProgressEmitter = __webpack_require__(744); +const pEvent = __webpack_require__(723); +const CpFileError = __webpack_require__(726); +const fs = __webpack_require__(730); +const ProgressEmitter = __webpack_require__(733); const cpFileAsync = async (source, destination, options, progressEmitter) => { let readError; @@ -87809,12 +84618,12 @@ module.exports.sync = (source, destination, options) => { /***/ }), -/* 734 */ +/* 723 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pTimeout = __webpack_require__(735); +const pTimeout = __webpack_require__(724); const symbolAsyncIterator = Symbol.asyncIterator || '@@asyncIterator'; @@ -88105,12 +84914,12 @@ module.exports.iterator = (emitter, event, options) => { /***/ }), -/* 735 */ +/* 724 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pFinally = __webpack_require__(736); +const pFinally = __webpack_require__(725); class TimeoutError extends Error { constructor(message) { @@ -88156,7 +84965,7 @@ module.exports.TimeoutError = TimeoutError; /***/ }), -/* 736 */ +/* 725 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -88178,12 +84987,12 @@ module.exports = (promise, onFinally) => { /***/ }), -/* 737 */ +/* 726 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(738); +const NestedError = __webpack_require__(727); class CpFileError extends NestedError { constructor(message, nested) { @@ -88197,10 +85006,10 @@ module.exports = CpFileError; /***/ }), -/* 738 */ +/* 727 */ /***/ (function(module, exports, __webpack_require__) { -var inherits = __webpack_require__(739); +var inherits = __webpack_require__(728); var NestedError = function (message, nested) { this.nested = nested; @@ -88251,7 +85060,7 @@ module.exports = NestedError; /***/ }), -/* 739 */ +/* 728 */ /***/ (function(module, exports, __webpack_require__) { try { @@ -88259,12 +85068,12 @@ try { if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { - module.exports = __webpack_require__(740); + module.exports = __webpack_require__(729); } /***/ }), -/* 740 */ +/* 729 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -88293,16 +85102,16 @@ if (typeof Object.create === 'function') { /***/ }), -/* 741 */ +/* 730 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(111); const fs = __webpack_require__(132); -const makeDir = __webpack_require__(742); -const pEvent = __webpack_require__(734); -const CpFileError = __webpack_require__(737); +const makeDir = __webpack_require__(731); +const pEvent = __webpack_require__(723); +const CpFileError = __webpack_require__(726); const stat = promisify(fs.stat); const lstat = promisify(fs.lstat); @@ -88399,7 +85208,7 @@ exports.copyFileSync = (source, destination, flags) => { /***/ }), -/* 742 */ +/* 731 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -88407,7 +85216,7 @@ exports.copyFileSync = (source, destination, flags) => { const fs = __webpack_require__(133); const path = __webpack_require__(4); const {promisify} = __webpack_require__(111); -const semver = __webpack_require__(743); +const semver = __webpack_require__(732); const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); @@ -88562,7 +85371,7 @@ module.exports.sync = (input, options) => { /***/ }), -/* 743 */ +/* 732 */ /***/ (function(module, exports) { exports = module.exports = SemVer @@ -90164,7 +86973,7 @@ function coerce (version, options) { /***/ }), -/* 744 */ +/* 733 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90205,7 +87014,7 @@ module.exports = ProgressEmitter; /***/ }), -/* 745 */ +/* 734 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90251,12 +87060,12 @@ exports.default = module.exports; /***/ }), -/* 746 */ +/* 735 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(747); +const NestedError = __webpack_require__(736); class CpyError extends NestedError { constructor(message, nested) { @@ -90270,7 +87079,7 @@ module.exports = CpyError; /***/ }), -/* 747 */ +/* 736 */ /***/ (function(module, exports, __webpack_require__) { var inherits = __webpack_require__(111).inherits; diff --git a/packages/kbn-storybook/index.js b/packages/kbn-storybook/index.js index c7dae20902f1a..77d457f2bb3c0 100644 --- a/packages/kbn-storybook/index.js +++ b/packages/kbn-storybook/index.js @@ -24,7 +24,7 @@ const { first } = require('rxjs/operators'); const storybook = require('@storybook/react/standalone'); const { run } = require('@kbn/dev-utils'); const { generateStorybookEntry } = require('./lib/storybook_entry'); -const { REPO_ROOT, ASSET_DIR, CURRENT_CONFIG } = require('./lib/constants'); +const { ASSET_DIR, CURRENT_CONFIG } = require('./lib/constants'); const { buildDll } = require('./lib/dll'); exports.runStorybookCli = (config) => { @@ -45,14 +45,6 @@ exports.runStorybookCli = (config) => { procRunner, }); - // Build sass and continue when initial build complete - await procRunner.run('watch sass', { - cmd: process.execPath, - args: ['scripts/build_sass', '--watch'], - cwd: REPO_ROOT, - wait: /scss bundles created/, - }); - const subj = new Rx.ReplaySubject(1); generateStorybookEntry({ log, storyGlobs }).subscribe(subj); diff --git a/packages/kbn-storybook/lib/storybook_entry.js b/packages/kbn-storybook/lib/storybook_entry.js index 9eb1b0a458c6a..8b8aa4126ad88 100644 --- a/packages/kbn-storybook/lib/storybook_entry.js +++ b/packages/kbn-storybook/lib/storybook_entry.js @@ -35,7 +35,7 @@ const { REPO_ROOT, STORY_ENTRY_PATH } = require('./constants'); const STORE_ENTRY_DIR = dirname(STORY_ENTRY_PATH); exports.generateStorybookEntry = ({ log, storyGlobs }) => { - const globs = ['built_assets/css/**/*.light.css', ...storyGlobs]; + const globs = [...storyGlobs]; log.info('Storybook globs:\n', globs); const norm = (p) => normalize(relative(STORE_ENTRY_DIR, p)); diff --git a/packages/kbn-storybook/lib/webpack.dll.config.js b/packages/kbn-storybook/lib/webpack.dll.config.js index 661312b9a0581..18dbe3bd049d3 100644 --- a/packages/kbn-storybook/lib/webpack.dll.config.js +++ b/packages/kbn-storybook/lib/webpack.dll.config.js @@ -72,7 +72,6 @@ module.exports = { 'rxjs', 'sinon', 'tinycolor2', - './src/legacy/ui/public/styles/bootstrap/bootstrap_light.less', ], plugins: [ // Produce the DLL and its manifest @@ -118,22 +117,6 @@ module.exports = { }, ], }, - { - test: /\.less$/, - use: [ - { loader: 'style-loader' }, - { loader: 'css-loader', options: { importLoaders: 2 } }, - { - loader: 'postcss-loader', - options: { - config: { - path: require.resolve('@kbn/optimizer/postcss.config.js'), - }, - }, - }, - { loader: 'less-loader' }, - ], - }, { test: /\.(woff|woff2|ttf|eot|svg|ico)(\?|$)/, loader: 'file-loader', diff --git a/packages/kbn-storybook/package.json b/packages/kbn-storybook/package.json index 53ad84da93988..9f12cd1f46c68 100644 --- a/packages/kbn-storybook/package.json +++ b/packages/kbn-storybook/package.json @@ -14,6 +14,7 @@ "@storybook/addon-storyshots": "^5.3.19", "@storybook/react": "^5.3.19", "@storybook/theming": "^5.3.19", + "babel-loader": "^8.0.6", "copy-webpack-plugin": "^6.0.2", "fast-glob": "2.2.7", "glob-watcher": "5.0.3", diff --git a/packages/kbn-storybook/storybook_config/webpack.config.js b/packages/kbn-storybook/storybook_config/webpack.config.js index 7b43d106417b2..d505c4f9a0448 100644 --- a/packages/kbn-storybook/storybook_config/webpack.config.js +++ b/packages/kbn-storybook/storybook_config/webpack.config.js @@ -17,7 +17,7 @@ * under the License. */ -const { parse, resolve } = require('path'); +const { resolve } = require('path'); const webpack = require('webpack'); const webpackMerge = require('webpack-merge'); const { stringifyRequest } = require('loader-utils'); @@ -73,34 +73,13 @@ module.exports = async ({ config: storybookConfig }) => { }, }, }, - { - loader: 'resolve-url-loader', - options: { - // If you don't have arguments (_, __) to the join function, the - // resolve-url-loader fails with a loader misconfiguration error. - // - // eslint-disable-next-line no-unused-vars - join: (_, __) => (uri, base) => { - if (!base || !parse(base).dir.includes('legacy')) { - return null; - } - - // URIs on mixins in src/legacy/public/styles need to be resolved. - if (uri.startsWith('ui/assets')) { - return resolve(REPO_ROOT, 'src/core/server/core_app/', uri.replace('ui/', '')); - } - - return null; - }, - }, - }, { loader: 'sass-loader', options: { prependData(loaderContext) { return `@import ${stringifyRequest( loaderContext, - resolve(REPO_ROOT, 'src/legacy/ui/public/styles/_globals_v7light.scss') + resolve(REPO_ROOT, 'src/core/public/core_app/styles/_globals_v7light.scss') )};\n`; }, sassOptions: { @@ -137,6 +116,9 @@ module.exports = async ({ config: storybookConfig }) => { resolve: { // Tell Webpack about the ts/x extensions extensions: ['.ts', '.tsx', '.scss'], + alias: { + core_app_image_assets: resolve(REPO_ROOT, 'src/core/public/core_app/images'), + }, }, }; diff --git a/packages/kbn-test/src/functional_tests/lib/paths.js b/packages/kbn-test/src/functional_tests/lib/paths.js index 97ba44f4d711e..9ede5a105b08a 100644 --- a/packages/kbn-test/src/functional_tests/lib/paths.js +++ b/packages/kbn-test/src/functional_tests/lib/paths.js @@ -32,4 +32,3 @@ export const KIBANA_FTR_SCRIPT = resolve(KIBANA_ROOT, 'scripts/functional_test_r export const PROJECT_ROOT = resolve(__dirname, '../../../../../../'); export const FUNCTIONAL_CONFIG_PATH = resolve(KIBANA_ROOT, 'test/functional/config'); export const API_CONFIG_PATH = resolve(KIBANA_ROOT, 'test/api_integration/config'); -export const OPTIMIZE_BUNDLE_DIR = resolve(KIBANA_ROOT, 'data/optimize/bundles'); diff --git a/packages/kbn-test/src/index.ts b/packages/kbn-test/src/index.ts index f7321ca713087..50ef521a2d811 100644 --- a/packages/kbn-test/src/index.ts +++ b/packages/kbn-test/src/index.ts @@ -31,7 +31,7 @@ export { runTestsCli, processRunTestsCliOptions, startServersCli, processStartSe export { runTests, startServers } from './functional_tests/tasks'; // @ts-ignore not typed yet -export { OPTIMIZE_BUNDLE_DIR, KIBANA_ROOT } from './functional_tests/lib/paths'; +export { KIBANA_ROOT } from './functional_tests/lib/paths'; // @ts-ignore not typed yet export { esTestConfig, createLegacyEsTestCluster } from './legacy_es'; diff --git a/scripts/build_sass.js b/scripts/build_sass.js deleted file mode 100644 index 4c1c1766761c5..0000000000000 --- a/scripts/build_sass.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -require('../src/setup_node_env'); -require('../src/dev/sass/run_build_sass_cli'); diff --git a/src/cli/cluster/cluster_manager.test.ts b/src/cli/cluster/cluster_manager.test.ts index 2ddccae2fada6..a8e139533d397 100644 --- a/src/cli/cluster/cluster_manager.test.ts +++ b/src/cli/cluster/cluster_manager.test.ts @@ -21,20 +21,6 @@ import * as Rx from 'rxjs'; import { mockCluster } from './cluster_manager.test.mocks'; -jest.mock('./run_kbn_optimizer', () => { - // eslint-disable-next-line @typescript-eslint/no-var-requires,no-shadow - const Rx = require('rxjs'); - - return { - runKbnOptimizer: () => - new Rx.BehaviorSubject({ - type: 'compiler success', - durSec: 0, - bundles: [], - }), - }; -}); - jest.mock('readline', () => ({ createInterface: jest.fn(() => ({ on: jest.fn(), @@ -43,18 +29,26 @@ jest.mock('readline', () => ({ })), })); -const mockConfig: any = { - get: (key: string) => { - expect(key).toBe('optimize.enabled'); - return false; - }, -}; +const mockConfig: any = {}; import { sample } from 'lodash'; -import { ClusterManager } from './cluster_manager'; +import { ClusterManager, SomeCliArgs } from './cluster_manager'; import { Worker } from './worker'; +const CLI_ARGS: SomeCliArgs = { + disableOptimizer: true, + open: false, + oss: false, + quiet: false, + repl: false, + runExamples: false, + silent: false, + watch: false, + cache: false, + dist: false, +}; + describe('CLI cluster manager', () => { beforeEach(() => { mockCluster.fork.mockImplementation(() => { @@ -75,17 +69,18 @@ describe('CLI cluster manager', () => { }); test('has two workers', () => { - const manager = new ClusterManager({}, mockConfig); + const manager = new ClusterManager(CLI_ARGS, mockConfig); - expect(manager.workers).toHaveLength(2); - for (const worker of manager.workers) expect(worker).toBeInstanceOf(Worker); + expect(manager.workers).toHaveLength(1); + for (const worker of manager.workers) { + expect(worker).toBeInstanceOf(Worker); + } - expect(manager.optimizer).toBeInstanceOf(Worker); expect(manager.server).toBeInstanceOf(Worker); }); test('delivers broadcast messages to other workers', () => { - const manager = new ClusterManager({}, mockConfig); + const manager = new ClusterManager(CLI_ARGS, mockConfig); for (const worker of manager.workers) { Worker.prototype.start.call(worker); // bypass the debounced start method @@ -110,7 +105,7 @@ describe('CLI cluster manager', () => { test('correctly configures `BasePathProxy`.', async () => { const basePathProxyMock = { start: jest.fn() }; - new ClusterManager({}, mockConfig, basePathProxyMock as any); + new ClusterManager(CLI_ARGS, mockConfig, basePathProxyMock as any); expect(basePathProxyMock.start).toHaveBeenCalledWith({ shouldRedirectFromOldBasePath: expect.any(Function), @@ -125,7 +120,7 @@ describe('CLI cluster manager', () => { beforeEach(async () => { const basePathProxyMock = { start: jest.fn() }; - clusterManager = new ClusterManager({}, mockConfig, basePathProxyMock as any); + clusterManager = new ClusterManager(CLI_ARGS, mockConfig, basePathProxyMock as any); [[{ delayUntil, shouldRedirectFromOldBasePath }]] = basePathProxyMock.start.mock.calls; }); @@ -147,7 +142,6 @@ describe('CLI cluster manager', () => { describe('delayUntil()', () => { test('returns an observable which emits when the server and kbnOptimizer are ready and completes', async () => { clusterManager.serverReady$.next(false); - clusterManager.optimizerReady$.next(false); clusterManager.kbnOptimizerReady$.next(false); const events: Array = []; diff --git a/src/cli/cluster/cluster_manager.ts b/src/cli/cluster/cluster_manager.ts index 5ada95bfeef94..eb7db8dac7cb6 100644 --- a/src/cli/cluster/cluster_manager.ts +++ b/src/cli/cluster/cluster_manager.ts @@ -27,6 +27,7 @@ import * as Rx from 'rxjs'; import { startWith, mapTo, filter, map, take, tap } from 'rxjs/operators'; import { runKbnOptimizer } from './run_kbn_optimizer'; +import { CliArgs } from '../../core/server/config'; import { LegacyConfig } from '../../core/server/legacy'; import { BasePathProxyServer } from '../../core/server/http'; @@ -35,6 +36,20 @@ import { Worker } from './worker'; process.env.kbnWorkerType = 'managr'; +export type SomeCliArgs = Pick< + CliArgs, + | 'quiet' + | 'silent' + | 'repl' + | 'disableOptimizer' + | 'open' + | 'watch' + | 'oss' + | 'runExamples' + | 'cache' + | 'dist' +>; + const firstAllTrue = (...sources: Array>) => Rx.combineLatest(...sources).pipe( filter((values) => values.every((v) => v === true)), @@ -43,7 +58,6 @@ const firstAllTrue = (...sources: Array>) => ); export class ClusterManager { - public optimizer: Worker; public server: Worker; public workers: Worker[]; @@ -56,45 +70,33 @@ export class ClusterManager { // exposed for testing public readonly serverReady$ = new Rx.ReplaySubject(1); // exposed for testing - public readonly optimizerReady$ = new Rx.ReplaySubject(1); - // exposed for testing public readonly kbnOptimizerReady$ = new Rx.ReplaySubject(1); - constructor( - opts: Record, - config: LegacyConfig, - basePathProxy?: BasePathProxyServer - ) { + constructor(opts: SomeCliArgs, config: LegacyConfig, basePathProxy?: BasePathProxyServer) { this.log = new Log(opts.quiet, opts.silent); this.inReplMode = !!opts.repl; this.basePathProxy = basePathProxy; - if (config.get('optimize.enabled') !== false) { - // run @kbn/optimizer and write it's state to kbnOptimizerReady$ + // run @kbn/optimizer and write it's state to kbnOptimizerReady$ + if (opts.disableOptimizer) { + this.kbnOptimizerReady$.next(true); + } else { runKbnOptimizer(opts, config) .pipe( map(({ state }) => state.phase === 'success' || state.phase === 'issue'), tap({ error: (error) => { - this.log.bad('New platform optimizer error', error.stack); + this.log.bad('@kbn/optimizer error', error.stack); process.exit(1); }, }) ) .subscribe(this.kbnOptimizerReady$); - } else { - this.kbnOptimizerReady$.next(true); } const serverArgv = []; - const optimizerArgv = ['--plugins.initialize=false', '--server.autoListen=false']; if (this.basePathProxy) { - optimizerArgv.push( - `--server.basePath=${this.basePathProxy.basePath}`, - '--server.rewriteBasePath=true' - ); - serverArgv.push( `--server.port=${this.basePathProxy.targetPort}`, `--server.basePath=${this.basePathProxy.basePath}`, @@ -103,13 +105,6 @@ export class ClusterManager { } this.workers = [ - (this.optimizer = new Worker({ - type: 'optmzr', - title: 'optimizer', - log: this.log, - argv: optimizerArgv, - watch: false, - })), (this.server = new Worker({ type: 'server', log: this.log, @@ -126,18 +121,6 @@ export class ClusterManager { .pipe(startWith(this.server.listening || this.server.crashed)) .subscribe(this.serverReady$); - // write optimizer status to the optimizerReady$ subject - Rx.merge( - Rx.fromEvent(this.optimizer, 'optimizeStatus'), - Rx.defer(() => { - if (this.optimizer.fork) { - this.optimizer.fork.send({ optimizeReady: '?' }); - } - }) - ) - .pipe(map((msg: any) => msg && !!msg.success)) - .subscribe(this.optimizerReady$); - // broker messages between workers this.workers.forEach((worker) => { worker.on('broadcast', (msg) => { @@ -224,7 +207,7 @@ export class ClusterManager { } setupOpen(openUrl: string) { - firstAllTrue(this.serverReady$, this.kbnOptimizerReady$, this.optimizerReady$) + firstAllTrue(this.serverReady$, this.kbnOptimizerReady$) .toPromise() .then(() => { opn(openUrl); diff --git a/src/cli/cluster/run_kbn_optimizer.ts b/src/cli/cluster/run_kbn_optimizer.ts index f36ce70f65a45..c231437da3943 100644 --- a/src/cli/cluster/run_kbn_optimizer.ts +++ b/src/cli/cluster/run_kbn_optimizer.ts @@ -28,9 +28,12 @@ import { } from '@kbn/dev-utils'; import { runOptimizer, OptimizerConfig, logOptimizerState } from '@kbn/optimizer'; +import { CliArgs } from '../../core/server/config'; import { LegacyConfig } from '../../core/server/legacy'; -export function runKbnOptimizer(opts: Record, config: LegacyConfig) { +type SomeCliArgs = Pick; + +export function runKbnOptimizer(opts: SomeCliArgs, config: LegacyConfig) { const optimizerConfig = OptimizerConfig.create({ repoRoot: REPO_ROOT, watch: !!opts.watch, diff --git a/src/cli/serve/serve.js b/src/cli/serve/serve.js index 972bcdba6b403..3bc710e44f7bc 100644 --- a/src/cli/serve/serve.js +++ b/src/cli/serve/serve.js @@ -77,7 +77,6 @@ function applyConfigOverrides(rawConfig, opts, extraCliOptions) { if (opts.dev) { set('env', 'development'); - set('optimize.watch', true); if (!has('elasticsearch.username')) { set('elasticsearch.username', 'kibana_system'); @@ -194,7 +193,7 @@ export default function (program) { [] ) .option('--plugins ', 'an alias for --plugin-dir', pluginDirCollector) - .option('--optimize', 'Run the legacy plugin optimizer and then stop the server'); + .option('--optimize', 'Deprecated, running the optimizer is no longer required'); if (CAN_REPL) { command.option('--repl', 'Run the server with a REPL prompt and access to the server object'); @@ -220,6 +219,7 @@ export default function (program) { "Don't put a proxy in front of the dev server, which adds a random basePath" ) .option('--no-watch', 'Prevents automatic restarts of the server in --dev mode') + .option('--no-optimizer', 'Disable the kbn/optimizer completely') .option('--no-cache', 'Disable the kbn/optimizer cache') .option('--no-dev-config', 'Prevents loading the kibana.dev.yml file in --dev mode'); } @@ -255,6 +255,7 @@ export default function (program) { // elastic.co links. basePath: opts.runExamples ? false : !!opts.basePath, optimize: !!opts.optimize, + disableOptimizer: !opts.optimizer, oss: !!opts.oss, cache: !!opts.cache, dist: !!opts.dist, diff --git a/src/core/MIGRATION.md b/src/core/MIGRATION.md index 72945597758e2..ea0e8d66d58f2 100644 --- a/src/core/MIGRATION.md +++ b/src/core/MIGRATION.md @@ -1322,7 +1322,6 @@ This table shows where these uiExports have moved to in the New Platform. In mos | `savedObjectTypes` | | Part of SavedObjects, see [#33587](https://github.com/elastic/kibana/issues/33587) | | `search` | | | | `shareContextMenuExtensions` | | | -| `styleSheetPaths` | | | | `taskDefinitions` | | Should be an API on the taskManager plugin. | | `uiCapabilities` | [`core.application.register`](/docs/development/core/public/kibana-plugin-core-public.applicationsetup.register.md) | | | `uiSettingDefaults` | [`core.uiSettings.register`](/docs/development/core/server/kibana-plugin-core-server.uisettingsservicesetup.md) | | diff --git a/src/core/server/core_app/assets/images/bg_bottom_branded.svg b/src/core/public/core_app/images/bg_bottom_branded.svg similarity index 100% rename from src/core/server/core_app/assets/images/bg_bottom_branded.svg rename to src/core/public/core_app/images/bg_bottom_branded.svg diff --git a/src/core/server/core_app/assets/images/bg_bottom_branded_dark.svg b/src/core/public/core_app/images/bg_bottom_branded_dark.svg similarity index 100% rename from src/core/server/core_app/assets/images/bg_bottom_branded_dark.svg rename to src/core/public/core_app/images/bg_bottom_branded_dark.svg diff --git a/src/core/server/core_app/assets/images/bg_top_branded.svg b/src/core/public/core_app/images/bg_top_branded.svg similarity index 100% rename from src/core/server/core_app/assets/images/bg_top_branded.svg rename to src/core/public/core_app/images/bg_top_branded.svg diff --git a/src/core/server/core_app/assets/images/bg_top_branded_dark.svg b/src/core/public/core_app/images/bg_top_branded_dark.svg similarity index 100% rename from src/core/server/core_app/assets/images/bg_top_branded_dark.svg rename to src/core/public/core_app/images/bg_top_branded_dark.svg diff --git a/src/legacy/ui/public/styles/_globals_v7dark.scss b/src/core/public/core_app/styles/_globals_v7dark.scss similarity index 81% rename from src/legacy/ui/public/styles/_globals_v7dark.scss rename to src/core/public/core_app/styles/_globals_v7dark.scss index d5a8535f32718..8ac841aab8469 100644 --- a/src/legacy/ui/public/styles/_globals_v7dark.scss +++ b/src/core/public/core_app/styles/_globals_v7dark.scss @@ -1,7 +1,6 @@ // v7dark global scope // -// prepended to all .scss imports (from JS, when v7dark theme selected) and -// legacy uiExports.styleSheetPaths when any dark theme is selected +// prepended to all .scss imports (from JS, when v7dark theme selected) @import '@elastic/eui/src/themes/eui/eui_colors_dark'; diff --git a/src/legacy/ui/public/styles/_globals_v7light.scss b/src/core/public/core_app/styles/_globals_v7light.scss similarity index 80% rename from src/legacy/ui/public/styles/_globals_v7light.scss rename to src/core/public/core_app/styles/_globals_v7light.scss index 522b346b64900..701bbdfe03662 100644 --- a/src/legacy/ui/public/styles/_globals_v7light.scss +++ b/src/core/public/core_app/styles/_globals_v7light.scss @@ -1,7 +1,6 @@ // v7light global scope // -// prepended to all .scss imports (from JS, when v7light theme selected) and -// legacy uiExports.styleSheetPaths when any dark theme is selected +// prepended to all .scss imports (from JS, when v7light theme selected) @import '@elastic/eui/src/themes/eui/eui_colors_light'; diff --git a/src/legacy/ui/public/styles/_globals_v8dark.scss b/src/core/public/core_app/styles/_globals_v8dark.scss similarity index 100% rename from src/legacy/ui/public/styles/_globals_v8dark.scss rename to src/core/public/core_app/styles/_globals_v8dark.scss diff --git a/src/legacy/ui/public/styles/_globals_v8light.scss b/src/core/public/core_app/styles/_globals_v8light.scss similarity index 100% rename from src/legacy/ui/public/styles/_globals_v8light.scss rename to src/core/public/core_app/styles/_globals_v8light.scss diff --git a/src/legacy/ui/public/styles/_mixins.scss b/src/core/public/core_app/styles/_mixins.scss similarity index 88% rename from src/legacy/ui/public/styles/_mixins.scss rename to src/core/public/core_app/styles/_mixins.scss index e335ef88a01b5..4e5ed5d42f126 100644 --- a/src/legacy/ui/public/styles/_mixins.scss +++ b/src/core/public/core_app/styles/_mixins.scss @@ -89,7 +89,7 @@ z-index: 1; width: 310px; height: 477px; - content: url(lightOrDarkTheme('ui/assets/images/bg_top_branded.svg', 'ui/assets/images/bg_top_branded_dark.svg')); + content: url(lightOrDarkTheme('~core_app_image_assets/bg_top_branded.svg', '~core_app_image_assets/bg_top_branded_dark.svg')); } &::after { @@ -99,7 +99,7 @@ z-index: 1; width: 313px; height: 461px; - content: url(lightOrDarkTheme('ui/assets/images/bg_bottom_branded.svg', 'ui/assets/images/bg_bottom_branded_dark.svg')); + content: url(lightOrDarkTheme('~core_app_image_assets/bg_bottom_branded.svg', '~core_app_image_assets/bg_bottom_branded_dark.svg')); } @keyframes kibanaFullScreenGraphics_FadeIn { diff --git a/src/core/server/bootstrap.ts b/src/core/server/bootstrap.ts index 5dbe5a0b4f955..c0cbe3a39ff54 100644 --- a/src/core/server/bootstrap.ts +++ b/src/core/server/bootstrap.ts @@ -55,6 +55,11 @@ export async function bootstrap({ onRootShutdown('Kibana REPL mode can only be run in development mode.'); } + if (cliArgs.optimize) { + // --optimize is deprecated and does nothing now, avoid starting up and just shutdown + return; + } + const env = Env.createDefault({ configs, cliArgs, @@ -106,12 +111,6 @@ export async function bootstrap({ } catch (err) { await shutdown(err); } - - if (cliArgs.optimize) { - const cliLogger = root.logger.get('cli'); - cliLogger.info('Optimization done.'); - await shutdown(); - } } function onRootShutdown(reason?: any) { diff --git a/src/core/server/config/__mocks__/env.ts b/src/core/server/config/__mocks__/env.ts index 80cfab81fb557..f37ac14e60235 100644 --- a/src/core/server/config/__mocks__/env.ts +++ b/src/core/server/config/__mocks__/env.ts @@ -36,7 +36,9 @@ export function getEnvOptions(options: DeepPartial = {}): EnvOptions watch: false, repl: false, basePath: false, - optimize: false, + disableOptimizer: true, + cache: true, + dist: false, oss: false, runExamples: false, ...(options.cliArgs || {}), diff --git a/src/core/server/config/__snapshots__/env.test.ts.snap b/src/core/server/config/__snapshots__/env.test.ts.snap index 204b8a70aa877..005fa6e680f8b 100644 --- a/src/core/server/config/__snapshots__/env.test.ts.snap +++ b/src/core/server/config/__snapshots__/env.test.ts.snap @@ -5,10 +5,12 @@ Env { "binDir": "/test/kibanaRoot/bin", "cliArgs": Object { "basePath": false, + "cache": true, "dev": true, + "disableOptimizer": true, + "dist": false, "envName": "development", "open": false, - "optimize": false, "oss": false, "quiet": false, "repl": false, @@ -49,10 +51,12 @@ Env { "binDir": "/test/kibanaRoot/bin", "cliArgs": Object { "basePath": false, + "cache": true, "dev": false, + "disableOptimizer": true, + "dist": false, "envName": "production", "open": false, - "optimize": false, "oss": false, "quiet": false, "repl": false, @@ -93,9 +97,11 @@ Env { "binDir": "/test/kibanaRoot/bin", "cliArgs": Object { "basePath": false, + "cache": true, "dev": true, + "disableOptimizer": true, + "dist": false, "open": false, - "optimize": false, "oss": false, "quiet": false, "repl": false, @@ -136,9 +142,11 @@ Env { "binDir": "/test/kibanaRoot/bin", "cliArgs": Object { "basePath": false, + "cache": true, "dev": false, + "disableOptimizer": true, + "dist": false, "open": false, - "optimize": false, "oss": false, "quiet": false, "repl": false, @@ -179,9 +187,11 @@ Env { "binDir": "/test/kibanaRoot/bin", "cliArgs": Object { "basePath": false, + "cache": true, "dev": false, + "disableOptimizer": true, + "dist": false, "open": false, - "optimize": false, "oss": false, "quiet": false, "repl": false, @@ -222,9 +232,11 @@ Env { "binDir": "/some/home/dir/bin", "cliArgs": Object { "basePath": false, + "cache": true, "dev": false, + "disableOptimizer": true, + "dist": false, "open": false, - "optimize": false, "oss": false, "quiet": false, "repl": false, diff --git a/src/core/server/config/deprecation/core_deprecations.ts b/src/core/server/config/deprecation/core_deprecations.ts index 6cc0e5ef138d5..e4e881ab24372 100644 --- a/src/core/server/config/deprecation/core_deprecations.ts +++ b/src/core/server/config/deprecation/core_deprecations.ts @@ -113,18 +113,29 @@ const mapManifestServiceUrlDeprecation: ConfigDeprecation = (settings, fromPath, return settings; }; -export const coreDeprecationProvider: ConfigDeprecationProvider = ({ - unusedFromRoot, - renameFromRoot, -}) => [ +export const coreDeprecationProvider: ConfigDeprecationProvider = ({ unusedFromRoot }) => [ unusedFromRoot('savedObjects.indexCheckTimeout'), unusedFromRoot('server.xsrf.token'), unusedFromRoot('maps.manifestServiceUrl'), - renameFromRoot('optimize.lazy', 'optimize.watch'), - renameFromRoot('optimize.lazyPort', 'optimize.watchPort'), - renameFromRoot('optimize.lazyHost', 'optimize.watchHost'), - renameFromRoot('optimize.lazyPrebuild', 'optimize.watchPrebuild'), - renameFromRoot('optimize.lazyProxyTimeout', 'optimize.watchProxyTimeout'), + unusedFromRoot('optimize.lazy'), + unusedFromRoot('optimize.lazyPort'), + unusedFromRoot('optimize.lazyHost'), + unusedFromRoot('optimize.lazyPrebuild'), + unusedFromRoot('optimize.lazyProxyTimeout'), + unusedFromRoot('optimize.enabled'), + unusedFromRoot('optimize.bundleFilter'), + unusedFromRoot('optimize.bundleDir'), + unusedFromRoot('optimize.viewCaching'), + unusedFromRoot('optimize.watch'), + unusedFromRoot('optimize.watchPort'), + unusedFromRoot('optimize.watchHost'), + unusedFromRoot('optimize.watchPrebuild'), + unusedFromRoot('optimize.watchProxyTimeout'), + unusedFromRoot('optimize.useBundleCache'), + unusedFromRoot('optimize.sourceMaps'), + unusedFromRoot('optimize.workers'), + unusedFromRoot('optimize.profile'), + unusedFromRoot('optimize.validateSyntaxOfNodeModules'), configPathDeprecation, dataPathDeprecation, rewriteBasePathDeprecation, diff --git a/src/core/server/config/env.ts b/src/core/server/config/env.ts index d8068c5b383fa..d8b056996315b 100644 --- a/src/core/server/config/env.ts +++ b/src/core/server/config/env.ts @@ -40,10 +40,14 @@ export interface CliArgs { watch: boolean; repl: boolean; basePath: boolean; - optimize: boolean; open: boolean; oss: boolean; + /** @deprecated use disableOptimizer to know if the @kbn/optimizer is disabled in development */ + optimize?: boolean; runExamples: boolean; + disableOptimizer: boolean; + cache: boolean; + dist: boolean; } export class Env { diff --git a/src/core/server/config/integration_tests/config_deprecation.test.ts b/src/core/server/config/integration_tests/config_deprecation.test.ts index 56385f3b171c9..65f5bbdac5248 100644 --- a/src/core/server/config/integration_tests/config_deprecation.test.ts +++ b/src/core/server/config/integration_tests/config_deprecation.test.ts @@ -24,6 +24,10 @@ import * as kbnTestServer from '../../../../test_utils/kbn_server'; describe('configuration deprecations', () => { let root: ReturnType; + beforeEach(() => { + jest.clearAllMocks(); + }); + afterEach(async () => { if (root) { await root.shutdown(); @@ -36,13 +40,7 @@ describe('configuration deprecations', () => { await root.setup(); const logs = loggingSystemMock.collect(mockLoggingSystem); - const warnings = logs.warn.flatMap((i) => i); - expect(warnings).not.toContain( - '"optimize.lazy" is deprecated and has been replaced by "optimize.watch"' - ); - expect(warnings).not.toContain( - '"optimize.lazyPort" is deprecated and has been replaced by "optimize.watchPort"' - ); + expect(logs.warn.flat()).toMatchInlineSnapshot(`Array []`); }); it('should log deprecation warnings for core deprecations', async () => { @@ -56,12 +54,11 @@ describe('configuration deprecations', () => { await root.setup(); const logs = loggingSystemMock.collect(mockLoggingSystem); - const warnings = logs.warn.flatMap((i) => i); - expect(warnings).toContain( - '"optimize.lazy" is deprecated and has been replaced by "optimize.watch"' - ); - expect(warnings).toContain( - '"optimize.lazyPort" is deprecated and has been replaced by "optimize.watchPort"' - ); + expect(logs.warn.flat()).toMatchInlineSnapshot(` + Array [ + "optimize.lazy is deprecated and is no longer used", + "optimize.lazyPort is deprecated and is no longer used", + ] + `); }); }); diff --git a/src/core/server/core_app/assets/fonts/readme.md b/src/core/server/core_app/assets/fonts/readme.md index 8bb92cc6aa0d9..4042fd98a7a0e 100644 --- a/src/core/server/core_app/assets/fonts/readme.md +++ b/src/core/server/core_app/assets/fonts/readme.md @@ -6,8 +6,3 @@ Kibana packages two fonts: * [Roboto Mono](https://fonts.google.com/specimen/Roboto+Mono) was pulled from the Google Fonts website on January 22, 2019. Licenses for both can be found in the folders below this root. - - -## How fonts are loaded - -Reference the `src/legacy/ui/ui_render/views/chrome.pug` which makes the font-face CSS declarations against the files contained here. References to those those faces are called directly in [EUI](https://github.com/elastic/eui) primarily through the [typography variables](https://github.com/elastic/eui/blob/master/src/global_styling/variables/_typography.scss). \ No newline at end of file diff --git a/src/core/server/core_app/assets/images/kibana.svg b/src/core/server/core_app/assets/images/kibana.svg deleted file mode 100644 index 6ac1fed080261..0000000000000 --- a/src/core/server/core_app/assets/images/kibana.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/core/server/core_app/assets/legacy_dark_theme.css b/src/core/server/core_app/assets/legacy_dark_theme.css new file mode 100644 index 0000000000000..f5891b361bc43 --- /dev/null +++ b/src/core/server/core_app/assets/legacy_dark_theme.css @@ -0,0 +1,4419 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/* @notice + * This product bundles bootstrap@3.3.6 which is available under a + * "MIT" license. + * + * The MIT License (MIT) + * + * Copyright (c) 2011-2015 Twitter, 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. + */ +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, +.col-sm-1, +.col-md-1, +.col-lg-1, +.col-xs-2, +.col-sm-2, +.col-md-2, +.col-lg-2, +.col-xs-3, +.col-sm-3, +.col-md-3, +.col-lg-3, +.col-xs-4, +.col-sm-4, +.col-md-4, +.col-lg-4, +.col-xs-5, +.col-sm-5, +.col-md-5, +.col-lg-5, +.col-xs-6, +.col-sm-6, +.col-md-6, +.col-lg-6, +.col-xs-7, +.col-sm-7, +.col-md-7, +.col-lg-7, +.col-xs-8, +.col-sm-8, +.col-md-8, +.col-lg-8, +.col-xs-9, +.col-sm-9, +.col-md-9, +.col-lg-9, +.col-xs-10, +.col-sm-10, +.col-md-10, +.col-lg-10, +.col-xs-11, +.col-sm-11, +.col-md-11, +.col-lg-11, +.col-xs-12, +.col-sm-12, +.col-md-12, +.col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11, +.col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, + .col-sm-2, + .col-sm-3, + .col-sm-4, + .col-sm-5, + .col-sm-6, + .col-sm-7, + .col-sm-8, + .col-sm-9, + .col-sm-10, + .col-sm-11, + .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, + .col-md-2, + .col-md-3, + .col-md-4, + .col-md-5, + .col-md-6, + .col-md-7, + .col-md-8, + .col-md-9, + .col-md-10, + .col-md-11, + .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, + .col-lg-2, + .col-lg-3, + .col-lg-4, + .col-lg-5, + .col-lg-6, + .col-lg-7, + .col-lg-8, + .col-lg-9, + .col-lg-10, + .col-lg-11, + .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; + font-size: 14px; +} +.table thead { + font-size: 12px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #343741; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 1px solid #343741; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #343741; +} +.table .table { + background-color: #1D1E24; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; + font-size: 12px; +} +.table-bordered { + border: 1px solid #343741; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #343741; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #343741; +} +.table-hover > tbody > tr:hover { + background-color: #343741; +} +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #343741; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #292b33; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #7DE2D1; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #68ddca; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #1BA9F5; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #0a9dec; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #FF977A; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #ff8361; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #FF6666; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ff4c4c; +} +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #343741; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +.form-control { + display: block; + width: 100%; + height: 32px; + padding: 5px 15px; + font-size: 14px; + line-height: 1.42857143; + color: #F5F7FA; + background-color: #1a1a20; + background-image: none; + border: 1px solid #343741; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #1BA9F5; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(27, 169, 245, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(27, 169, 245, 0.6); +} +.form-control::-moz-placeholder { + color: #535966; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #535966; +} +.form-control::-webkit-input-placeholder { + color: #535966; +} +.form-control::-ms-expand { + border: 0; + background-color: transparent; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #343741; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +.form-group:not(:empty) { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 6px; + padding-bottom: 6px; + margin-bottom: 0; + min-height: 34px; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-left: 0; + padding-right: 0; +} +.input-sm { + height: 32px; + padding: 6px 9px; + font-size: 12px; + line-height: 1.5; + border-radius: 4px; +} +select.input-sm { + height: 32px; + line-height: 32px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 32px; + padding: 6px 9px; + font-size: 12px; + line-height: 1.5; + border-radius: 4px; +} +.form-group-sm select.form-control { + height: 32px; + line-height: 32px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 32px; + min-height: 32px; + padding: 7px 9px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 62px; + padding: 18px 27px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 4px; +} +select.input-lg { + height: 62px; + line-height: 62px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 62px; + padding: 18px 27px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 4px; +} +.form-group-lg select.form-control { + height: 62px; + line-height: 62px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 62px; + min-height: 38px; + padding: 19px 27px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 40px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 32px; + height: 32px; + line-height: 32px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 62px; + height: 62px; + line-height: 62px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 32px; + height: 32px; + line-height: 32px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #1D1E24; +} +.has-success .form-control { + border-color: #1D1E24; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #060608; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4b4d5c; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4b4d5c; +} +.has-success .input-group-addon { + color: #1D1E24; + border-color: #1D1E24; + background-color: #7DE2D1; +} +.has-success .form-control-feedback { + color: #1D1E24; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #1D1E24; +} +.has-warning .form-control { + border-color: #1D1E24; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #060608; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4b4d5c; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4b4d5c; +} +.has-warning .input-group-addon { + color: #1D1E24; + border-color: #1D1E24; + background-color: #FF977A; +} +.has-warning .form-control-feedback { + color: #1D1E24; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #1D1E24; +} +.has-error .form-control { + border-color: #1D1E24; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #060608; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4b4d5c; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4b4d5c; +} +.has-error .input-group-addon { + color: #1D1E24; + border-color: #1D1E24; + background-color: #FF6666; +} +.has-error .form-control-feedback { + color: #1D1E24; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #ffffff; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 6px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 26px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 6px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 19px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 7px; + font-size: 12px; + } +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-muted { + color: #3e434d; +} +.text-primary { + color: #F5F7FA; +} +a.text-primary:hover, +a.text-primary:focus { + color: #d3dce9; +} +.text-success { + color: #1D1E24; +} +a.text-success:hover, +a.text-success:focus { + color: #060608; +} +.text-info { + color: #1D1E24; +} +a.text-info:hover, +a.text-info:focus { + color: #060608; +} +.text-warning { + color: #1D1E24; +} +a.text-warning:hover, +a.text-warning:focus { + color: #060608; +} +.text-danger { + color: #1D1E24; +} +a.text-danger:hover, +a.text-danger:focus { + color: #060608; +} +.bg-info { + background-color: #1BA9F5; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #098dd4; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +@media (min-width: 0) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; +} +/** + * ui/angular-ui-select depends upon these styles. Don't use them in your markup. + * Please use the UI Framework styles instead. + */ +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 5px 15px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + box-shadow: 0 0 0 1px white, 0 0 0 2px #0079a5; + /* 3 */ +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #1D1E24; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #1D1E24; + background-color: #1BA9F5; + border-color: #1BA9F5; +} +.btn-default:focus, +.btn-default.focus { + color: #1D1E24; + background-color: #098dd4; + border-color: #065c8a; +} +.btn-default:hover { + color: #1D1E24; + background-color: #098dd4; + border-color: #0987ca; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #1D1E24; + background-color: #098dd4; + border-color: #0987ca; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #1D1E24; + background-color: #0876b2; + border-color: #065c8a; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #1BA9F5; + border-color: #1BA9F5; +} +.btn-default .badge { + color: #1BA9F5; + background-color: #1D1E24; +} +.btn-primary { + color: #1D1E24; + background-color: #1BA9F5; + border-color: #1BA9F5; +} +.btn-primary:focus, +.btn-primary.focus { + color: #1D1E24; + background-color: #098dd4; + border-color: #065c8a; +} +.btn-primary:hover { + color: #1D1E24; + background-color: #098dd4; + border-color: #0987ca; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #1D1E24; + background-color: #098dd4; + border-color: #0987ca; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #1D1E24; + background-color: #0876b2; + border-color: #065c8a; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #1BA9F5; + border-color: #1BA9F5; +} +.btn-primary .badge { + color: #1BA9F5; + background-color: #1D1E24; +} +.btn-xs { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 4px; +} +.navbar { + position: relative; + min-height: 45px; + margin-bottom: 0px; + border: 1px solid transparent; +} +@media (min-width: 0) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 0) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + overflow-x: visible; + padding-right: 10px; + padding-left: 10px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 0) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -10px; + margin-left: -10px; +} +@media (min-width: 0) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1050; +} +@media (min-width: 0) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + padding: 12.5px 10px; + font-size: 18px; + line-height: 20px; + height: 45px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 0) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -10px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 10px; + padding: 9px 10px; + margin-top: 5.5px; + margin-bottom: 5.5px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 0) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 6.25px -10px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: -1) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 0) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 12.5px; + padding-bottom: 12.5px; + } +} +.navbar-form { + margin-left: -10px; + margin-right: -10px; + padding: 10px 10px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 6.5px; + margin-bottom: 6.5px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: -1) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 0) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-text { + margin-top: 12.5px; + margin-bottom: 12.5px; +} +@media (min-width: 0) { + .navbar-text { + float: left; + margin-left: 10px; + margin-right: 10px; + } +} +@media (min-width: 0) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -10px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #000000; + border-color: transparent; +} +.navbar-default .navbar-brand { + color: #D4DAE5; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #D4DAE5; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #D4DAE5; +} +.navbar-default .navbar-nav > li > a { + color: #D4DAE5; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #D4DAE5; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #F5F7FA; + background-color: transparent; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #D4DAE5; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #000000; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #000000; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #1D1E24; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: transparent; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: transparent; + color: #F5F7FA; +} +@media (max-width: -1) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #D4DAE5; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #D4DAE5; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #F5F7FA; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #D4DAE5; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #D4DAE5; +} +.navbar-default .navbar-link:hover { + color: #D4DAE5; +} +.navbar-inverse { + background-color: #F5F7FA; + border-color: #d3dce9; +} +.navbar-inverse .navbar-brand { + color: #1D1E24; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #1D1E24; + background-color: #ffffff; +} +.navbar-inverse .navbar-text { + color: #1D1E24; +} +.navbar-inverse .navbar-nav > li > a { + color: #343741; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #1D1E24; + background-color: #ffffff; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #1D1E24; + background-color: #D4DAE5; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #3e434d; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #d3dce9; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #d3dce9; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #1D1E24; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #dde4ee; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + background-color: #D4DAE5; + color: #1D1E24; +} +@media (max-width: -1) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #d3dce9; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #d3dce9; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #343741; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #1D1E24; + background-color: #ffffff; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #1D1E24; + background-color: #D4DAE5; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #3e434d; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #343741; +} +.navbar-inverse .navbar-link:hover { + color: #1D1E24; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #FFF; + text-shadow: none; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #FFF; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1070; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #1D1E24; + border: 1px solid #535966; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 4px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1060; + background-color: #FFF; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #2d3039; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #1D1E24; + text-align: center; + background-color: #54B399; + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #7DE2D1; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #1BA9F5; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #FF977A; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #FF6666; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.list-group { + margin-bottom: 20px; + padding-left: 0; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #1D1E24; + border: 1px solid #343741; +} +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.list-group-item--noBorder { + border-top: 0; +} +a.list-group-item, +button.list-group-item { + color: #D4DAE5; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #F5F7FA; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + text-decoration: none; + color: #D4DAE5; + background-color: #25262E; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + background-color: #343741; + color: #3e434d; + cursor: not-allowed; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #3e434d; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #F5F7FA; + background-color: #F5F7FA; + border-color: #F5F7FA; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #ffffff; +} +.list-group-item-success { + color: #1D1E24; + background-color: #7DE2D1; +} +a.list-group-item-success, +button.list-group-item-success { + color: #1D1E24; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #1D1E24; + background-color: #68ddca; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #1D1E24; + border-color: #1D1E24; +} +.list-group-item-info { + color: #1D1E24; + background-color: #1BA9F5; +} +a.list-group-item-info, +button.list-group-item-info { + color: #1D1E24; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #1D1E24; + background-color: #0a9dec; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #1D1E24; + border-color: #1D1E24; +} +.list-group-item-warning { + color: #1D1E24; + background-color: #FF977A; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #1D1E24; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #1D1E24; + background-color: #ff8361; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #1D1E24; + border-color: #1D1E24; +} +.list-group-item-danger { + color: #1D1E24; + background-color: #FF6666; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #1D1E24; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #1D1E24; + background-color: #ff4c4c; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #1D1E24; + border-color: #1D1E24; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #343741; +} +.nav > li.disabled > a { + color: #3e434d; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #3e434d; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #343741; + border-color: #1BA9F5; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #343741; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #343741; + background-color: #1D1E24; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #F5F7FA; + background-color: #1D1E24; + border: 1px solid #343741; + border-bottom-color: transparent; + cursor: default; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #1D1E24; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #1D1E24; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #1D1E24; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #1D1E24; + background-color: #1BA9F5; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #1D1E24; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #1D1E24; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #1D1E24; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + background-color: #7DE2D1; + border-color: #53d9c2; + color: #1D1E24; +} +.alert-success hr { + border-top-color: #3ed4bb; +} +.alert-success .alert-link { + color: #060608; +} +.alert-info { + background-color: #1BA9F5; + border-color: #098dd4; + color: #1D1E24; +} +.alert-info hr { + border-top-color: #087dbb; +} +.alert-info .alert-link { + color: #060608; +} +.alert-warning { + background-color: #FF977A; + border-color: #ff6f47; + color: #1D1E24; +} +.alert-warning hr { + border-top-color: #ff5b2e; +} +.alert-warning .alert-link { + color: #060608; +} +.alert-danger { + background-color: #FF6666; + border-color: #ff3333; + color: #1D1E24; +} +.alert-danger hr { + border-top-color: #ff1919; +} +.alert-danger .alert-link { + color: #060608; +} +.bsTooltip { + position: absolute; + z-index: 1040; + display: block; + font-family: 'Open Sans', Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; + opacity: 0; + filter: alpha(opacity=0); +} +.bsTooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.bsTooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.bsTooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.bsTooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.bsTooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.bsTooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.bsTooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.bsTooltip.top .bsTooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.bsTooltip.top-left .bsTooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.bsTooltip.top-right .bsTooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.bsTooltip.right .bsTooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.bsTooltip.left .bsTooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.bsTooltip.bottom .bsTooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.bsTooltip.bottom-left .bsTooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.bsTooltip.bottom-right .bsTooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #1D1E24; + border: 1px solid #343741; + border-radius: 4px; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.1); + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #343741; +} +.dropdown-menu > li > a, +.dropdown-menu > li > button { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #ababab; + white-space: nowrap; +} +.dropdown-menu > li > button { + appearance: none; + background: none; + border: none; + width: 100%; + text-align: left; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > button:hover, +.dropdown-menu > li > a:focus, +.dropdown-menu > li > button:focus { + text-decoration: none; + color: #1D1E24; + background-color: #F5F7FA; +} +.dropdown-menu > .active > button, +.dropdown-menu > .active > a, +.dropdown-menu > .active > button:hover, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > button:focus, +.dropdown-menu > .active > a:focus { + color: #1D1E24; + text-decoration: none; + outline: 0; + background-color: #F5F7FA; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #535966; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + left: auto; + right: 0; +} +.dropdown-menu-left { + left: 0; + right: auto; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #535966; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 0) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon { + height: 62px; + padding: 18px 27px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 4px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon { + height: 62px; + line-height: 62px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon { + height: 32px; + padding: 6px 9px; + font-size: 12px; + line-height: 1.5; + border-radius: 4px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon { + height: 32px; + line-height: 32px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon { + height: auto; +} +.input-group-addon, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 5px 15px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #F5F7FA; + text-align: center; + background-color: #343741; + border: 1px solid #343741; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 6px 9px; + font-size: 12px; + border-radius: 4px; +} +.input-group-addon.input-lg { + padding: 18px 27px; + font-size: 18px; + border-radius: 4px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 5px 15px; + line-height: 1.42857143; + text-decoration: none; + color: #1BA9F5; + background-color: transparent; + border: 1px solid transparent; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #1BA9F5; + background-color: rgba(0, 0, 0, 0); + border-color: transparent; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #F5F7FA; + background-color: rgba(0, 0, 0, 0); + border-color: transparent; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #F5F7FA; + background-color: rgba(38, 38, 38, 0); + border-color: transparent; + cursor: not-allowed; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 18px 27px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 6px 9px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: rgba(0, 0, 0, 0); +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #1D1E24; + background-color: transparent; + cursor: not-allowed; +} +.label { + display: inline; + padding: 0.2em 0.6em 0.3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #1D1E24; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25em; +} +a.label:hover, +a.label:focus { + color: #1D1E24; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.label-default { + background-color: #1BA9F5; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #098dd4; +} +.label-primary { + background-color: #F5F7FA; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #d3dce9; +} +.label-success { + background-color: #7DE2D1; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #53d9c2; +} +.label-info { + background-color: #1BA9F5; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #098dd4; +} +.label-warning { + background-color: #FF977A; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ff6f47; +} +.label-danger { + background-color: #FF6666; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #ff3333; +} +.panel { + margin-bottom: 20px; + background-color: #1D1E24; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #25262E; + border-top: 1px solid #343741; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #343741; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #343741; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #343741; +} +.panel-default { + border-color: #343741; +} +.panel-default > .panel-heading { + color: #ababab; + background-color: #25262E; + border-color: #343741; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #343741; +} +.panel-default > .panel-heading .badge { + color: #25262E; + background-color: #ababab; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #343741; +} +.panel-primary { + border-color: #F5F7FA; +} +.panel-primary > .panel-heading { + color: #1D1E24; + background-color: #F5F7FA; + border-color: #F5F7FA; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #F5F7FA; +} +.panel-primary > .panel-heading .badge { + color: #F5F7FA; + background-color: #1D1E24; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #F5F7FA; +} +.panel-success { + border-color: #53d9c2; +} +.panel-success > .panel-heading { + color: #1D1E24; + background-color: #7DE2D1; + border-color: #53d9c2; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #53d9c2; +} +.panel-success > .panel-heading .badge { + color: #7DE2D1; + background-color: #1D1E24; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #53d9c2; +} +.panel-info { + border-color: #098dd4; +} +.panel-info > .panel-heading { + color: #1D1E24; + background-color: #1BA9F5; + border-color: #098dd4; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #098dd4; +} +.panel-info > .panel-heading .badge { + color: #1BA9F5; + background-color: #1D1E24; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #098dd4; +} +.panel-warning { + border-color: #ff6f47; +} +.panel-warning > .panel-heading { + color: #1D1E24; + background-color: #FF977A; + border-color: #ff6f47; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ff6f47; +} +.panel-warning > .panel-heading .badge { + color: #FF977A; + background-color: #1D1E24; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ff6f47; +} +.panel-danger { + border-color: #ff3333; +} +.panel-danger > .panel-heading { + color: #1D1E24; + background-color: #FF6666; + border-color: #ff3333; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ff3333; +} +.panel-danger > .panel-heading .badge { + color: #FF6666; + background-color: #1D1E24; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ff3333; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + font-family: 'Open Sans', Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 14px; + background-color: #1D1E24; + background-clip: padding-box; + border: 1px solid #343741; + border-radius: 4px; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.1); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + background-color: #16171c; + border-bottom: 1px solid #0b0b0d; + border-radius: 3px 3px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #070708; + border-top-color: #343741; + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #1D1E24; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #070708; + border-right-color: #343741; +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #1D1E24; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #070708; + border-bottom-color: #343741; + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #1D1E24; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #070708; + border-left-color: #343741; +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #1D1E24; + bottom: -10px; +} +.clearfix:before, +.clearfix:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after, +.nav:before, +.nav:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after { + content: " "; + display: table; +} +.clearfix:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.dl-horizontal dd:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.modal-header:after, +.modal-footer:after, +.nav:after, +.pager:after, +.panel-body:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +.navbar > .container-fluid > .navbar-nav:not(.pull-right):first-child, +.navbar > .container-fluid > .navbar-form:not(.pull-right):first-child { + margin-left: -15px; + margin-top: 4px; +} +.navbar { + border-width: 0; +} +.navbar-btn-link { + margin: 0; + border-radius: 0; +} +@media (max-width: 768px) { + .navbar-btn-link { + width: 100%; + text-align: left; + } +} +.navbar-default .badge { + background-color: #1D1E24; + color: #000000; +} +.navbar-inverse .kbnGlobalNav__logoBrand { + height: 45px; + width: 252px; + background-color: #ffffff; +} +.navbar-inverse .kbnGlobalNav__smallLogoBrand { + height: 45px; + width: 45px; + background-color: #ffffff; +} +.navbar-inverse .badge { + background-color: #1D1E24; + color: #ffffff; +} +.navbar-brand { + cursor: default; + font-size: 1.8em; + user-select: none; +} +.navbar-nav { + font-size: 12px; +} +.navbar-nav > .active > a { + border-bottom-color: #ababab; + background-color: transparent; +} +.navbar-toggle { + margin-top: 4px; +} +.text-primary, +.text-primary:hover { + color: #F5F7FA; +} +.text-success, +.text-success:hover { + color: #7DE2D1; +} +.text-danger, +.text-danger:hover { + color: #FF6666; +} +.text-warning, +.text-warning:hover { + color: #FF977A; +} +.text-info, +.text-info:hover { + color: #1BA9F5; +} +table .success, +.table .success, +table .warning, +.table .warning, +table .danger, +.table .danger, +table .info, +.table .info { + color: #1D1E24; +} +table .success a, +.table .success a, +table .warning a, +.table .warning a, +table .danger a, +.table .danger a, +table .info a, +.table .info a { + color: #1D1E24; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #343741; +} +.form-control, +input { + border-width: 1px; + -webkit-box-shadow: none; + box-shadow: none; +} +.form-control:focus, +input:focus { + -webkit-box-shadow: none; + box-shadow: none; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning .form-control-feedback { + color: #FF977A; +} +.has-warning .form-control, +.has-warning .form-control:focus { + border: 1px solid; + border-color: #FF977A; +} +.has-warning .input-group-addon { + border-color: #FF977A; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error .form-control-feedback { + color: #FF6666; +} +.has-error .form-control, +.has-error .form-control:focus { + border: 1px solid; + border-color: #FF6666; +} +.has-error .input-group-addon { + border-color: #FF6666; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success .form-control-feedback { + color: #7DE2D1; +} +.has-success .form-control, +.has-success .form-control:focus { + border: solid #7DE2D1; +} +.has-success .input-group-addon { + border-color: #7DE2D1; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + border-color: transparent; +} +.pager a, +.pager a:hover { + color: #1D1E24; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + background-color: rgba(38, 38, 38, 0); +} +.panel { + border-radius: 0; + -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + box-shadow: 0 0 0 rgba(0, 0, 0, 0); +} +.progress { + -webkit-box-shadow: none; + box-shadow: none; +} +.progress .progress-bar { + font-size: 10px; + line-height: 10px; +} +.well { + -webkit-box-shadow: none; + box-shadow: none; +} diff --git a/src/core/server/core_app/assets/legacy_light_theme.css b/src/core/server/core_app/assets/legacy_light_theme.css new file mode 100644 index 0000000000000..c5c639f60e3be --- /dev/null +++ b/src/core/server/core_app/assets/legacy_light_theme.css @@ -0,0 +1,4419 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/* @notice + * This product bundles bootstrap@3.3.6 which is available under a + * "MIT" license. + * + * The MIT License (MIT) + * + * Copyright (c) 2011-2015 Twitter, 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. + */ +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, +.col-sm-1, +.col-md-1, +.col-lg-1, +.col-xs-2, +.col-sm-2, +.col-md-2, +.col-lg-2, +.col-xs-3, +.col-sm-3, +.col-md-3, +.col-lg-3, +.col-xs-4, +.col-sm-4, +.col-md-4, +.col-lg-4, +.col-xs-5, +.col-sm-5, +.col-md-5, +.col-lg-5, +.col-xs-6, +.col-sm-6, +.col-md-6, +.col-lg-6, +.col-xs-7, +.col-sm-7, +.col-md-7, +.col-lg-7, +.col-xs-8, +.col-sm-8, +.col-md-8, +.col-lg-8, +.col-xs-9, +.col-sm-9, +.col-md-9, +.col-lg-9, +.col-xs-10, +.col-sm-10, +.col-md-10, +.col-lg-10, +.col-xs-11, +.col-sm-11, +.col-md-11, +.col-lg-11, +.col-xs-12, +.col-sm-12, +.col-md-12, +.col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, +.col-xs-2, +.col-xs-3, +.col-xs-4, +.col-xs-5, +.col-xs-6, +.col-xs-7, +.col-xs-8, +.col-xs-9, +.col-xs-10, +.col-xs-11, +.col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, + .col-sm-2, + .col-sm-3, + .col-sm-4, + .col-sm-5, + .col-sm-6, + .col-sm-7, + .col-sm-8, + .col-sm-9, + .col-sm-10, + .col-sm-11, + .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, + .col-md-2, + .col-md-3, + .col-md-4, + .col-md-5, + .col-md-6, + .col-md-7, + .col-md-8, + .col-md-9, + .col-md-10, + .col-md-11, + .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, + .col-lg-2, + .col-lg-3, + .col-lg-4, + .col-lg-5, + .col-lg-6, + .col-lg-7, + .col-lg-8, + .col-lg-9, + .col-lg-10, + .col-lg-11, + .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; + font-size: 14px; +} +.table thead { + font-size: 12px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #D3DAE6; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 1px solid #D3DAE6; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #D3DAE6; +} +.table .table { + background-color: #FFF; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; + font-size: 12px; +} +.table-bordered { + border: 1px solid #D3DAE6; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #D3DAE6; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #D3DAE6; +} +.table-hover > tbody > tr:hover { + background-color: #D3DAE6; +} +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #D3DAE6; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #c3ccdd; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #017D73; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #01645c; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #006BB4; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #005c9b; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #F5A700; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #dc9600; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #BD271E; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #a7221b; +} +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #D3DAE6; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +.form-control { + display: block; + width: 100%; + height: 32px; + padding: 5px 15px; + font-size: 14px; + line-height: 1.42857143; + color: #343741; + background-color: #fafbfd; + background-image: none; + border: 1px solid #D3DAE6; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #006BB4; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(0, 107, 180, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(0, 107, 180, 0.6); +} +.form-control::-moz-placeholder { + color: #98A2B3; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #98A2B3; +} +.form-control::-webkit-input-placeholder { + color: #98A2B3; +} +.form-control::-ms-expand { + border: 0; + background-color: transparent; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #D3DAE6; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +.form-group:not(:empty) { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 6px; + padding-bottom: 6px; + margin-bottom: 0; + min-height: 34px; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-left: 0; + padding-right: 0; +} +.input-sm { + height: 32px; + padding: 6px 9px; + font-size: 12px; + line-height: 1.5; + border-radius: 4px; +} +select.input-sm { + height: 32px; + line-height: 32px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 32px; + padding: 6px 9px; + font-size: 12px; + line-height: 1.5; + border-radius: 4px; +} +.form-group-sm select.form-control { + height: 32px; + line-height: 32px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 32px; + min-height: 32px; + padding: 7px 9px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 62px; + padding: 18px 27px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 4px; +} +select.input-lg { + height: 62px; + line-height: 62px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 62px; + padding: 18px 27px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 4px; +} +.form-group-lg select.form-control { + height: 62px; + line-height: 62px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 62px; + min-height: 38px; + padding: 19px 27px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 40px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 32px; + height: 32px; + line-height: 32px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 62px; + height: 62px; + line-height: 62px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 32px; + height: 32px; + line-height: 32px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #FFF; +} +.has-success .form-control { + border-color: #FFF; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #e6e6e6; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; +} +.has-success .input-group-addon { + color: #FFF; + border-color: #FFF; + background-color: #017D73; +} +.has-success .form-control-feedback { + color: #FFF; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #FFF; +} +.has-warning .form-control { + border-color: #FFF; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #e6e6e6; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; +} +.has-warning .input-group-addon { + color: #FFF; + border-color: #FFF; + background-color: #F5A700; +} +.has-warning .form-control-feedback { + color: #FFF; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #FFF; +} +.has-error .form-control { + border-color: #FFF; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #e6e6e6; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; +} +.has-error .input-group-addon { + color: #FFF; + border-color: #FFF; + background-color: #BD271E; +} +.has-error .form-control-feedback { + color: #FFF; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #6d7388; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 6px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 26px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 6px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 19px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 7px; + font-size: 12px; + } +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-muted { + color: #b2bac6; +} +.text-primary { + color: #343741; +} +a.text-primary:hover, +a.text-primary:focus { + color: #1d1f25; +} +.text-success { + color: #FFF; +} +a.text-success:hover, +a.text-success:focus { + color: #e6e6e6; +} +.text-info { + color: #FFF; +} +a.text-info:hover, +a.text-info:focus { + color: #e6e6e6; +} +.text-warning { + color: #FFF; +} +a.text-warning:hover, +a.text-warning:focus { + color: #e6e6e6; +} +.text-danger { + color: #FFF; +} +a.text-danger:hover, +a.text-danger:focus { + color: #e6e6e6; +} +.bg-info { + background-color: #006BB4; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #004d81; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +@media (min-width: 0) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; +} +/** + * ui/angular-ui-select depends upon these styles. Don't use them in your markup. + * Please use the UI Framework styles instead. + */ +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 5px 15px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + box-shadow: 0 0 0 1px white, 0 0 0 2px #0079a5; + /* 3 */ +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #FFF; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #FFF; + background-color: #006BB4; + border-color: #006BB4; +} +.btn-default:focus, +.btn-default.focus { + color: #FFF; + background-color: #004d81; + border-color: #001f35; +} +.btn-default:hover { + color: #FFF; + background-color: #004d81; + border-color: #004777; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #FFF; + background-color: #004d81; + border-color: #004777; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #FFF; + background-color: #00375d; + border-color: #001f35; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #006BB4; + border-color: #006BB4; +} +.btn-default .badge { + color: #006BB4; + background-color: #FFF; +} +.btn-primary { + color: #FFF; + background-color: #006BB4; + border-color: #006BB4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #FFF; + background-color: #004d81; + border-color: #001f35; +} +.btn-primary:hover { + color: #FFF; + background-color: #004d81; + border-color: #004777; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #FFF; + background-color: #004d81; + border-color: #004777; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #FFF; + background-color: #00375d; + border-color: #001f35; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #006BB4; + border-color: #006BB4; +} +.btn-primary .badge { + color: #006BB4; + background-color: #FFF; +} +.btn-xs { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 4px; +} +.navbar { + position: relative; + min-height: 45px; + margin-bottom: 0px; + border: 1px solid transparent; +} +@media (min-width: 0) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 0) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + overflow-x: visible; + padding-right: 10px; + padding-left: 10px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 0) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -10px; + margin-left: -10px; +} +@media (min-width: 0) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1050; +} +@media (min-width: 0) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + padding: 12.5px 10px; + font-size: 18px; + line-height: 20px; + height: 45px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 0) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -10px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 10px; + padding: 9px 10px; + margin-top: 5.5px; + margin-bottom: 5.5px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 0) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 6.25px -10px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: -1) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 0) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 12.5px; + padding-bottom: 12.5px; + } +} +.navbar-form { + margin-left: -10px; + margin-right: -10px; + padding: 10px 10px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 6.5px; + margin-bottom: 6.5px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: -1) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 0) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-text { + margin-top: 12.5px; + margin-bottom: 12.5px; +} +@media (min-width: 0) { + .navbar-text { + float: left; + margin-left: 10px; + margin-right: 10px; + } +} +@media (min-width: 0) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -10px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #F5F7FA; + border-color: transparent; +} +.navbar-default .navbar-brand { + color: #69707D; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #69707D; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #69707D; +} +.navbar-default .navbar-nav > li > a { + color: #69707D; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #69707D; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #343741; + background-color: transparent; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #69707D; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #d3dce9; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #d3dce9; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #FFF; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: transparent; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: transparent; + color: #343741; +} +@media (max-width: -1) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #69707D; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #69707D; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #343741; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #69707D; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #69707D; +} +.navbar-default .navbar-link:hover { + color: #69707D; +} +.navbar-inverse { + background-color: #343741; + border-color: #1d1f25; +} +.navbar-inverse .navbar-brand { + color: #FFF; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #FFF; + background-color: #4b4f5d; +} +.navbar-inverse .navbar-text { + color: #FFF; +} +.navbar-inverse .navbar-nav > li > a { + color: #D3DAE6; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #FFF; + background-color: #61677a; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #FFF; + background-color: #69707D; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #b2bac6; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #1d1f25; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #1d1f25; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #FFF; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #24262d; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + background-color: #69707D; + color: #FFF; +} +@media (max-width: -1) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #1d1f25; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #1d1f25; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #D3DAE6; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #FFF; + background-color: #61677a; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #FFF; + background-color: #69707D; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #b2bac6; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #D3DAE6; +} +.navbar-inverse .navbar-link:hover { + color: #FFF; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: none; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1070; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #FFF; + border: 1px solid #98A2B3; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 4px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1060; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #b8bec8; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #FFF; + text-align: center; + background-color: #54B399; + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #017D73; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #006BB4; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #F5A700; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #BD271E; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.list-group { + margin-bottom: 20px; + padding-left: 0; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #FFF; + border: 1px solid #D3DAE6; +} +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.list-group-item--noBorder { + border-top: 0; +} +a.list-group-item, +button.list-group-item { + color: #69707D; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #343741; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + text-decoration: none; + color: #69707D; + background-color: #F5F7FA; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + background-color: #D3DAE6; + color: #b2bac6; + cursor: not-allowed; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #b2bac6; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #343741; + background-color: #343741; + border-color: #343741; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #969bab; +} +.list-group-item-success { + color: #FFF; + background-color: #017D73; +} +a.list-group-item-success, +button.list-group-item-success { + color: #FFF; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #FFF; + background-color: #01645c; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #FFF; + border-color: #FFF; +} +.list-group-item-info { + color: #FFF; + background-color: #006BB4; +} +a.list-group-item-info, +button.list-group-item-info { + color: #FFF; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #FFF; + background-color: #005c9b; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #FFF; + border-color: #FFF; +} +.list-group-item-warning { + color: #FFF; + background-color: #F5A700; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #FFF; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #FFF; + background-color: #dc9600; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #FFF; + border-color: #FFF; +} +.list-group-item-danger { + color: #FFF; + background-color: #BD271E; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #FFF; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #FFF; + background-color: #a7221b; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #FFF; + border-color: #FFF; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #D3DAE6; +} +.nav > li.disabled > a { + color: #b2bac6; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #b2bac6; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #D3DAE6; + border-color: #006BB4; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #D3DAE6; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #D3DAE6; + background-color: #FFF; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #343741; + background-color: #FFF; + border: 1px solid #D3DAE6; + border-bottom-color: transparent; + cursor: default; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #FFF; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #FFF; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #FFF; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #FFF; + background-color: #006BB4; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #FFF; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #FFF; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #FFF; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + background-color: #017D73; + border-color: #014a44; + color: #FFF; +} +.alert-success hr { + border-top-color: #00312d; +} +.alert-success .alert-link { + color: #e6e6e6; +} +.alert-info { + background-color: #006BB4; + border-color: #004d81; + color: #FFF; +} +.alert-info hr { + border-top-color: #003e68; +} +.alert-info .alert-link { + color: #e6e6e6; +} +.alert-warning { + background-color: #F5A700; + border-color: #c28400; + color: #FFF; +} +.alert-warning hr { + border-top-color: #a97300; +} +.alert-warning .alert-link { + color: #e6e6e6; +} +.alert-danger { + background-color: #BD271E; + border-color: #911e17; + color: #FFF; +} +.alert-danger hr { + border-top-color: #7b1914; +} +.alert-danger .alert-link { + color: #e6e6e6; +} +.bsTooltip { + position: absolute; + z-index: 1040; + display: block; + font-family: 'Open Sans', Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; + opacity: 0; + filter: alpha(opacity=0); +} +.bsTooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.bsTooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.bsTooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.bsTooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.bsTooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.bsTooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.bsTooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.bsTooltip.top .bsTooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.bsTooltip.top-left .bsTooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.bsTooltip.top-right .bsTooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.bsTooltip.right .bsTooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.bsTooltip.left .bsTooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.bsTooltip.bottom .bsTooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.bsTooltip.bottom-left .bsTooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.bsTooltip.bottom-right .bsTooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #FFF; + border: 1px solid #D3DAE6; + border-radius: 4px; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.1); + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #D3DAE6; +} +.dropdown-menu > li > a, +.dropdown-menu > li > button { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #7b7b7b; + white-space: nowrap; +} +.dropdown-menu > li > button { + appearance: none; + background: none; + border: none; + width: 100%; + text-align: left; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > button:hover, +.dropdown-menu > li > a:focus, +.dropdown-menu > li > button:focus { + text-decoration: none; + color: #FFF; + background-color: #343741; +} +.dropdown-menu > .active > button, +.dropdown-menu > .active > a, +.dropdown-menu > .active > button:hover, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > button:focus, +.dropdown-menu > .active > a:focus { + color: #FFF; + text-decoration: none; + outline: 0; + background-color: #343741; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #98A2B3; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + left: auto; + right: 0; +} +.dropdown-menu-left { + left: 0; + right: auto; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #98A2B3; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 0) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon { + height: 62px; + padding: 18px 27px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 4px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon { + height: 62px; + line-height: 62px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon { + height: 32px; + padding: 6px 9px; + font-size: 12px; + line-height: 1.5; + border-radius: 4px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon { + height: 32px; + line-height: 32px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon { + height: auto; +} +.input-group-addon, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 5px 15px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #343741; + text-align: center; + background-color: #D3DAE6; + border: 1px solid #D3DAE6; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 6px 9px; + font-size: 12px; + border-radius: 4px; +} +.input-group-addon.input-lg { + padding: 18px 27px; + font-size: 18px; + border-radius: 4px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 5px 15px; + line-height: 1.42857143; + text-decoration: none; + color: #006BB4; + background-color: transparent; + border: 1px solid transparent; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #006BB4; + background-color: rgba(0, 0, 0, 0); + border-color: transparent; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #343741; + background-color: rgba(0, 0, 0, 0); + border-color: transparent; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #343741; + background-color: rgba(38, 38, 38, 0); + border-color: transparent; + cursor: not-allowed; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 18px 27px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 6px 9px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: rgba(0, 0, 0, 0); +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #FFF; + background-color: transparent; + cursor: not-allowed; +} +.label { + display: inline; + padding: 0.2em 0.6em 0.3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #FFF; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25em; +} +a.label:hover, +a.label:focus { + color: #FFF; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.label-default { + background-color: #006BB4; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #004d81; +} +.label-primary { + background-color: #343741; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #1d1f25; +} +.label-success { + background-color: #017D73; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #014a44; +} +.label-info { + background-color: #006BB4; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #004d81; +} +.label-warning { + background-color: #F5A700; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #c28400; +} +.label-danger { + background-color: #BD271E; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #911e17; +} +.panel { + margin-bottom: 20px; + background-color: #FFF; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #F5F7FA; + border-top: 1px solid #D3DAE6; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #D3DAE6; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #D3DAE6; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #D3DAE6; +} +.panel-default { + border-color: #D3DAE6; +} +.panel-default > .panel-heading { + color: #7b7b7b; + background-color: #F5F7FA; + border-color: #D3DAE6; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #D3DAE6; +} +.panel-default > .panel-heading .badge { + color: #F5F7FA; + background-color: #7b7b7b; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #D3DAE6; +} +.panel-primary { + border-color: #343741; +} +.panel-primary > .panel-heading { + color: #FFF; + background-color: #343741; + border-color: #343741; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #343741; +} +.panel-primary > .panel-heading .badge { + color: #343741; + background-color: #FFF; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #343741; +} +.panel-success { + border-color: #014a44; +} +.panel-success > .panel-heading { + color: #FFF; + background-color: #017D73; + border-color: #014a44; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #014a44; +} +.panel-success > .panel-heading .badge { + color: #017D73; + background-color: #FFF; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #014a44; +} +.panel-info { + border-color: #004d81; +} +.panel-info > .panel-heading { + color: #FFF; + background-color: #006BB4; + border-color: #004d81; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #004d81; +} +.panel-info > .panel-heading .badge { + color: #006BB4; + background-color: #FFF; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #004d81; +} +.panel-warning { + border-color: #c28400; +} +.panel-warning > .panel-heading { + color: #FFF; + background-color: #F5A700; + border-color: #c28400; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #c28400; +} +.panel-warning > .panel-heading .badge { + color: #F5A700; + background-color: #FFF; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #c28400; +} +.panel-danger { + border-color: #911e17; +} +.panel-danger > .panel-heading { + color: #FFF; + background-color: #BD271E; + border-color: #911e17; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #911e17; +} +.panel-danger > .panel-heading .badge { + color: #BD271E; + background-color: #FFF; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #911e17; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + font-family: 'Open Sans', Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 14px; + background-color: #FFF; + background-clip: padding-box; + border: 1px solid #D3DAE6; + border-radius: 4px; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.1); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 3px 3px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #92a3c1; + border-top-color: #d3dae6; + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #FFF; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #92a3c1; + border-right-color: #d3dae6; +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #FFF; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #92a3c1; + border-bottom-color: #d3dae6; + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #FFF; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #92a3c1; + border-left-color: #d3dae6; +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #FFF; + bottom: -10px; +} +.clearfix:before, +.clearfix:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after, +.nav:before, +.nav:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after { + content: " "; + display: table; +} +.clearfix:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.dl-horizontal dd:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.modal-header:after, +.modal-footer:after, +.nav:after, +.pager:after, +.panel-body:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +.navbar > .container-fluid > .navbar-nav:not(.pull-right):first-child, +.navbar > .container-fluid > .navbar-form:not(.pull-right):first-child { + margin-left: -15px; + margin-top: 4px; +} +.navbar { + border-width: 0; +} +.navbar-btn-link { + margin: 0; + border-radius: 0; +} +@media (max-width: 768px) { + .navbar-btn-link { + width: 100%; + text-align: left; + } +} +.navbar-default .badge { + background-color: #FFF; + color: #F5F7FA; +} +.navbar-inverse .kbnGlobalNav__logoBrand { + height: 45px; + width: 252px; + background-color: #4b4f5d; +} +.navbar-inverse .kbnGlobalNav__smallLogoBrand { + height: 45px; + width: 45px; + background-color: #4b4f5d; +} +.navbar-inverse .badge { + background-color: #FFF; + color: #4b4f5d; +} +.navbar-brand { + cursor: default; + font-size: 1.8em; + user-select: none; +} +.navbar-nav { + font-size: 12px; +} +.navbar-nav > .active > a { + border-bottom-color: #7b7b7b; + background-color: transparent; +} +.navbar-toggle { + margin-top: 4px; +} +.text-primary, +.text-primary:hover { + color: #343741; +} +.text-success, +.text-success:hover { + color: #017D73; +} +.text-danger, +.text-danger:hover { + color: #BD271E; +} +.text-warning, +.text-warning:hover { + color: #F5A700; +} +.text-info, +.text-info:hover { + color: #006BB4; +} +table .success, +.table .success, +table .warning, +.table .warning, +table .danger, +.table .danger, +table .info, +.table .info { + color: #FFF; +} +table .success a, +.table .success a, +table .warning a, +.table .warning a, +table .danger a, +.table .danger a, +table .info a, +.table .info a { + color: #FFF; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #D3DAE6; +} +.form-control, +input { + border-width: 1px; + -webkit-box-shadow: none; + box-shadow: none; +} +.form-control:focus, +input:focus { + -webkit-box-shadow: none; + box-shadow: none; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning .form-control-feedback { + color: #F5A700; +} +.has-warning .form-control, +.has-warning .form-control:focus { + border: 1px solid; + border-color: #F5A700; +} +.has-warning .input-group-addon { + border-color: #F5A700; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error .form-control-feedback { + color: #BD271E; +} +.has-error .form-control, +.has-error .form-control:focus { + border: 1px solid; + border-color: #BD271E; +} +.has-error .input-group-addon { + border-color: #BD271E; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success .form-control-feedback { + color: #017D73; +} +.has-success .form-control, +.has-success .form-control:focus { + border: solid #017D73; +} +.has-success .input-group-addon { + border-color: #017D73; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + border-color: transparent; +} +.pager a, +.pager a:hover { + color: #FFF; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + background-color: rgba(38, 38, 38, 0); +} +.panel { + border-radius: 0; + -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + box-shadow: 0 0 0 rgba(0, 0, 0, 0); +} +.progress { + -webkit-box-shadow: none; + box-shadow: none; +} +.progress .progress-bar { + font-size: 10px; + line-height: 10px; +} +.well { + -webkit-box-shadow: none; + box-shadow: none; +} diff --git a/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap b/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap index eab29731ea524..5ff5d69f96f70 100644 --- a/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap +++ b/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap @@ -273,277 +273,3 @@ Object { "version": Any, } `; - -exports[`RenderingService setup() render() renders "legacy" page 1`] = ` -Object { - "anonymousStatusPage": false, - "basePath": "/mock-server-basepath", - "branch": Any, - "buildNumber": Any, - "csp": Object { - "warnLegacyBrowsers": true, - }, - "env": Object { - "mode": Object { - "dev": Any, - "name": Any, - "prod": Any, - }, - "packageInfo": Object { - "branch": Any, - "buildNum": Any, - "buildSha": Any, - "dist": Any, - "version": Any, - }, - }, - "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", - }, - "legacyMetadata": Object { - "app": Object {}, - "basePath": "/mock-server-basepath", - "branch": Any, - "buildNum": Any, - "buildSha": Any, - "bundleId": "app:legacy", - "devMode": true, - "nav": Array [], - "serverName": "http-server-test", - "uiSettings": Object { - "defaults": Object { - "registered": Object { - "name": "title", - }, - }, - "user": Object {}, - }, - "version": Any, - }, - "legacyMode": true, - "serverBasePath": "/mock-server-basepath", - "uiPlugins": Array [], - "vars": Object {}, - "version": Any, -} -`; - -exports[`RenderingService setup() render() renders "legacy" page for blank basepath 1`] = ` -Object { - "anonymousStatusPage": false, - "basePath": "", - "branch": Any, - "buildNumber": Any, - "csp": Object { - "warnLegacyBrowsers": true, - }, - "env": Object { - "mode": Object { - "dev": Any, - "name": Any, - "prod": Any, - }, - "packageInfo": Object { - "branch": Any, - "buildNum": Any, - "buildSha": Any, - "dist": Any, - "version": Any, - }, - }, - "i18n": Object { - "translationsUrl": "/translations/en.json", - }, - "legacyMetadata": Object { - "app": Object {}, - "basePath": "", - "branch": Any, - "buildNum": Any, - "buildSha": Any, - "bundleId": "app:legacy", - "devMode": true, - "nav": Array [], - "serverName": "http-server-test", - "uiSettings": Object { - "defaults": Object { - "registered": Object { - "name": "title", - }, - }, - "user": Object {}, - }, - "version": Any, - }, - "legacyMode": true, - "serverBasePath": "/mock-server-basepath", - "uiPlugins": Array [], - "vars": Object {}, - "version": Any, -} -`; - -exports[`RenderingService setup() render() renders "legacy" with custom vars 1`] = ` -Object { - "anonymousStatusPage": false, - "basePath": "/mock-server-basepath", - "branch": Any, - "buildNumber": Any, - "csp": Object { - "warnLegacyBrowsers": true, - }, - "env": Object { - "mode": Object { - "dev": Any, - "name": Any, - "prod": Any, - }, - "packageInfo": Object { - "branch": Any, - "buildNum": Any, - "buildSha": Any, - "dist": Any, - "version": Any, - }, - }, - "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", - }, - "legacyMetadata": Object { - "app": Object {}, - "basePath": "/mock-server-basepath", - "branch": Any, - "buildNum": Any, - "buildSha": Any, - "bundleId": "app:legacy", - "devMode": true, - "nav": Array [], - "serverName": "http-server-test", - "uiSettings": Object { - "defaults": Object { - "registered": Object { - "name": "title", - }, - }, - "user": Object {}, - }, - "version": Any, - }, - "legacyMode": true, - "serverBasePath": "/mock-server-basepath", - "uiPlugins": Array [], - "vars": Object { - "fake": "__TEST_TOKEN__", - }, - "version": Any, -} -`; - -exports[`RenderingService setup() render() renders "legacy" with excluded user settings 1`] = ` -Object { - "anonymousStatusPage": false, - "basePath": "/mock-server-basepath", - "branch": Any, - "buildNumber": Any, - "csp": Object { - "warnLegacyBrowsers": true, - }, - "env": Object { - "mode": Object { - "dev": Any, - "name": Any, - "prod": Any, - }, - "packageInfo": Object { - "branch": Any, - "buildNum": Any, - "buildSha": Any, - "dist": Any, - "version": Any, - }, - }, - "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", - }, - "legacyMetadata": Object { - "app": Object {}, - "basePath": "/mock-server-basepath", - "branch": Any, - "buildNum": Any, - "buildSha": Any, - "bundleId": "app:legacy", - "devMode": true, - "nav": Array [], - "serverName": "http-server-test", - "uiSettings": Object { - "defaults": Object { - "registered": Object { - "name": "title", - }, - }, - "user": Object {}, - }, - "version": Any, - }, - "legacyMode": true, - "serverBasePath": "/mock-server-basepath", - "uiPlugins": Array [], - "vars": Object {}, - "version": Any, -} -`; - -exports[`RenderingService setup() render() renders "legacy" with excluded user settings and custom vars 1`] = ` -Object { - "anonymousStatusPage": false, - "basePath": "/mock-server-basepath", - "branch": Any, - "buildNumber": Any, - "csp": Object { - "warnLegacyBrowsers": true, - }, - "env": Object { - "mode": Object { - "dev": Any, - "name": Any, - "prod": Any, - }, - "packageInfo": Object { - "branch": Any, - "buildNum": Any, - "buildSha": Any, - "dist": Any, - "version": Any, - }, - }, - "i18n": Object { - "translationsUrl": "/mock-server-basepath/translations/en.json", - }, - "legacyMetadata": Object { - "app": Object {}, - "basePath": "/mock-server-basepath", - "branch": Any, - "buildNum": Any, - "buildSha": Any, - "bundleId": "app:legacy", - "devMode": true, - "nav": Array [], - "serverName": "http-server-test", - "uiSettings": Object { - "defaults": Object { - "registered": Object { - "name": "title", - }, - }, - "user": Object {}, - }, - "version": Any, - }, - "legacyMode": true, - "serverBasePath": "/mock-server-basepath", - "uiPlugins": Array [], - "vars": Object { - "fake": "__TEST_TOKEN__", - }, - "version": Any, -} -`; diff --git a/src/core/server/rendering/rendering_service.test.ts b/src/core/server/rendering/rendering_service.test.ts index 7caf4af850c10..254bafed5b194 100644 --- a/src/core/server/rendering/rendering_service.test.ts +++ b/src/core/server/rendering/rendering_service.test.ts @@ -52,7 +52,6 @@ const INJECTED_METADATA = { }; const { createKibanaRequest, createRawRequest } = httpServerMock; -const legacyApp = { getId: () => 'legacy' }; describe('RenderingService', () => { let service: RenderingService; @@ -126,62 +125,6 @@ describe('RenderingService', () => { expect(data).toMatchSnapshot(INJECTED_METADATA); }); - - it('renders "legacy" page', async () => { - const content = await render(createRawRequest(), uiSettings, { app: legacyApp }); - const dom = load(content); - const data = JSON.parse(dom('kbn-injected-metadata').attr('data')); - - expect(data).toMatchSnapshot(INJECTED_METADATA); - }); - - it('renders "legacy" page for blank basepath', async () => { - mockRenderingSetupDeps.http.basePath.get.mockReturnValueOnce(''); - - const content = await render(createRawRequest(), uiSettings, { app: legacyApp }); - const dom = load(content); - const data = JSON.parse(dom('kbn-injected-metadata').attr('data')); - - expect(data).toMatchSnapshot(INJECTED_METADATA); - }); - - it('renders "legacy" with custom vars', async () => { - const content = await render(createRawRequest(), uiSettings, { - app: legacyApp, - vars: { - fake: '__TEST_TOKEN__', - }, - }); - const dom = load(content); - const data = JSON.parse(dom('kbn-injected-metadata').attr('data')); - - expect(data).toMatchSnapshot(INJECTED_METADATA); - }); - - it('renders "legacy" with excluded user settings', async () => { - const content = await render(createRawRequest(), uiSettings, { - app: legacyApp, - includeUserSettings: false, - }); - const dom = load(content); - const data = JSON.parse(dom('kbn-injected-metadata').attr('data')); - - expect(data).toMatchSnapshot(INJECTED_METADATA); - }); - - it('renders "legacy" with excluded user settings and custom vars', async () => { - const content = await render(createRawRequest(), uiSettings, { - app: legacyApp, - includeUserSettings: false, - vars: { - fake: '__TEST_TOKEN__', - }, - }); - const dom = load(content); - const data = JSON.parse(dom('kbn-injected-metadata').attr('data')); - - expect(data).toMatchSnapshot(INJECTED_METADATA); - }); }); }); }); diff --git a/src/core/server/rendering/rendering_service.tsx b/src/core/server/rendering/rendering_service.tsx index f49952ec713fb..e7ee0b16fce08 100644 --- a/src/core/server/rendering/rendering_service.tsx +++ b/src/core/server/rendering/rendering_service.tsx @@ -69,7 +69,7 @@ export class RenderingService implements CoreService { describe('when file is present and config property is set', () => { describe('when they mismatch', () => { - describe('when syncToFile is true', () => { - it('writes to file and returns the config uuid', async () => { - const uuid = await resolveInstanceUuid({ configService, logger, syncToFile: true }); - expect(uuid).toEqual(DEFAULT_CONFIG_UUID); - expect(writeFile).toHaveBeenCalledWith( - join('data-folder', 'uuid'), - DEFAULT_CONFIG_UUID, - expect.any(Object) - ); - expect(logger.debug).toHaveBeenCalledTimes(1); - expect(logger.debug.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - "Updating Kibana instance UUID to: CONFIG_UUID (was: FILE_UUID)", - ] - `); - }); - }); - - describe('when syncTofile is false', () => { - it('does not write to file and returns the config uuid', async () => { - const uuid = await resolveInstanceUuid({ configService, logger, syncToFile: false }); - expect(uuid).toEqual(DEFAULT_CONFIG_UUID); - expect(writeFile).not.toHaveBeenCalled(); - expect(logger.debug).toHaveBeenCalledTimes(1); - expect(logger.debug.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - "Updating Kibana instance UUID to: CONFIG_UUID (was: FILE_UUID)", - ] - `); - }); - }); - }); - - describe('when they match', () => { - it('does not write to file', async () => { - mockReadFile({ uuid: DEFAULT_CONFIG_UUID }); - const uuid = await resolveInstanceUuid({ configService, logger, syncToFile: true }); - expect(uuid).toEqual(DEFAULT_CONFIG_UUID); - expect(writeFile).not.toHaveBeenCalled(); - expect(logger.debug).toHaveBeenCalledTimes(1); - expect(logger.debug.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - "Kibana instance UUID: CONFIG_UUID", - ] - `); - }); - }); - }); - - describe('when file is not present and config property is set', () => { - describe('when syncToFile is true', () => { - it('writes the uuid to file and returns the config uuid', async () => { - mockReadFile({ error: fileNotFoundError }); - const uuid = await resolveInstanceUuid({ configService, logger, syncToFile: true }); + it('writes to file and returns the config uuid', async () => { + const uuid = await resolveInstanceUuid({ configService, logger }); expect(uuid).toEqual(DEFAULT_CONFIG_UUID); expect(writeFile).toHaveBeenCalledWith( join('data-folder', 'uuid'), @@ -161,32 +109,51 @@ describe('resolveInstanceUuid', () => { expect(logger.debug).toHaveBeenCalledTimes(1); expect(logger.debug.mock.calls[0]).toMatchInlineSnapshot(` Array [ - "Setting new Kibana instance UUID: CONFIG_UUID", + "Updating Kibana instance UUID to: CONFIG_UUID (was: FILE_UUID)", ] `); }); }); - describe('when syncToFile is false', () => { - it('does not write the uuid to file and returns the config uuid', async () => { - mockReadFile({ error: fileNotFoundError }); - const uuid = await resolveInstanceUuid({ configService, logger, syncToFile: false }); + describe('when they match', () => { + it('does not write to file', async () => { + mockReadFile({ uuid: DEFAULT_CONFIG_UUID }); + const uuid = await resolveInstanceUuid({ configService, logger }); expect(uuid).toEqual(DEFAULT_CONFIG_UUID); expect(writeFile).not.toHaveBeenCalled(); expect(logger.debug).toHaveBeenCalledTimes(1); expect(logger.debug.mock.calls[0]).toMatchInlineSnapshot(` Array [ - "Setting new Kibana instance UUID: CONFIG_UUID", + "Kibana instance UUID: CONFIG_UUID", ] `); }); }); }); + describe('when file is not present and config property is set', () => { + it('writes the uuid to file and returns the config uuid', async () => { + mockReadFile({ error: fileNotFoundError }); + const uuid = await resolveInstanceUuid({ configService, logger }); + expect(uuid).toEqual(DEFAULT_CONFIG_UUID); + expect(writeFile).toHaveBeenCalledWith( + join('data-folder', 'uuid'), + DEFAULT_CONFIG_UUID, + expect.any(Object) + ); + expect(logger.debug).toHaveBeenCalledTimes(1); + expect(logger.debug.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + "Setting new Kibana instance UUID: CONFIG_UUID", + ] + `); + }); + }); + describe('when file is present and config property is not set', () => { it('does not write to file and returns the file uuid', async () => { configService = getConfigService(undefined); - const uuid = await resolveInstanceUuid({ configService, logger, syncToFile: true }); + const uuid = await resolveInstanceUuid({ configService, logger }); expect(uuid).toEqual(DEFAULT_FILE_UUID); expect(writeFile).not.toHaveBeenCalled(); expect(logger.debug).toHaveBeenCalledTimes(1); @@ -203,7 +170,7 @@ describe('resolveInstanceUuid', () => { it('writes new uuid to file and returns new uuid', async () => { mockReadFile({ uuid: UUID_7_6_0_BUG }); configService = getConfigService(undefined); - const uuid = await resolveInstanceUuid({ configService, logger, syncToFile: true }); + const uuid = await resolveInstanceUuid({ configService, logger }); expect(uuid).not.toEqual(UUID_7_6_0_BUG); expect(uuid).toEqual('NEW_UUID'); expect(writeFile).toHaveBeenCalledWith( @@ -229,7 +196,7 @@ describe('resolveInstanceUuid', () => { it('writes config uuid to file and returns config uuid', async () => { mockReadFile({ uuid: UUID_7_6_0_BUG }); configService = getConfigService(DEFAULT_CONFIG_UUID); - const uuid = await resolveInstanceUuid({ configService, logger, syncToFile: true }); + const uuid = await resolveInstanceUuid({ configService, logger }); expect(uuid).not.toEqual(UUID_7_6_0_BUG); expect(uuid).toEqual(DEFAULT_CONFIG_UUID); expect(writeFile).toHaveBeenCalledWith( @@ -253,40 +220,22 @@ describe('resolveInstanceUuid', () => { }); describe('when file is not present and config property is not set', () => { - describe('when syncToFile is true', () => { - it('generates a new uuid and write it to file', async () => { - configService = getConfigService(undefined); - mockReadFile({ error: fileNotFoundError }); - const uuid = await resolveInstanceUuid({ configService, logger, syncToFile: true }); - expect(uuid).toEqual('NEW_UUID'); - expect(writeFile).toHaveBeenCalledWith( - join('data-folder', 'uuid'), - 'NEW_UUID', - expect.any(Object) - ); - expect(logger.debug).toHaveBeenCalledTimes(1); - expect(logger.debug.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - "Setting new Kibana instance UUID: NEW_UUID", - ] - `); - }); - }); - - describe('when syncToFile is false', () => { - it('generates a new uuid and does not write it to file', async () => { - configService = getConfigService(undefined); - mockReadFile({ error: fileNotFoundError }); - const uuid = await resolveInstanceUuid({ configService, logger, syncToFile: false }); - expect(uuid).toEqual('NEW_UUID'); - expect(writeFile).not.toHaveBeenCalled(); - expect(logger.debug).toHaveBeenCalledTimes(1); - expect(logger.debug.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - "Setting new Kibana instance UUID: NEW_UUID", - ] - `); - }); + it('generates a new uuid and write it to file', async () => { + configService = getConfigService(undefined); + mockReadFile({ error: fileNotFoundError }); + const uuid = await resolveInstanceUuid({ configService, logger }); + expect(uuid).toEqual('NEW_UUID'); + expect(writeFile).toHaveBeenCalledWith( + join('data-folder', 'uuid'), + 'NEW_UUID', + expect.any(Object) + ); + expect(logger.debug).toHaveBeenCalledTimes(1); + expect(logger.debug.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + "Setting new Kibana instance UUID: NEW_UUID", + ] + `); }); }); @@ -294,7 +243,7 @@ describe('resolveInstanceUuid', () => { it('throws an explicit error for file read errors', async () => { mockReadFile({ error: permissionError }); await expect( - resolveInstanceUuid({ configService, logger, syncToFile: true }) + resolveInstanceUuid({ configService, logger }) ).rejects.toThrowErrorMatchingInlineSnapshot( `"Unable to read Kibana UUID file, please check the uuid.server configuration value in kibana.yml and ensure Kibana has sufficient permissions to read / write to this file. Error was: EACCES"` ); @@ -302,7 +251,7 @@ describe('resolveInstanceUuid', () => { it('throws an explicit error for file write errors', async () => { mockWriteFile(isDirectoryError); await expect( - resolveInstanceUuid({ configService, logger, syncToFile: true }) + resolveInstanceUuid({ configService, logger }) ).rejects.toThrowErrorMatchingInlineSnapshot( `"Unable to write Kibana UUID file, please check the uuid.server configuration value in kibana.yml and ensure Kibana has sufficient permissions to read / write to this file. Error was: EISDIR"` ); diff --git a/src/core/server/uuid/resolve_uuid.ts b/src/core/server/uuid/resolve_uuid.ts index c3e79cc519a1b..36f0eb73b1de7 100644 --- a/src/core/server/uuid/resolve_uuid.ts +++ b/src/core/server/uuid/resolve_uuid.ts @@ -36,11 +36,9 @@ export const UUID_7_6_0_BUG = `ce42b997-a913-4d58-be46-bb1937feedd6`; export async function resolveInstanceUuid({ configService, - syncToFile, logger, }: { configService: IConfigService; - syncToFile: boolean; logger: Logger; }): Promise { const [pathConfig, serverConfig] = await Promise.all([ @@ -65,7 +63,7 @@ export async function resolveInstanceUuid({ } else { logger.debug(`Updating Kibana instance UUID to: ${uuidFromConfig} (was: ${uuidFromFile})`); } - await writeUuidToFile(uuidFilePath, uuidFromConfig, syncToFile); + await writeUuidToFile(uuidFilePath, uuidFromConfig); return uuidFromConfig; } } @@ -73,7 +71,7 @@ export async function resolveInstanceUuid({ const newUuid = uuid.v4(); // no uuid either in config or file, we need to generate and write it. logger.debug(`Setting new Kibana instance UUID: ${newUuid}`); - await writeUuidToFile(uuidFilePath, newUuid, syncToFile); + await writeUuidToFile(uuidFilePath, newUuid); return newUuid; } @@ -105,11 +103,7 @@ async function readUuidFromFile(filepath: string, logger: Logger): Promise ({ resolveInstanceUuid: jest.fn().mockResolvedValue('SOME_UUID'), @@ -47,28 +45,10 @@ describe('UuidService', () => { expect(resolveInstanceUuid).toHaveBeenCalledTimes(1); expect(resolveInstanceUuid).toHaveBeenCalledWith({ configService: coreContext.configService, - syncToFile: true, logger: logger.get('uuid'), }); }); - describe('when cliArgs.optimize is true', () => { - it('calls resolveInstanceUuid with syncToFile: false', async () => { - coreContext = mockCoreContext.create({ - logger, - env: Env.createDefault(getEnvOptions({ cliArgs: { optimize: true } })), - }); - const service = new UuidService(coreContext); - await service.setup(); - expect(resolveInstanceUuid).toHaveBeenCalledTimes(1); - expect(resolveInstanceUuid).toHaveBeenCalledWith({ - configService: coreContext.configService, - syncToFile: false, - logger: logger.get('uuid'), - }); - }); - }); - it('returns the uuid resolved from resolveInstanceUuid', async () => { const service = new UuidService(coreContext); const setup = await service.setup(); diff --git a/src/core/server/uuid/uuid_service.ts b/src/core/server/uuid/uuid_service.ts index 62ed4a19edf5a..d7c1b3331c447 100644 --- a/src/core/server/uuid/uuid_service.ts +++ b/src/core/server/uuid/uuid_service.ts @@ -20,7 +20,7 @@ import { resolveInstanceUuid } from './resolve_uuid'; import { CoreContext } from '../core_context'; import { Logger } from '../logging'; -import { IConfigService, CliArgs } from '../config'; +import { IConfigService } from '../config'; /** * APIs to access the application's instance uuid. @@ -38,19 +38,16 @@ export interface UuidServiceSetup { export class UuidService { private readonly log: Logger; private readonly configService: IConfigService; - private readonly cliArgs: CliArgs; private uuid: string = ''; constructor(core: CoreContext) { this.log = core.logger.get('uuid'); this.configService = core.configService; - this.cliArgs = core.env.cliArgs; } public async setup() { this.uuid = await resolveInstanceUuid({ configService: this.configService, - syncToFile: !this.cliArgs.optimize, logger: this.log, }); diff --git a/src/dev/build/build_distributables.ts b/src/dev/build/build_distributables.ts index 1d41f4c270caa..5e6f6efcb50ca 100644 --- a/src/dev/build/build_distributables.ts +++ b/src/dev/build/build_distributables.ts @@ -73,8 +73,6 @@ export async function buildDistributables(log: ToolingLog, options: BuildOptions await run(Tasks.CreateNoticeFile); await run(Tasks.UpdateLicenseFile); await run(Tasks.RemovePackageJsonDeps); - await run(Tasks.TranspileScss); - await run(Tasks.OptimizeBuild); await run(Tasks.CleanTypescript); await run(Tasks.CleanExtraFilesFromModules); await run(Tasks.CleanEmptyFolders); diff --git a/src/dev/build/tasks/copy_source_task.ts b/src/dev/build/tasks/copy_source_task.ts index 79279997671e5..7a5d84da527db 100644 --- a/src/dev/build/tasks/copy_source_task.ts +++ b/src/dev/build/tasks/copy_source_task.ts @@ -39,7 +39,6 @@ export const CopySource: Task = { '!src/functional_test_runner/**', '!src/dev/**', 'typings/**', - 'webpackShims/**', 'config/kibana.yml', 'config/node.options', 'tsconfig*.json', diff --git a/src/dev/build/tasks/index.ts b/src/dev/build/tasks/index.ts index 4c00e56faee6b..c2a0d74dbfed5 100644 --- a/src/dev/build/tasks/index.ts +++ b/src/dev/build/tasks/index.ts @@ -31,12 +31,10 @@ export * from './install_dependencies_task'; export * from './license_file_task'; export * from './nodejs'; export * from './notice_file_task'; -export * from './optimize_task'; export * from './os_packages'; export * from './patch_native_modules_task'; export * from './path_length_task'; export * from './transpile_babel_task'; -export * from './transpile_scss_task'; export * from './uuid_verification_task'; export * from './verify_env_task'; export * from './write_sha_sums_task'; diff --git a/src/dev/build/tasks/optimize_task.ts b/src/dev/build/tasks/optimize_task.ts deleted file mode 100644 index 98979f376eacd..0000000000000 --- a/src/dev/build/tasks/optimize_task.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { deleteAll, copyAll, exec, Task } from '../lib'; -import { getNodeDownloadInfo } from './nodejs'; - -export const OptimizeBuild: Task = { - description: 'Running optimizer', - - async run(config, log, build) { - const tempNodeInstallDir = build.resolvePath('node'); - const platform = config.getPlatformForThisOs(); - - // copy extracted node for this platform into the build temporarily - log.debug('Temporarily installing node.js for', platform.getNodeArch()); - const { extractDir } = getNodeDownloadInfo(config, platform); - await copyAll(extractDir, tempNodeInstallDir); - - const kibanaScript = platform.isWindows() ? '.\\bin\\kibana.bat' : './bin/kibana'; - - const kibanaArgs = ['--env.name=production', '--logging.json=false', '--optimize']; - - log.info('Running bin/kibana to trigger the optimizer'); - - await exec(log, kibanaScript, kibanaArgs, { - cwd: build.resolvePath('.'), - env: { - KBN_CACHE_LOADER_WRITABLE: 'true', - NODE_OPTIONS: '--max-old-space-size=4096', - }, - }); - - // clean up temporary node install - await deleteAll([tempNodeInstallDir], log); - }, -}; diff --git a/src/dev/build/tasks/transpile_scss_task.ts b/src/dev/build/tasks/transpile_scss_task.ts deleted file mode 100644 index e1b0bd0171c92..0000000000000 --- a/src/dev/build/tasks/transpile_scss_task.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { Task } from '../lib'; - -// @ts-expect-error buildSass isn't TS yet -import { buildSass } from '../../sass'; - -export const TranspileScss: Task = { - description: 'Transpiling SCSS to CSS', - async run(config, log, build) { - await buildSass({ - log, - kibanaDir: build.resolvePath('.'), - }); - }, -}; diff --git a/src/dev/i18n/README.md b/src/dev/i18n/README.md index 2ef739e655d9b..5c2e996c2a640 100644 --- a/src/dev/i18n/README.md +++ b/src/dev/i18n/README.md @@ -4,7 +4,7 @@ ### Description -The tool is used to extract default messages from all `*.{js, ts, jsx, tsx, html, pug}` files in provided plugins directories to a JSON file. +The tool is used to extract default messages from all `*.{js, ts, jsx, tsx, html }` files in provided plugins directories to a JSON file. It uses Babel to parse code and build an AST for each file or a single JS expression if whole file parsing is impossible. The tool is able to validate, extract and match IDs, default messages and descriptions only if they are defined statically and together, otherwise it will fail with detailed explanation. That means one can't define ID in one place and default message in another, or use function call to dynamically create default message etc. @@ -116,18 +116,6 @@ The `description` is optional, `values` is optional too unless `defaultMessage` * Expression can be parsed only if it is located in syntactically valid JS/TS code. Do not use type assertions in TypeScript for `defaultMessage` or `description` properties, id argument or the second argument of `i18n*` call expression. It is never needed for i18n engine use cases. -* **Pug (.pug)** - - ``` - #{i18n('pluginNamespace.messageId', { - defaultMessage: 'Default message string literal, {key}', - values: { key: 'value' }, - description: 'Message context or description', - })} - ``` - - * Expression in `#{...}` is parsed as a JS expression. - ### Usage ```bash diff --git a/src/dev/i18n/__fixtures__/extract_default_translations/test_plugin_1/test_file_2.pug b/src/dev/i18n/__fixtures__/extract_default_translations/test_plugin_1/test_file_2.pug deleted file mode 100644 index fb61f554a1c70..0000000000000 --- a/src/dev/i18n/__fixtures__/extract_default_translations/test_plugin_1/test_file_2.pug +++ /dev/null @@ -1,10 +0,0 @@ -extends ./chrome.pug - -block content - .kibanaWelcomeView - .kibanaLoaderWrap - .kibanaLoader - .kibanaWelcomeLogoCircle - .kibanaWelcomeLogo - .kibanaWelcomeText - | #{i18n('plugin_1.id_5', { defaultMessage: 'Message 5' })} diff --git a/src/dev/i18n/__snapshots__/extract_default_translations.test.js.snap b/src/dev/i18n/__snapshots__/extract_default_translations.test.js.snap index 2c86934d7c71d..b19b366a8db7b 100644 --- a/src/dev/i18n/__snapshots__/extract_default_translations.test.js.snap +++ b/src/dev/i18n/__snapshots__/extract_default_translations.test.js.snap @@ -30,13 +30,6 @@ Array [ "message": "Message 4", }, ], - Array [ - "plugin_1.id_5", - Object { - "description": undefined, - "message": "Message 5", - }, - ], Array [ "plugin_1.id_7", Object { diff --git a/src/dev/i18n/extract_default_translations.js b/src/dev/i18n/extract_default_translations.js index e70c666422f7b..a0be81a30838d 100644 --- a/src/dev/i18n/extract_default_translations.js +++ b/src/dev/i18n/extract_default_translations.js @@ -19,7 +19,7 @@ import path from 'path'; -import { extractHtmlMessages, extractCodeMessages, extractPugMessages } from './extractors'; +import { extractHtmlMessages, extractCodeMessages } from './extractors'; import { globAsync, readFileAsync, normalizePath } from './utils'; import { createFailError, isFailError } from '@kbn/dev-utils'; @@ -70,7 +70,7 @@ export async function matchEntriesWithExctractors(inputPath, options = {}) { '**/*.d.ts', ].concat(additionalIgnore); - const entries = await globAsync('*.{js,jsx,pug,ts,tsx,html}', { + const entries = await globAsync('*.{js,jsx,ts,tsx,html}', { cwd: inputPath, matchBase: true, ignore, @@ -78,27 +78,24 @@ export async function matchEntriesWithExctractors(inputPath, options = {}) { absolute, }); - const { htmlEntries, codeEntries, pugEntries } = entries.reduce( + const { htmlEntries, codeEntries } = entries.reduce( (paths, entry) => { const resolvedPath = path.resolve(inputPath, entry); if (resolvedPath.endsWith('.html')) { paths.htmlEntries.push(resolvedPath); - } else if (resolvedPath.endsWith('.pug')) { - paths.pugEntries.push(resolvedPath); } else { paths.codeEntries.push(resolvedPath); } return paths; }, - { htmlEntries: [], codeEntries: [], pugEntries: [] } + { htmlEntries: [], codeEntries: [] } ); return [ [htmlEntries, extractHtmlMessages], [codeEntries, extractCodeMessages], - [pugEntries, extractPugMessages], ]; } diff --git a/src/dev/i18n/extractors/__snapshots__/pug.test.js.snap b/src/dev/i18n/extractors/__snapshots__/pug.test.js.snap deleted file mode 100644 index 48c887fc6318c..0000000000000 --- a/src/dev/i18n/extractors/__snapshots__/pug.test.js.snap +++ /dev/null @@ -1,37 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`dev/i18n/extractors/pug extracts messages from pug template with interpolation 1`] = ` -Array [ - "message-id", - Object { - "description": "Message description", - "message": "Default message", - }, -] -`; - -exports[`dev/i18n/extractors/pug extracts messages from pug template without interpolation 1`] = ` -Array [ - "message-id", - Object { - "description": "Message description", - "message": "Default message", - }, -] -`; - -exports[`dev/i18n/extractors/pug throws on empty id 1`] = ` -Array [ - Array [ - [Error: Empty "id" value in i18n() or i18n.translate() is not allowed.], - ], -] -`; - -exports[`dev/i18n/extractors/pug throws on missing default message 1`] = ` -Array [ - Array [ - [Error: Empty defaultMessage in i18n() or i18n.translate() is not allowed ("message-id").], - ], -] -`; diff --git a/src/dev/i18n/extractors/index.js b/src/dev/i18n/extractors/index.js index 48e90de6c6d49..cc8a4b7b27637 100644 --- a/src/dev/i18n/extractors/index.js +++ b/src/dev/i18n/extractors/index.js @@ -19,4 +19,3 @@ export { extractCodeMessages } from './code'; export { extractHtmlMessages } from './html'; -export { extractPugMessages } from './pug'; diff --git a/src/dev/i18n/extractors/pug.js b/src/dev/i18n/extractors/pug.js deleted file mode 100644 index 20fc72a404843..0000000000000 --- a/src/dev/i18n/extractors/pug.js +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { parse } from '@babel/parser'; - -import { extractI18nCallMessages } from './i18n_call'; -import { isI18nTranslateFunction, traverseNodes, createParserErrorMessage } from '../utils'; -import { createFailError, isFailError } from '@kbn/dev-utils'; - -/** - * Matches `i18n(...)` in `#{i18n('id', { defaultMessage: 'Message text' })}` - */ -const PUG_I18N_REGEX = /i18n\((([^)']|'([^'\\]|\\.)*')*)\)/g; - -function parsePugExpression(expression) { - let ast; - - try { - ast = parse(expression); - } catch (error) { - if (error instanceof SyntaxError) { - const errorWithContext = createParserErrorMessage(expression, error); - throw createFailError( - `Couldn't parse Pug expression with i18n(...) call:\n${errorWithContext}` - ); - } - - throw error; - } - - return ast; -} - -/** - * Example: `#{i18n('message-id', { defaultMessage: 'Message text' })}` - */ -export function* extractPugMessages(buffer, reporter) { - const expressions = buffer.toString().match(PUG_I18N_REGEX) || []; - - for (const expression of expressions) { - try { - const ast = parsePugExpression(expression); - const node = [...traverseNodes(ast.program.body)].find((node) => - isI18nTranslateFunction(node) - ); - - if (node) { - yield extractI18nCallMessages(node); - } - } catch (error) { - if (!isFailError(error)) { - throw error; - } - - reporter.report(error); - } - } -} diff --git a/src/dev/i18n/extractors/pug.test.js b/src/dev/i18n/extractors/pug.test.js deleted file mode 100644 index 4e81f73cae8bb..0000000000000 --- a/src/dev/i18n/extractors/pug.test.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { extractPugMessages } from './pug'; - -const report = jest.fn(); - -describe('dev/i18n/extractors/pug', () => { - beforeEach(() => { - report.mockClear(); - }); - - test('extracts messages from pug template with interpolation', () => { - const source = Buffer.from(`\ -#{i18n('message-id', { defaultMessage: 'Default message', description: 'Message description' })} -`); - const [messageObject] = extractPugMessages(source); - - expect(messageObject).toMatchSnapshot(); - }); - - test('extracts messages from pug template without interpolation', () => { - const source = Buffer.from(`\ -.kibanaWelcomeText(data-error-message=i18n('message-id', { defaultMessage: 'Default message', description: 'Message description' })) -`); - const [messageObject] = extractPugMessages(source); - - expect(messageObject).toMatchSnapshot(); - }); - - test('throws on empty id', () => { - const source = Buffer.from(`\ -h1= i18n('', { defaultMessage: 'Default message', description: 'Message description' }) -`); - - expect(() => extractPugMessages(source, { report }).next()).not.toThrow(); - expect(report.mock.calls).toMatchSnapshot(); - }); - - test('throws on missing default message', () => { - const source = Buffer.from(`\ -#{i18n('message-id', { description: 'Message description' })} -`); - - expect(() => extractPugMessages(source, { report }).next()).not.toThrow(); - expect(report.mock.calls).toMatchSnapshot(); - }); -}); diff --git a/src/dev/i18n/tasks/extract_untracked_translations.ts b/src/dev/i18n/tasks/extract_untracked_translations.ts index 39f8a1cc59c6b..21ab47641f2f0 100644 --- a/src/dev/i18n/tasks/extract_untracked_translations.ts +++ b/src/dev/i18n/tasks/extract_untracked_translations.ts @@ -45,7 +45,6 @@ export async function extractUntrackedMessagesTask({ const availablePaths = Object.values(config.paths).flat(); const ignore = availablePaths.concat([ '**/build/**', - '**/webpackShims/**', '**/__fixtures__/**', '**/packages/kbn-i18n/**', '**/packages/kbn-plugin-generator/sao_template/**', diff --git a/src/dev/jest/config.js b/src/dev/jest/config.js index 5249b7d652790..74e1ec5e2b4ed 100644 --- a/src/dev/jest/config.js +++ b/src/dev/jest/config.js @@ -32,6 +32,7 @@ export default { '/src/cli_plugin', '/packages/kbn-test/target/functional_test_runner', '/src/dev', + '/src/optimize', '/src/legacy/utils', '/src/setup_node_env', '/packages', diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index bdbd600e9aa74..19d03e41ac5a9 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -40,7 +40,7 @@ export const IGNORE_FILE_GLOBS = [ 'x-pack/plugins/canvas/canvas_plugin_src/**/*', 'x-pack/plugins/monitoring/public/lib/jquery_flot/**/*', '**/.*', - '**/{webpackShims,__mocks__}/**/*', + '**/__mocks__/**/*', 'x-pack/docs/**/*', 'src/core/server/core_app/assets/fonts/**/*', 'src/dev/code_coverage/ingest_coverage/integration_tests/mocks/**/*', @@ -99,7 +99,6 @@ export const KEBAB_CASE_DIRECTORY_GLOBS = ['packages/*', 'x-pack']; */ export const IGNORE_DIRECTORY_GLOBS = [ ...KEBAB_CASE_DIRECTORY_GLOBS, - '**/webpackShims', 'src/babel-*', 'packages/*', 'packages/kbn-ui-framework/generator-kui', @@ -143,35 +142,10 @@ export const TEMPORARILY_IGNORED_PATHS = [ 'src/core/server/core_app/assets/favicons/mstile-310x150.png', 'src/core/server/core_app/assets/favicons/mstile-310x310.png', 'src/core/server/core_app/assets/favicons/safari-pinned-tab.svg', - 'src/legacy/ui/public/styles/bootstrap/component-animations.less', - 'src/legacy/ui/public/styles/bootstrap/input-groups.less', - 'src/legacy/ui/public/styles/bootstrap/list-group.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/background-variant.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/border-radius.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/center-block.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/grid-framework.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/hide-text.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/list-group.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/nav-divider.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/nav-vertical-align.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/progress-bar.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/reset-filter.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/reset-text.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/responsive-visibility.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/tab-focus.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/table-row.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/text-emphasis.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/text-overflow.less', - 'src/legacy/ui/public/styles/bootstrap/mixins/vendor-prefixes.less', - 'src/legacy/ui/public/styles/bootstrap/progress-bars.less', - 'src/legacy/ui/public/styles/bootstrap/responsive-utilities.less', 'test/functional/apps/management/exports/_import_objects-conflicts.json', 'packages/kbn-ui-framework/doc_site/src/images/elastic-logo.svg', 'packages/kbn-ui-framework/doc_site/src/images/hint-arrow.svg', 'packages/kbn-ui-framework/doc_site/src/images/react-logo.svg', - 'webpackShims/elasticsearch-browser.js', - 'webpackShims/moment-timezone.js', - 'webpackShims/ui-bootstrap.js', 'x-pack/legacy/plugins/index_management/public/lib/editSettings.js', 'x-pack/legacy/plugins/license_management/public/store/reducers/licenseManagement.js', 'x-pack/plugins/monitoring/public/components/sparkline/__mocks__/plugins/xpack_main/jquery_flot.js', diff --git a/src/dev/sass/build_sass.js b/src/dev/sass/build_sass.js deleted file mode 100644 index 68058043477d0..0000000000000 --- a/src/dev/sass/build_sass.js +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { resolve } from 'path'; - -import * as Rx from 'rxjs'; -import { toArray } from 'rxjs/operators'; - -import { createFailError } from '@kbn/dev-utils'; -import { debounce } from 'lodash'; -import { findPluginSpecs } from '../../legacy/plugin_discovery'; -import { collectUiExports } from '../../legacy/ui'; -import { buildAll } from '../../legacy/server/sass/build_all'; -import chokidar from 'chokidar'; - -// TODO: clintandrewhall - Extract and use FSWatcher from legacy/server/sass -const build = async ({ log, kibanaDir, styleSheetPaths, watch }) => { - if (styleSheetPaths.length === 0) { - return; - } - - let bundleCount = 0; - try { - const bundles = await buildAll({ - styleSheets: styleSheetPaths, - log, - buildDir: resolve(kibanaDir, 'built_assets/css'), - sourceMap: true, - }); - - bundles.forEach((bundle) => { - log.debug(`Compiled SCSS: ${bundle.sourcePath} (theme=${bundle.theme})`); - }); - - bundleCount = bundles.length; - } catch (error) { - const { message, line, file } = error; - throw createFailError(`${message} on line ${line} of ${file}`); - } - - log.success('%d scss bundles %s', bundleCount, watch ? 'rebuilt' : 'created'); -}; - -export async function buildSass({ log, kibanaDir, watch }) { - log.info('running plugin discovery in', kibanaDir); - - const scanDirs = [resolve(kibanaDir, 'src/legacy/core_plugins')]; - const paths = [resolve(kibanaDir, 'x-pack')]; - const { spec$, disabledSpec$ } = findPluginSpecs({ plugins: { scanDirs, paths } }); - const allPlugins = await Rx.merge(spec$, disabledSpec$).pipe(toArray()).toPromise(); - const uiExports = collectUiExports(allPlugins); - const { styleSheetPaths } = uiExports; - - log.info('%s %d styleSheetPaths', watch ? 'watching' : 'found', styleSheetPaths.length); - log.verbose(styleSheetPaths); - - if (watch) { - const debouncedBuild = debounce(async (path) => { - let buildPaths = styleSheetPaths; - if (path) { - buildPaths = styleSheetPaths.filter((styleSheetPath) => - path.includes(styleSheetPath.urlImports.publicDir) - ); - } - await build({ log, kibanaDir, styleSheetPaths: buildPaths, watch }); - }); - - const watchPaths = styleSheetPaths.map((styleSheetPath) => styleSheetPath.urlImports.publicDir); - - await build({ log, kibanaDir, styleSheetPaths }); - - chokidar.watch(watchPaths, { ignoreInitial: true }).on('all', (_, path) => { - debouncedBuild(path); - }); - } else { - await build({ log, kibanaDir, styleSheetPaths }); - } -} diff --git a/src/dev/sass/run_build_sass_cli.js b/src/dev/sass/run_build_sass_cli.js deleted file mode 100644 index 439d16178c417..0000000000000 --- a/src/dev/sass/run_build_sass_cli.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { run } from '@kbn/dev-utils'; -import { REPO_ROOT } from '../constants'; -import { buildSass } from './build_sass'; - -run( - async ({ log, flags: { kibanaDir, watch } }) => { - await buildSass({ - log, - kibanaDir, - watch, - }); - }, - { - description: 'Simple CLI, useful for building scss files outside of the server', - flags: { - default: { - kibanaDir: REPO_ROOT, - watch: false, - }, - string: ['kibanaDir'], - boolean: ['watch'], - help: ` - --kibanaDir The root of the Kibana directory to build sass files in. - --watch Watch the SASS files and recompile them on save. - `, - }, - } -); diff --git a/src/legacy/core_plugins/kibana/index.js b/src/legacy/core_plugins/kibana/index.js index 9648ff29a95e7..2e30bc5ce05ee 100644 --- a/src/legacy/core_plugins/kibana/index.js +++ b/src/legacy/core_plugins/kibana/index.js @@ -18,7 +18,6 @@ */ import Fs from 'fs'; -import { resolve } from 'path'; import { promisify } from 'util'; import { getUiSettingDefaults } from './server/ui_setting_defaults'; @@ -40,7 +39,6 @@ export default function (kibana) { }, uiExports: { - styleSheetPaths: resolve(__dirname, 'public/index.scss'), uiSettingDefaults: getUiSettingDefaults(), }, diff --git a/src/legacy/core_plugins/status_page/index.js b/src/legacy/core_plugins/status_page/index.js deleted file mode 100644 index 5a94eb9c77160..0000000000000 --- a/src/legacy/core_plugins/status_page/index.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -export default function (kibana) { - return new kibana.Plugin({ - uiExports: { - app: { - title: 'Legacy Server Status', - main: 'plugins/status_page/status_page', - hidden: true, - url: '/__legacy__/status', - }, - }, - }); -} diff --git a/src/legacy/core_plugins/status_page/package.json b/src/legacy/core_plugins/status_page/package.json deleted file mode 100644 index cecfe30f1173c..0000000000000 --- a/src/legacy/core_plugins/status_page/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "status_page", - "version": "kibana" -} diff --git a/src/legacy/core_plugins/status_page/public/components/render.js b/src/legacy/core_plugins/status_page/public/components/render.js deleted file mode 100644 index dca79d783a29a..0000000000000 --- a/src/legacy/core_plugins/status_page/public/components/render.js +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -import { render, unmountComponentAtNode } from 'react-dom'; -import { I18nContext } from 'ui/i18n'; -// just to import eui into legacy -import '@elastic/eui'; - -const STATUS_PAGE_DOM_NODE_ID = 'createStatusPageReact'; - -export function renderStatusPage() { - const node = document.getElementById(STATUS_PAGE_DOM_NODE_ID); - - if (!node) { - return; - } - - render(Foo, node); -} - -export function destroyStatusPage() { - const node = document.getElementById(STATUS_PAGE_DOM_NODE_ID); - node && unmountComponentAtNode(node); -} diff --git a/src/legacy/core_plugins/status_page/public/status_page.html b/src/legacy/core_plugins/status_page/public/status_page.html deleted file mode 100644 index 6e6af4f5bc56d..0000000000000 --- a/src/legacy/core_plugins/status_page/public/status_page.html +++ /dev/null @@ -1 +0,0 @@ -
    diff --git a/src/legacy/core_plugins/status_page/public/status_page.js b/src/legacy/core_plugins/status_page/public/status_page.js deleted file mode 100644 index 709164caa9e04..0000000000000 --- a/src/legacy/core_plugins/status_page/public/status_page.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import 'ui/i18n'; -import chrome from 'ui/chrome'; -import { npStart } from 'ui/new_platform'; -import { destroyStatusPage, renderStatusPage } from './components/render'; -import template from 'plugins/status_page/status_page.html'; - -npStart.core.chrome.navLinks.enableForcedAppSwitcherNavigation(); - -chrome.setRootTemplate(template).setRootController('ui', function ($scope, buildNum, buildSha) { - $scope.$$postDigest(() => { - renderStatusPage(buildNum, buildSha.substr(0, 8)); - $scope.$on('$destroy', destroyStatusPage); - }); -}); diff --git a/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts b/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts index d668739436726..e51a355cbc8d2 100644 --- a/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts +++ b/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts @@ -24,12 +24,8 @@ import { SavedObjectsLegacyManagementDefinition } from '../../../core/server/sav export type InitPluginFunction = (server: Server) => void; export interface UiExports { injectDefaultVars?: (server: Server) => { [key: string]: any }; - styleSheetPaths?: string; savedObjectsManagement?: SavedObjectsLegacyManagementDefinition; mappings?: unknown; - visTypes?: string[]; - interpreter?: string[]; - hacks?: string[]; } export interface PluginSpecOptions { diff --git a/src/legacy/plugin_discovery/types.ts b/src/legacy/plugin_discovery/types.ts index 4d8090a138ffb..283806f69599a 100644 --- a/src/legacy/plugin_discovery/types.ts +++ b/src/legacy/plugin_discovery/types.ts @@ -66,9 +66,7 @@ export interface LegacyPluginOptions { hacks: string[]; visualize: string[]; devTools: string[]; - styleSheetPaths: string; injectDefaultVars: (server: Server) => Record; - noParse: string[]; home: string[]; mappings: any; migrations: any; diff --git a/src/legacy/server/config/schema.js b/src/legacy/server/config/schema.js index 952c35df244c1..6cd3f8dc448b0 100644 --- a/src/legacy/server/config/schema.js +++ b/src/legacy/server/config/schema.js @@ -19,9 +19,6 @@ import Joi from 'joi'; import os from 'os'; -import { join } from 'path'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { getDataPath } from '../../../core/server/path'; // Still used by optimize config schema const HANDLED_IN_NEW_PLATFORM = Joi.any().description( 'This key is handled in the new platform ONLY' @@ -161,28 +158,6 @@ export default () => maximumWaitTimeForAllCollectorsInS: Joi.number().default(60), }).default(), - optimize: Joi.object({ - enabled: Joi.boolean().default(true), - bundleFilter: Joi.string().default('!tests'), - bundleDir: Joi.string().default(join(getDataPath(), 'optimize')), - viewCaching: Joi.boolean().default(Joi.ref('$prod')), - watch: Joi.boolean().default(false), - watchPort: Joi.number().default(5602), - watchHost: Joi.string().hostname().default('localhost'), - watchPrebuild: Joi.boolean().default(false), - watchProxyTimeout: Joi.number().default(10 * 60000), - useBundleCache: Joi.boolean().default(!!process.env.CODE_COVERAGE ? true : Joi.ref('$prod')), - sourceMaps: Joi.when('$prod', { - is: true, - then: Joi.boolean().valid(false), - otherwise: Joi.alternatives() - .try(Joi.string().required(), Joi.boolean()) - .default(!!process.env.CODE_COVERAGE ? 'true' : '#cheap-source-map'), - }), - workers: Joi.number().min(1), - profile: Joi.boolean().default(false), - validateSyntaxOfNodeModules: Joi.boolean().default(true), - }).default(), status: Joi.object({ allowAnonymous: Joi.boolean().default(false), }).default(), diff --git a/src/legacy/server/http/index.js b/src/legacy/server/http/index.js index 2d62d12dfd9f3..0cab1a1609287 100644 --- a/src/legacy/server/http/index.js +++ b/src/legacy/server/http/index.js @@ -18,28 +18,18 @@ */ import { format } from 'url'; -import _ from 'lodash'; import Boom from 'boom'; import { registerHapiPlugins } from './register_hapi_plugins'; import { setupBasePathProvider } from './setup_base_path_provider'; -export default async function (kbnServer, server, config) { +export default async function (kbnServer, server) { server = kbnServer.server; setupBasePathProvider(kbnServer); await registerHapiPlugins(server); - // helper for creating view managers for servers - server.decorate('server', 'setupViews', function (path, engines) { - this.views({ - path: path, - isCached: config.get('optimize.viewCaching'), - engines: _.assign({ pug: require('pug') }, engines || {}), - }); - }); - server.route({ method: 'GET', path: '/{p*}', diff --git a/src/legacy/server/kbn_server.js b/src/legacy/server/kbn_server.js index 1168d24254911..1084521235ea0 100644 --- a/src/legacy/server/kbn_server.js +++ b/src/legacy/server/kbn_server.js @@ -31,13 +31,12 @@ import warningsMixin from './warnings'; import { statusMixin } from './status'; import pidMixin from './pid'; import configCompleteMixin from './config/complete'; -import optimizeMixin from '../../optimize'; +import { optimizeMixin } from '../../optimize'; import * as Plugins from './plugins'; import { savedObjectsMixin } from './saved_objects/saved_objects_mixin'; import { capabilitiesMixin } from './capabilities'; import { serverExtensionsMixin } from './server_extensions'; import { uiMixin } from '../ui'; -import { sassMixin } from './sass'; import { i18nMixin } from './i18n'; /** @@ -111,7 +110,6 @@ export default class KbnServer { // tell the config we are done loading plugins configCompleteMixin, - // setup this.uiBundles uiMixin, // setup saved object routes @@ -120,13 +118,9 @@ export default class KbnServer { // setup capabilities routes capabilitiesMixin, - // ensure that all bundles are built, or that the - // watch bundle server is running + // setup routes that serve the @kbn/optimizer output optimizeMixin, - // transpiles SCSS into CSS - sassMixin, - // initialize the plugins Plugins.initializeMixin, diff --git a/src/legacy/server/sass/__fixtures__/images/img.png b/src/legacy/server/sass/__fixtures__/images/img.png deleted file mode 100644 index c7738a39df3e67c91335dd28b57160e4bb11597f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3820 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 { - const relativePath = relative(root, path); - return { - path, - root, - boundry, - url: join(`${PUBLIC_PATH_PLACEHOLDER}${urlRoot}`, relativePath).replace(/\\/g, '/'), - copyTo: copyRoot ? resolve(copyRoot, relativePath) : undefined, - requestUrl: request.url, - }; -}; - -export class Build { - constructor({ log, sourcePath, targetPath, urlImports, theme }) { - this.log = log; - this.sourcePath = sourcePath; - this.sourceDir = dirname(this.sourcePath); - this.targetPath = targetPath; - this.targetDir = dirname(this.targetPath); - this.urlImports = urlImports; - this.theme = theme; - this.includedFiles = [sourcePath]; - } - - /** - * Glob based on source path - */ - async buildIfIncluded(path) { - if (this.includedFiles && this.includedFiles.includes(path)) { - await this.build(); - return true; - } - - return false; - } - - /** - * Transpiles SASS and writes CSS to output - */ - - async build() { - const scss = await readFile(this.sourcePath); - const relativeGlobalsPath = - this.theme === 'dark' - ? relative(this.sourceDir, DARK_GLOBALS_PATH) - : relative(this.sourceDir, LIGHT_GLOBALS_PATH); - - const rendered = await renderSass({ - file: this.sourcePath, - data: `@import '${relativeGlobalsPath}';\n${scss}`, - outFile: this.targetPath, - sourceMap: true, - outputStyle: 'nested', - sourceMapEmbed: true, - includePaths: [resolve(__dirname, '../../../../node_modules')], - }); - - const processor = postcss([autoprefixer]); - - const urlAssets = []; - - if (this.urlImports) { - processor.use( - postcssUrl({ - url: (request) => { - if (!request.pathname) { - return request.url; - } - - const asset = makeAsset( - request, - request.pathname.startsWith('ui/assets') - ? { - path: resolve(UI_ASSETS_DIR, relative('ui/assets', request.pathname)), - root: UI_ASSETS_DIR, - boundry: UI_ASSETS_DIR, - urlRoot: `ui/`, - } - : { - path: resolve(this.sourceDir, request.pathname), - root: this.sourceDir, - boundry: this.urlImports.publicDir, - urlRoot: this.urlImports.urlBase, - copyRoot: this.targetDir, - } - ); - - if ( - !urlAssets.some(({ path, copyTo }) => path === asset.path && copyTo === asset.copyTo) - ) { - urlAssets.push(asset); - } - - return asset.url; - }, - }) - ); - } - - const prefixed = await processor.process(rendered.css, { - from: this.sourcePath, - }); - - this.includedFiles = [...rendered.stats.includedFiles, ...urlAssets.map(({ path }) => path)]; - - // verify that asset sources exist and import is valid before writing anything - await Promise.all( - urlAssets.map(async (asset) => { - try { - await access(asset.path); - } catch (e) { - throw this._makeError( - 'Invalid url() in css output', - `url("${asset.requestUrl}") resolves to "${asset.path}", which does not exist.\n` + - ` Make sure that the request is relative to "${asset.root}"` - ); - } - - if (!isPathInside(asset.path, asset.boundry)) { - throw this._makeError( - 'Invalid url() in css output', - `url("${asset.requestUrl}") resolves to "${asset.path}"\n` + - ` which is outside of "${asset.boundry}"` - ); - } - }) - ); - - // write css - await mkdirAsync(this.targetDir, { recursive: true }); - await writeFile(this.targetPath, prefixed.css); - - // copy non-shared urlAssets - await Promise.all( - urlAssets.map(async (asset) => { - if (!asset.copyTo) { - return; - } - - await mkdirAsync(dirname(asset.copyTo), { recursive: true }); - await copyFile(asset.path, asset.copyTo); - }) - ); - - return this; - } - - _makeError(title, message) { - const error = new Error(`${chalk.red(`${title} [${this.sourcePath}]`)}\n\n ${message}\n`); - error.file = this.sourcePath; - return error; - } -} diff --git a/src/legacy/server/sass/build.test.js b/src/legacy/server/sass/build.test.js deleted file mode 100644 index 155c300bf3036..0000000000000 --- a/src/legacy/server/sass/build.test.js +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { dirname, resolve } from 'path'; -import { readFileSync } from 'fs'; -import globby from 'globby'; - -import del from 'del'; - -import { Build } from './build'; - -const TMP = resolve(__dirname, '__tmp__'); -const FIXTURE = resolve(__dirname, '__fixtures__/index.scss'); - -afterEach(async () => { - await del(TMP); -}); - -it('builds light themed SASS', async () => { - // Increased timeout from 5000ms due to intermittent timeout failures - jest.setTimeout(60000); - const targetPath = resolve(TMP, 'style.css'); - await new Build({ - sourcePath: FIXTURE, - log: { - info: () => {}, - warn: () => {}, - error: () => {}, - }, - theme: 'light', - targetPath, - }).build(); - - expect(readFileSync(targetPath, 'utf8').replace(/(\/\*# sourceMappingURL=).*( \*\/)/, '$1...$2')) - .toMatchInlineSnapshot(` - "foo bar { - display: flex; - background: #e6f0f8 url(./images/img.png) url(ui/assets/favicons/favicon.ico); } - /*# sourceMappingURL=... */" - `); -}); - -it('builds dark themed SASS', async () => { - const targetPath = resolve(TMP, 'style.css'); - await new Build({ - sourcePath: FIXTURE, - log: { - info: () => {}, - warn: () => {}, - error: () => {}, - }, - theme: 'dark', - targetPath, - }).build(); - - expect(readFileSync(targetPath, 'utf8').replace(/(\/\*# sourceMappingURL=).*( \*\/)/, '$1...$2')) - .toMatchInlineSnapshot(` - "foo bar { - display: flex; - background: #232635 url(./images/img.png) url(ui/assets/favicons/favicon.ico); } - /*# sourceMappingURL=... */" - `); -}); - -it('rewrites url imports', async () => { - const targetPath = resolve(TMP, 'style.css'); - await new Build({ - sourcePath: FIXTURE, - log: { - info: () => {}, - warn: () => {}, - error: () => {}, - }, - theme: 'dark', - targetPath, - urlImports: { - publicDir: dirname(FIXTURE), - urlBase: 'foo/bar', - }, - }).build(); - - expect(readFileSync(targetPath, 'utf8').replace(/(\/\*# sourceMappingURL=).*( \*\/)/, '$1...$2')) - .toMatchInlineSnapshot(` - "foo bar { - display: flex; - background: #232635 url(__REPLACE_WITH_PUBLIC_PATH__foo/bar/images/img.png) url(__REPLACE_WITH_PUBLIC_PATH__ui/favicons/favicon.ico); } - /*# sourceMappingURL=... */" - `); - - expect( - Buffer.compare( - readFileSync(resolve(TMP, 'images/img.png')), - readFileSync(resolve(dirname(FIXTURE), 'images/img.png')) - ) - ).toBe(0); - - expect(await globby('**/*', { cwd: TMP })).toMatchInlineSnapshot(` - Array [ - "style.css", - "images/img.png", - ] - `); -}); diff --git a/src/legacy/server/sass/build_all.js b/src/legacy/server/sass/build_all.js deleted file mode 100644 index dac6ac87a40d3..0000000000000 --- a/src/legacy/server/sass/build_all.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { resolve } from 'path'; - -import { Build } from './build'; - -export async function buildAll({ styleSheets, log, buildDir }) { - const bundles = await Promise.all( - styleSheets.map(async (styleSheet) => { - if (!styleSheet.localPath.endsWith('.scss')) { - return; - } - - const bundle = new Build({ - sourcePath: styleSheet.localPath, - log, - theme: styleSheet.theme, - targetPath: resolve(buildDir, styleSheet.publicPath), - urlImports: styleSheet.urlImports, - }); - await bundle.build(); - - return bundle; - }) - ); - - return bundles.filter((v) => v); -} diff --git a/src/legacy/server/sass/index.js b/src/legacy/server/sass/index.js deleted file mode 100644 index 001457d110276..0000000000000 --- a/src/legacy/server/sass/index.js +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { IS_KIBANA_DISTRIBUTABLE } from '../../utils'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { fromRoot } from '../../../core/server/utils'; - -export async function sassMixin(kbnServer, server, config) { - if (process.env.kbnWorkerType === 'optmzr') { - return; - } - - /** - * Build assets - * - * SCSS is only transpiled while running from source - */ - - if (IS_KIBANA_DISTRIBUTABLE) { - return; - } - - const { buildAll } = require('./build_all'); - let scssBundles = []; - let trackedFiles = new Set(); - - const log = { - info: (msg) => server.log(['info', 'scss'], msg), - warn: (msg) => server.log(['warn', 'scss'], msg), - error: (msg) => server.log(['error', 'scss'], msg), - }; - - try { - scssBundles = await buildAll({ - styleSheets: kbnServer.uiExports.styleSheetPaths, - log, - buildDir: fromRoot('built_assets/css'), - }); - - scssBundles.forEach((bundle) => { - bundle.includedFiles.forEach((file) => trackedFiles.add(file)); - server.log(['info', 'scss'], `Compiled CSS: ${bundle.sourcePath} (theme=${bundle.theme})`); - }); - } catch (error) { - const { message, line, file } = error; - if (!file) { - throw error; - } - - trackedFiles.add(file); - server.log(['error', 'scss'], `${message}${line ? ` on line ${line} of ${file}` : ''}`); - } - - /** - * Setup Watchers - * - * Similar to the optimizer, we only setup watchers while in development mode - */ - - if (!config.get('env').dev) { - return; - } - - const { FSWatcher } = require('chokidar'); - const watcher = new FSWatcher({ ignoreInitial: true }); - - watcher.add([...trackedFiles]); - - watcher.on('all', async (event, path) => { - const currentlyTrackedFiles = new Set(); - - server.log(['debug', 'scss'], `${path} triggered ${event}`); - - // build bundles containing the changed file - await Promise.all( - scssBundles.map(async (bundle) => { - try { - if (await bundle.buildIfIncluded(path)) { - server.log(['info', 'scss'], `Compiled ${bundle.sourcePath} due to change in ${path}`); - } - // if the bundle rebuilt, includedFiles is the new set; otherwise includedFiles is unchanged and remains tracked - bundle.includedFiles.forEach((file) => currentlyTrackedFiles.add(file)); - } catch (error) { - const { message, line, file } = error; - if (!file) { - throw error; - } - - currentlyTrackedFiles.add(file); - server.log(['error', 'scss'], `${message}${line ? ` on line ${line} of ${file}` : ''}`); - } - }, []) - ); - - /** - * update watchers - */ - - // un-watch files no longer included in any bundle - trackedFiles.forEach((file) => { - if (currentlyTrackedFiles.has(file)) { - return; - } - - watcher.unwatch(file); - server.log(['debug', 'scss'], `No longer watching ${file}`); - }); - - // watch files not previously included in any bundle - currentlyTrackedFiles.forEach((file) => { - if (trackedFiles.has(file)) { - return; - } - - watcher.add(file); - server.log(['debug', 'scss'], `Now watching ${file}`); - }); - - trackedFiles = currentlyTrackedFiles; - }); -} diff --git a/src/legacy/server/views/index.pug b/src/legacy/server/views/index.pug deleted file mode 100644 index 8711217ec6a74..0000000000000 --- a/src/legacy/server/views/index.pug +++ /dev/null @@ -1,6 +0,0 @@ -html - head - title Kibana Status - body - h1 Kibana Status Page - p Statusy stuff goes here... it's going to be totally awesome! diff --git a/src/legacy/ui/public/UI_SYSTEMS.md b/src/legacy/ui/public/UI_SYSTEMS.md deleted file mode 100644 index 8462b2c8f4144..0000000000000 --- a/src/legacy/ui/public/UI_SYSTEMS.md +++ /dev/null @@ -1,8 +0,0 @@ -# UI Systems - -In this directory you'll find various UI systems you can use to craft effective user experiences within Kibana. - -## ui/notify - -* [banners](notify/banners/BANNERS.md) -* [toastNotifications](../../../plugins/kibana_legacy/public/notify/toasts/TOAST_NOTIFICATIONS.md) diff --git a/src/legacy/ui/public/chrome/__mocks__/index.js b/src/legacy/ui/public/chrome/__mocks__/index.js index d6f0df83a0e3d..cf977cd2c9f81 100644 --- a/src/legacy/ui/public/chrome/__mocks__/index.js +++ b/src/legacy/ui/public/chrome/__mocks__/index.js @@ -60,12 +60,6 @@ const internals = _.defaults(_.cloneDeep(metadata), { const waitForBootstrap = new Promise((resolve) => { chrome.bootstrap = function (targetDomElement) { - // import chrome nav controls and hacks now so that they are executed after - // everything else, can safely import the chrome, and interact with services - // and such setup by all other modules - require('uiExports/chromeNavControls'); - require('uiExports/hacks'); - // sets attribute on body for stylesheet sandboxing document.body.setAttribute('id', `${internals.app.id}-app`); diff --git a/src/legacy/ui/public/chrome/chrome.js b/src/legacy/ui/public/chrome/chrome.js index 0640017f7806a..cdb0734f61622 100644 --- a/src/legacy/ui/public/chrome/chrome.js +++ b/src/legacy/ui/public/chrome/chrome.js @@ -81,12 +81,6 @@ npStart.core.chrome.setAppTitle(chrome.getAppTitle()); const waitForBootstrap = new Promise((resolve) => { chrome.bootstrap = function (targetDomElement) { - // import chrome nav controls and hacks now so that they are executed after - // everything else, can safely import the chrome, and interact with services - // and such setup by all other modules - require('uiExports/chromeNavControls'); - require('uiExports/hacks'); - // sets attribute on body for stylesheet sandboxing document.body.setAttribute('id', `${internals.app.id}-app`); diff --git a/src/legacy/ui/public/styles/bootstrap/_colors_dark.less b/src/legacy/ui/public/styles/bootstrap/_colors_dark.less deleted file mode 100644 index 677a829cd5d1e..0000000000000 --- a/src/legacy/ui/public/styles/bootstrap/_colors_dark.less +++ /dev/null @@ -1,20 +0,0 @@ -//== Colors -// -//## Gray and brand colors for use across Bootstrap. -@white: #1D1E24; -@blue: #1BA9F5; - -@brand-primary: #F5F7FA; -@brand-success: #7DE2D1; -@brand-info: @blue; -@brand-warning: #FF977A; -@brand-danger: #FF6666; - -@gray-base: #FFF; -@gray-darker: #F5F7FA; -@gray-dark: #ababab; -@gray5: #D4DAE5; -@gray: #535966; -@gray-light: darken(#535966, 9%); -@gray-lighter: #343741; -@gray-lightest: #25262E; diff --git a/src/legacy/ui/public/styles/bootstrap/_colors_light.less b/src/legacy/ui/public/styles/bootstrap/_colors_light.less deleted file mode 100644 index adea876322f0d..0000000000000 --- a/src/legacy/ui/public/styles/bootstrap/_colors_light.less +++ /dev/null @@ -1,20 +0,0 @@ -//== Colors -// -//## Gray and brand colors for use across Bootstrap. -@white: #FFF; -@blue: #006BB4; - -@brand-primary: #343741; -@brand-success: #017D73; -@brand-info: @blue; -@brand-warning: #F5A700; -@brand-danger: #BD271E; - -@gray-base: #000; -@gray-darker: #343741; -@gray-dark: #7b7b7b; -@gray5: #69707D; -@gray: #98A2B3; -@gray-light: lighten(#98A2B3, 9%); // ~#b4b4b4 -@gray-lighter: #D3DAE6; -@gray-lightest: #F5F7FA; diff --git a/src/legacy/ui/public/styles/bootstrap/_custom_variables.less b/src/legacy/ui/public/styles/bootstrap/_custom_variables.less deleted file mode 100644 index a348e7bfa86b8..0000000000000 --- a/src/legacy/ui/public/styles/bootstrap/_custom_variables.less +++ /dev/null @@ -1,443 +0,0 @@ -//== Scaffolding -// -// ## Settings for some of the most global styles. - -//** Background color for ``. -@body-bg: @white; -//** Global text color on ``. -@text-color: @brand-primary; - - -//** Global textual link color. -@link-color: @blue; -@link-hover-color: darken(@link-color, 10%); -@link-hover-decoration: none; - -//== Typography -// -//## Font, line-height, and color for body text, headings, and more. -@font-family-sans-serif: 'Open Sans', Helvetica, Arial, sans-serif; -//** Default monospace fonts for ``, ``, and `

    `.
    -@font-family-monospace:   'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
    -
    -//** By default, this inherits from the ``.
    -@headings-font-family:    @font-family-base;
    -@headings-font-weight:    400;
    -@headings-line-height:    1.3;
    -
    -//-- Iconography
    -//
    -//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.
    -
    -@icon-font-path:          "../fonts/";
    -@icon-font-name:          "glyphicons-halflings-regular";
    -@icon-font-svg-id:        "glyphicons_halflingsregular";
    -
    -//== Components
    -//
    -//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
    -
    -@padding-base-vertical:     5px;
    -@padding-base-horizontal:   15px;
    -
    -@padding-large-vertical:    18px;
    -@padding-large-horizontal:  27px;
    -
    -@padding-small-vertical:    6px;
    -@padding-small-horizontal:  9px;
    -
    -@padding-xs-vertical:       1px;
    -@padding-xs-horizontal:     5px;
    -
    -@border-radius-base:        4px;
    -@border-radius-large:       4px;
    -@border-radius-small:       4px;
    -
    -//** Global color for active items (e.g., navs or dropdowns).
    -@component-active-color:    @white;
    -
    -
    -//== Tables
    -//
    -//## Customizes the `.table` component with basic values, each used across all table variations.
    -
    -//** Background color used for `.table-striped`.
    -@table-bg-accent:           @gray-lighter;
    -//** Background color used for `.table-hover`.
    -@table-bg-hover:            @gray-lighter;
    -//** Border color for table and cell borders.
    -@table-border-color:        @gray-lighter;
    -
    -
    -//== Buttons
    -//
    -//## For each of Bootstrap's buttons, define text, background and border color.
    -
    -@btn-default-color:         @white;
    -@btn-default-bg:            @blue;
    -@btn-default-border:        @blue;
    -
    -@btn-primary-color:         @white;
    -@btn-primary-bg:            @blue;
    -@btn-primary-border:        @blue;
    -
    -@btn-success-color:         @btn-default-color;
    -@btn-success-bg:            @blue;
    -@btn-success-border:        @blue;
    -
    -@btn-info-color:            @btn-default-color;
    -@btn-info-bg:               @brand-info;
    -@btn-info-border:           @btn-info-bg;
    -
    -@btn-warning-color:         @btn-default-color;
    -@btn-warning-bg:            @brand-warning;
    -@btn-warning-border:        @btn-warning-bg;
    -
    -@btn-danger-color:          @btn-default-color;
    -@btn-danger-bg:             @brand-danger;
    -@btn-danger-border:         @btn-danger-bg;
    -
    -
    -//== Forms
    -//
    -//##
    -
    -
    -//** `` background color
    -@input-bg:                       lighten(@gray-lightest, 1.5%);
    -//** Placeholder text color
    -@input-color-placeholder:        @gray;
    -
    -//** Text color for ``s
    -@input-color:                     @text-color;
    -//** `` border color
    -@input-border:                    @gray-lighter;
    -//** Border color for inputs on focus
    -@input-border-focus:              @blue;
    -
    -@legend-color:                    @text-color;
    -@legend-border-color:             transparent;
    -
    -
    -//== Dropdowns
    -//
    -//## Dropdown menu container and contents.
    -
    -//** Background for the dropdown menu.
    -@dropdown-bg:                   @white;
    -//** Dropdown menu `border-color`.
    -@dropdown-border:               @gray-lighter;
    -//** Dropdown menu `border-color` **for IE8**.
    -@dropdown-fallback-border:      @gray-lighter;
    -//** Divider color for between dropdown items.
    -@dropdown-divider-bg:           @gray-lighter;
    -
    -//** Hover color for dropdown links.
    -@dropdown-link-hover-color:     @white;
    -//** Hover background for dropdown links.
    -@dropdown-link-hover-bg:        @dropdown-link-active-bg;
    -
    -//** Active dropdown menu item text color.
    -@dropdown-link-active-color:    @white;
    -
    -//** Disabled dropdown menu item background color.
    -@dropdown-link-disabled-color:  @gray;
    -
    -//** Text color for headers within dropdown menus.
    -@dropdown-header-color:         @gray;
    -
    -// Note: Deprecated @dropdown-caret-color as of v3.1.0
    -@dropdown-caret-color:          @gray-base;
    -
    -
    -//-- Z-index master list
    -//
    -// Warning: Avoid customizing these values. They're used for a bird's eye view
    -// of components dependent on the z-axis and are designed to all work together.
    -//
    -// Note: These variables are not generated into the Customizer.
    -
    -@zindex-dropdown:          1000;
    -@zindex-popover:           1010;
    -@zindex-typeahead:         1030;
    -@zindex-tooltip:           1040;
    -@zindex-navbar-fixed:      1050;
    -@zindex-modal-background:  1060;
    -@zindex-modal:             1070;
    -
    -
    -//== Navbar
    -//
    -//##
    -
    -// Basics of a navbar
    -@navbar-height:                    45px;
    -@navbar-margin:                    @padding-small-vertical;
    -@navbar-margin-bottom:             0px;
    -@navbar-border-radius:             @border-radius-base;
    -@navbar-padding-horizontal:        10px;
    -
    -// Default theme
    -@navbar-default-bg:                     @gray-lightest;
    -@navbar-default-color:                  @gray5;
    -@navbar-default-border:                 transparent;
    -@navbar-default-link-color:             @gray5;
    -@navbar-default-link-hover-color:       @gray5;
    -@navbar-default-link-active-color:      @brand-primary;
    -@navbar-default-link-active-bg:         transparent;
    -@navbar-default-link-disabled-color:    @gray5;
    -
    -// Navbar brand label
    -@navbar-default-brand-color:            @navbar-default-link-color;
    -@navbar-default-brand-hover-color:      @navbar-default-link-hover-color;
    -@navbar-default-brand-hover-bg:         transparent;
    -
    -// Navbar toggle
    -@navbar-default-toggle-hover-bg:        darken(@navbar-default-bg, 10%);
    -@navbar-default-toggle-icon-bar-bg:     @white;
    -@navbar-default-toggle-border-color:    darken(@navbar-default-bg, 10%);
    -
    -
    -// Inverted navbar
    -// Reset inverted navbar basics
    -@navbar-inverse-link-active-bg:         @gray5;
    -@navbar-inverse-color:                  @white;
    -@navbar-inverse-bg:                     @gray-darker;
    -@navbar-inverse-border:                 darken(@navbar-inverse-bg, 10%);
    -
    -// Inverted navbar links
    -@navbar-inverse-link-color:             @gray-lighter;
    -@navbar-inverse-link-hover-color:       @white;
    -@navbar-inverse-link-hover-bg:          lighten(@navbar-inverse-bg, 20%);
    -@navbar-inverse-link-active-color:      @white;
    -@navbar-inverse-link-disabled-color:    @gray-light;
    -@navbar-inverse-link-disabled-bg:       transparent;
    -
    -// Inverted navbar brand label
    -@navbar-inverse-brand-color:            @white;
    -@navbar-inverse-brand-bg:               lighten(@navbar-inverse-bg, 10%);
    -@navbar-inverse-brand-hover-color:      @navbar-inverse-brand-color;
    -@navbar-inverse-brand-hover-bg:         @navbar-inverse-brand-bg;
    -
    -// Inverted navbar toggle
    -@navbar-inverse-toggle-hover-bg:        darken(@navbar-inverse-bg, 10%);
    -@navbar-inverse-toggle-icon-bar-bg:     @white;
    -@navbar-inverse-toggle-border-color:    darken(@navbar-inverse-bg, 10%);
    -
    -@navbar-default-badge-bg: @white;
    -@navbar-default-badge-color: @navbar-default-bg;
    -@navbar-inverse-badge-bg: @white;
    -@navbar-inverse-badge-color: lighten(@navbar-inverse-bg, 10%);
    -@navbar-nav-active-link-border: @body-bg;
    -
    -//== Navs
    -//
    -//##
    -
    -//== Tabs
    -@nav-tabs-border-color:                           @gray-lighter;
    -@nav-tabs-link-hover-border-color:                @white;
    -@nav-tabs-active-link-hover-bg:                   @white;
    -@nav-tabs-active-link-hover-color:                @brand-primary;
    -@nav-tabs-active-link-hover-border-color:         @white;
    -@nav-tabs-justified-link-border-color:            @white;
    -
    -//== Pills
    -@nav-pills-active-link-hover-bg:                  @blue;
    -@nav-pills-active-link-hover-color:               @white;
    -
    -//== Pagination
    -//
    -//##
    -
    -@pagination-color:                      @link-color;
    -@pagination-bg:                         transparent;
    -@pagination-border:                     transparent;
    -@pagination-hover-color:                @link-color;
    -@pagination-hover-bg:                   darken(transparent, 15%);
    -@pagination-hover-border:               transparent;
    -@pagination-active-color:               @text-color;
    -@pagination-active-bg:                  darken(transparent, 15%);
    -@pagination-active-border:              transparent;
    -@pagination-disabled-color:             @gray-darker;
    -@pagination-disabled-bg:                lighten(transparent, 15%);
    -@pagination-disabled-border:            transparent;
    -
    -
    -//== Pager
    -//
    -//##
    -
    -@pager-disabled-color:                 @white;
    -@pager-border-radius:                  0;
    -
    -
    -//== Form states and alerts
    -//
    -//## Define colors for form feedback states and, by default, alerts.
    -
    -@state-success-text:                    @white;
    -@state-success-bg:                      @brand-success;
    -@state-success-border:                  darken(@brand-success, 10%);
    -@state-info-text:                       @white;
    -@state-info-bg:                         @brand-info;
    -@state-info-border:                     darken(@brand-info, 10%);
    -@state-warning-text:                    @white;
    -@state-warning-bg:                      @brand-warning;
    -@state-warning-border:                  darken(@brand-warning, 10%);
    -@state-danger-text:                     @white;
    -@state-danger-bg:                       @brand-danger;
    -@state-danger-border:                   darken(@brand-danger, 10%);
    -
    -
    -//== Tooltips
    -//
    -//##
    -
    -@tooltip-opacity:                       .8;
    -
    -//== Popovers
    -//
    -//##
    -
    -//** Popover body background color
    -@popover-bg:                            @white;
    -//** Popover border color
    -@popover-border-color:                  @gray-lighter;
    -//** Popover fallback border color
    -@popover-fallback-border-color:         @gray-lighter;
    -//** Popover outer arrow fallback color
    -@popover-arrow-outer-fallback-color:    darken(@popover-fallback-border-color, 20%);
    -
    -//== Labels
    -//
    -//##
    -
    -//** Default label background color
    -@label-default-bg:                      @btn-default-bg;
    -//** Default label text color
    -@label-color:                           @white;
    -//** Default text color of a linked label
    -@label-link-hover-color:                @white;
    -
    -
    -//== Modals
    -//
    -//##
    -
    -//** Background color of modal content area
    -@modal-content-bg:                      @white;
    -//** Modal content border color **for IE8**
    -@modal-content-fallback-border-color:   @gray;
    -//** Modal backdrop background color
    -@modal-backdrop-bg:                     @gray-base;
    -
    -
    -//== Progress bars
    -//
    -//##
    -
    -//** Background color of the whole progress component
    -@progress-bg:                 @gray-lighter;
    -//** Progress bar text color
    -@progress-bar-color:          @white;
    -
    -//** Background color of the whole progress component
    -@progress-bg:                           shade(@gray-lighter, 13%);
    -//** Default progress bar color
    -@progress-bar-bg:                       #54B399;
    -
    -//== List group
    -//
    -//##
    -
    -//** Background color on `.list-group-item`
    -@list-group-bg:                         @white;
    -//** `.list-group-item` border color
    -@list-group-border:                     @gray-lighter;
    -//** Text color of active list items
    -@list-group-active-color:               @text-color;
    -
    -@list-group-link-color:                 @gray5;
    -@list-group-link-heading-color:         @brand-primary;
    -
    -
    -//== Panels
    -//
    -//##
    -
    -@panel-bg:                              @white;
    -//** Border color for elements within panels
    -@panel-inner-border:                    @gray-lighter;
    -@panel-default-border:                  @gray-lighter;
    -@panel-primary-text:                    @white;
    -
    -
    -//== Thumbnails
    -//
    -//##
    -
    -//** Thumbnail border color
    -@thumbnail-border:                      @gray-lighter;
    -
    -
    -//== Wells
    -//
    -//##
    -
    -@well-bg:                               #F5F7FA;
    -@well-border:                           transparent;
    -
    -
    -//== Badges
    -//
    -//##
    -
    -@badge-color:                           @white;
    -//** Linked badge text color on hover
    -@badge-link-hover-color:                @white;
    -@badge-bg:                              @brand-primary;
    -//** Badge text color in active nav link
    -@badge-active-color:                    @brand-primary;
    -//** Badge background color in active nav link
    -@badge-active-bg:                       @white;
    -
    -
    -//== Breadcrumbs
    -//
    -//##
    -
    -//** Breadcrumb background color
    -@breadcrumb-bg:                         @gray-lighter;
    -//** Breadcrumb text color
    -@breadcrumb-color:                      @gray-light;
    -//** Text color of current page in the breadcrumb
    -@breadcrumb-active-color:               @gray;
    -
    -
    -//== Close
    -//
    -//##
    -
    -@close-color:                           @gray-base;
    -@close-text-shadow:                     none;
    -
    -
    -//== Code
    -//
    -//##
    -
    -@kbd-color:                             @white;
    -@kbd-bg:                                @brand-primary;
    -@pre-bg:                                @gray-lighter;
    -@pre-color:                             @gray-darker;
    -@pre-border-color:                      @gray-lighter;
    -
    -//== Type
    -//
    -//##
    -
    -//** Headings small color
    -@headings-small-color:                  @brand-primary;
    -//** Page header border color
    -@page-header-border-color:              transparent;
    diff --git a/src/legacy/ui/public/styles/bootstrap/_custom_variables_dark_overrides.less b/src/legacy/ui/public/styles/bootstrap/_custom_variables_dark_overrides.less
    deleted file mode 100644
    index c546e447c705d..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/_custom_variables_dark_overrides.less
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -@navbar-default-bg: darken(@gray-lighter, 50%);
    -
    -//** `` background color
    -@input-bg: darken(@gray-lightest, 5%);
    diff --git a/src/legacy/ui/public/styles/bootstrap/_overrides.less b/src/legacy/ui/public/styles/bootstrap/_overrides.less
    deleted file mode 100644
    index ae0edd12a7015..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/_overrides.less
    +++ /dev/null
    @@ -1,252 +0,0 @@
    -// Navbar =====================================================================
    -
    -.navbar > .container-fluid {
    -  > .navbar-nav,
    -  > .navbar-form {
    -    &:not(.pull-right):first-child {
    -      // This is how .navbar-brand accomplishes it's solid placement
    -      margin-left: -15px;
    -      margin-top: 4px;
    -    }
    -  }
    -}
    -
    -.navbar {
    -  border-width: 0;
    -}
    -
    -  .navbar-btn-link {
    -    margin: 0;
    -    border-radius: 0;
    -
    -    @media (max-width: @screen-sm-min) {
    -      width: 100%;
    -      text-align: left;
    -    }
    -  }
    -
    -  .navbar-default {
    -    .badge {
    -      background-color: @navbar-default-badge-bg;
    -      color: @navbar-default-badge-color;
    -    }
    -  }
    -
    -  .navbar-inverse {
    -    .kbnGlobalNav__logoBrand {
    -      height: @navbar-height;
    -      width: 252px;
    -      background-color: @navbar-inverse-brand-bg;
    -    }
    -
    -    .kbnGlobalNav__smallLogoBrand {
    -      height: @navbar-height;
    -      width: 45px;
    -      background-color: @navbar-inverse-brand-bg;
    -    }
    -
    -    .badge {
    -      background-color: @navbar-inverse-badge-bg;
    -      color: @navbar-inverse-badge-color;
    -    }
    -  }
    -
    -  .navbar-brand {
    -    cursor: default;
    -    font-size: 1.8em;
    -    user-select: none;
    -  }
    -
    -  .navbar-nav {
    -    font-size: @font-size-small;
    -
    -    & > .active > a {
    -      border-bottom-color: @gray-dark;
    -      background-color: transparent;
    -    }
    -  }
    -
    -  .navbar-toggle {
    -    margin-top: 4px;
    -  }
    -
    -
    -// Typography =================================================================
    -
    -.text-primary,
    -.text-primary:hover {
    -  color: @brand-primary;
    -}
    -
    -.text-success,
    -.text-success:hover {
    -  color: @brand-success;
    -}
    -
    -.text-danger,
    -.text-danger:hover {
    -  color: @brand-danger;
    -}
    -
    -.text-warning,
    -.text-warning:hover {
    -  color: @brand-warning;
    -}
    -
    -.text-info,
    -.text-info:hover {
    -  color: @brand-info;
    -}
    -
    -// Tables =====================================================================
    -
    -table,
    -.table {
    -
    -  .success,
    -  .warning,
    -  .danger,
    -  .info {
    -    color: @white;
    -
    -    a {
    -      color: @white;
    -    }
    -  }
    -}
    -
    -  .table-bordered > thead > tr > th,
    -  .table-bordered > tbody > tr > th,
    -  .table-bordered > tfoot > tr > th,
    -  .table-bordered > thead > tr > td,
    -  .table-bordered > tbody > tr > td,
    -  .table-bordered > tfoot > tr > td {
    -    border: 1px solid @table-border-color;
    -  }
    -
    -// Forms ======================================================================
    -
    -.form-control,
    -input {
    -  border-width: 1px;
    -  .box-shadow(none);
    -
    -  &:focus {
    -    .box-shadow(none);
    -  }
    -}
    -
    -.has-warning {
    -  .help-block,
    -  .control-label,
    -  .radio,
    -  .checkbox,
    -  .radio-inline,
    -  .checkbox-inline,
    -  .form-control-feedback {
    -    color: @brand-warning;
    -  }
    -
    -  .form-control,
    -  .form-control:focus {
    -    border: 1px solid;
    -    border-color: @brand-warning;
    -  }
    -
    -  .input-group-addon {
    -    border-color: @brand-warning;
    -  }
    -}
    -
    -.has-error {
    -  .help-block,
    -  .control-label,
    -  .radio,
    -  .checkbox,
    -  .radio-inline,
    -  .checkbox-inline,
    -  .form-control-feedback {
    -    color: @brand-danger;
    -  }
    -
    -  .form-control,
    -  .form-control:focus {
    -    border: 1px solid;
    -    border-color: @brand-danger;
    -  }
    -
    -  .input-group-addon {
    -    border-color: @brand-danger;
    -  }
    -}
    -
    -.has-success {
    -  .help-block,
    -  .control-label,
    -  .radio,
    -  .checkbox,
    -  .radio-inline,
    -  .checkbox-inline,
    -  .form-control-feedback {
    -    color: @brand-success;
    -  }
    -
    -  .form-control,
    -  .form-control:focus {
    -    border: solid @brand-success;
    -  }
    -
    -  .input-group-addon {
    -    border-color: @brand-success;
    -  }
    -}
    -
    -// Navs =======================================================================
    -
    -.nav {
    -  .open > a,
    -  .open > a:hover,
    -  .open > a:focus {
    -    border-color: transparent;
    -  }
    -}
    -
    -.pager {
    -  a,
    -  a:hover {
    -    color: @white;
    -  }
    -
    -  .disabled {
    -    &>a,
    -    &>a:hover,
    -    &>a:focus,
    -    &>span {
    -      background-color: @pagination-disabled-bg;
    -    }
    -  }
    -}
    -
    -
    -// Panel =================================================================
    -
    -.panel {
    -  border-radius: 0;
    -  .box-shadow(0 0 0 rgba(0,0,0,0));
    -}
    -
    -// Progress bars ==============================================================
    -
    -.progress {
    -  .box-shadow(none);
    -  .progress-bar {
    -    font-size: 10px;
    -    line-height: 10px;
    -  }
    -}
    -
    -// Containers =================================================================
    -
    -.well {
    -  .box-shadow(none);
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/alerts.less b/src/legacy/ui/public/styles/bootstrap/alerts.less
    deleted file mode 100644
    index c4199db927e79..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/alerts.less
    +++ /dev/null
    @@ -1,73 +0,0 @@
    -//
    -// Alerts
    -// --------------------------------------------------
    -
    -
    -// Base styles
    -// -------------------------
    -
    -.alert {
    -  padding: @alert-padding;
    -  margin-bottom: @line-height-computed;
    -  border: 1px solid transparent;
    -  border-radius: @alert-border-radius;
    -
    -  // Headings for larger alerts
    -  h4 {
    -    margin-top: 0;
    -    // Specified for the h4 to prevent conflicts of changing @headings-color
    -    color: inherit;
    -  }
    -
    -  // Provide class for links that match alerts
    -  .alert-link {
    -    font-weight: @alert-link-font-weight;
    -  }
    -
    -  // Improve alignment and spacing of inner content
    -  > p,
    -  > ul {
    -    margin-bottom: 0;
    -  }
    -
    -  > p + p {
    -    margin-top: 5px;
    -  }
    -}
    -
    -// Dismissible alerts
    -//
    -// Expand the right padding and account for the close button's positioning.
    -
    -.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.
    -.alert-dismissible {
    -  padding-right: (@alert-padding + 20);
    -
    -  // Adjust close link position
    -  .close {
    -    position: relative;
    -    top: -2px;
    -    right: -21px;
    -    color: inherit;
    -  }
    -}
    -
    -// Alternate styles
    -//
    -// Generate contextual modifier classes for colorizing the alert.
    -
    -.alert-success {
    -  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);
    -}
    -
    -.alert-info {
    -  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);
    -}
    -
    -.alert-warning {
    -  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);
    -}
    -
    -.alert-danger {
    -  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/bootstrap_dark.less b/src/legacy/ui/public/styles/bootstrap/bootstrap_dark.less
    deleted file mode 100644
    index 459efed37dd75..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/bootstrap_dark.less
    +++ /dev/null
    @@ -1,77 +0,0 @@
    -/*!
    - * Bootstrap v3.3.6 (http://getbootstrap.com)
    - * Copyright 2011-2015 Twitter, Inc.
    - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    - */
    -
    -/* @notice
    - * This product bundles bootstrap@3.3.6 which is available under a
    - * "MIT" license.
    - *
    - * The MIT License (MIT)
    - *
    - * Copyright (c) 2011-2015 Twitter, 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.
    - */
    -
    -// PLANNED FOR REMOVAL
    -// We are trying to remove bootstrap. The below are the files we're currently using.
    -// There's an audit in the comments to cover what's left to remove.
    -
    -// Core variables and mixins
    -@import "variables.less";
    -@import "_colors_dark.less";
    -@import "_custom_variables.less";
    -@import "_custom_variables_dark_overrides.less";
    -@import "mixins.less";
    -
    -// Hard to remove, used in many places
    -@import "grid.less"; // Used in a lot of places
    -@import "tables.less"; // Used in a lot of places
    -@import "forms.less"; // Used in a lot of places
    -
    -// Easy to remove
    -@import "type.less"; // Can be search / replaced with EUI
    -@import "component-animations.less"; // Used in angular bootstrap
    -@import "buttons.less";
    -@import "navbar.less"; // Used in Graph
    -@import "close.less"; // Only in angular-bootstrap
    -@import "modals.less"; // Only in angular-bootstrap
    -@import "progress-bars.less"; // Used in ML, angular-bootstrap
    -@import "list-group.less"; // Used in Timelion, Graph
    -@import "navs.less"; // Used in ML
    -@import "alerts.less"; // Only in angular-bootstrap
    -@import "tooltip.less"; // Only in angular-bootstrap
    -@import "responsive-utilities.less"; // Minimal usage
    -
    -// Decent usage in multiple areas
    -@import "dropdowns.less"; // Used in console, watcher
    -@import "input-groups.less"; // Used in ML, typeahead, reporting, graph
    -@import "pagination.less";
    -@import "pager.less";
    -@import "labels.less"; // Hard to judge usage because of generic selector names
    -@import "panels.less"; // Used in ML, dashboards, notify, angular-bootstrap
    -@import "popovers.less"; // Hard to judge usage because of generic selector names
    -
    -// Utility classes
    -@import "utilities.less";
    -
    -// OVERRIDES
    -@import "_overrides.less";
    diff --git a/src/legacy/ui/public/styles/bootstrap/bootstrap_light.less b/src/legacy/ui/public/styles/bootstrap/bootstrap_light.less
    deleted file mode 100644
    index e049b62f3dc2c..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/bootstrap_light.less
    +++ /dev/null
    @@ -1,76 +0,0 @@
    -/*!
    - * Bootstrap v3.3.6 (http://getbootstrap.com)
    - * Copyright 2011-2015 Twitter, Inc.
    - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    - */
    -
    -/* @notice
    - * This product bundles bootstrap@3.3.6 which is available under a
    - * "MIT" license.
    - *
    - * The MIT License (MIT)
    - *
    - * Copyright (c) 2011-2015 Twitter, 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.
    - */
    -
    -// PLANNED FOR REMOVAL
    -// We are trying to remove bootstrap. The below are the files we're currently using.
    -// There's an audit in the comments to cover what's left to remove.
    -
    -// Core variables and mixins
    -@import "variables.less";
    -@import "_colors_light.less";
    -@import "_custom_variables.less";
    -@import "mixins.less";
    -
    -// Hard to remove, used in many places
    -@import "grid.less"; // Used in a lot of places
    -@import "tables.less"; // Used in a lot of places
    -@import "forms.less"; // Used in a lot of places
    -
    -// Easy to remove
    -@import "type.less"; // Can be search / replaced with EUI
    -@import "component-animations.less"; // Used in angular bootstrap
    -@import "buttons.less";
    -@import "navbar.less"; // Used in Graph
    -@import "close.less"; // Only in angular-bootstrap
    -@import "modals.less"; // Only in angular-bootstrap
    -@import "progress-bars.less"; // Used in ML, angular-bootstrap
    -@import "list-group.less"; // Used in Timelion, Graph
    -@import "navs.less"; // Used in ML
    -@import "alerts.less"; // Only in angular-bootstrap
    -@import "tooltip.less"; // Only in angular-bootstrap
    -@import "responsive-utilities.less"; // Minimal usage
    -
    -// Decent usage in multiple areas
    -@import "dropdowns.less"; // Used in console, datepicker, watcher
    -@import "input-groups.less"; // Used in ML, typeahead, reporting, graph
    -@import "pagination.less";
    -@import "pager.less";
    -@import "labels.less"; // Hard to judge usage because of generic selector names
    -@import "panels.less"; // Used in ML, dashboards, notify, angular-bootstrap
    -@import "popovers.less"; // Hard to judge usage because of generic selector names
    -
    -// Utility classes
    -@import "utilities.less";
    -
    -// OVERRIDES
    -@import "_overrides.less";
    diff --git a/src/legacy/ui/public/styles/bootstrap/buttons.less b/src/legacy/ui/public/styles/bootstrap/buttons.less
    deleted file mode 100644
    index 04bc13b0d9c6e..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/buttons.less
    +++ /dev/null
    @@ -1,69 +0,0 @@
    -/**
    - * ui/angular-ui-select depends upon these styles. Don't use them in your markup.
    - * Please use the UI Framework styles instead.
    - */
    -
    -.btn {
    -  display: inline-block;
    -  margin-bottom: 0; // For input.btn
    -  font-weight: @btn-font-weight;
    -  text-align: center;
    -  vertical-align: middle;
    -  touch-action: manipulation;
    -  cursor: pointer;
    -  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
    -  border: 1px solid transparent;
    -  white-space: nowrap;
    -  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);
    -  .user-select(none);
    -
    -  &,
    -  &:active,
    -  &.active {
    -    &:focus,
    -    &.focus {
    -      .tab-focus();
    -    }
    -  }
    -
    -  &:hover,
    -  &:focus,
    -  &.focus {
    -    color: @btn-default-color;
    -    text-decoration: none;
    -  }
    -
    -  &:active,
    -  &.active {
    -    outline: 0;
    -    background-image: none;
    -    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
    -  }
    -
    -  &.disabled,
    -  &[disabled],
    -  fieldset[disabled] & {
    -    cursor: @cursor-disabled;
    -    .opacity(.65);
    -    .box-shadow(none);
    -  }
    -
    -  a& {
    -    &.disabled,
    -    fieldset[disabled] & {
    -      pointer-events: none; // Future-proof disabling of clicks on `` elements
    -    }
    -  }
    -}
    -
    -.btn-default {
    -  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);
    -}
    -
    -.btn-primary {
    -  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);
    -}
    -
    -.btn-xs {
    -  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/close.less b/src/legacy/ui/public/styles/bootstrap/close.less
    deleted file mode 100644
    index 6d5bfe087aed3..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/close.less
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -//
    -// Close icons
    -// --------------------------------------------------
    -
    -
    -.close {
    -  float: right;
    -  font-size: (@font-size-base * 1.5);
    -  font-weight: @close-font-weight;
    -  line-height: 1;
    -  color: @close-color;
    -  text-shadow: @close-text-shadow;
    -  .opacity(.2);
    -
    -  &:hover,
    -  &:focus {
    -    color: @close-color;
    -    text-decoration: none;
    -    cursor: pointer;
    -    .opacity(.5);
    -  }
    -
    -  // Additional properties for button version
    -  // iOS requires the button element instead of an anchor tag.
    -  // If you want the anchor version, it requires `href="#"`.
    -  // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
    -  button& {
    -    padding: 0;
    -    cursor: pointer;
    -    background: transparent;
    -    border: 0;
    -    -webkit-appearance: none;
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/component-animations.less b/src/legacy/ui/public/styles/bootstrap/component-animations.less
    deleted file mode 100644
    index 0bcee910ac5f2..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/component-animations.less
    +++ /dev/null
    @@ -1,33 +0,0 @@
    -//
    -// Component animations
    -// --------------------------------------------------
    -
    -// Heads up!
    -//
    -// We don't use the `.opacity()` mixin here since it causes a bug with text
    -// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
    -
    -.fade {
    -  opacity: 0;
    -  .transition(opacity .15s linear);
    -  &.in {
    -    opacity: 1;
    -  }
    -}
    -
    -.collapse {
    -  display: none;
    -
    -  &.in      { display: block; }
    -  tr&.in    { display: table-row; }
    -  tbody&.in { display: table-row-group; }
    -}
    -
    -.collapsing {
    -  position: relative;
    -  height: 0;
    -  overflow: hidden;
    -  .transition-property(~"height, visibility");
    -  .transition-duration(.35s);
    -  .transition-timing-function(ease);
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/dropdowns.less b/src/legacy/ui/public/styles/bootstrap/dropdowns.less
    deleted file mode 100644
    index b0376eb4a6317..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/dropdowns.less
    +++ /dev/null
    @@ -1,227 +0,0 @@
    -//
    -// Dropdown menus
    -// --------------------------------------------------
    -
    -
    -// Dropdown arrow/caret
    -.caret {
    -  display: inline-block;
    -  width: 0;
    -  height: 0;
    -  margin-left: 2px;
    -  vertical-align: middle;
    -  border-top:   @caret-width-base dashed;
    -  border-top:   @caret-width-base solid ~"\9"; // IE8
    -  border-right: @caret-width-base solid transparent;
    -  border-left:  @caret-width-base solid transparent;
    -}
    -
    -// The dropdown wrapper (div)
    -.dropup,
    -.dropdown {
    -  position: relative;
    -}
    -
    -// Prevent the focus on the dropdown toggle when closing dropdowns
    -.dropdown-toggle:focus {
    -  outline: 0;
    -}
    -
    -// The dropdown menu (ul)
    -.dropdown-menu {
    -  position: absolute;
    -  top: 100%;
    -  left: 0;
    -  z-index: @zindex-dropdown;
    -  display: none; // none by default, but block on "open" of the menu
    -  float: left;
    -  min-width: 160px;
    -  padding: 5px 0;
    -  margin: 2px 0 0; // override default ul
    -  list-style: none;
    -  font-size: @font-size-base;
    -  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
    -  background-color: @dropdown-bg;
    -  border: 1px solid @dropdown-fallback-border; // IE8 fallback
    -  border: 1px solid @dropdown-border;
    -  border-radius: @border-radius-base;
    -  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.1);
    -  background-clip: padding-box;
    -
    -  // Aligns the dropdown menu to right
    -  //
    -  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
    -  &.pull-right {
    -    right: 0;
    -    left: auto;
    -  }
    -
    -  // Dividers (basically an hr) within the dropdown
    -  .divider {
    -    .nav-divider(@dropdown-divider-bg);
    -  }
    -
    -  // Links within the dropdown menu
    -  > li > a,
    -  > li > button {
    -    display: block;
    -    padding: 3px 20px;
    -    clear: both;
    -    font-weight: normal;
    -    line-height: @line-height-base;
    -    color: @dropdown-link-color;
    -    white-space: nowrap; // prevent links from randomly breaking onto new lines
    -  }
    -
    -  > li > button {
    -    appearance: none;
    -    background: none;
    -    border: none;
    -    width: 100%;
    -    text-align: left;
    -  }
    -}
    -
    -// Hover/Focus state
    -.dropdown-menu > li > a,
    -.dropdown-menu > li > button {
    -  &:hover,
    -  &:focus {
    -    text-decoration: none;
    -    color: @dropdown-link-hover-color;
    -    background-color: @dropdown-link-hover-bg;
    -  }
    -}
    -
    -// Active state
    -.dropdown-menu > .active > button,
    -.dropdown-menu > .active > a {
    -  &,
    -  &:hover,
    -  &:focus {
    -    color: @dropdown-link-active-color;
    -    text-decoration: none;
    -    outline: 0;
    -    background-color: @dropdown-link-active-bg;
    -  }
    -}
    -
    -// Disabled state
    -//
    -// Gray out text and ensure the hover/focus state remains gray
    -
    -.dropdown-menu > .disabled > a {
    -  &,
    -  &:hover,
    -  &:focus {
    -    color: @dropdown-link-disabled-color;
    -  }
    -
    -  // Nuke hover/focus effects
    -  &:hover,
    -  &:focus {
    -    text-decoration: none;
    -    background-color: transparent;
    -    background-image: none; // Remove CSS gradient
    -    .reset-filter();
    -    cursor: @cursor-disabled;
    -  }
    -}
    -
    -// Open state for the dropdown
    -.open {
    -  // Show the menu
    -  > .dropdown-menu {
    -    display: block;
    -  }
    -
    -  // Remove the outline when :focus is triggered
    -  > a {
    -    outline: 0;
    -  }
    -}
    -
    -// Menu positioning
    -//
    -// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
    -// menu with the parent.
    -.dropdown-menu-right {
    -  left: auto; // Reset the default from `.dropdown-menu`
    -  right: 0;
    -}
    -// With v3, we enabled auto-flipping if you have a dropdown within a right
    -// aligned nav component. To enable the undoing of that, we provide an override
    -// to restore the default dropdown menu alignment.
    -//
    -// This is only for left-aligning a dropdown menu within a `.navbar-right` or
    -// `.pull-right` nav component.
    -.dropdown-menu-left {
    -  left: 0;
    -  right: auto;
    -}
    -
    -// Dropdown section headers
    -.dropdown-header {
    -  display: block;
    -  padding: 3px 20px;
    -  font-size: @font-size-small;
    -  line-height: @line-height-base;
    -  color: @dropdown-header-color;
    -  white-space: nowrap; // as with > li > a
    -}
    -
    -// Backdrop to catch body clicks on mobile, etc.
    -.dropdown-backdrop {
    -  position: fixed;
    -  left: 0;
    -  right: 0;
    -  bottom: 0;
    -  top: 0;
    -  z-index: (@zindex-dropdown - 10);
    -}
    -
    -// Right aligned dropdowns
    -.pull-right > .dropdown-menu {
    -  right: 0;
    -  left: auto;
    -}
    -
    -// Allow for dropdowns to go bottom up (aka, dropup-menu)
    -//
    -// Just add .dropup after the standard .dropdown class and you're set, bro.
    -// TODO: abstract this so that the navbar fixed styles are not placed here?
    -
    -.dropup,
    -.navbar-fixed-bottom .dropdown {
    -  // Reverse the caret
    -  .caret {
    -    border-top: 0;
    -    border-bottom: @caret-width-base dashed;
    -    border-bottom: @caret-width-base solid ~"\9"; // IE8
    -    content: "";
    -  }
    -  // Different positioning for bottom up menu
    -  .dropdown-menu {
    -    top: auto;
    -    bottom: 100%;
    -    margin-bottom: 2px;
    -  }
    -}
    -
    -
    -// Component alignment
    -//
    -// Reiterate per navbar.less and the modified component alignment there.
    -
    -@media (min-width: @grid-float-breakpoint) {
    -  .navbar-right {
    -    .dropdown-menu {
    -      .dropdown-menu-right();
    -    }
    -    // Necessary for overrides of the default right aligned menu.
    -    // Will remove come v4 in all likelihood.
    -    .dropdown-menu-left {
    -      .dropdown-menu-left();
    -    }
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/forms.less b/src/legacy/ui/public/styles/bootstrap/forms.less
    deleted file mode 100644
    index 20636ec6f22cf..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/forms.less
    +++ /dev/null
    @@ -1,470 +0,0 @@
    -//
    -// Forms
    -// --------------------------------------------------
    -
    -
    -// Common form controls
    -//
    -// Shared size and type resets for form controls. Apply `.form-control` to any
    -// of the following form controls:
    -//
    -// select
    -// textarea
    -// input[type="text"]
    -// input[type="password"]
    -// input[type="datetime"]
    -// input[type="datetime-local"]
    -// input[type="date"]
    -// input[type="month"]
    -// input[type="time"]
    -// input[type="week"]
    -// input[type="number"]
    -// input[type="email"]
    -// input[type="url"]
    -// input[type="search"]
    -// input[type="tel"]
    -// input[type="color"]
    -
    -.form-control {
    -  display: block;
    -  width: 100%;
    -  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
    -  padding: @padding-base-vertical @padding-base-horizontal;
    -  font-size: @font-size-base;
    -  line-height: @line-height-base;
    -  color: @input-color;
    -  background-color: @input-bg;
    -  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
    -  border: 1px solid @input-border;
    -  border-radius: @input-border-radius-base; // Note: This has no effect on s in CSS.
    -  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
    -  .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s");
    -
    -  // Customize the `:focus` state to imitate native WebKit styles.
    -  .form-control-focus();
    -
    -  // Placeholder
    -  .placeholder();
    -
    -  // Unstyle the caret on ``
    -// element gets special love because it's special, and that's a fact!
    -.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
    -  height: @input-height;
    -  padding: @padding-vertical @padding-horizontal;
    -  font-size: @font-size;
    -  line-height: @line-height;
    -  border-radius: @border-radius;
    -
    -  select& {
    -    height: @input-height;
    -    line-height: @input-height;
    -  }
    -
    -  textarea&,
    -  select[multiple]& {
    -    height: auto;
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/gradients.less b/src/legacy/ui/public/styles/bootstrap/mixins/gradients.less
    deleted file mode 100644
    index 0b88a89cc56a6..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/gradients.less
    +++ /dev/null
    @@ -1,59 +0,0 @@
    -// Gradients
    -
    -#gradient {
    -
    -  // Horizontal gradient, from left to right
    -  //
    -  // Creates two color stops, start and end, by specifying a color and position for each color stop.
    -  // Color stops are not available in IE9 and below.
    -  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
    -    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+
    -    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12
    -    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
    -    background-repeat: repeat-x;
    -    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down
    -  }
    -
    -  // Vertical gradient, from top to bottom
    -  //
    -  // Creates two color stops, start and end, by specifying a color and position for each color stop.
    -  // Color stops are not available in IE9 and below.
    -  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
    -    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+
    -    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12
    -    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
    -    background-repeat: repeat-x;
    -    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down
    -  }
    -
    -  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
    -    background-repeat: repeat-x;
    -    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+
    -    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12
    -    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
    -  }
    -  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
    -    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
    -    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
    -    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);
    -    background-repeat: no-repeat;
    -    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
    -  }
    -  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
    -    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
    -    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
    -    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
    -    background-repeat: no-repeat;
    -    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
    -  }
    -  .radial(@inner-color: #555; @outer-color: #333) {
    -    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
    -    background-image: radial-gradient(circle, @inner-color, @outer-color);
    -    background-repeat: no-repeat;
    -  }
    -  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {
    -    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
    -    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
    -    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/grid-framework.less b/src/legacy/ui/public/styles/bootstrap/mixins/grid-framework.less
    deleted file mode 100644
    index 8c23eed24e60e..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/grid-framework.less
    +++ /dev/null
    @@ -1,91 +0,0 @@
    -// Framework grid generation
    -//
    -// Used only by Bootstrap to generate the correct number of grid classes given
    -// any value of `@grid-columns`.
    -
    -.make-grid-columns() {
    -  // Common styles for all sizes of grid columns, widths 1-12
    -  .col(@index) { // initial
    -    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
    -    .col((@index + 1), @item);
    -  }
    -  .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo
    -    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
    -    .col((@index + 1), ~"@{list}, @{item}");
    -  }
    -  .col(@index, @list) when (@index > @grid-columns) { // terminal
    -    @{list} {
    -      position: relative;
    -      // Prevent columns from collapsing when empty
    -      min-height: 1px;
    -      // Inner gutter via padding
    -      padding-left:  ceil((@grid-gutter-width / 2));
    -      padding-right: floor((@grid-gutter-width / 2));
    -    }
    -  }
    -  .col(1); // kickstart it
    -}
    -
    -.float-grid-columns(@class) {
    -  .col(@index) { // initial
    -    @item: ~".col-@{class}-@{index}";
    -    .col((@index + 1), @item);
    -  }
    -  .col(@index, @list) when (@index =< @grid-columns) { // general
    -    @item: ~".col-@{class}-@{index}";
    -    .col((@index + 1), ~"@{list}, @{item}");
    -  }
    -  .col(@index, @list) when (@index > @grid-columns) { // terminal
    -    @{list} {
    -      float: left;
    -    }
    -  }
    -  .col(1); // kickstart it
    -}
    -
    -.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {
    -  .col-@{class}-@{index} {
    -    width: percentage((@index / @grid-columns));
    -  }
    -}
    -.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {
    -  .col-@{class}-push-@{index} {
    -    left: percentage((@index / @grid-columns));
    -  }
    -}
    -.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {
    -  .col-@{class}-push-0 {
    -    left: auto;
    -  }
    -}
    -.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {
    -  .col-@{class}-pull-@{index} {
    -    right: percentage((@index / @grid-columns));
    -  }
    -}
    -.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {
    -  .col-@{class}-pull-0 {
    -    right: auto;
    -  }
    -}
    -.calc-grid-column(@index, @class, @type) when (@type = offset) {
    -  .col-@{class}-offset-@{index} {
    -    margin-left: percentage((@index / @grid-columns));
    -  }
    -}
    -
    -// Basic looping in LESS
    -.loop-grid-columns(@index, @class, @type) when (@index >= 0) {
    -  .calc-grid-column(@index, @class, @type);
    -  // next iteration
    -  .loop-grid-columns((@index - 1), @class, @type);
    -}
    -
    -// Create grid for specific class
    -.make-grid(@class) {
    -  .float-grid-columns(@class);
    -  .loop-grid-columns(@grid-columns, @class, width);
    -  .loop-grid-columns(@grid-columns, @class, pull);
    -  .loop-grid-columns(@grid-columns, @class, push);
    -  .loop-grid-columns(@grid-columns, @class, offset);
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/grid.less b/src/legacy/ui/public/styles/bootstrap/mixins/grid.less
    deleted file mode 100644
    index df496d0b3c1a9..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/grid.less
    +++ /dev/null
    @@ -1,122 +0,0 @@
    -// Grid system
    -//
    -// Generate semantic grid columns with these mixins.
    -
    -// Centered container element
    -.container-fixed(@gutter: @grid-gutter-width) {
    -  margin-right: auto;
    -  margin-left: auto;
    -  padding-left:  floor((@gutter / 2));
    -  padding-right: ceil((@gutter / 2));
    -  &:extend(.clearfix all);
    -}
    -
    -// Creates a wrapper for a series of columns
    -.make-row(@gutter: @grid-gutter-width) {
    -  margin-left:  ceil((@gutter / -2));
    -  margin-right: floor((@gutter / -2));
    -  &:extend(.clearfix all);
    -}
    -
    -// Generate the extra small columns
    -.make-xs-column(@columns; @gutter: @grid-gutter-width) {
    -  position: relative;
    -  float: left;
    -  width: percentage((@columns / @grid-columns));
    -  min-height: 1px;
    -  padding-left:  (@gutter / 2);
    -  padding-right: (@gutter / 2);
    -}
    -.make-xs-column-offset(@columns) {
    -  margin-left: percentage((@columns / @grid-columns));
    -}
    -.make-xs-column-push(@columns) {
    -  left: percentage((@columns / @grid-columns));
    -}
    -.make-xs-column-pull(@columns) {
    -  right: percentage((@columns / @grid-columns));
    -}
    -
    -// Generate the small columns
    -.make-sm-column(@columns; @gutter: @grid-gutter-width) {
    -  position: relative;
    -  min-height: 1px;
    -  padding-left:  (@gutter / 2);
    -  padding-right: (@gutter / 2);
    -
    -  @media (min-width: @screen-sm-min) {
    -    float: left;
    -    width: percentage((@columns / @grid-columns));
    -  }
    -}
    -.make-sm-column-offset(@columns) {
    -  @media (min-width: @screen-sm-min) {
    -    margin-left: percentage((@columns / @grid-columns));
    -  }
    -}
    -.make-sm-column-push(@columns) {
    -  @media (min-width: @screen-sm-min) {
    -    left: percentage((@columns / @grid-columns));
    -  }
    -}
    -.make-sm-column-pull(@columns) {
    -  @media (min-width: @screen-sm-min) {
    -    right: percentage((@columns / @grid-columns));
    -  }
    -}
    -
    -// Generate the medium columns
    -.make-md-column(@columns; @gutter: @grid-gutter-width) {
    -  position: relative;
    -  min-height: 1px;
    -  padding-left:  (@gutter / 2);
    -  padding-right: (@gutter / 2);
    -
    -  @media (min-width: @screen-md-min) {
    -    float: left;
    -    width: percentage((@columns / @grid-columns));
    -  }
    -}
    -.make-md-column-offset(@columns) {
    -  @media (min-width: @screen-md-min) {
    -    margin-left: percentage((@columns / @grid-columns));
    -  }
    -}
    -.make-md-column-push(@columns) {
    -  @media (min-width: @screen-md-min) {
    -    left: percentage((@columns / @grid-columns));
    -  }
    -}
    -.make-md-column-pull(@columns) {
    -  @media (min-width: @screen-md-min) {
    -    right: percentage((@columns / @grid-columns));
    -  }
    -}
    -
    -// Generate the large columns
    -.make-lg-column(@columns; @gutter: @grid-gutter-width) {
    -  position: relative;
    -  min-height: 1px;
    -  padding-left:  (@gutter / 2);
    -  padding-right: (@gutter / 2);
    -
    -  @media (min-width: @screen-lg-min) {
    -    float: left;
    -    width: percentage((@columns / @grid-columns));
    -  }
    -}
    -.make-lg-column-offset(@columns) {
    -  @media (min-width: @screen-lg-min) {
    -    margin-left: percentage((@columns / @grid-columns));
    -  }
    -}
    -.make-lg-column-push(@columns) {
    -  @media (min-width: @screen-lg-min) {
    -    left: percentage((@columns / @grid-columns));
    -  }
    -}
    -.make-lg-column-pull(@columns) {
    -  @media (min-width: @screen-lg-min) {
    -    right: percentage((@columns / @grid-columns));
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/hide-text.less b/src/legacy/ui/public/styles/bootstrap/mixins/hide-text.less
    deleted file mode 100644
    index 2bb84a3b444fc..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/hide-text.less
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -// CSS image replacement
    -//
    -// Heads up! v3 launched with only `.hide-text()`, but per our pattern for
    -// mixins being reused as classes with the same name, this doesn't hold up. As
    -// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
    -//
    -// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
    -
    -// Deprecated as of v3.0.1 (has been removed in v4)
    -.hide-text() {
    -  font: ~"0/0" a;
    -  color: transparent;
    -  text-shadow: none;
    -  background-color: transparent;
    -  border: 0;
    -}
    -
    -// New mixin to use as of v3.0.1
    -.text-hide() {
    -  .hide-text();
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/image.less b/src/legacy/ui/public/styles/bootstrap/mixins/image.less
    deleted file mode 100644
    index f233cb3e199f2..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/image.less
    +++ /dev/null
    @@ -1,33 +0,0 @@
    -// Image Mixins
    -// - Responsive image
    -// - Retina image
    -
    -
    -// Responsive image
    -//
    -// Keep images from scaling beyond the width of their parents.
    -.img-responsive(@display: block) {
    -  display: @display;
    -  max-width: 100%; // Part 1: Set a maximum relative to the parent
    -  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
    -}
    -
    -
    -// Retina image
    -//
    -// Short retina mixin for setting background-image and -size. Note that the
    -// spelling of `min--moz-device-pixel-ratio` is intentional.
    -.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
    -  background-image: url("@{file-1x}");
    -
    -  @media
    -  only screen and (-webkit-min-device-pixel-ratio: 2),
    -  only screen and (   min--moz-device-pixel-ratio: 2),
    -  only screen and (     -o-min-device-pixel-ratio: 2/1),
    -  only screen and (        min-device-pixel-ratio: 2),
    -  only screen and (                min-resolution: 192dpi),
    -  only screen and (                min-resolution: 2dppx) {
    -    background-image: url("@{file-2x}");
    -    background-size: @width-1x @height-1x;
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/labels.less b/src/legacy/ui/public/styles/bootstrap/mixins/labels.less
    deleted file mode 100644
    index 9f7a67ee3d08a..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/labels.less
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -// Labels
    -
    -.label-variant(@color) {
    -  background-color: @color;
    -
    -  &[href] {
    -    &:hover,
    -    &:focus {
    -      background-color: darken(@color, 10%);
    -    }
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/list-group.less b/src/legacy/ui/public/styles/bootstrap/mixins/list-group.less
    deleted file mode 100644
    index 03aa19069d954..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/list-group.less
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -// List Groups
    -
    -.list-group-item-variant(@state; @background; @color) {
    -  .list-group-item-@{state} {
    -    color: @color;
    -    background-color: @background;
    -
    -    a&,
    -    button& {
    -      color: @color;
    -
    -      .list-group-item-heading {
    -        color: inherit;
    -      }
    -
    -      &:hover,
    -      &:focus {
    -        color: @color;
    -        background-color: darken(@background, 5%);
    -      }
    -      &.active,
    -      &.active:hover,
    -      &.active:focus {
    -        color: #fff;
    -        background-color: @color;
    -        border-color: @color;
    -      }
    -    }
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/nav-divider.less b/src/legacy/ui/public/styles/bootstrap/mixins/nav-divider.less
    deleted file mode 100644
    index feb1e9ed0dad8..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/nav-divider.less
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -// Horizontal dividers
    -//
    -// Dividers (basically an hr) within dropdowns and nav lists
    -
    -.nav-divider(@color: #e5e5e5) {
    -  height: 1px;
    -  margin: ((@line-height-computed / 2) - 1) 0;
    -  overflow: hidden;
    -  background-color: @color;
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/nav-vertical-align.less b/src/legacy/ui/public/styles/bootstrap/mixins/nav-vertical-align.less
    deleted file mode 100644
    index d458c78613e6d..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/nav-vertical-align.less
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -// Navbar vertical align
    -//
    -// Vertically center elements in the navbar.
    -// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
    -
    -.navbar-vertical-align(@element-height) {
    -  margin-top: ((@navbar-height - @element-height) / 2);
    -  margin-bottom: ((@navbar-height - @element-height) / 2);
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/opacity.less b/src/legacy/ui/public/styles/bootstrap/mixins/opacity.less
    deleted file mode 100644
    index 33ed25ce6763d..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/opacity.less
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -// Opacity
    -
    -.opacity(@opacity) {
    -  opacity: @opacity;
    -  // IE8 filter
    -  @opacity-ie: (@opacity * 100);
    -  filter: ~"alpha(opacity=@{opacity-ie})";
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/pagination.less b/src/legacy/ui/public/styles/bootstrap/mixins/pagination.less
    deleted file mode 100644
    index 618804f2dee3e..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/pagination.less
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -// Pagination
    -
    -.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
    -  > li {
    -    > a,
    -    > span {
    -      padding: @padding-vertical @padding-horizontal;
    -      font-size: @font-size;
    -      line-height: @line-height;
    -    }
    -    &:first-child {
    -      > a,
    -      > span {
    -        .border-left-radius(@border-radius);
    -      }
    -    }
    -    &:last-child {
    -      > a,
    -      > span {
    -        .border-right-radius(@border-radius);
    -      }
    -    }
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/panels.less b/src/legacy/ui/public/styles/bootstrap/mixins/panels.less
    deleted file mode 100644
    index 49ee10d4ad39d..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/panels.less
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -// Panels
    -
    -.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {
    -  border-color: @border;
    -
    -  & > .panel-heading {
    -    color: @heading-text-color;
    -    background-color: @heading-bg-color;
    -    border-color: @heading-border;
    -
    -    + .panel-collapse > .panel-body {
    -      border-top-color: @border;
    -    }
    -    .badge {
    -      color: @heading-bg-color;
    -      background-color: @heading-text-color;
    -    }
    -  }
    -  & > .panel-footer {
    -    + .panel-collapse > .panel-body {
    -      border-bottom-color: @border;
    -    }
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/progress-bar.less b/src/legacy/ui/public/styles/bootstrap/mixins/progress-bar.less
    deleted file mode 100644
    index f07996a34dbc1..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/progress-bar.less
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -// Progress bars
    -
    -.progress-bar-variant(@color) {
    -  background-color: @color;
    -
    -  // Deprecated parent class requirement as of v3.2.0
    -  .progress-striped & {
    -    #gradient > .striped();
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/reset-filter.less b/src/legacy/ui/public/styles/bootstrap/mixins/reset-filter.less
    deleted file mode 100644
    index 68cdb5e18602a..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/reset-filter.less
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -// Reset filters for IE
    -//
    -// When you need to remove a gradient background, do not forget to use this to reset
    -// the IE filter for IE9 and below.
    -
    -.reset-filter() {
    -  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/reset-text.less b/src/legacy/ui/public/styles/bootstrap/mixins/reset-text.less
    deleted file mode 100644
    index 58dd4d19b4d1f..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/reset-text.less
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -.reset-text() {
    -  font-family: @font-family-base;
    -  // We deliberately do NOT reset font-size.
    -  font-style: normal;
    -  font-weight: normal;
    -  letter-spacing: normal;
    -  line-break: auto;
    -  line-height: @line-height-base;
    -  text-align: left; // Fallback for where `start` is not supported
    -  text-align: start;
    -  text-decoration: none;
    -  text-shadow: none;
    -  text-transform: none;
    -  white-space: normal;
    -  word-break: normal;
    -  word-spacing: normal;
    -  word-wrap: normal;
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/resize.less b/src/legacy/ui/public/styles/bootstrap/mixins/resize.less
    deleted file mode 100644
    index 3acd3afdbacbb..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/resize.less
    +++ /dev/null
    @@ -1,6 +0,0 @@
    -// Resize anything
    -
    -.resizable(@direction) {
    -  resize: @direction; // Options: horizontal, vertical, both
    -  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/responsive-visibility.less b/src/legacy/ui/public/styles/bootstrap/mixins/responsive-visibility.less
    deleted file mode 100644
    index ecf1e979fd25c..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/responsive-visibility.less
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -// Responsive utilities
    -
    -//
    -// More easily include all the states for responsive-utilities.less.
    -.responsive-visibility() {
    -  display: block !important;
    -  table&  { display: table !important; }
    -  tr&     { display: table-row !important; }
    -  th&,
    -  td&     { display: table-cell !important; }
    -}
    -
    -.responsive-invisibility() {
    -  display: none !important;
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/size.less b/src/legacy/ui/public/styles/bootstrap/mixins/size.less
    deleted file mode 100644
    index a8be650896068..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/size.less
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -// Sizing shortcuts
    -
    -.size(@width; @height) {
    -  width: @width;
    -  height: @height;
    -}
    -
    -.square(@size) {
    -  .size(@size; @size);
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/tab-focus.less b/src/legacy/ui/public/styles/bootstrap/mixins/tab-focus.less
    deleted file mode 100644
    index a868f344d7bec..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/tab-focus.less
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -// WebKit-style focus
    -
    -.tab-focus() {
    -  box-shadow: 0 0 0 1px white, 0 0 0 2px #0079a5; /* 3 */
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/table-row.less b/src/legacy/ui/public/styles/bootstrap/mixins/table-row.less
    deleted file mode 100644
    index 0f287f1a8bdf5..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/table-row.less
    +++ /dev/null
    @@ -1,28 +0,0 @@
    -// Tables
    -
    -.table-row-variant(@state; @background) {
    -  // Exact selectors below required to override `.table-striped` and prevent
    -  // inheritance to nested tables.
    -  .table > thead > tr,
    -  .table > tbody > tr,
    -  .table > tfoot > tr {
    -    > td.@{state},
    -    > th.@{state},
    -    &.@{state} > td,
    -    &.@{state} > th {
    -      background-color: @background;
    -    }
    -  }
    -
    -  // Hover states for `.table-hover`
    -  // Note: this is not available for cells or rows within `thead` or `tfoot`.
    -  .table-hover > tbody > tr {
    -    > td.@{state}:hover,
    -    > th.@{state}:hover,
    -    &.@{state}:hover > td,
    -    &:hover > .@{state},
    -    &.@{state}:hover > th {
    -      background-color: darken(@background, 5%);
    -    }
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/text-emphasis.less b/src/legacy/ui/public/styles/bootstrap/mixins/text-emphasis.less
    deleted file mode 100644
    index 9e8a77a6985f0..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/text-emphasis.less
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -// Typography
    -
    -.text-emphasis-variant(@color) {
    -  color: @color;
    -  a&:hover,
    -  a&:focus {
    -    color: darken(@color, 10%);
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/text-overflow.less b/src/legacy/ui/public/styles/bootstrap/mixins/text-overflow.less
    deleted file mode 100644
    index c11ad2fb7471d..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/text-overflow.less
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -// Text overflow
    -// Requires inline-block or block for proper styling
    -
    -.text-overflow() {
    -  overflow: hidden;
    -  text-overflow: ellipsis;
    -  white-space: nowrap;
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/mixins/vendor-prefixes.less b/src/legacy/ui/public/styles/bootstrap/mixins/vendor-prefixes.less
    deleted file mode 100644
    index 2b5e74b99ed68..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/mixins/vendor-prefixes.less
    +++ /dev/null
    @@ -1,227 +0,0 @@
    -// Vendor Prefixes
    -//
    -// All vendor mixins are deprecated as of v3.2.0 due to the introduction of
    -// Autoprefixer in our Gruntfile. They have been removed in v4.
    -
    -// - Animations
    -// - Backface visibility
    -// - Box shadow
    -// - Box sizing
    -// - Content columns
    -// - Hyphens
    -// - Placeholder text
    -// - Transformations
    -// - Transitions
    -// - User Select
    -
    -
    -// Animations
    -.animation(@animation) {
    -  -webkit-animation: @animation;
    -       -o-animation: @animation;
    -          animation: @animation;
    -}
    -.animation-name(@name) {
    -  -webkit-animation-name: @name;
    -          animation-name: @name;
    -}
    -.animation-duration(@duration) {
    -  -webkit-animation-duration: @duration;
    -          animation-duration: @duration;
    -}
    -.animation-timing-function(@timing-function) {
    -  -webkit-animation-timing-function: @timing-function;
    -          animation-timing-function: @timing-function;
    -}
    -.animation-delay(@delay) {
    -  -webkit-animation-delay: @delay;
    -          animation-delay: @delay;
    -}
    -.animation-iteration-count(@iteration-count) {
    -  -webkit-animation-iteration-count: @iteration-count;
    -          animation-iteration-count: @iteration-count;
    -}
    -.animation-direction(@direction) {
    -  -webkit-animation-direction: @direction;
    -          animation-direction: @direction;
    -}
    -.animation-fill-mode(@fill-mode) {
    -  -webkit-animation-fill-mode: @fill-mode;
    -          animation-fill-mode: @fill-mode;
    -}
    -
    -// Backface visibility
    -// Prevent browsers from flickering when using CSS 3D transforms.
    -// Default value is `visible`, but can be changed to `hidden`
    -
    -.backface-visibility(@visibility) {
    -  -webkit-backface-visibility: @visibility;
    -     -moz-backface-visibility: @visibility;
    -          backface-visibility: @visibility;
    -}
    -
    -// Drop shadows
    -//
    -// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
    -// supported browsers that have box shadow capabilities now support it.
    -
    -.box-shadow(@shadow) {
    -  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
    -          box-shadow: @shadow;
    -}
    -
    -// Box sizing
    -.box-sizing(@boxmodel) {
    -  -webkit-box-sizing: @boxmodel;
    -     -moz-box-sizing: @boxmodel;
    -          box-sizing: @boxmodel;
    -}
    -
    -// CSS3 Content Columns
    -.content-columns(@column-count; @column-gap: @grid-gutter-width) {
    -  -webkit-column-count: @column-count;
    -     -moz-column-count: @column-count;
    -          column-count: @column-count;
    -  -webkit-column-gap: @column-gap;
    -     -moz-column-gap: @column-gap;
    -          column-gap: @column-gap;
    -}
    -
    -// Optional hyphenation
    -.hyphens(@mode: auto) {
    -  word-wrap: break-word;
    -  -webkit-hyphens: @mode;
    -     -moz-hyphens: @mode;
    -      -ms-hyphens: @mode; // IE10+
    -       -o-hyphens: @mode;
    -          hyphens: @mode;
    -}
    -
    -// Placeholder text
    -.placeholder(@color: @input-color-placeholder) {
    -  // Firefox
    -  &::-moz-placeholder {
    -    color: @color;
    -    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526
    -  }
    -  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+
    -  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome
    -}
    -
    -// Transformations
    -.scale(@ratio) {
    -  -webkit-transform: scale(@ratio);
    -      -ms-transform: scale(@ratio); // IE9 only
    -       -o-transform: scale(@ratio);
    -          transform: scale(@ratio);
    -}
    -.scale(@ratioX; @ratioY) {
    -  -webkit-transform: scale(@ratioX, @ratioY);
    -      -ms-transform: scale(@ratioX, @ratioY); // IE9 only
    -       -o-transform: scale(@ratioX, @ratioY);
    -          transform: scale(@ratioX, @ratioY);
    -}
    -.scaleX(@ratio) {
    -  -webkit-transform: scaleX(@ratio);
    -      -ms-transform: scaleX(@ratio); // IE9 only
    -       -o-transform: scaleX(@ratio);
    -          transform: scaleX(@ratio);
    -}
    -.scaleY(@ratio) {
    -  -webkit-transform: scaleY(@ratio);
    -      -ms-transform: scaleY(@ratio); // IE9 only
    -       -o-transform: scaleY(@ratio);
    -          transform: scaleY(@ratio);
    -}
    -.skew(@x; @y) {
    -  -webkit-transform: skewX(@x) skewY(@y);
    -      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
    -       -o-transform: skewX(@x) skewY(@y);
    -          transform: skewX(@x) skewY(@y);
    -}
    -.translate(@x; @y) {
    -  -webkit-transform: translate(@x, @y);
    -      -ms-transform: translate(@x, @y); // IE9 only
    -       -o-transform: translate(@x, @y);
    -          transform: translate(@x, @y);
    -}
    -.translate3d(@x; @y; @z) {
    -  -webkit-transform: translate3d(@x, @y, @z);
    -          transform: translate3d(@x, @y, @z);
    -}
    -.rotate(@degrees) {
    -  -webkit-transform: rotate(@degrees);
    -      -ms-transform: rotate(@degrees); // IE9 only
    -       -o-transform: rotate(@degrees);
    -          transform: rotate(@degrees);
    -}
    -.rotateX(@degrees) {
    -  -webkit-transform: rotateX(@degrees);
    -      -ms-transform: rotateX(@degrees); // IE9 only
    -       -o-transform: rotateX(@degrees);
    -          transform: rotateX(@degrees);
    -}
    -.rotateY(@degrees) {
    -  -webkit-transform: rotateY(@degrees);
    -      -ms-transform: rotateY(@degrees); // IE9 only
    -       -o-transform: rotateY(@degrees);
    -          transform: rotateY(@degrees);
    -}
    -.perspective(@perspective) {
    -  -webkit-perspective: @perspective;
    -     -moz-perspective: @perspective;
    -          perspective: @perspective;
    -}
    -.perspective-origin(@perspective) {
    -  -webkit-perspective-origin: @perspective;
    -     -moz-perspective-origin: @perspective;
    -          perspective-origin: @perspective;
    -}
    -.transform-origin(@origin) {
    -  -webkit-transform-origin: @origin;
    -     -moz-transform-origin: @origin;
    -      -ms-transform-origin: @origin; // IE9 only
    -          transform-origin: @origin;
    -}
    -
    -
    -// Transitions
    -
    -.transition(@transition) {
    -  -webkit-transition: @transition;
    -       -o-transition: @transition;
    -          transition: @transition;
    -}
    -.transition-property(@transition-property) {
    -  -webkit-transition-property: @transition-property;
    -          transition-property: @transition-property;
    -}
    -.transition-delay(@transition-delay) {
    -  -webkit-transition-delay: @transition-delay;
    -          transition-delay: @transition-delay;
    -}
    -.transition-duration(@transition-duration) {
    -  -webkit-transition-duration: @transition-duration;
    -          transition-duration: @transition-duration;
    -}
    -.transition-timing-function(@timing-function) {
    -  -webkit-transition-timing-function: @timing-function;
    -          transition-timing-function: @timing-function;
    -}
    -.transition-transform(@transition) {
    -  -webkit-transition: -webkit-transform @transition;
    -     -moz-transition: -moz-transform @transition;
    -       -o-transition: -o-transform @transition;
    -          transition: transform @transition;
    -}
    -
    -
    -// User select
    -// For selecting text on the page
    -
    -.user-select(@select) {
    -  -webkit-user-select: @select;
    -     -moz-user-select: @select;
    -      -ms-user-select: @select; // IE10+
    -          user-select: @select;
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/modals.less b/src/legacy/ui/public/styles/bootstrap/modals.less
    deleted file mode 100644
    index 232b7b5f8b501..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/modals.less
    +++ /dev/null
    @@ -1,136 +0,0 @@
    -//
    -// Modals
    -// --------------------------------------------------
    -
    -// .modal-open      - body class for killing the scroll
    -// .modal           - container to scroll within
    -// .modal-dialog    - positioning shell for the actual modal
    -// .modal-content   - actual modal w/ bg and corners and shit
    -
    -// Kill the scroll on the body
    -.modal-open {
    -  overflow: hidden;
    -}
    -
    -// Container that the modal scrolls within
    -.modal {
    -  display: none;
    -  overflow: hidden;
    -  position: fixed;
    -  top: 0;
    -  right: 0;
    -  bottom: 0;
    -  left: 0;
    -  z-index: @zindex-modal;
    -  -webkit-overflow-scrolling: touch;
    -
    -  // Prevent Chrome on Windows from adding a focus outline. For details, see
    -  // https://github.com/twbs/bootstrap/pull/10951.
    -  outline: 0;
    -
    -  // When fading in the modal, animate it to slide down
    -  &.fade .modal-dialog {
    -    .translate(0, -25%);
    -    .transition-transform(~"0.3s ease-out");
    -  }
    -  &.in .modal-dialog { .translate(0, 0) }
    -}
    -.modal-open .modal {
    -  overflow-x: hidden;
    -  overflow-y: auto;
    -}
    -
    -// Shell div to position the modal with bottom padding
    -.modal-dialog {
    -  position: relative;
    -  width: auto;
    -  margin: 10px;
    -}
    -
    -// Actual modal
    -.modal-content {
    -  position: relative;
    -  background-color: @modal-content-bg;
    -  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
    -  border: 1px solid @modal-content-border-color;
    -  border-radius: @border-radius-large;
    -  .box-shadow(0 3px 9px rgba(0,0,0,.5));
    -  background-clip: padding-box;
    -  // Remove focus outline from opened modal
    -  outline: 0;
    -}
    -
    -// Modal background
    -.modal-backdrop {
    -  position: fixed;
    -  top: 0;
    -  right: 0;
    -  bottom: 0;
    -  left: 0;
    -  z-index: @zindex-modal-background;
    -  background-color: @modal-backdrop-bg;
    -  // Fade for backdrop
    -  &.fade { .opacity(0); }
    -  &.in { .opacity(@modal-backdrop-opacity); }
    -}
    -
    -// Modal header
    -// Top section of the modal w/ title and dismiss
    -.modal-header {
    -  padding: @modal-title-padding;
    -  border-bottom: 1px solid @modal-header-border-color;
    -  &:extend(.clearfix all);
    -}
    -// Close icon
    -.modal-header .close {
    -  margin-top: -2px;
    -}
    -
    -// Title text within header
    -.modal-title {
    -  margin: 0;
    -  line-height: @modal-title-line-height;
    -}
    -
    -// Modal body
    -// Where all modal content resides (sibling of .modal-header and .modal-footer)
    -.modal-body {
    -  position: relative;
    -  padding: @modal-inner-padding;
    -}
    -
    -// Footer (for actions)
    -.modal-footer {
    -  padding: @modal-inner-padding;
    -  text-align: right; // right align buttons
    -  border-top: 1px solid @modal-footer-border-color;
    -  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons
    -}
    -
    -// Measure scrollbar width for padding body during modal show/hide
    -.modal-scrollbar-measure {
    -  position: absolute;
    -  top: -9999px;
    -  width: 50px;
    -  height: 50px;
    -  overflow: scroll;
    -}
    -
    -// Scale up the modal
    -@media (min-width: @screen-sm-min) {
    -  // Automatically set modal's width for larger viewports
    -  .modal-dialog {
    -    width: @modal-md;
    -    margin: 30px auto;
    -  }
    -  .modal-content {
    -    .box-shadow(0 5px 15px rgba(0,0,0,.5));
    -  }
    -
    -  // Modal sizes
    -  .modal-sm { width: @modal-sm; }
    -}
    -
    -@media (min-width: @screen-md-min) {
    -  .modal-lg { width: @modal-lg; }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/navbar.less b/src/legacy/ui/public/styles/bootstrap/navbar.less
    deleted file mode 100644
    index b1c279c1ae109..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/navbar.less
    +++ /dev/null
    @@ -1,603 +0,0 @@
    -//
    -// Navbars
    -// --------------------------------------------------
    -
    -
    -// Wrapper and base class
    -//
    -// Provide a static navbar from which we expand to create full-width, fixed, and
    -// other navbar variations.
    -
    -.navbar {
    -  position: relative;
    -  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
    -  margin-bottom: @navbar-margin-bottom;
    -  border: 1px solid transparent;
    -
    -  // Prevent floats from breaking the navbar
    -  &:extend(.clearfix all);
    -
    -  @media (min-width: @grid-float-breakpoint) {
    -    border-radius: @navbar-border-radius;
    -  }
    -}
    -
    -
    -// Navbar heading
    -//
    -// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
    -// styling of responsive aspects.
    -
    -.navbar-header {
    -  &:extend(.clearfix all);
    -
    -  @media (min-width: @grid-float-breakpoint) {
    -    float: left;
    -  }
    -}
    -
    -
    -// Navbar collapse (body)
    -//
    -// Group your navbar content into this for easy collapsing and expanding across
    -// various device sizes. By default, this content is collapsed when <768px, but
    -// will expand past that for a horizontal display.
    -//
    -// To start (on mobile devices) the navbar links, forms, and buttons are stacked
    -// vertically and include a `max-height` to overflow in case you have too much
    -// content for the user's viewport.
    -
    -.navbar-collapse {
    -  overflow-x: visible;
    -  padding-right: @navbar-padding-horizontal;
    -  padding-left:  @navbar-padding-horizontal;
    -  border-top: 1px solid transparent;
    -  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
    -  &:extend(.clearfix all);
    -  -webkit-overflow-scrolling: touch;
    -
    -  &.in {
    -    overflow-y: auto;
    -  }
    -
    -  @media (min-width: @grid-float-breakpoint) {
    -    width: auto;
    -    border-top: 0;
    -    box-shadow: none;
    -
    -    &.collapse {
    -      display: block !important;
    -      height: auto !important;
    -      padding-bottom: 0; // Override default setting
    -      overflow: visible !important;
    -    }
    -
    -    &.in {
    -      overflow-y: visible;
    -    }
    -
    -    // Undo the collapse side padding for navbars with containers to ensure
    -    // alignment of right-aligned contents.
    -    .navbar-fixed-top &,
    -    .navbar-fixed-bottom & {
    -      padding-left: 0;
    -      padding-right: 0;
    -    }
    -  }
    -}
    -
    -.navbar-fixed-top,
    -.navbar-fixed-bottom {
    -  .navbar-collapse {
    -    max-height: @navbar-collapse-max-height;
    -
    -    @media (max-device-width: @screen-xs-min) and (orientation: landscape) {
    -      max-height: 200px;
    -    }
    -  }
    -}
    -
    -
    -// Both navbar header and collapse
    -//
    -// When a container is present, change the behavior of the header and collapse.
    -
    -.container,
    -.container-fluid {
    -  > .navbar-header,
    -  > .navbar-collapse {
    -    margin-right: -@navbar-padding-horizontal;
    -    margin-left:  -@navbar-padding-horizontal;
    -
    -    @media (min-width: @grid-float-breakpoint) {
    -      margin-right: 0;
    -      margin-left:  0;
    -    }
    -  }
    -}
    -
    -
    -//
    -// Navbar alignment options
    -//
    -// Display the navbar across the entirety of the page or fixed it to the top or
    -// bottom of the page.
    -
    -// Fix the top/bottom navbars when screen real estate supports it
    -.navbar-fixed-top,
    -.navbar-fixed-bottom {
    -  position: fixed;
    -  right: 0;
    -  left: 0;
    -  z-index: @zindex-navbar-fixed;
    -
    -  // Undo the rounded corners
    -  @media (min-width: @grid-float-breakpoint) {
    -    border-radius: 0;
    -  }
    -}
    -.navbar-fixed-top {
    -  top: 0;
    -  border-width: 0 0 1px;
    -}
    -.navbar-fixed-bottom {
    -  bottom: 0;
    -  margin-bottom: 0; // override .navbar defaults
    -  border-width: 1px 0 0;
    -}
    -
    -
    -// Brand/project name
    -
    -.navbar-brand {
    -  float: left;
    -  padding: @navbar-padding-vertical @navbar-padding-horizontal;
    -  font-size: @font-size-large;
    -  line-height: @line-height-computed;
    -  height: @navbar-height;
    -
    -  &:hover,
    -  &:focus {
    -    text-decoration: none;
    -  }
    -
    -  > img {
    -    display: block;
    -  }
    -
    -  @media (min-width: @grid-float-breakpoint) {
    -    .navbar > .container &,
    -    .navbar > .container-fluid & {
    -      margin-left: -@navbar-padding-horizontal;
    -    }
    -  }
    -}
    -
    -
    -// Navbar toggle
    -//
    -// Custom button for toggling the `.navbar-collapse`, powered by the collapse
    -// JavaScript plugin.
    -
    -.navbar-toggle {
    -  position: relative;
    -  float: right;
    -  margin-right: @navbar-padding-horizontal;
    -  padding: 9px 10px;
    -  .navbar-vertical-align(34px);
    -  background-color: transparent;
    -  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
    -  border: 1px solid transparent;
    -  border-radius: @border-radius-base;
    -
    -  // We remove the `outline` here, but later compensate by attaching `:hover`
    -  // styles to `:focus`.
    -  &:focus {
    -    outline: 0;
    -  }
    -
    -  // Bars
    -  .icon-bar {
    -    display: block;
    -    width: 22px;
    -    height: 2px;
    -    border-radius: 1px;
    -  }
    -  .icon-bar + .icon-bar {
    -    margin-top: 4px;
    -  }
    -
    -  @media (min-width: @grid-float-breakpoint) {
    -    display: none;
    -  }
    -}
    -
    -
    -// Navbar nav links
    -//
    -// Builds on top of the `.nav` components with its own modifier class to make
    -// the nav the full height of the horizontal nav (above 768px).
    -
    -.navbar-nav {
    -  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;
    -
    -  > li > a {
    -    padding-top:    10px;
    -    padding-bottom: 10px;
    -    line-height: @line-height-computed;
    -  }
    -
    -  @media (max-width: @grid-float-breakpoint-max) {
    -    // Dropdowns get custom display when collapsed
    -    .open .dropdown-menu {
    -      position: static;
    -      float: none;
    -      width: auto;
    -      margin-top: 0;
    -      background-color: transparent;
    -      border: 0;
    -      box-shadow: none;
    -      > li > a,
    -      .dropdown-header {
    -        padding: 5px 15px 5px 25px;
    -      }
    -      > li > a {
    -        line-height: @line-height-computed;
    -        &:hover,
    -        &:focus {
    -          background-image: none;
    -        }
    -      }
    -    }
    -  }
    -
    -  // Uncollapse the nav
    -  @media (min-width: @grid-float-breakpoint) {
    -    float: left;
    -    margin: 0;
    -
    -    > li {
    -      float: left;
    -      > a {
    -        padding-top:    @navbar-padding-vertical;
    -        padding-bottom: @navbar-padding-vertical;
    -      }
    -    }
    -  }
    -}
    -
    -
    -// Navbar form
    -//
    -// Extension of the `.form-inline` with some extra flavor for optimum display in
    -// our navbars.
    -
    -.navbar-form {
    -  margin-left: -@navbar-padding-horizontal;
    -  margin-right: -@navbar-padding-horizontal;
    -  padding: 10px @navbar-padding-horizontal;
    -  border-top: 1px solid transparent;
    -  border-bottom: 1px solid transparent;
    -  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
    -  .box-shadow(@shadow);
    -
    -  // Mixin behavior for optimum display
    -  .form-inline();
    -
    -  .form-group {
    -    @media (max-width: @grid-float-breakpoint-max) {
    -      margin-bottom: 5px;
    -
    -      &:last-child {
    -        margin-bottom: 0;
    -      }
    -    }
    -  }
    -
    -  // Vertically center in expanded, horizontal navbar
    -  .navbar-vertical-align(@input-height-base);
    -
    -  // Undo 100% width for pull classes
    -  @media (min-width: @grid-float-breakpoint) {
    -    width: auto;
    -    border: 0;
    -    margin-left: 0;
    -    margin-right: 0;
    -    padding-top: 0;
    -    padding-bottom: 0;
    -    .box-shadow(none);
    -  }
    -}
    -
    -
    -// Dropdown menus
    -
    -// Menu position and menu carets
    -.navbar-nav > li > .dropdown-menu {
    -  margin-top: 0;
    -  .border-top-radius(0);
    -}
    -// Menu position and menu caret support for dropups via extra dropup class
    -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
    -  margin-bottom: 0;
    -  .border-top-radius(@navbar-border-radius);
    -  .border-bottom-radius(0);
    -}
    -
    -
    -// Text in navbars
    -//
    -// Add a class to make any element properly align itself vertically within the navbars.
    -
    -.navbar-text {
    -  .navbar-vertical-align(@line-height-computed);
    -
    -  @media (min-width: @grid-float-breakpoint) {
    -    float: left;
    -    margin-left: @navbar-padding-horizontal;
    -    margin-right: @navbar-padding-horizontal;
    -  }
    -}
    -
    -
    -// Component alignment
    -//
    -// Repurpose the pull utilities as their own navbar utilities to avoid specificity
    -// issues with parents and chaining. Only do this when the navbar is uncollapsed
    -// though so that navbar contents properly stack and align in mobile.
    -//
    -// Declared after the navbar components to ensure more specificity on the margins.
    -
    -@media (min-width: @grid-float-breakpoint) {
    -  .navbar-left  { .pull-left(); }
    -  .navbar-right {
    -    .pull-right();
    -    margin-right: -@navbar-padding-horizontal;
    -
    -    ~ .navbar-right {
    -      margin-right: 0;
    -    }
    -  }
    -}
    -
    -
    -// Alternate navbars
    -// --------------------------------------------------
    -
    -// Default navbar
    -.navbar-default {
    -  background-color: @navbar-default-bg;
    -  border-color: @navbar-default-border;
    -
    -  .navbar-brand {
    -    color: @navbar-default-brand-color;
    -    &:hover,
    -    &:focus {
    -      color: @navbar-default-brand-hover-color;
    -      background-color: @navbar-default-brand-hover-bg;
    -    }
    -  }
    -
    -  .navbar-text {
    -    color: @navbar-default-color;
    -  }
    -
    -  .navbar-nav {
    -    > li > a {
    -      color: @navbar-default-link-color;
    -
    -      &:hover,
    -      &:focus {
    -        color: @navbar-default-link-hover-color;
    -        background-color: @navbar-default-link-hover-bg;
    -      }
    -    }
    -    > .active > a {
    -      &,
    -      &:hover,
    -      &:focus {
    -        color: @navbar-default-link-active-color;
    -        background-color: @navbar-default-link-active-bg;
    -      }
    -    }
    -    > .disabled > a {
    -      &,
    -      &:hover,
    -      &:focus {
    -        color: @navbar-default-link-disabled-color;
    -        background-color: @navbar-default-link-disabled-bg;
    -      }
    -    }
    -  }
    -
    -  .navbar-toggle {
    -    border-color: @navbar-default-toggle-border-color;
    -    &:hover,
    -    &:focus {
    -      background-color: @navbar-default-toggle-hover-bg;
    -    }
    -    .icon-bar {
    -      background-color: @navbar-default-toggle-icon-bar-bg;
    -    }
    -  }
    -
    -  .navbar-collapse,
    -  .navbar-form {
    -    border-color: @navbar-default-border;
    -  }
    -
    -  // Dropdown menu items
    -  .navbar-nav {
    -    // Remove background color from open dropdown
    -    > .open > a {
    -      &,
    -      &:hover,
    -      &:focus {
    -        background-color: @navbar-default-link-active-bg;
    -        color: @navbar-default-link-active-color;
    -      }
    -    }
    -
    -    @media (max-width: @grid-float-breakpoint-max) {
    -      // Dropdowns get custom display when collapsed
    -      .open .dropdown-menu {
    -        > li > a {
    -          color: @navbar-default-link-color;
    -          &:hover,
    -          &:focus {
    -            color: @navbar-default-link-hover-color;
    -            background-color: @navbar-default-link-hover-bg;
    -          }
    -        }
    -        > .active > a {
    -          &,
    -          &:hover,
    -          &:focus {
    -            color: @navbar-default-link-active-color;
    -            background-color: @navbar-default-link-active-bg;
    -          }
    -        }
    -        > .disabled > a {
    -          &,
    -          &:hover,
    -          &:focus {
    -            color: @navbar-default-link-disabled-color;
    -            background-color: @navbar-default-link-disabled-bg;
    -          }
    -        }
    -      }
    -    }
    -  }
    -
    -
    -  // Links in navbars
    -  //
    -  // Add a class to ensure links outside the navbar nav are colored correctly.
    -
    -  .navbar-link {
    -    color: @navbar-default-link-color;
    -    &:hover {
    -      color: @navbar-default-link-hover-color;
    -    }
    -  }
    -}
    -
    -// Inverse navbar
    -
    -.navbar-inverse {
    -  background-color: @navbar-inverse-bg;
    -  border-color: @navbar-inverse-border;
    -
    -  .navbar-brand {
    -    color: @navbar-inverse-brand-color;
    -    &:hover,
    -    &:focus {
    -      color: @navbar-inverse-brand-hover-color;
    -      background-color: @navbar-inverse-brand-hover-bg;
    -    }
    -  }
    -
    -  .navbar-text {
    -    color: @navbar-inverse-color;
    -  }
    -
    -  .navbar-nav {
    -    > li > a {
    -      color: @navbar-inverse-link-color;
    -
    -      &:hover,
    -      &:focus {
    -        color: @navbar-inverse-link-hover-color;
    -        background-color: @navbar-inverse-link-hover-bg;
    -      }
    -    }
    -    > .active > a {
    -      &,
    -      &:hover,
    -      &:focus {
    -        color: @navbar-inverse-link-active-color;
    -        background-color: @navbar-inverse-link-active-bg;
    -      }
    -    }
    -    > .disabled > a {
    -      &,
    -      &:hover,
    -      &:focus {
    -        color: @navbar-inverse-link-disabled-color;
    -        background-color: @navbar-inverse-link-disabled-bg;
    -      }
    -    }
    -  }
    -
    -  // Darken the responsive nav toggle
    -  .navbar-toggle {
    -    border-color: @navbar-inverse-toggle-border-color;
    -    &:hover,
    -    &:focus {
    -      background-color: @navbar-inverse-toggle-hover-bg;
    -    }
    -    .icon-bar {
    -      background-color: @navbar-inverse-toggle-icon-bar-bg;
    -    }
    -  }
    -
    -  .navbar-collapse,
    -  .navbar-form {
    -    border-color: darken(@navbar-inverse-bg, 7%);
    -  }
    -
    -  // Dropdowns
    -  .navbar-nav {
    -    > .open > a {
    -      &,
    -      &:hover,
    -      &:focus {
    -        background-color: @navbar-inverse-link-active-bg;
    -        color: @navbar-inverse-link-active-color;
    -      }
    -    }
    -
    -    @media (max-width: @grid-float-breakpoint-max) {
    -      // Dropdowns get custom display
    -      .open .dropdown-menu {
    -        > .dropdown-header {
    -          border-color: @navbar-inverse-border;
    -        }
    -        .divider {
    -          background-color: @navbar-inverse-border;
    -        }
    -        > li > a {
    -          color: @navbar-inverse-link-color;
    -          &:hover,
    -          &:focus {
    -            color: @navbar-inverse-link-hover-color;
    -            background-color: @navbar-inverse-link-hover-bg;
    -          }
    -        }
    -        > .active > a {
    -          &,
    -          &:hover,
    -          &:focus {
    -            color: @navbar-inverse-link-active-color;
    -            background-color: @navbar-inverse-link-active-bg;
    -          }
    -        }
    -        > .disabled > a {
    -          &,
    -          &:hover,
    -          &:focus {
    -            color: @navbar-inverse-link-disabled-color;
    -            background-color: @navbar-inverse-link-disabled-bg;
    -          }
    -        }
    -      }
    -    }
    -  }
    -
    -  .navbar-link {
    -    color: @navbar-inverse-link-color;
    -    &:hover {
    -      color: @navbar-inverse-link-hover-color;
    -    }
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/navs.less b/src/legacy/ui/public/styles/bootstrap/navs.less
    deleted file mode 100644
    index b8df31c60039e..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/navs.less
    +++ /dev/null
    @@ -1,243 +0,0 @@
    -//
    -// Navs
    -// --------------------------------------------------
    -
    -
    -// Base class
    -// --------------------------------------------------
    -
    -.nav {
    -  margin-bottom: 0;
    -  padding-left: 0; // Override default ul/ol
    -  list-style: none;
    -  &:extend(.clearfix all);
    -
    -  > li {
    -    position: relative;
    -    display: block;
    -
    -    > a {
    -      position: relative;
    -      display: block;
    -      padding: @nav-link-padding;
    -      &:hover,
    -      &:focus {
    -        text-decoration: none;
    -        background-color: @nav-link-hover-bg;
    -      }
    -    }
    -
    -    // Disabled state sets text to gray and nukes hover/tab effects
    -    &.disabled > a {
    -      color: @nav-disabled-link-color;
    -
    -      &:hover,
    -      &:focus {
    -        color: @nav-disabled-link-hover-color;
    -        text-decoration: none;
    -        background-color: transparent;
    -        cursor: @cursor-disabled;
    -      }
    -    }
    -  }
    -
    -  // Open dropdowns
    -  .open > a {
    -    &,
    -    &:hover,
    -    &:focus {
    -      background-color: @nav-link-hover-bg;
    -      border-color: @link-color;
    -    }
    -  }
    -
    -  // Nav dividers (deprecated with v3.0.1)
    -  //
    -  // This should have been removed in v3 with the dropping of `.nav-list`, but
    -  // we missed it. We don't currently support this anywhere, but in the interest
    -  // of maintaining backward compatibility in case you use it, it's deprecated.
    -  .nav-divider {
    -    .nav-divider();
    -  }
    -
    -  // Prevent IE8 from misplacing imgs
    -  //
    -  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
    -  > li > a > img {
    -    max-width: none;
    -  }
    -}
    -
    -
    -// Tabs
    -// -------------------------
    -
    -// Give the tabs something to sit on
    -.nav-tabs {
    -  border-bottom: 1px solid @nav-tabs-border-color;
    -  > li {
    -    float: left;
    -    // Make the list-items overlay the bottom border
    -    margin-bottom: -1px;
    -
    -    // Actual tabs (as links)
    -    > a {
    -      margin-right: 2px;
    -      line-height: @line-height-base;
    -      border: 1px solid transparent;
    -      border-radius: @border-radius-base @border-radius-base 0 0;
    -      &:hover {
    -        border-color: @gray-lighter;
    -        background-color: @white;
    -      }
    -    }
    -
    -    // Active state, and its :hover to override normal :hover
    -    &.active > a {
    -      &,
    -      &:hover,
    -      &:focus {
    -        color: @brand-primary;
    -        background-color: @white;
    -        border: 1px solid @gray-lighter;
    -        border-bottom-color: transparent;
    -        cursor: default;
    -      }
    -    }
    -  }
    -  // pulling this in mainly for less shorthand
    -  &.nav-justified {
    -    .nav-justified();
    -    .nav-tabs-justified();
    -  }
    -}
    -
    -
    -// Pills
    -// -------------------------
    -.nav-pills {
    -  > li {
    -    float: left;
    -
    -    // Links rendered as pills
    -    > a {
    -      border-radius: @nav-pills-border-radius;
    -    }
    -    + li {
    -      margin-left: 2px;
    -    }
    -
    -    // Active state
    -    &.active > a {
    -      &,
    -      &:hover,
    -      &:focus {
    -        color: @nav-pills-active-link-hover-color;
    -        background-color: @nav-pills-active-link-hover-bg;
    -      }
    -    }
    -  }
    -}
    -
    -
    -// Stacked pills
    -.nav-stacked {
    -  > li {
    -    float: none;
    -    + li {
    -      margin-top: 2px;
    -      margin-left: 0; // no need for this gap between nav items
    -    }
    -  }
    -}
    -
    -
    -// Nav variations
    -// --------------------------------------------------
    -
    -// Justified nav links
    -// -------------------------
    -
    -.nav-justified {
    -  width: 100%;
    -
    -  > li {
    -    float: none;
    -    > a {
    -      text-align: center;
    -      margin-bottom: 5px;
    -    }
    -  }
    -
    -  > .dropdown .dropdown-menu {
    -    top: auto;
    -    left: auto;
    -  }
    -
    -  @media (min-width: @screen-sm-min) {
    -    > li {
    -      display: table-cell;
    -      width: 1%;
    -      > a {
    -        margin-bottom: 0;
    -      }
    -    }
    -  }
    -}
    -
    -// Move borders to anchors instead of bottom of list
    -//
    -// Mixin for adding on top the shared `.nav-justified` styles for our tabs
    -.nav-tabs-justified {
    -  border-bottom: 0;
    -
    -  > li > a {
    -    // Override margin from .nav-tabs
    -    margin-right: 0;
    -    border-radius: @border-radius-base;
    -  }
    -
    -  > .active > a,
    -  > .active > a:hover,
    -  > .active > a:focus {
    -    border: 1px solid @nav-tabs-justified-link-border-color;
    -  }
    -
    -  @media (min-width: @screen-sm-min) {
    -    > li > a {
    -      border-bottom: 1px solid @nav-tabs-justified-link-border-color;
    -      border-radius: @border-radius-base @border-radius-base 0 0;
    -    }
    -    > .active > a,
    -    > .active > a:hover,
    -    > .active > a:focus {
    -      border-bottom-color: @nav-tabs-justified-active-link-border-color;
    -    }
    -  }
    -}
    -
    -
    -// Tabbable tabs
    -// -------------------------
    -
    -// Hide tabbable panes to start, show them when `.active`
    -.tab-content {
    -  > .tab-pane {
    -    display: none;
    -  }
    -  > .active {
    -    display: block;
    -  }
    -}
    -
    -
    -// Dropdowns
    -// -------------------------
    -
    -// Specific dropdowns
    -.nav-tabs .dropdown-menu {
    -  // make dropdown border overlap tab border
    -  margin-top: -1px;
    -  // Remove the top rounded corners here since there is a hard edge above the menu
    -  .border-top-radius(0);
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/pager.less b/src/legacy/ui/public/styles/bootstrap/pager.less
    deleted file mode 100644
    index 41abaaadc5dc6..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/pager.less
    +++ /dev/null
    @@ -1,54 +0,0 @@
    -//
    -// Pager pagination
    -// --------------------------------------------------
    -
    -
    -.pager {
    -  padding-left: 0;
    -  margin: @line-height-computed 0;
    -  list-style: none;
    -  text-align: center;
    -  &:extend(.clearfix all);
    -  li {
    -    display: inline;
    -    > a,
    -    > span {
    -      display: inline-block;
    -      padding: 5px 14px;
    -      background-color: @pager-bg;
    -      border: 1px solid @pager-border;
    -      border-radius: @pager-border-radius;
    -    }
    -
    -    > a:hover,
    -    > a:focus {
    -      text-decoration: none;
    -      background-color: @pager-hover-bg;
    -    }
    -  }
    -
    -  .next {
    -    > a,
    -    > span {
    -      float: right;
    -    }
    -  }
    -
    -  .previous {
    -    > a,
    -    > span {
    -      float: left;
    -    }
    -  }
    -
    -  .disabled {
    -    > a,
    -    > a:hover,
    -    > a:focus,
    -    > span {
    -      color: @pager-disabled-color;
    -      background-color: @pager-bg;
    -      cursor: @cursor-disabled;
    -    }
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/pagination.less b/src/legacy/ui/public/styles/bootstrap/pagination.less
    deleted file mode 100644
    index 31f77aae4ed7b..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/pagination.less
    +++ /dev/null
    @@ -1,89 +0,0 @@
    -//
    -// Pagination (multiple pages)
    -// --------------------------------------------------
    -.pagination {
    -  display: inline-block;
    -  padding-left: 0;
    -  margin: @line-height-computed 0;
    -  border-radius: @border-radius-base;
    -
    -  > li {
    -    display: inline; // Remove list-style and block-level defaults
    -    > a,
    -    > span {
    -      position: relative;
    -      float: left; // Collapse white-space
    -      padding: @padding-base-vertical @padding-base-horizontal;
    -      line-height: @line-height-base;
    -      text-decoration: none;
    -      color: @pagination-color;
    -      background-color: @pagination-bg;
    -      border: 1px solid @pagination-border;
    -      margin-left: -1px;
    -    }
    -    &:first-child {
    -      > a,
    -      > span {
    -        margin-left: 0;
    -        .border-left-radius(@border-radius-base);
    -      }
    -    }
    -    &:last-child {
    -      > a,
    -      > span {
    -        .border-right-radius(@border-radius-base);
    -      }
    -    }
    -  }
    -
    -  > li > a,
    -  > li > span {
    -    &:hover,
    -    &:focus {
    -      z-index: 2;
    -      color: @pagination-hover-color;
    -      background-color: @pagination-hover-bg;
    -      border-color: @pagination-hover-border;
    -    }
    -  }
    -
    -  > .active > a,
    -  > .active > span {
    -    &,
    -    &:hover,
    -    &:focus {
    -      z-index: 3;
    -      color: @pagination-active-color;
    -      background-color: @pagination-active-bg;
    -      border-color: @pagination-active-border;
    -      cursor: default;
    -    }
    -  }
    -
    -  > .disabled {
    -    > span,
    -    > span:hover,
    -    > span:focus,
    -    > a,
    -    > a:hover,
    -    > a:focus {
    -      color: @pagination-disabled-color;
    -      background-color: @pagination-disabled-bg;
    -      border-color: @pagination-disabled-border;
    -      cursor: @cursor-disabled;
    -    }
    -  }
    -}
    -
    -// Sizing
    -// --------------------------------------------------
    -
    -// Large
    -.pagination-lg {
    -  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
    -}
    -
    -// Small
    -.pagination-sm {
    -  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/panels.less b/src/legacy/ui/public/styles/bootstrap/panels.less
    deleted file mode 100644
    index 425eb5e642c15..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/panels.less
    +++ /dev/null
    @@ -1,271 +0,0 @@
    -//
    -// Panels
    -// --------------------------------------------------
    -
    -
    -// Base class
    -.panel {
    -  margin-bottom: @line-height-computed;
    -  background-color: @panel-bg;
    -  border: 1px solid transparent;
    -  border-radius: @panel-border-radius;
    -  .box-shadow(0 1px 1px rgba(0,0,0,.05));
    -}
    -
    -// Panel contents
    -.panel-body {
    -  padding: @panel-body-padding;
    -  &:extend(.clearfix all);
    -}
    -
    -// Optional heading
    -.panel-heading {
    -  padding: @panel-heading-padding;
    -  border-bottom: 1px solid transparent;
    -  .border-top-radius((@panel-border-radius - 1));
    -
    -  > .dropdown .dropdown-toggle {
    -    color: inherit;
    -  }
    -}
    -
    -// Within heading, strip any `h*` tag of its default margins for spacing.
    -.panel-title {
    -  margin-top: 0;
    -  margin-bottom: 0;
    -  font-size: ceil((@font-size-base * 1.125));
    -  color: inherit;
    -
    -  > a,
    -  > small,
    -  > .small,
    -  > small > a,
    -  > .small > a {
    -    color: inherit;
    -  }
    -}
    -
    -// Optional footer (stays gray in every modifier class)
    -.panel-footer {
    -  padding: @panel-footer-padding;
    -  background-color: @panel-footer-bg;
    -  border-top: 1px solid @panel-inner-border;
    -  .border-bottom-radius((@panel-border-radius - 1));
    -}
    -
    -
    -// List groups in panels
    -//
    -// By default, space out list group content from panel headings to account for
    -// any kind of custom content between the two.
    -
    -.panel {
    -  > .list-group,
    -  > .panel-collapse > .list-group {
    -    margin-bottom: 0;
    -
    -    .list-group-item {
    -      border-width: 1px 0;
    -      border-radius: 0;
    -    }
    -
    -    // Add border top radius for first one
    -    &:first-child {
    -      .list-group-item:first-child {
    -        border-top: 0;
    -        .border-top-radius((@panel-border-radius - 1));
    -      }
    -    }
    -
    -    // Add border bottom radius for last one
    -    &:last-child {
    -      .list-group-item:last-child {
    -        border-bottom: 0;
    -        .border-bottom-radius((@panel-border-radius - 1));
    -      }
    -    }
    -  }
    -  > .panel-heading + .panel-collapse > .list-group {
    -    .list-group-item:first-child {
    -      .border-top-radius(0);
    -    }
    -  }
    -}
    -// Collapse space between when there's no additional content.
    -.panel-heading + .list-group {
    -  .list-group-item:first-child {
    -    border-top-width: 0;
    -  }
    -}
    -.list-group + .panel-footer {
    -  border-top-width: 0;
    -}
    -
    -// Tables in panels
    -//
    -// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
    -// watch it go full width.
    -
    -.panel {
    -  > .table,
    -  > .table-responsive > .table,
    -  > .panel-collapse > .table {
    -    margin-bottom: 0;
    -
    -    caption {
    -      padding-left: @panel-body-padding;
    -      padding-right: @panel-body-padding;
    -    }
    -  }
    -  // Add border top radius for first one
    -  > .table:first-child,
    -  > .table-responsive:first-child > .table:first-child {
    -    .border-top-radius((@panel-border-radius - 1));
    -
    -    > thead:first-child,
    -    > tbody:first-child {
    -      > tr:first-child {
    -        border-top-left-radius: (@panel-border-radius - 1);
    -        border-top-right-radius: (@panel-border-radius - 1);
    -
    -        td:first-child,
    -        th:first-child {
    -          border-top-left-radius: (@panel-border-radius - 1);
    -        }
    -        td:last-child,
    -        th:last-child {
    -          border-top-right-radius: (@panel-border-radius - 1);
    -        }
    -      }
    -    }
    -  }
    -  // Add border bottom radius for last one
    -  > .table:last-child,
    -  > .table-responsive:last-child > .table:last-child {
    -    .border-bottom-radius((@panel-border-radius - 1));
    -
    -    > tbody:last-child,
    -    > tfoot:last-child {
    -      > tr:last-child {
    -        border-bottom-left-radius: (@panel-border-radius - 1);
    -        border-bottom-right-radius: (@panel-border-radius - 1);
    -
    -        td:first-child,
    -        th:first-child {
    -          border-bottom-left-radius: (@panel-border-radius - 1);
    -        }
    -        td:last-child,
    -        th:last-child {
    -          border-bottom-right-radius: (@panel-border-radius - 1);
    -        }
    -      }
    -    }
    -  }
    -  > .panel-body + .table,
    -  > .panel-body + .table-responsive,
    -  > .table + .panel-body,
    -  > .table-responsive + .panel-body {
    -    border-top: 1px solid @table-border-color;
    -  }
    -  > .table > tbody:first-child > tr:first-child th,
    -  > .table > tbody:first-child > tr:first-child td {
    -    border-top: 0;
    -  }
    -  > .table-bordered,
    -  > .table-responsive > .table-bordered {
    -    border: 0;
    -    > thead,
    -    > tbody,
    -    > tfoot {
    -      > tr {
    -        > th:first-child,
    -        > td:first-child {
    -          border-left: 0;
    -        }
    -        > th:last-child,
    -        > td:last-child {
    -          border-right: 0;
    -        }
    -      }
    -    }
    -    > thead,
    -    > tbody {
    -      > tr:first-child {
    -        > td,
    -        > th {
    -          border-bottom: 0;
    -        }
    -      }
    -    }
    -    > tbody,
    -    > tfoot {
    -      > tr:last-child {
    -        > td,
    -        > th {
    -          border-bottom: 0;
    -        }
    -      }
    -    }
    -  }
    -  > .table-responsive {
    -    border: 0;
    -    margin-bottom: 0;
    -  }
    -}
    -
    -
    -// Collapsable panels (aka, accordion)
    -//
    -// Wrap a series of panels in `.panel-group` to turn them into an accordion with
    -// the help of our collapse JavaScript plugin.
    -
    -.panel-group {
    -  margin-bottom: @line-height-computed;
    -
    -  // Tighten up margin so it's only between panels
    -  .panel {
    -    margin-bottom: 0;
    -    border-radius: @panel-border-radius;
    -
    -    + .panel {
    -      margin-top: 5px;
    -    }
    -  }
    -
    -  .panel-heading {
    -    border-bottom: 0;
    -
    -    + .panel-collapse > .panel-body,
    -    + .panel-collapse > .list-group {
    -      border-top: 1px solid @panel-inner-border;
    -    }
    -  }
    -
    -  .panel-footer {
    -    border-top: 0;
    -    + .panel-collapse .panel-body {
    -      border-bottom: 1px solid @panel-inner-border;
    -    }
    -  }
    -}
    -
    -
    -// Contextual variations
    -.panel-default {
    -  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);
    -}
    -.panel-primary {
    -  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);
    -}
    -.panel-success {
    -  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);
    -}
    -.panel-info {
    -  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);
    -}
    -.panel-warning {
    -  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);
    -}
    -.panel-danger {
    -  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/popovers.less b/src/legacy/ui/public/styles/bootstrap/popovers.less
    deleted file mode 100644
    index 0791dc323d0fd..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/popovers.less
    +++ /dev/null
    @@ -1,131 +0,0 @@
    -//
    -// Popovers
    -// --------------------------------------------------
    -
    -
    -.popover {
    -  position: absolute;
    -  top: 0;
    -  left: 0;
    -  z-index: @zindex-popover;
    -  display: none;
    -  max-width: @popover-max-width;
    -  padding: 1px;
    -  // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.
    -  // So reset our font and text properties to avoid inheriting weird values.
    -  .reset-text();
    -  font-size: @font-size-base;
    -
    -  background-color: @popover-bg;
    -  background-clip: padding-box;
    -  border: 1px solid @popover-fallback-border-color;
    -  border: 1px solid @popover-border-color;
    -  border-radius: @border-radius-large;
    -  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.1);
    -
    -  // Offset the popover to account for the popover arrow
    -  &.top     { margin-top: -@popover-arrow-width; }
    -  &.right   { margin-left: @popover-arrow-width; }
    -  &.bottom  { margin-top: @popover-arrow-width; }
    -  &.left    { margin-left: -@popover-arrow-width; }
    -}
    -
    -.popover-title {
    -  margin: 0; // reset heading margin
    -  padding: 8px 14px;
    -  font-size: @font-size-base;
    -  background-color: @popover-title-bg;
    -  border-bottom: 1px solid darken(@popover-title-bg, 5%);
    -  border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;
    -}
    -
    -.popover-content {
    -  padding: 9px 14px;
    -}
    -
    -// Arrows
    -//
    -// .arrow is outer, .arrow:after is inner
    -
    -.popover > .arrow {
    -  &,
    -  &:after {
    -    position: absolute;
    -    display: block;
    -    width: 0;
    -    height: 0;
    -    border-color: transparent;
    -    border-style: solid;
    -  }
    -}
    -.popover > .arrow {
    -  border-width: @popover-arrow-outer-width;
    -}
    -.popover > .arrow:after {
    -  border-width: @popover-arrow-width;
    -  content: "";
    -}
    -
    -.popover {
    -  &.top > .arrow {
    -    left: 50%;
    -    margin-left: -@popover-arrow-outer-width;
    -    border-bottom-width: 0;
    -    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback
    -    border-top-color: @popover-arrow-outer-color;
    -    bottom: -@popover-arrow-outer-width;
    -    &:after {
    -      content: " ";
    -      bottom: 1px;
    -      margin-left: -@popover-arrow-width;
    -      border-bottom-width: 0;
    -      border-top-color: @popover-arrow-color;
    -    }
    -  }
    -  &.right > .arrow {
    -    top: 50%;
    -    left: -@popover-arrow-outer-width;
    -    margin-top: -@popover-arrow-outer-width;
    -    border-left-width: 0;
    -    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback
    -    border-right-color: @popover-arrow-outer-color;
    -    &:after {
    -      content: " ";
    -      left: 1px;
    -      bottom: -@popover-arrow-width;
    -      border-left-width: 0;
    -      border-right-color: @popover-arrow-color;
    -    }
    -  }
    -  &.bottom > .arrow {
    -    left: 50%;
    -    margin-left: -@popover-arrow-outer-width;
    -    border-top-width: 0;
    -    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback
    -    border-bottom-color: @popover-arrow-outer-color;
    -    top: -@popover-arrow-outer-width;
    -    &:after {
    -      content: " ";
    -      top: 1px;
    -      margin-left: -@popover-arrow-width;
    -      border-top-width: 0;
    -      border-bottom-color: @popover-arrow-color;
    -    }
    -  }
    -
    -  &.left > .arrow {
    -    top: 50%;
    -    right: -@popover-arrow-outer-width;
    -    margin-top: -@popover-arrow-outer-width;
    -    border-right-width: 0;
    -    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback
    -    border-left-color: @popover-arrow-outer-color;
    -    &:after {
    -      content: " ";
    -      right: 1px;
    -      border-right-width: 0;
    -      border-left-color: @popover-arrow-color;
    -      bottom: -@popover-arrow-width;
    -    }
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/progress-bars.less b/src/legacy/ui/public/styles/bootstrap/progress-bars.less
    deleted file mode 100644
    index 282c59a099d66..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/progress-bars.less
    +++ /dev/null
    @@ -1,86 +0,0 @@
    -//
    -// Progress bars
    -// --------------------------------------------------
    -
    -
    -// Bar animations
    -// -------------------------
    -
    -// WebKit
    -@-webkit-keyframes progress-bar-stripes {
    -  from  { background-position: 40px 0; }
    -  to    { background-position: 0 0; }
    -}
    -
    -// Spec and IE10+
    -@keyframes progress-bar-stripes {
    -  from  { background-position: 40px 0; }
    -  to    { background-position: 0 0; }
    -}
    -
    -
    -// Bar itself
    -// -------------------------
    -
    -// Outer container
    -.progress {
    -  overflow: hidden;
    -  height: @line-height-computed;
    -  margin-bottom: @line-height-computed;
    -  background-color: @progress-bg;
    -  border-radius: @progress-border-radius;
    -  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
    -}
    -
    -// Bar of progress
    -.progress-bar {
    -  float: left;
    -  width: 0%;
    -  height: 100%;
    -  font-size: @font-size-small;
    -  line-height: @line-height-computed;
    -  color: @progress-bar-color;
    -  text-align: center;
    -  background-color: @progress-bar-bg;
    -  .transition(width .6s ease);
    -}
    -
    -// Striped bars
    -//
    -// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the
    -// `.progress-bar-striped` class, which you just add to an existing
    -// `.progress-bar`.
    -.progress-striped .progress-bar,
    -.progress-bar-striped {
    -  #gradient > .striped();
    -  background-size: 40px 40px;
    -}
    -
    -// Call animation for the active one
    -//
    -// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the
    -// `.progress-bar.active` approach.
    -.progress.active .progress-bar,
    -.progress-bar.active {
    -  .animation(progress-bar-stripes 2s linear infinite);
    -}
    -
    -
    -// Variations
    -// -------------------------
    -
    -.progress-bar-success {
    -  .progress-bar-variant(@progress-bar-success-bg);
    -}
    -
    -.progress-bar-info {
    -  .progress-bar-variant(@progress-bar-info-bg);
    -}
    -
    -.progress-bar-warning {
    -  .progress-bar-variant(@progress-bar-warning-bg);
    -}
    -
    -.progress-bar-danger {
    -  .progress-bar-variant(@progress-bar-danger-bg);
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/responsive-utilities.less b/src/legacy/ui/public/styles/bootstrap/responsive-utilities.less
    deleted file mode 100644
    index aa192b6282513..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/responsive-utilities.less
    +++ /dev/null
    @@ -1,173 +0,0 @@
    -//
    -// Responsive: Utility classes
    -// --------------------------------------------------
    -
    -// Visibility utilities
    -// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
    -.visible-xs,
    -.visible-sm,
    -.visible-md,
    -.visible-lg {
    -  .responsive-invisibility();
    -}
    -
    -.visible-xs-block,
    -.visible-xs-inline,
    -.visible-xs-inline-block,
    -.visible-sm-block,
    -.visible-sm-inline,
    -.visible-sm-inline-block,
    -.visible-md-block,
    -.visible-md-inline,
    -.visible-md-inline-block,
    -.visible-lg-block,
    -.visible-lg-inline,
    -.visible-lg-inline-block {
    -  display: none !important;
    -}
    -
    -.visible-xs {
    -  @media (max-width: @screen-xs-max) {
    -    .responsive-visibility();
    -  }
    -}
    -.visible-xs-block {
    -  @media (max-width: @screen-xs-max) {
    -    display: block !important;
    -  }
    -}
    -.visible-xs-inline {
    -  @media (max-width: @screen-xs-max) {
    -    display: inline !important;
    -  }
    -}
    -.visible-xs-inline-block {
    -  @media (max-width: @screen-xs-max) {
    -    display: inline-block !important;
    -  }
    -}
    -
    -.visible-sm {
    -  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
    -    .responsive-visibility();
    -  }
    -}
    -.visible-sm-block {
    -  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
    -    display: block !important;
    -  }
    -}
    -.visible-sm-inline {
    -  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
    -    display: inline !important;
    -  }
    -}
    -.visible-sm-inline-block {
    -  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
    -    display: inline-block !important;
    -  }
    -}
    -
    -.visible-md {
    -  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
    -    .responsive-visibility();
    -  }
    -}
    -.visible-md-block {
    -  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
    -    display: block !important;
    -  }
    -}
    -.visible-md-inline {
    -  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
    -    display: inline !important;
    -  }
    -}
    -.visible-md-inline-block {
    -  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
    -    display: inline-block !important;
    -  }
    -}
    -
    -.visible-lg {
    -  @media (min-width: @screen-lg-min) {
    -    .responsive-visibility();
    -  }
    -}
    -.visible-lg-block {
    -  @media (min-width: @screen-lg-min) {
    -    display: block !important;
    -  }
    -}
    -.visible-lg-inline {
    -  @media (min-width: @screen-lg-min) {
    -    display: inline !important;
    -  }
    -}
    -.visible-lg-inline-block {
    -  @media (min-width: @screen-lg-min) {
    -    display: inline-block !important;
    -  }
    -}
    -
    -.hidden-xs {
    -  @media (max-width: @screen-xs-max) {
    -    .responsive-invisibility();
    -  }
    -}
    -.hidden-sm {
    -  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
    -    .responsive-invisibility();
    -  }
    -}
    -.hidden-md {
    -  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
    -    .responsive-invisibility();
    -  }
    -}
    -.hidden-lg {
    -  @media (min-width: @screen-lg-min) {
    -    .responsive-invisibility();
    -  }
    -}
    -
    -
    -// Print utilities
    -//
    -// Media queries are placed on the inside to be mixin-friendly.
    -
    -// Note: Deprecated .visible-print as of v3.2.0
    -.visible-print {
    -  .responsive-invisibility();
    -
    -  @media print {
    -    .responsive-visibility();
    -  }
    -}
    -.visible-print-block {
    -  display: none !important;
    -
    -  @media print {
    -    display: block !important;
    -  }
    -}
    -.visible-print-inline {
    -  display: none !important;
    -
    -  @media print {
    -    display: inline !important;
    -  }
    -}
    -.visible-print-inline-block {
    -  display: none !important;
    -
    -  @media print {
    -    display: inline-block !important;
    -  }
    -}
    -
    -.hidden-print {
    -  @media print {
    -    .responsive-invisibility();
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/tables.less b/src/legacy/ui/public/styles/bootstrap/tables.less
    deleted file mode 100644
    index 917196b3c711d..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/tables.less
    +++ /dev/null
    @@ -1,227 +0,0 @@
    -//
    -// Tables
    -// --------------------------------------------------
    -
    -
    -// Baseline styles
    -
    -.table {
    -  width: 100%;
    -  max-width: 100%;
    -  margin-bottom: @line-height-computed;
    -  font-size: 14px;
    -
    -  thead {
    -    font-size: 12px;
    -  }
    -
    -  // Cells
    -  > thead,
    -  > tbody,
    -  > tfoot {
    -    > tr {
    -      > th,
    -      > td {
    -        padding: @table-cell-padding;
    -        line-height: @line-height-base;
    -        vertical-align: top;
    -        border-top: 1px solid @table-border-color;
    -      }
    -    }
    -  }
    -  // Bottom align for column headings
    -  > thead > tr > th {
    -    vertical-align: bottom;
    -    border-bottom: 1px solid @table-border-color;
    -  }
    -  // Remove top border from thead by default
    -  > caption + thead,
    -  > colgroup + thead,
    -  > thead:first-child {
    -    > tr:first-child {
    -      > th,
    -      > td {
    -        border-top: 0;
    -      }
    -    }
    -  }
    -  // Account for multiple tbody instances
    -  > tbody + tbody {
    -    border-top: 2px solid @table-border-color;
    -  }
    -
    -  // Nesting
    -  .table {
    -    background-color: @body-bg;
    -  }
    -}
    -
    -
    -// Condensed table w/ half padding
    -
    -.table-condensed {
    -  > thead,
    -  > tbody,
    -  > tfoot {
    -    > tr {
    -      > th,
    -      > td {
    -        padding: @table-condensed-cell-padding;
    -        font-size: 12px;
    -      }
    -    }
    -  }
    -}
    -
    -
    -// Bordered version
    -//
    -// Add borders all around the table and between all the columns.
    -
    -.table-bordered {
    -  border: 1px solid @table-border-color;
    -  > thead,
    -  > tbody,
    -  > tfoot {
    -    > tr {
    -      > th,
    -      > td {
    -        border: 1px solid @table-border-color;
    -      }
    -    }
    -  }
    -  > thead > tr {
    -    > th,
    -    > td {
    -      border-bottom-width: 2px;
    -    }
    -  }
    -}
    -
    -
    -// Zebra-striping
    -//
    -// Default zebra-stripe styles (alternating gray and transparent backgrounds)
    -
    -.table-striped {
    -  > tbody > tr:nth-of-type(odd) {
    -    background-color: @table-bg-accent;
    -  }
    -}
    -
    -
    -// Hover effect
    -//
    -// Placed here since it has to come after the potential zebra striping
    -
    -.table-hover {
    -  > tbody > tr:hover {
    -    background-color: @table-bg-hover;
    -  }
    -}
    -
    -
    -// Table cell sizing
    -//
    -// Reset default table behavior
    -
    -table col[class*="col-"] {
    -  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
    -  float: none;
    -  display: table-column;
    -}
    -table {
    -  td,
    -  th {
    -    &[class*="col-"] {
    -      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
    -      float: none;
    -      display: table-cell;
    -    }
    -  }
    -}
    -
    -
    -// Table backgrounds
    -//
    -// Exact selectors below required to override `.table-striped` and prevent
    -// inheritance to nested tables.
    -
    -// Generate the contextual variants
    -.table-row-variant(active; @table-bg-active);
    -.table-row-variant(success; @state-success-bg);
    -.table-row-variant(info; @state-info-bg);
    -.table-row-variant(warning; @state-warning-bg);
    -.table-row-variant(danger; @state-danger-bg);
    -
    -
    -// Responsive tables
    -//
    -// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
    -// by enabling horizontal scrolling. Only applies <768px. Everything above that
    -// will display normally.
    -
    -.table-responsive {
    -  overflow-x: auto;
    -  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)
    -
    -  @media screen and (max-width: @screen-xs-max) {
    -    width: 100%;
    -    margin-bottom: (@line-height-computed * 0.75);
    -    overflow-y: hidden;
    -    -ms-overflow-style: -ms-autohiding-scrollbar;
    -    border: 1px solid @table-border-color;
    -
    -    // Tighten up spacing
    -    > .table {
    -      margin-bottom: 0;
    -
    -      // Ensure the content doesn't wrap
    -      > thead,
    -      > tbody,
    -      > tfoot {
    -        > tr {
    -          > th,
    -          > td {
    -            white-space: nowrap;
    -          }
    -        }
    -      }
    -    }
    -
    -    // Special overrides for the bordered tables
    -    > .table-bordered {
    -      border: 0;
    -
    -      // Nuke the appropriate borders so that the parent can handle them
    -      > thead,
    -      > tbody,
    -      > tfoot {
    -        > tr {
    -          > th:first-child,
    -          > td:first-child {
    -            border-left: 0;
    -          }
    -          > th:last-child,
    -          > td:last-child {
    -            border-right: 0;
    -          }
    -        }
    -      }
    -
    -      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since
    -      // chances are there will be only one `tr` in a `thead` and that would
    -      // remove the border altogether.
    -      > tbody,
    -      > tfoot {
    -        > tr:last-child {
    -          > th,
    -          > td {
    -            border-bottom: 0;
    -          }
    -        }
    -      }
    -
    -    }
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/tooltip.less b/src/legacy/ui/public/styles/bootstrap/tooltip.less
    deleted file mode 100644
    index a85617d38b263..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/tooltip.less
    +++ /dev/null
    @@ -1,101 +0,0 @@
    -//
    -// Tooltips
    -// --------------------------------------------------
    -
    -
    -// Base class
    -.bsTooltip {
    -  position: absolute;
    -  z-index: @zindex-tooltip;
    -  display: block;
    -  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
    -  // So reset our font and text properties to avoid inheriting weird values.
    -  .reset-text();
    -  font-size: @font-size-small;
    -
    -  .opacity(0);
    -
    -  &.in     { .opacity(@tooltip-opacity); }
    -  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }
    -  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }
    -  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }
    -  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }
    -}
    -
    -// Wrapper for the tooltip content
    -.bsTooltip-inner {
    -  max-width: @tooltip-max-width;
    -  padding: 3px 8px;
    -  color: @tooltip-color;
    -  text-align: center;
    -  background-color: @tooltip-bg;
    -  border-radius: @border-radius-base;
    -}
    -
    -// Arrows
    -.bsTooltip-arrow {
    -  position: absolute;
    -  width: 0;
    -  height: 0;
    -  border-color: transparent;
    -  border-style: solid;
    -}
    -// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1
    -.bsTooltip {
    -  &.top .bsTooltip-arrow {
    -    bottom: 0;
    -    left: 50%;
    -    margin-left: -@tooltip-arrow-width;
    -    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
    -    border-top-color: @tooltip-arrow-color;
    -  }
    -  &.top-left .bsTooltip-arrow {
    -    bottom: 0;
    -    right: @tooltip-arrow-width;
    -    margin-bottom: -@tooltip-arrow-width;
    -    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
    -    border-top-color: @tooltip-arrow-color;
    -  }
    -  &.top-right .bsTooltip-arrow {
    -    bottom: 0;
    -    left: @tooltip-arrow-width;
    -    margin-bottom: -@tooltip-arrow-width;
    -    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
    -    border-top-color: @tooltip-arrow-color;
    -  }
    -  &.right .bsTooltip-arrow {
    -    top: 50%;
    -    left: 0;
    -    margin-top: -@tooltip-arrow-width;
    -    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;
    -    border-right-color: @tooltip-arrow-color;
    -  }
    -  &.left .bsTooltip-arrow {
    -    top: 50%;
    -    right: 0;
    -    margin-top: -@tooltip-arrow-width;
    -    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;
    -    border-left-color: @tooltip-arrow-color;
    -  }
    -  &.bottom .bsTooltip-arrow {
    -    top: 0;
    -    left: 50%;
    -    margin-left: -@tooltip-arrow-width;
    -    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
    -    border-bottom-color: @tooltip-arrow-color;
    -  }
    -  &.bottom-left .bsTooltip-arrow {
    -    top: 0;
    -    right: @tooltip-arrow-width;
    -    margin-top: -@tooltip-arrow-width;
    -    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
    -    border-bottom-color: @tooltip-arrow-color;
    -  }
    -  &.bottom-right .bsTooltip-arrow {
    -    top: 0;
    -    left: @tooltip-arrow-width;
    -    margin-top: -@tooltip-arrow-width;
    -    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
    -    border-bottom-color: @tooltip-arrow-color;
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/type.less b/src/legacy/ui/public/styles/bootstrap/type.less
    deleted file mode 100644
    index 08be0615b04c1..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/type.less
    +++ /dev/null
    @@ -1,63 +0,0 @@
    -//
    -// Typography
    -// --------------------------------------------------
    -
    -
    -// Alignment
    -.text-left           { text-align: left; }
    -.text-right          { text-align: right; }
    -.text-center         { text-align: center; }
    -
    -// Contextual colors
    -.text-muted {
    -  color: @text-muted;
    -}
    -.text-primary {
    -  .text-emphasis-variant(@brand-primary);
    -}
    -.text-success {
    -  .text-emphasis-variant(@state-success-text);
    -}
    -.text-info {
    -  .text-emphasis-variant(@state-info-text);
    -}
    -.text-warning {
    -  .text-emphasis-variant(@state-warning-text);
    -}
    -.text-danger {
    -  .text-emphasis-variant(@state-danger-text);
    -}
    -
    -.bg-info {
    -  .bg-variant(@state-info-bg);
    -}
    -
    -// Unstyled keeps list items block level, just removes default browser padding and list-style
    -.list-unstyled {
    -  padding-left: 0;
    -  list-style: none;
    -}
    -
    -// Horizontal description lists
    -//
    -// Defaults to being stacked without any of the below styles applied, until the
    -// grid breakpoint is reached (default of ~768px).
    -
    -.dl-horizontal {
    -  dd {
    -    &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present
    -  }
    -
    -  @media (min-width: @dl-horizontal-breakpoint) {
    -    dt {
    -      float: left;
    -      width: (@dl-horizontal-offset - 20);
    -      clear: left;
    -      text-align: right;
    -      .text-overflow();
    -    }
    -    dd {
    -      margin-left: @dl-horizontal-offset;
    -    }
    -  }
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/utilities.less b/src/legacy/ui/public/styles/bootstrap/utilities.less
    deleted file mode 100644
    index 7a8ca27a8ff54..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/utilities.less
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -//
    -// Utility classes
    -// --------------------------------------------------
    -
    -
    -// Floats
    -// -------------------------
    -
    -.clearfix {
    -  .clearfix();
    -}
    -.center-block {
    -  .center-block();
    -}
    -.pull-right {
    -  float: right !important;
    -}
    -.pull-left {
    -  float: left !important;
    -}
    -
    -
    -// Toggling content
    -// -------------------------
    -
    -// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
    -.hide {
    -  display: none !important;
    -}
    -.show {
    -  display: block !important;
    -}
    -.invisible {
    -  visibility: hidden;
    -}
    -.text-hide {
    -  .text-hide();
    -}
    -
    -
    -// Hide from screenreaders and browsers
    -//
    -// Credit: HTML5 Boilerplate
    -
    -.hidden {
    -  display: none !important;
    -}
    -
    -
    -// For Affix plugin
    -// -------------------------
    -
    -.affix {
    -  position: fixed;
    -}
    diff --git a/src/legacy/ui/public/styles/bootstrap/variables.less b/src/legacy/ui/public/styles/bootstrap/variables.less
    deleted file mode 100644
    index 129beaaee5bb8..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap/variables.less
    +++ /dev/null
    @@ -1,852 +0,0 @@
    -//
    -// Variables
    -// --------------------------------------------------
    -
    -
    -//== Colors
    -//
    -//## Gray and brand colors for use across Bootstrap.
    -
    -@gray-base:              #000;
    -@gray-darker:            lighten(@gray-base, 13.5%); // #222
    -@gray-dark:              lighten(@gray-base, 20%);   // #333
    -@gray:                   lighten(@gray-base, 33.5%); // #555
    -@gray-light:             lighten(@gray-base, 46.7%); // #777
    -@gray-lighter:           lighten(@gray-base, 93.5%); // #eee
    -@gray-lightest:          lighten(@gray-base, 98%);
    -
    -@brand-primary:         darken(#428bca, 6.5%); // #337ab7
    -@brand-success:         #5cb85c;
    -@brand-info:            #5bc0de;
    -@brand-warning:         #f0ad4e;
    -@brand-danger:          #d9534f;
    -
    -
    -//== Scaffolding
    -//
    -//## Settings for some of the most global styles.
    -
    -//** Background color for ``.
    -@body-bg:               #fff;
    -//** Global text color on ``.
    -@text-color:            @gray-dark;
    -
    -//** Global textual link color.
    -@link-color:            @brand-primary;
    -//** Link hover color set via `darken()` function.
    -@link-hover-color:      darken(@link-color, 15%);
    -//** Link hover decoration.
    -@link-hover-decoration: underline;
    -
    -
    -//== Typography
    -//
    -//## Font, line-height, and color for body text, headings, and more.
    -
    -@font-family-sans-serif:  "Helvetica Neue", Helvetica, Arial, sans-serif;
    -@font-family-serif:       Georgia, "Times New Roman", Times, serif;
    -//** Default monospace fonts for ``, ``, and `
    `.
    -@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
    -@font-family-base:        @font-family-sans-serif;
    -
    -@font-size-base:          14px;
    -@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
    -@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
    -
    -@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px
    -@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px
    -@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px
    -@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px
    -@font-size-h5:            @font-size-base;
    -@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px
    -
    -//** Unit-less `line-height` for use in components like buttons.
    -@line-height-base:        1.428571429; // 20/14
    -//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
    -@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
    -
    -//** By default, this inherits from the ``.
    -@headings-font-family:    inherit;
    -@headings-font-weight:    500;
    -@headings-line-height:    1.1;
    -@headings-color:          inherit;
    -
    -
    -//== Iconography
    -//
    -//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
    -
    -//** Load fonts from this directory.
    -@icon-font-path:          "../fonts/";
    -//** File name for all font files.
    -@icon-font-name:          "glyphicons-halflings-regular";
    -//** Element ID within SVG icon file.
    -@icon-font-svg-id:        "glyphicons_halflingsregular";
    -
    -
    -//== Components
    -//
    -//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
    -
    -@padding-base-vertical:     6px;
    -@padding-base-horizontal:   12px;
    -
    -@padding-large-vertical:    10px;
    -@padding-large-horizontal:  16px;
    -
    -@padding-small-vertical:    5px;
    -@padding-small-horizontal:  10px;
    -
    -@padding-xs-vertical:       1px;
    -@padding-xs-horizontal:     5px;
    -
    -@line-height-large:         1.3333333; // extra decimals for Win 8.1 Chrome
    -@line-height-small:         1.5;
    -
    -@border-radius-base:        4px;
    -@border-radius-large:       6px;
    -@border-radius-small:       3px;
    -
    -//** Global color for active items (e.g., navs or dropdowns).
    -@component-active-color:    #fff;
    -//** Global background color for active items (e.g., navs or dropdowns).
    -@component-active-bg:       @brand-primary;
    -
    -//** Width of the `border` for generating carets that indicator dropdowns.
    -@caret-width-base:          4px;
    -//** Carets increase slightly in size for larger components.
    -@caret-width-large:         5px;
    -
    -
    -//== Tables
    -//
    -//## Customizes the `.table` component with basic values, each used across all table variations.
    -
    -//** Padding for ``s and ``s.
    -@table-cell-padding:            8px;
    -//** Padding for cells in `.table-condensed`.
    -@table-condensed-cell-padding:  5px;
    -
    -//** Default background color used for all tables.
    -@table-bg:                      transparent;
    -//** Background color used for `.table-striped`.
    -@table-bg-accent:               #f9f9f9;
    -//** Background color used for `.table-hover`.
    -@table-bg-hover:                @gray-lightest;
    -@table-bg-active:               @table-bg-hover;
    -
    -//** Border color for table and cell borders.
    -@table-border-color:            #ddd;
    -
    -
    -//== Buttons
    -//
    -//## For each of Bootstrap's buttons, define text, background and border color.
    -
    -@btn-font-weight:                normal;
    -
    -@btn-default-color:              #333;
    -@btn-default-bg:                 #fff;
    -@btn-default-border:             #ccc;
    -
    -@btn-primary-color:              #fff;
    -@btn-primary-bg:                 @brand-primary;
    -@btn-primary-border:             darken(@btn-primary-bg, 5%);
    -
    -@btn-success-color:              #fff;
    -@btn-success-bg:                 @brand-success;
    -@btn-success-border:             darken(@btn-success-bg, 5%);
    -
    -@btn-info-color:                 #fff;
    -@btn-info-bg:                    @brand-info;
    -@btn-info-border:                darken(@btn-info-bg, 5%);
    -
    -@btn-warning-color:              #fff;
    -@btn-warning-bg:                 @brand-warning;
    -@btn-warning-border:             darken(@btn-warning-bg, 5%);
    -
    -@btn-danger-color:               #fff;
    -@btn-danger-bg:                  @brand-danger;
    -@btn-danger-border:              darken(@btn-danger-bg, 5%);
    -
    -@btn-link-disabled-color:        @gray-light;
    -
    -// Allows for customizing button radius independently from global border radius
    -@btn-border-radius-base:         @border-radius-base;
    -@btn-border-radius-large:        @border-radius-large;
    -@btn-border-radius-small:        @border-radius-small;
    -
    -
    -//== Forms
    -//
    -//##
    -
    -//** `` background color
    -@input-bg:                       #fff;
    -//** `` background color
    -@input-bg-disabled:              @gray-lighter;
    -
    -//** Text color for ``s
    -@input-color:                    @gray;
    -//** `` border color
    -@input-border:                   #ccc;
    -
    -//** Default `.form-control` border radius
    -// This has no effect on ``s in CSS.
    -@input-border-radius-base:       @border-radius-base;
    -//** Large `.form-control` border radius
    -@input-border-radius-large:      @border-radius-large;
    -//** Small `.form-control` border radius
    -@input-border-radius-small:      @border-radius-small;
    -
    -//** Border color for inputs on focus
    -@input-border-focus:             #66afe9;
    -
    -//** Placeholder text color
    -@input-color-placeholder:        #999;
    -
    -//** Default `.form-control` height
    -@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
    -//** Large `.form-control` height
    -@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
    -//** Small `.form-control` height
    -@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
    -
    -//** `.form-group` margin
    -@form-group-margin-bottom:       15px;
    -
    -@legend-color:                   @gray-dark;
    -@legend-border-color:            #e5e5e5;
    -
    -//** Background color for textual input addons
    -@input-group-addon-bg:           @gray-lighter;
    -//** Border color for textual input addons
    -@input-group-addon-border-color: @input-border;
    -
    -//** Disabled cursor for form controls and buttons.
    -@cursor-disabled:                not-allowed;
    -
    -
    -//== Dropdowns
    -//
    -//## Dropdown menu container and contents.
    -
    -//** Background for the dropdown menu.
    -@dropdown-bg:                    #fff;
    -//** Dropdown menu `border-color`.
    -@dropdown-border:                rgba(0,0,0,.15);
    -//** Dropdown menu `border-color` **for IE8**.
    -@dropdown-fallback-border:       #ccc;
    -//** Divider color for between dropdown items.
    -@dropdown-divider-bg:            #e5e5e5;
    -
    -//** Dropdown link text color.
    -@dropdown-link-color:            @gray-dark;
    -//** Hover color for dropdown links.
    -@dropdown-link-hover-color:      darken(@gray-dark, 5%);
    -//** Hover background for dropdown links.
    -@dropdown-link-hover-bg:         @gray-lightest;
    -
    -//** Active dropdown menu item text color.
    -@dropdown-link-active-color:     @component-active-color;
    -//** Active dropdown menu item background color.
    -@dropdown-link-active-bg:        @component-active-bg;
    -
    -//** Disabled dropdown menu item background color.
    -@dropdown-link-disabled-color:   @gray-light;
    -
    -//** Text color for headers within dropdown menus.
    -@dropdown-header-color:          @gray-light;
    -
    -//** Deprecated `@dropdown-caret-color` as of v3.1.0
    -@dropdown-caret-color:           #000;
    -
    -
    -//-- Z-index master list
    -//
    -// Warning: Avoid customizing these values. They're used for a bird's eye view
    -// of components dependent on the z-axis and are designed to all work together.
    -//
    -// Note: These variables are not generated into the Customizer.
    -
    -@zindex-navbar:            1000;
    -@zindex-dropdown:          1000;
    -@zindex-popover:           1060;
    -@zindex-tooltip:           1070;
    -@zindex-navbar-fixed:      1030;
    -@zindex-modal-background:  1040;
    -@zindex-modal:             1050;
    -
    -
    -//== Media queries breakpoints
    -//
    -//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
    -
    -// Extra small screen / phone
    -//** Deprecated `@screen-xs` as of v3.0.1
    -@screen-xs:                  480px;
    -//** Deprecated `@screen-xs-min` as of v3.2.0
    -@screen-xs-min:              @screen-xs;
    -//** Deprecated `@screen-phone` as of v3.0.1
    -@screen-phone:               @screen-xs-min;
    -
    -// Small screen / tablet
    -//** Deprecated `@screen-sm` as of v3.0.1
    -@screen-sm:                  768px;
    -@screen-sm-min:              @screen-sm;
    -//** Deprecated `@screen-tablet` as of v3.0.1
    -@screen-tablet:              @screen-sm-min;
    -
    -// Medium screen / desktop
    -//** Deprecated `@screen-md` as of v3.0.1
    -@screen-md:                  992px;
    -@screen-md-min:              @screen-md;
    -//** Deprecated `@screen-desktop` as of v3.0.1
    -@screen-desktop:             @screen-md-min;
    -
    -// Large screen / wide desktop
    -//** Deprecated `@screen-lg` as of v3.0.1
    -@screen-lg:                  1200px;
    -@screen-lg-min:              @screen-lg;
    -//** Deprecated `@screen-lg-desktop` as of v3.0.1
    -@screen-lg-desktop:          @screen-lg-min;
    -
    -// So media queries don't overlap when required, provide a maximum
    -@screen-xs-max:              (@screen-sm-min - 1);
    -@screen-sm-max:              (@screen-md-min - 1);
    -@screen-md-max:              (@screen-lg-min - 1);
    -
    -
    -//== Grid system
    -//
    -//## Define your custom responsive grid.
    -
    -//** Number of columns in the grid.
    -@grid-columns:              12;
    -//** Padding between columns. Gets divided in half for the left and right.
    -@grid-gutter-width:         30px;
    -// Navbar collapse
    -//** Point at which the navbar becomes uncollapsed.
    -@grid-float-breakpoint:     0;
    -//** Point at which the navbar begins collapsing.
    -@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
    -
    -
    -//== Container sizes
    -//
    -//## Define the maximum width of `.container` for different screen sizes.
    -
    -// Small screen / tablet
    -@container-tablet:             (720px + @grid-gutter-width);
    -//** For `@screen-sm-min` and up.
    -@container-sm:                 @container-tablet;
    -
    -// Medium screen / desktop
    -@container-desktop:            (940px + @grid-gutter-width);
    -//** For `@screen-md-min` and up.
    -@container-md:                 @container-desktop;
    -
    -// Large screen / wide desktop
    -@container-large-desktop:      (1140px + @grid-gutter-width);
    -//** For `@screen-lg-min` and up.
    -@container-lg:                 @container-large-desktop;
    -
    -
    -//== Navbar
    -//
    -//##
    -
    -// Basics of a navbar
    -@navbar-height:                    48px;
    -@navbar-margin-bottom:             @line-height-computed;
    -@navbar-border-radius:             @border-radius-base;
    -@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
    -@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
    -@navbar-collapse-max-height:       340px;
    -
    -@navbar-default-color:             #777;
    -@navbar-default-bg:                #f8f8f8;
    -@navbar-default-border:            darken(@navbar-default-bg, 6.5%);
    -
    -// Navbar links
    -@navbar-default-link-color:                #777;
    -@navbar-default-link-hover-color:          #333;
    -@navbar-default-link-hover-bg:             transparent;
    -@navbar-default-link-active-color:         #555;
    -@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);
    -@navbar-default-link-disabled-color:       #ccc;
    -@navbar-default-link-disabled-bg:          transparent;
    -
    -// Navbar brand label
    -@navbar-default-brand-color:               @navbar-default-link-color;
    -@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);
    -@navbar-default-brand-hover-bg:            transparent;
    -
    -// Navbar toggle
    -@navbar-default-toggle-hover-bg:           #ddd;
    -@navbar-default-toggle-icon-bar-bg:        #888;
    -@navbar-default-toggle-border-color:       #ddd;
    -
    -
    -//=== Inverted navbar
    -// Reset inverted navbar basics
    -@navbar-inverse-color:                      lighten(@gray-light, 15%);
    -@navbar-inverse-bg:                         #222;
    -@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
    -
    -// Inverted navbar links
    -@navbar-inverse-link-color:                 lighten(@gray-light, 15%);
    -@navbar-inverse-link-hover-color:           #fff;
    -@navbar-inverse-link-hover-bg:              transparent;
    -@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
    -@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);
    -@navbar-inverse-link-disabled-color:        #444;
    -@navbar-inverse-link-disabled-bg:           transparent;
    -
    -// Inverted navbar brand label
    -@navbar-inverse-brand-color:                @navbar-inverse-link-color;
    -@navbar-inverse-brand-hover-color:          #fff;
    -@navbar-inverse-brand-hover-bg:             transparent;
    -
    -// Inverted navbar toggle
    -@navbar-inverse-toggle-hover-bg:            #333;
    -@navbar-inverse-toggle-icon-bar-bg:         #fff;
    -@navbar-inverse-toggle-border-color:        #333;
    -
    -
    -//== Navs
    -//
    -//##
    -
    -//=== Shared nav styles
    -@nav-link-padding:                          10px 15px;
    -@nav-link-hover-bg:                         @gray-lighter;
    -
    -@nav-disabled-link-color:                   @gray-light;
    -@nav-disabled-link-hover-color:             @gray-light;
    -
    -//== Tabs
    -@nav-tabs-border-color:                     #ddd;
    -
    -@nav-tabs-link-hover-border-color:          @gray-lighter;
    -
    -@nav-tabs-active-link-hover-bg:             #fff;;
    -@nav-tabs-active-link-hover-color:          @gray;
    -@nav-tabs-active-link-hover-border-color:   #ddd;
    -
    -@nav-tabs-justified-link-border-color:            #ddd;
    -@nav-tabs-justified-active-link-border-color:     @body-bg;
    -
    -//== Pills
    -@nav-pills-border-radius:                   @border-radius-base;
    -@nav-pills-active-link-hover-bg:            @component-active-bg;
    -@nav-pills-active-link-hover-color:         @component-active-color;
    -
    -
    -//== Pagination
    -//
    -//##
    -
    -@pagination-color:                     @link-color;
    -@pagination-bg:                        #fff;
    -@pagination-border:                    #ddd;
    -
    -@pagination-hover-color:               @link-hover-color;
    -@pagination-hover-bg:                  @gray-lighter;
    -@pagination-hover-border:              #ddd;
    -
    -@pagination-active-color:              #fff;
    -@pagination-active-bg:                 @brand-primary;
    -@pagination-active-border:             @brand-primary;
    -
    -@pagination-disabled-color:            @gray-light;
    -@pagination-disabled-bg:               #fff;
    -@pagination-disabled-border:           #ddd;
    -
    -
    -//== Pager
    -//
    -//##
    -
    -@pager-bg:                             @pagination-bg;
    -@pager-border:                         @pagination-border;
    -@pager-border-radius:                  15px;
    -
    -@pager-hover-bg:                       @pagination-hover-bg;
    -
    -@pager-active-bg:                      @pagination-active-bg;
    -@pager-active-color:                   @pagination-active-color;
    -
    -@pager-disabled-color:                 @pagination-disabled-color;
    -
    -
    -//== Jumbotron
    -//
    -//##
    -
    -@jumbotron-padding:              30px;
    -@jumbotron-color:                inherit;
    -@jumbotron-bg:                   @gray-lighter;
    -@jumbotron-heading-color:        inherit;
    -@jumbotron-font-size:            ceil((@font-size-base * 1.5));
    -@jumbotron-heading-font-size:    ceil((@font-size-base * 4.5));
    -
    -
    -//== Form states and alerts
    -//
    -//## Define colors for form feedback states and, by default, alerts.
    -
    -@state-success-text:             #3c763d;
    -@state-success-bg:               #dff0d8;
    -@state-success-border:           darken(spin(@state-success-bg, -10), 5%);
    -
    -@state-info-text:                #31708f;
    -@state-info-bg:                  #d9edf7;
    -@state-info-border:              darken(spin(@state-info-bg, -10), 7%);
    -
    -@state-warning-text:             #8a6d3b;
    -@state-warning-bg:               #fcf8e3;
    -@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);
    -
    -@state-danger-text:              #a94442;
    -@state-danger-bg:                #f2dede;
    -@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);
    -
    -
    -//== Tooltips
    -//
    -//##
    -
    -//** Tooltip max width
    -@tooltip-max-width:           200px;
    -//** Tooltip text color
    -@tooltip-color:               #fff;
    -//** Tooltip background color
    -@tooltip-bg:                  #000;
    -@tooltip-opacity:             .9;
    -
    -//** Tooltip arrow width
    -@tooltip-arrow-width:         5px;
    -//** Tooltip arrow color
    -@tooltip-arrow-color:         @tooltip-bg;
    -
    -
    -//== Popovers
    -//
    -//##
    -
    -//** Popover body background color
    -@popover-bg:                          #fff;
    -//** Popover maximum width
    -@popover-max-width:                   276px;
    -//** Popover border color
    -@popover-border-color:                rgba(0,0,0,.2);
    -//** Popover fallback border color
    -@popover-fallback-border-color:       #ccc;
    -
    -//** Popover title background color
    -@popover-title-bg:                    darken(@popover-bg, 3%);
    -
    -//** Popover arrow width
    -@popover-arrow-width:                 10px;
    -//** Popover arrow color
    -@popover-arrow-color:                 @popover-bg;
    -
    -//** Popover outer arrow width
    -@popover-arrow-outer-width:           (@popover-arrow-width + 1);
    -//** Popover outer arrow color
    -@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
    -//** Popover outer arrow fallback color
    -@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
    -
    -
    -//== Labels
    -//
    -//##
    -
    -//** Default label background color
    -@label-default-bg:            @gray-light;
    -//** Primary label background color
    -@label-primary-bg:            @brand-primary;
    -//** Success label background color
    -@label-success-bg:            @brand-success;
    -//** Info label background color
    -@label-info-bg:               @brand-info;
    -//** Warning label background color
    -@label-warning-bg:            @brand-warning;
    -//** Danger label background color
    -@label-danger-bg:             @brand-danger;
    -
    -//** Default label text color
    -@label-color:                 #fff;
    -//** Default text color of a linked label
    -@label-link-hover-color:      #fff;
    -
    -
    -//== Modals
    -//
    -//##
    -
    -//** Padding applied to the modal body
    -@modal-inner-padding:         15px;
    -
    -//** Padding applied to the modal title
    -@modal-title-padding:         15px;
    -//** Modal title line-height
    -@modal-title-line-height:     @line-height-base;
    -
    -//** Background color of modal content area
    -@modal-content-bg:                             #fff;
    -//** Modal content border color
    -@modal-content-border-color:                   rgba(0,0,0,.2);
    -//** Modal content border color **for IE8**
    -@modal-content-fallback-border-color:          #999;
    -
    -//** Modal backdrop background color
    -@modal-backdrop-bg:           #000;
    -//** Modal backdrop opacity
    -@modal-backdrop-opacity:      .5;
    -//** Modal header border color
    -@modal-header-border-color:   #e5e5e5;
    -//** Modal footer border color
    -@modal-footer-border-color:   @modal-header-border-color;
    -
    -@modal-lg:                    900px;
    -@modal-md:                    600px;
    -@modal-sm:                    300px;
    -
    -
    -//== Alerts
    -//
    -//## Define alert colors, border radius, and padding.
    -
    -@alert-padding:               15px;
    -@alert-border-radius:         @border-radius-base;
    -@alert-link-font-weight:      bold;
    -
    -@alert-success-bg:            @state-success-bg;
    -@alert-success-text:          @state-success-text;
    -@alert-success-border:        @state-success-border;
    -
    -@alert-info-bg:               @state-info-bg;
    -@alert-info-text:             @state-info-text;
    -@alert-info-border:           @state-info-border;
    -
    -@alert-warning-bg:            @state-warning-bg;
    -@alert-warning-text:          @state-warning-text;
    -@alert-warning-border:        @state-warning-border;
    -
    -@alert-danger-bg:             @state-danger-bg;
    -@alert-danger-text:           @state-danger-text;
    -@alert-danger-border:         @state-danger-border;
    -
    -
    -//== Progress bars
    -//
    -//##
    -
    -//** Background color of the whole progress component
    -@progress-bg:                 @gray-lightest;
    -//** Progress bar text color
    -@progress-bar-color:          #fff;
    -//** Variable for setting rounded corners on progress bar.
    -@progress-border-radius:      @border-radius-base;
    -
    -//** Default progress bar color
    -@progress-bar-bg:             @brand-primary;
    -//** Success progress bar color
    -@progress-bar-success-bg:     @brand-success;
    -//** Warning progress bar color
    -@progress-bar-warning-bg:     @brand-warning;
    -//** Danger progress bar color
    -@progress-bar-danger-bg:      @brand-danger;
    -//** Info progress bar color
    -@progress-bar-info-bg:        @brand-info;
    -
    -
    -//== List group
    -//
    -//##
    -
    -//** Background color on `.list-group-item`
    -@list-group-bg:                 #fff;
    -//** `.list-group-item` border color
    -@list-group-border:             #ddd;
    -//** List group border radius
    -@list-group-border-radius:      @border-radius-base;
    -
    -//** Background color of single list items on hover
    -@list-group-hover-bg:           @gray-lightest;
    -//** Text color of active list items
    -@list-group-active-color:       @component-active-color;
    -//** Background color of active list items
    -@list-group-active-bg:          @component-active-bg;
    -//** Border color of active list elements
    -@list-group-active-border:      @list-group-active-bg;
    -//** Text color for content within active list items
    -@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
    -
    -//** Text color of disabled list items
    -@list-group-disabled-color:      @gray-light;
    -//** Background color of disabled list items
    -@list-group-disabled-bg:         @gray-lighter;
    -//** Text color for content within disabled list items
    -@list-group-disabled-text-color: @list-group-disabled-color;
    -
    -@list-group-link-color:         #555;
    -@list-group-link-hover-color:   @list-group-link-color;
    -@list-group-link-heading-color: #333;
    -
    -
    -//== Panels
    -//
    -//##
    -
    -@panel-bg:                    #fff;
    -@panel-body-padding:          15px;
    -@panel-heading-padding:       10px 15px;
    -@panel-footer-padding:        @panel-heading-padding;
    -@panel-border-radius:         @border-radius-base;
    -
    -//** Border color for elements within panels
    -@panel-inner-border:          #ddd;
    -@panel-footer-bg:             @gray-lightest;
    -
    -@panel-default-text:          @gray-dark;
    -@panel-default-border:        #ddd;
    -@panel-default-heading-bg:    @gray-lightest;
    -
    -@panel-primary-text:          #fff;
    -@panel-primary-border:        @brand-primary;
    -@panel-primary-heading-bg:    @brand-primary;
    -
    -@panel-success-text:          @state-success-text;
    -@panel-success-border:        @state-success-border;
    -@panel-success-heading-bg:    @state-success-bg;
    -
    -@panel-info-text:             @state-info-text;
    -@panel-info-border:           @state-info-border;
    -@panel-info-heading-bg:       @state-info-bg;
    -
    -@panel-warning-text:          @state-warning-text;
    -@panel-warning-border:        @state-warning-border;
    -@panel-warning-heading-bg:    @state-warning-bg;
    -
    -@panel-danger-text:           @state-danger-text;
    -@panel-danger-border:         @state-danger-border;
    -@panel-danger-heading-bg:     @state-danger-bg;
    -
    -
    -//== Thumbnails
    -//
    -//##
    -
    -//** Padding around the thumbnail image
    -@thumbnail-padding:           4px;
    -//** Thumbnail background color
    -@thumbnail-bg:                @body-bg;
    -//** Thumbnail border color
    -@thumbnail-border:            #ddd;
    -//** Thumbnail border radius
    -@thumbnail-border-radius:     @border-radius-base;
    -
    -//** Custom text color for thumbnail captions
    -@thumbnail-caption-color:     @text-color;
    -//** Padding around the thumbnail caption
    -@thumbnail-caption-padding:   9px;
    -
    -
    -//== Wells
    -//
    -//##
    -
    -@well-bg:                     @gray-lightest;
    -@well-border:                 darken(@well-bg, 7%);
    -
    -
    -//== Badges
    -//
    -//##
    -
    -@badge-color:                 #fff;
    -//** Linked badge text color on hover
    -@badge-link-hover-color:      #fff;
    -@badge-bg:                    @gray-light;
    -
    -//** Badge text color in active nav link
    -@badge-active-color:          @link-color;
    -//** Badge background color in active nav link
    -@badge-active-bg:             #fff;
    -
    -@badge-font-weight:           bold;
    -@badge-line-height:           1;
    -@badge-border-radius:         10px;
    -
    -
    -//== Breadcrumbs
    -//
    -//##
    -
    -@breadcrumb-padding-vertical:   8px;
    -@breadcrumb-padding-horizontal: 15px;
    -//** Breadcrumb background color
    -@breadcrumb-bg:                 @gray-lightest;
    -//** Breadcrumb text color
    -@breadcrumb-color:              #ccc;
    -//** Text color of current page in the breadcrumb
    -@breadcrumb-active-color:       @gray-light;
    -//** Textual separator for between breadcrumb elements
    -@breadcrumb-separator:          "/";
    -
    -
    -//== Close
    -//
    -//##
    -
    -@close-font-weight:           bold;
    -@close-color:                 #000;
    -@close-text-shadow:           0 1px 0 #fff;
    -
    -
    -//== Code
    -//
    -//##
    -
    -@code-color:                  #c7254e;
    -@code-bg:                     #f9f2f4;
    -
    -@kbd-color:                   #fff;
    -@kbd-bg:                      #333;
    -
    -@pre-bg:                      @gray-lightest;
    -@pre-color:                   @gray-dark;
    -@pre-border-color:            #ccc;
    -@pre-scrollable-max-height:   340px;
    -
    -
    -//== Type
    -//
    -//##
    -
    -//** Horizontal offset for forms and lists.
    -@component-offset-horizontal: 180px;
    -//** Text muted color
    -@text-muted:                  @gray-light;
    -//** Abbreviations and acronyms border color
    -@abbr-border-color:           @gray-light;
    -//** Headings small color
    -@headings-small-color:        @gray-light;
    -//** Blockquote small color
    -@blockquote-small-color:      @gray-light;
    -//** Blockquote font size
    -@blockquote-font-size:        (@font-size-base * 1.25);
    -//** Blockquote border color
    -@blockquote-border-color:     @gray-lighter;
    -//** Page header border color
    -@page-header-border-color:    @gray-lighter;
    -//** Width of horizontal description list titles
    -@dl-horizontal-offset:        @component-offset-horizontal;
    -//** Point at which .dl-horizontal becomes horizontal
    -@dl-horizontal-breakpoint:    @grid-float-breakpoint;
    -//** Horizontal line color.
    -@hr-border:                   @gray-lighter;
    diff --git a/src/legacy/ui/public/styles/bootstrap_dark.less b/src/legacy/ui/public/styles/bootstrap_dark.less
    deleted file mode 100644
    index a0079df56a4e2..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap_dark.less
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -//
    -// COMPILER FOR BOOTSTRAP
    -
    -@import "~ui/styles/bootstrap/bootstrap_dark";
    diff --git a/src/legacy/ui/public/styles/bootstrap_light.less b/src/legacy/ui/public/styles/bootstrap_light.less
    deleted file mode 100644
    index 101be5f3c898f..0000000000000
    --- a/src/legacy/ui/public/styles/bootstrap_light.less
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -//
    -// COMPILER FOR BOOTSTRAP
    -
    -@import "~ui/styles/bootstrap/bootstrap_light";
    -
    diff --git a/src/legacy/ui/ui_bundles/__tests__/app_entry_template.js b/src/legacy/ui/ui_bundles/__tests__/app_entry_template.js
    deleted file mode 100644
    index 8a9b74df92e76..0000000000000
    --- a/src/legacy/ui/ui_bundles/__tests__/app_entry_template.js
    +++ /dev/null
    @@ -1,45 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import sinon from 'sinon';
    -import expect from '@kbn/expect';
    -
    -import { appEntryTemplate } from '../app_entry_template';
    -
    -function createMockBundle() {
    -  return {
    -    getContext: sinon.stub().returns(''),
    -    getRequires: sinon.stub().returns([]),
    -  };
    -}
    -
    -describe('ui bundles / appEntryTemplate', () => {
    -  it('embeds bundle.getContext() result', () => {
    -    const bundle = createMockBundle();
    -    bundle.getContext.returns('foo bar baz');
    -    expect(appEntryTemplate(bundle)).to.contain('foo bar baz');
    -  });
    -
    -  it('joins requires into list', () => {
    -    const bundle = createMockBundle();
    -    const requires = ['foo', 'bar', 'baz'];
    -    bundle.getRequires.returns(requires);
    -    expect(appEntryTemplate(bundle)).to.contain(requires.join('\n  '));
    -  });
    -});
    diff --git a/src/legacy/ui/ui_bundles/__tests__/ui_bundle.js b/src/legacy/ui/ui_bundles/__tests__/ui_bundle.js
    deleted file mode 100644
    index 96ae6c448256e..0000000000000
    --- a/src/legacy/ui/ui_bundles/__tests__/ui_bundle.js
    +++ /dev/null
    @@ -1,50 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import expect from '@kbn/expect';
    -
    -import { UiBundle } from '../ui_bundle';
    -
    -describe('ui bundles / UiBundle', () => {
    -  describe('#getRequires', () => {
    -    it('returns modules option as a list of require calls', () => {
    -      const bundle = new UiBundle({
    -        modules: ['a', 'b', 'c'],
    -      });
    -
    -      expect(bundle.getRequires()).to.eql([`require('a');`, `require('b');`, `require('c');`]);
    -    });
    -
    -    it('does not sort modules', () => {
    -      const bundle = new UiBundle({
    -        modules: ['c', 'a', 'b'],
    -      });
    -
    -      expect(bundle.getRequires()).to.eql([`require('c');`, `require('a');`, `require('b');`]);
    -    });
    -
    -    it('converts \\ to /', () => {
    -      const bundle = new UiBundle({
    -        modules: ['a\\b\\c', 'd/e/f'],
    -      });
    -
    -      expect(bundle.getRequires()).to.eql([`require('a/b/c');`, `require('d/e/f');`]);
    -    });
    -  });
    -});
    diff --git a/src/legacy/ui/ui_bundles/app_entry_template.js b/src/legacy/ui/ui_bundles/app_entry_template.js
    deleted file mode 100644
    index a48de9a8cf7ee..0000000000000
    --- a/src/legacy/ui/ui_bundles/app_entry_template.js
    +++ /dev/null
    @@ -1,66 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { apmImport, apmInit } from '../apm';
    -
    -export const appEntryTemplate = (bundle) => `
    -/**
    - * Kibana entry file
    - *
    - * This is programmatically created and updated, do not modify
    - *
    - * Any changes to this file should be kept in sync with
    - * src/core/public/entry_point.ts
    - *
    - * context: ${bundle.getContext()}
    - */
    -
    -${apmImport()}
    -import { i18n } from '@kbn/i18n';
    -import { CoreSystem } from '__kibanaCore__'
    -
    -const injectedMetadata = JSON.parse(document.querySelector('kbn-injected-metadata').getAttribute('data'));
    -
    -${apmInit('injectedMetadata.vars.apmConfig')}
    -
    -i18n.load(injectedMetadata.i18n.translationsUrl)
    -  .catch(e => e)
    -  .then((i18nError) => {
    -    const coreSystem = new CoreSystem({
    -      injectedMetadata,
    -      rootDomElement: document.body,
    -      browserSupportsCsp: !window.__kbnCspNotEnforced__,
    -      requireLegacyFiles: () => {
    -        ${bundle.getRequires().join('\n  ')}
    -      },
    -      requireLegacyBootstrapModule: () => require('ui/chrome'),
    -      requireNewPlatformShimModule: () => require('ui/new_platform'),
    -    });
    -
    -    coreSystem
    -      .setup()
    -      .then((coreSetup) => {
    -        if (i18nError) {
    -          coreSetup.fatalErrors.add(i18nError);
    -        }
    -
    -        return coreSystem.start();
    -      });
    -  });
    -`;
    diff --git a/src/legacy/ui/ui_bundles/ui_bundle.js b/src/legacy/ui/ui_bundles/ui_bundle.js
    deleted file mode 100644
    index 4e853ad410efe..0000000000000
    --- a/src/legacy/ui/ui_bundles/ui_bundle.js
    +++ /dev/null
    @@ -1,125 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { fromNode as fcb } from 'bluebird';
    -import { readFile, writeFile, stat } from 'fs';
    -
    -// We normalize all path separators to `/` in generated files
    -function normalizePath(path) {
    -  return path.replace(/[\\\/]+/g, '/');
    -}
    -
    -export class UiBundle {
    -  constructor(options) {
    -    const { id, modules, template, controller, extendConfig } = options;
    -
    -    this._id = id;
    -    this._modules = modules;
    -    this._template = template;
    -    this._controller = controller;
    -    this._extendConfig = extendConfig;
    -  }
    -
    -  getId() {
    -    return this._id;
    -  }
    -
    -  getContext() {
    -    return this._controller.getContext();
    -  }
    -
    -  getEntryPath() {
    -    return this._controller.resolvePath(`${this.getId()}.entry.js`);
    -  }
    -
    -  getStylePath() {
    -    return this._controller.resolvePath(`${this.getId()}.style.css`);
    -  }
    -
    -  getOutputPath() {
    -    return this._controller.resolvePath(`${this.getId()}.bundle.js`);
    -  }
    -
    -  getRequires() {
    -    return this._modules.map((module) => `require('${normalizePath(module)}');`);
    -  }
    -
    -  renderContent() {
    -    return this._template(this);
    -  }
    -
    -  async readEntryFile() {
    -    try {
    -      const content = await fcb((cb) => readFile(this.getEntryPath(), cb));
    -      return content.toString('utf8');
    -    } catch (e) {
    -      return null;
    -    }
    -  }
    -
    -  async writeEntryFile() {
    -    return await fcb((cb) => writeFile(this.getEntryPath(), this.renderContent(), 'utf8', cb));
    -  }
    -
    -  async touchStyleFile() {
    -    return await fcb((cb) => writeFile(this.getStylePath(), '', 'utf8', cb));
    -  }
    -
    -  /**
    -   * Determine if the cache for this bundle is valid by
    -   * checking that the entry file exists, has the content we
    -   * expect based on the argument for this bundle, and that both
    -   * the style file and output for this bundle exist. In this
    -   * scenario we assume the cache is valid.
    -   *
    -   * When the `optimize.useBundleCache` config is set to `false`
    -   * (the default when running in development) we don't even call
    -   * this method and bundles are always recreated.
    -   */
    -  async isCacheValid() {
    -    if ((await this.readEntryFile()) !== this.renderContent()) {
    -      return false;
    -    }
    -
    -    try {
    -      await fcb((cb) => stat(this.getOutputPath(), cb));
    -      await fcb((cb) => stat(this.getStylePath(), cb));
    -      return true;
    -    } catch (e) {
    -      return false;
    -    }
    -  }
    -
    -  toJSON() {
    -    return {
    -      id: this._id,
    -      modules: this._modules,
    -      entryPath: this.getEntryPath(),
    -      outputPath: this.getOutputPath(),
    -    };
    -  }
    -
    -  getExtendedConfig(webpackConfig) {
    -    if (!this._extendConfig) {
    -      return webpackConfig;
    -    }
    -
    -    return this._extendConfig(webpackConfig);
    -  }
    -}
    diff --git a/src/legacy/ui/ui_bundles/ui_bundles_controller.js b/src/legacy/ui/ui_bundles/ui_bundles_controller.js
    deleted file mode 100644
    index dadb28cbb2f3a..0000000000000
    --- a/src/legacy/ui/ui_bundles/ui_bundles_controller.js
    +++ /dev/null
    @@ -1,255 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { resolve, relative, isAbsolute } from 'path';
    -import { createHash } from 'crypto';
    -import { promisify } from 'util';
    -import { existsSync, mkdir } from 'fs';
    -
    -import del from 'del';
    -import { makeRe } from 'minimatch';
    -import jsonStableStringify from 'json-stable-stringify';
    -
    -import { IS_KIBANA_DISTRIBUTABLE } from '../../utils';
    -// eslint-disable-next-line @kbn/eslint/no-restricted-paths
    -import { fromRoot } from '../../../core/server/utils';
    -import { UiBundle } from './ui_bundle';
    -import { appEntryTemplate } from './app_entry_template';
    -
    -const mkdirAsync = promisify(mkdir);
    -const REPO_ROOT = fromRoot();
    -
    -function getWebpackAliases(pluginSpecs) {
    -  return pluginSpecs.reduce((aliases, spec) => {
    -    const publicDir = spec.getPublicDir();
    -
    -    if (!publicDir) {
    -      return aliases;
    -    }
    -
    -    return {
    -      ...aliases,
    -      [`plugins/${spec.getId()}`]: publicDir,
    -    };
    -  }, {});
    -}
    -
    -// Recursively clone appExtensions, sorting array and normalizing absolute paths
    -function stableCloneAppExtensions(appExtensions) {
    -  return Object.fromEntries(
    -    Object.entries(appExtensions).map(([extensionType, moduleIds]) => [
    -      extensionType,
    -      moduleIds
    -        .map((moduleId) => {
    -          if (isAbsolute(moduleId)) {
    -            moduleId = `absolute:${relative(REPO_ROOT, moduleId)}`;
    -          }
    -          return moduleId.replace(/\\/g, '/');
    -        })
    -        .sort((a, b) => a.localeCompare(b)),
    -    ])
    -  );
    -}
    -
    -export class UiBundlesController {
    -  constructor(kbnServer) {
    -    const { config, uiApps, uiExports, pluginSpecs } = kbnServer;
    -
    -    this._workingDir = config.get('optimize.bundleDir');
    -    this._env = config.get('env.name');
    -    this._validateSyntaxOfNodeModules = config.get('optimize.validateSyntaxOfNodeModules');
    -    this._context = {
    -      env: config.get('env.name'),
    -      sourceMaps: config.get('optimize.sourceMaps'),
    -      kbnVersion: config.get('pkg.version'),
    -      buildNum: config.get('pkg.buildNum'),
    -      appExtensions: stableCloneAppExtensions(uiExports.appExtensions),
    -    };
    -
    -    this._filter = makeRe(config.get('optimize.bundleFilter') || '*', {
    -      noglobstar: true,
    -      noext: true,
    -      matchBase: true,
    -    });
    -
    -    this._appExtensions = uiExports.appExtensions || {};
    -
    -    this._webpackAliases = {
    -      ...getWebpackAliases(pluginSpecs),
    -      ...uiExports.webpackAliases,
    -    };
    -    this._webpackPluginProviders = uiExports.webpackPluginProviders;
    -    this._webpackNoParseRules = uiExports.webpackNoParseRules;
    -    this._postLoaders = [];
    -    this._bundles = [];
    -
    -    // create a bundle for each uiApp
    -    for (const uiApp of uiApps) {
    -      this.add({
    -        id: uiApp.getId(),
    -        modules: [uiApp.getMainModuleId()],
    -        template: appEntryTemplate,
    -      });
    -    }
    -  }
    -
    -  add(bundleSpec) {
    -    const { id, modules, template, extendConfig } = bundleSpec;
    -
    -    if (this._filter.test(id)) {
    -      this._bundles.push(
    -        new UiBundle({
    -          id,
    -          modules,
    -          template,
    -          controller: this,
    -          extendConfig,
    -        })
    -      );
    -    }
    -  }
    -
    -  isDevMode() {
    -    return this._env === 'development';
    -  }
    -
    -  shouldValidateSyntaxOfNodeModules() {
    -    return !!this._validateSyntaxOfNodeModules;
    -  }
    -
    -  getWebpackPluginProviders() {
    -    return this._webpackPluginProviders || [];
    -  }
    -
    -  getWebpackNoParseRules() {
    -    return this._webpackNoParseRules;
    -  }
    -
    -  getWorkingDir() {
    -    return this._workingDir;
    -  }
    -
    -  addPostLoader(loaderSpec) {
    -    this._postLoaders.push(loaderSpec);
    -  }
    -
    -  getPostLoaders() {
    -    return this._postLoaders;
    -  }
    -
    -  getAliases() {
    -    return this._webpackAliases;
    -  }
    -
    -  getAppExtensions() {
    -    return this._appExtensions;
    -  }
    -
    -  getContext() {
    -    return jsonStableStringify(this._context, {
    -      space: '  ',
    -    });
    -  }
    -
    -  resolvePath(...args) {
    -    return resolve(this._workingDir, ...args);
    -  }
    -
    -  async resetBundleDir() {
    -    if (!existsSync(this._workingDir)) {
    -      // create a fresh working directory
    -      await mkdirAsync(this._workingDir, { recursive: true });
    -    } else {
    -      // delete all children of the working directory
    -      await del(this.resolvePath('*'), {
    -        // since we know that `this.resolvePath()` is going to return an absolute path based on the `optimize.bundleDir`
    -        // and since we don't want to require that users specify a bundleDir that is within the cwd or limit the cwd
    -        // directory used to run Kibana in any way we use force here
    -        force: true,
    -      });
    -    }
    -
    -    // write the entry/style files for each bundle
    -    for (const bundle of this._bundles) {
    -      await bundle.writeEntryFile();
    -      await bundle.touchStyleFile();
    -    }
    -  }
    -
    -  getCacheDirectory(...subPath) {
    -    return this.resolvePath(
    -      '../../built_assets/.cache/ui_bundles',
    -      !IS_KIBANA_DISTRIBUTABLE ? this.hashBundleEntries() : '',
    -      ...subPath
    -    );
    -  }
    -
    -  getDescription() {
    -    const ids = this.getIds();
    -    switch (ids.length) {
    -      case 0:
    -        return '0 bundles';
    -      case 1:
    -        return `bundle for ${ids[0]}`;
    -      default:
    -        const last = ids.pop();
    -        const commas = ids.join(', ');
    -        return `bundles for ${commas} and ${last}`;
    -    }
    -  }
    -
    -  hashBundleEntries() {
    -    const hash = createHash('sha1');
    -
    -    for (const bundle of this._bundles) {
    -      hash.update(`bundleEntryPath:${bundle.getEntryPath()}`);
    -      hash.update(`bundleEntryContent:${bundle.renderContent()}`);
    -    }
    -
    -    return hash.digest('hex');
    -  }
    -
    -  async areAllBundleCachesValid() {
    -    for (const bundle of this._bundles) {
    -      if (!(await bundle.isCacheValid())) {
    -        return false;
    -      }
    -    }
    -
    -    return true;
    -  }
    -
    -  toWebpackEntries() {
    -    return this._bundles.reduce(
    -      (entries, bundle) => ({
    -        ...entries,
    -        [bundle.getId()]: bundle.getEntryPath(),
    -      }),
    -      {}
    -    );
    -  }
    -
    -  getIds() {
    -    return this._bundles.map((bundle) => bundle.getId());
    -  }
    -
    -  getExtendedConfig(webpackConfig) {
    -    return this._bundles.reduce((acc, bundle) => bundle.getExtendedConfig(acc), webpackConfig);
    -  }
    -}
    diff --git a/src/legacy/ui/ui_bundles/ui_bundles_mixin.js b/src/legacy/ui/ui_bundles/ui_bundles_mixin.js
    deleted file mode 100644
    index 6127cb9ecd143..0000000000000
    --- a/src/legacy/ui/ui_bundles/ui_bundles_mixin.js
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { UiBundlesController } from './ui_bundles_controller';
    -
    -export async function uiBundlesMixin(kbnServer) {
    -  kbnServer.uiBundles = new UiBundlesController(kbnServer);
    -
    -  const { uiBundleProviders = [] } = kbnServer.uiExports;
    -  for (const spec of uiBundleProviders) {
    -    await spec(kbnServer);
    -  }
    -}
    diff --git a/src/legacy/ui/ui_exports/__tests__/collect_ui_exports.js b/src/legacy/ui/ui_exports/__tests__/collect_ui_exports.js
    index 3686a2dad8f24..5b2af9f82333c 100644
    --- a/src/legacy/ui/ui_exports/__tests__/collect_ui_exports.js
    +++ b/src/legacy/ui/ui_exports/__tests__/collect_ui_exports.js
    @@ -34,7 +34,6 @@ const specs = new PluginPack({
           new Plugin({
             id: 'test',
             uiExports: {
    -          visTypes: ['plugin/test/visType1', 'plugin/test/visType2', 'plugin/test/visType3'],
               savedObjectSchemas: {
                 foo: {
                   isNamespaceAgnostic: true,
    @@ -45,7 +44,6 @@ const specs = new PluginPack({
           new Plugin({
             id: 'test2',
             uiExports: {
    -          visTypes: ['plugin/test2/visType1', 'plugin/test2/visType2', 'plugin/test2/visType3'],
               savedObjectSchemas: {
                 bar: {
                   isNamespaceAgnostic: true,
    @@ -61,16 +59,6 @@ describe('plugin discovery', () => {
       describe('collectUiExports()', () => {
         it('merges uiExports from all provided plugin specs', () => {
           const uiExports = collectUiExports(specs);
    -      const exported = uiExports.appExtensions.visTypes.sort((a, b) => a.localeCompare(b));
    -
    -      expect(exported).to.eql([
    -        'plugin/test/visType1',
    -        'plugin/test/visType2',
    -        'plugin/test/visType3',
    -        'plugin/test2/visType1',
    -        'plugin/test2/visType2',
    -        'plugin/test2/visType3',
    -      ]);
     
           expect(uiExports.savedObjectSchemas).to.eql({
             foo: {
    diff --git a/src/legacy/ui/ui_exports/ui_export_defaults.js b/src/legacy/ui/ui_exports/ui_export_defaults.js
    index 348f4ee77fab4..227954155ce88 100644
    --- a/src/legacy/ui/ui_exports/ui_export_defaults.js
    +++ b/src/legacy/ui/ui_exports/ui_export_defaults.js
    @@ -17,30 +17,4 @@
      * under the License.
      */
     
    -import { dirname, resolve } from 'path';
    -const ROOT = dirname(require.resolve('../../../../package.json'));
    -
    -export const UI_EXPORT_DEFAULTS = {
    -  webpackNoParseRules: [
    -    /node_modules[\/\\](angular|elasticsearch-browser)[\/\\]/,
    -    /node_modules[\/\\](mocha|moment)[\/\\]/,
    -    /node_modules[\/\\]vega[\/\\]build[\/\\]vega\.js$/,
    -  ],
    -
    -  webpackAliases: {
    -    ui: resolve(ROOT, 'src/legacy/ui/public'),
    -    __kibanaCore__$: resolve(ROOT, 'src/core/public'),
    -  },
    -
    -  styleSheetPaths: ['light', 'dark'].map((theme) => ({
    -    theme,
    -    localPath: resolve(ROOT, 'src/core/public/index.scss'),
    -    publicPath: `core.${theme}.css`,
    -    urlImports: {
    -      urlBase: 'built_assets/css/',
    -      publicDir: resolve(ROOT, 'src/core/public'),
    -    },
    -  })),
    -
    -  appExtensions: {},
    -};
    +export const UI_EXPORT_DEFAULTS = {};
    diff --git a/src/legacy/ui/ui_exports/ui_export_types/index.js b/src/legacy/ui/ui_exports/ui_export_types/index.js
    index 03b8301fcfab2..9ff6a53f4afb9 100644
    --- a/src/legacy/ui/ui_exports/ui_export_types/index.js
    +++ b/src/legacy/ui/ui_exports/ui_export_types/index.js
    @@ -29,46 +29,8 @@ export {
     
     export { taskDefinitions } from './task_definitions';
     
    -export { app, apps } from './ui_apps';
    -
    -export {
    -  visTypes,
    -  visEditorTypes,
    -  interpreter,
    -  savedObjectTypes,
    -  embeddableActions,
    -  embeddableFactories,
    -  fieldFormats,
    -  fieldFormatEditors,
    -  inspectorViews,
    -  chromeNavControls,
    -  navbarExtensions,
    -  contextMenuActions,
    -  managementSections,
    -  indexManagement,
    -  devTools,
    -  docViews,
    -  hacks,
    -  home,
    -  canvas,
    -  visTypeEnhancers,
    -  aliases,
    -  visualize,
    -  search,
    -  shareContextMenuExtensions,
    -} from './ui_app_extensions';
    -
     export { link, links } from './ui_nav_links';
     
    -export { styleSheetPaths } from './style_sheet_paths';
    -
     export { uiSettingDefaults } from './ui_settings';
     
     export { unknown } from './unknown';
    -
    -export {
    -  noParse,
    -  __globalImportAliases__,
    -  __bundleProvider__,
    -  __webpackPluginProvider__,
    -} from './webpack_customizations';
    diff --git a/src/legacy/ui/ui_exports/ui_export_types/style_sheet_paths.js b/src/legacy/ui/ui_exports/ui_export_types/style_sheet_paths.js
    deleted file mode 100644
    index 405a1310d29c5..0000000000000
    --- a/src/legacy/ui/ui_exports/ui_export_types/style_sheet_paths.js
    +++ /dev/null
    @@ -1,97 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import path from 'path';
    -import { existsSync } from 'fs';
    -import { flatConcatAtType } from './reduce';
    -import { mapSpec, wrap } from './modify_reduce';
    -
    -const OK_EXTNAMES = ['.css', '.scss'];
    -
    -function getUrlBase(pluginSpec) {
    -  return `plugins/${pluginSpec.getId()}`;
    -}
    -
    -function getPublicPath(pluginSpec, localPath) {
    -  // get the path of the stylesheet relative to the public dir for the plugin
    -  let relativePath = path.relative(pluginSpec.getPublicDir(), localPath);
    -
    -  // replace back slashes on windows
    -  relativePath = relativePath.split('\\').join('/');
    -
    -  return `${getUrlBase(pluginSpec)}/${relativePath}`;
    -}
    -
    -function getStyleSheetPath(pluginSpec, localPath, theme) {
    -  const extname = path.extname(localPath);
    -  const localCssPath = localPath.slice(0, -extname.length) + `.${theme}.css`;
    -
    -  return {
    -    theme,
    -    localPath: existsSync(localCssPath) ? localCssPath : localPath,
    -    publicPath: getPublicPath(pluginSpec, localCssPath),
    -    urlImports: {
    -      urlBase: `built_assets/css/${getUrlBase(pluginSpec)}`,
    -      publicDir: pluginSpec.getPublicDir(),
    -    },
    -  };
    -}
    -
    -function normalize(localPath, type, pluginSpec) {
    -  const pluginId = pluginSpec.getId();
    -  const publicDir = path.normalize(pluginSpec.getPublicDir());
    -  const extname = path.extname(localPath);
    -
    -  if (!OK_EXTNAMES.includes(extname)) {
    -    throw new Error(
    -      `[plugin:${pluginId}] uiExports.styleSheetPaths supported extensions [${OK_EXTNAMES.join(
    -        ', '
    -      )}], got "${extname}"`
    -    );
    -  }
    -
    -  if (!path.isAbsolute(localPath)) {
    -    throw new Error(
    -      `[plugin:${pluginId}] uiExports.styleSheetPaths must be an absolute path, got "${localPath}"`
    -    );
    -  }
    -
    -  if (!path.normalize(localPath).startsWith(publicDir)) {
    -    throw new Error(
    -      `[plugin:${pluginId}] uiExports.styleSheetPaths must be child of publicDir [${publicDir}]`
    -    );
    -  }
    -
    -  if (extname === '.css') {
    -    // when the localPath points to a css file, assume it will be included in every theme
    -    // and don't create ligkt/dark variations of it
    -    return {
    -      theme: '*',
    -      localPath: localPath,
    -      publicPath: getPublicPath(pluginSpec, localPath),
    -    };
    -  }
    -
    -  return [
    -    getStyleSheetPath(pluginSpec, localPath, 'light'),
    -    getStyleSheetPath(pluginSpec, localPath, 'dark'),
    -  ];
    -}
    -
    -export const styleSheetPaths = wrap(mapSpec(normalize), flatConcatAtType);
    diff --git a/src/legacy/ui/ui_exports/ui_export_types/style_sheet_paths.test.js b/src/legacy/ui/ui_exports/ui_export_types/style_sheet_paths.test.js
    deleted file mode 100644
    index 6a1fa7bdf3633..0000000000000
    --- a/src/legacy/ui/ui_exports/ui_export_types/style_sheet_paths.test.js
    +++ /dev/null
    @@ -1,139 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { resolve } from 'path';
    -import { tmpdir } from 'os';
    -import { styleSheetPaths } from './style_sheet_paths';
    -
    -const dir = tmpdir();
    -const pluginSpec = {
    -  getId: jest.fn(() => 'test'),
    -  getPublicDir: jest.fn(() => resolve(dir, 'kibana/public')),
    -};
    -
    -expect.addSnapshotSerializer({
    -  test: (value) => typeof value === 'string' && value.startsWith(dir),
    -  print: (value) => value.replace(dir, '').replace(/\\/g, '/'),
    -});
    -
    -describe('uiExports.styleSheetPaths', () => {
    -  it('does not support relative paths', () => {
    -    expect(() => styleSheetPaths([], 'public/bar.css', 'styleSheetPaths', pluginSpec)).toThrowError(
    -      /\[plugin:test\] uiExports.styleSheetPaths must be an absolute path/
    -    );
    -  });
    -
    -  it('path must be child of public path', () => {
    -    expect(() =>
    -      styleSheetPaths([], '/another/public/bar.css', 'styleSheetPaths', pluginSpec)
    -    ).toThrowError(/\[plugin:test\] uiExports.styleSheetPaths must be child of publicDir/);
    -  });
    -
    -  it('only supports css or scss extensions', () => {
    -    expect(() =>
    -      styleSheetPaths([], '/kibana/public/bar.bad', 'styleSheetPaths', pluginSpec)
    -    ).toThrowError(
    -      '[plugin:test] uiExports.styleSheetPaths supported extensions [.css, .scss], got ".bad"'
    -    );
    -  });
    -
    -  it('provides publicPath for scss extensions', () => {
    -    const localPath = resolve(dir, 'kibana/public/bar.scss');
    -    const uiExports = styleSheetPaths([], localPath, 'styleSheetPaths', pluginSpec);
    -
    -    expect(uiExports.styleSheetPaths).toMatchInlineSnapshot(`
    -Array [
    -  Object {
    -    "localPath": /kibana/public/bar.scss,
    -    "publicPath": "plugins/test/bar.light.css",
    -    "theme": "light",
    -    "urlImports": Object {
    -      "publicDir": /kibana/public,
    -      "urlBase": "built_assets/css/plugins/test",
    -    },
    -  },
    -  Object {
    -    "localPath": /kibana/public/bar.scss,
    -    "publicPath": "plugins/test/bar.dark.css",
    -    "theme": "dark",
    -    "urlImports": Object {
    -      "publicDir": /kibana/public,
    -      "urlBase": "built_assets/css/plugins/test",
    -    },
    -  },
    -]
    -`);
    -  });
    -
    -  it('provides publicPath for css extensions', () => {
    -    const localPath = resolve(dir, 'kibana/public/bar.scss');
    -    const uiExports = styleSheetPaths([], localPath, 'styleSheetPaths', pluginSpec);
    -
    -    expect(uiExports.styleSheetPaths).toMatchInlineSnapshot(`
    -Array [
    -  Object {
    -    "localPath": /kibana/public/bar.scss,
    -    "publicPath": "plugins/test/bar.light.css",
    -    "theme": "light",
    -    "urlImports": Object {
    -      "publicDir": /kibana/public,
    -      "urlBase": "built_assets/css/plugins/test",
    -    },
    -  },
    -  Object {
    -    "localPath": /kibana/public/bar.scss,
    -    "publicPath": "plugins/test/bar.dark.css",
    -    "theme": "dark",
    -    "urlImports": Object {
    -      "publicDir": /kibana/public,
    -      "urlBase": "built_assets/css/plugins/test",
    -    },
    -  },
    -]
    -`);
    -  });
    -
    -  it('should normalize mixed slashes', () => {
    -    const localPath = resolve(dir, 'kibana/public\\bar.scss');
    -    const uiExports = styleSheetPaths([], localPath, 'styleSheetPaths', pluginSpec);
    -
    -    expect(uiExports.styleSheetPaths).toMatchInlineSnapshot(`
    -Array [
    -  Object {
    -    "localPath": /kibana/public/bar.scss,
    -    "publicPath": "plugins/test/../public/bar.light.css",
    -    "theme": "light",
    -    "urlImports": Object {
    -      "publicDir": /kibana/public,
    -      "urlBase": "built_assets/css/plugins/test",
    -    },
    -  },
    -  Object {
    -    "localPath": /kibana/public/bar.scss,
    -    "publicPath": "plugins/test/../public/bar.dark.css",
    -    "theme": "dark",
    -    "urlImports": Object {
    -      "publicDir": /kibana/public,
    -      "urlBase": "built_assets/css/plugins/test",
    -    },
    -  },
    -]
    -`);
    -  });
    -});
    diff --git a/src/legacy/ui/ui_exports/ui_export_types/ui_app_extensions.js b/src/legacy/ui/ui_exports/ui_export_types/ui_app_extensions.js
    deleted file mode 100644
    index fe5695d5b3410..0000000000000
    --- a/src/legacy/ui/ui_exports/ui_export_types/ui_app_extensions.js
    +++ /dev/null
    @@ -1,66 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { flatConcatValuesAtType } from './reduce';
    -import { mapSpec, alias, wrap } from './modify_reduce';
    -
    -/**
    - *  Reducer "preset" that merges named "first-class" appExtensions by
    - *  converting them into objects and then concatenating the values of those objects
    - *  @type {Function}
    - */
    -const appExtension = wrap(
    -  mapSpec((spec, type) => ({ [type]: spec })),
    -  alias('appExtensions'),
    -  flatConcatValuesAtType
    -);
    -
    -// plain extension groups produce lists of modules that will be required by the entry
    -// files to include extensions of specific types into specific apps
    -export const visTypes = appExtension;
    -
    -export const visEditorTypes = appExtension;
    -export const savedObjectTypes = appExtension;
    -export const embeddableActions = appExtension;
    -export const embeddableFactories = appExtension;
    -export const contextMenuActions = appExtension;
    -export const fieldFormats = appExtension;
    -export const fieldFormatEditors = appExtension;
    -export const chromeNavControls = appExtension;
    -export const navbarExtensions = appExtension;
    -export const managementSections = appExtension;
    -export const indexManagement = appExtension;
    -export const devTools = appExtension;
    -export const docViews = appExtension;
    -export const hacks = appExtension;
    -export const home = appExtension;
    -export const canvas = appExtension;
    -export const inspectorViews = appExtension;
    -export const search = appExtension;
    -export const shareContextMenuExtensions = appExtension;
    -// Add a visualize app extension that should be used for visualize specific stuff
    -export const visualize = appExtension;
    -export const interpreter = appExtension;
    -
    -// aliases visTypeEnhancers to the visTypes group
    -export const visTypeEnhancers = wrap(alias('visTypes'), appExtension);
    -
    -// adhoc extension groups can define new extension groups on the fly
    -// so that plugins could concat their own
    -export const aliases = flatConcatValuesAtType;
    diff --git a/src/legacy/ui/ui_exports/ui_export_types/ui_apps.js b/src/legacy/ui/ui_exports/ui_export_types/ui_apps.js
    deleted file mode 100644
    index 639a5a7c58e18..0000000000000
    --- a/src/legacy/ui/ui_exports/ui_export_types/ui_apps.js
    +++ /dev/null
    @@ -1,70 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { flatConcatAtType } from './reduce';
    -import { alias, mapSpec, wrap } from './modify_reduce';
    -
    -function applySpecDefaults(spec, type, pluginSpec) {
    -  const pluginId = pluginSpec.getId();
    -  const {
    -    id = pluginId,
    -    main,
    -    title,
    -    order = 0,
    -    description = '',
    -    icon,
    -    euiIconType,
    -    hidden = false,
    -    linkToLastSubUrl = true,
    -    listed = !hidden,
    -    url = `/app/${id}`,
    -    category,
    -  } = spec;
    -
    -  if (spec.injectVars) {
    -    throw new Error(
    -      `[plugin:${pluginId}] uiExports.app.injectVars has been removed. Use server.injectUiAppVars('${id}', () => { ... })`
    -    );
    -  }
    -
    -  if (spec.uses) {
    -    throw new Error(
    -      `[plugin:${pluginId}] uiExports.app.uses has been removed. Import these uiExport types with "import 'uiExports/{type}'"`
    -    );
    -  }
    -
    -  return {
    -    pluginId,
    -    id,
    -    main,
    -    title,
    -    order,
    -    description,
    -    icon,
    -    euiIconType,
    -    hidden,
    -    linkToLastSubUrl,
    -    listed,
    -    url,
    -    category,
    -  };
    -}
    -
    -export const apps = wrap(alias('uiAppSpecs'), mapSpec(applySpecDefaults), flatConcatAtType);
    -export const app = wrap(alias('uiAppSpecs'), mapSpec(applySpecDefaults), flatConcatAtType);
    diff --git a/src/legacy/ui/ui_exports/ui_export_types/webpack_customizations.js b/src/legacy/ui/ui_exports/ui_export_types/webpack_customizations.js
    deleted file mode 100644
    index 3f3ff8b97999c..0000000000000
    --- a/src/legacy/ui/ui_exports/ui_export_types/webpack_customizations.js
    +++ /dev/null
    @@ -1,48 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { isAbsolute } from 'path';
    -
    -import { escapeRegExp } from 'lodash';
    -
    -import { flatConcatAtType, mergeAtType } from './reduce';
    -import { alias, wrap, uniqueKeys, mapSpec } from './modify_reduce';
    -
    -export const __globalImportAliases__ = wrap(
    -  alias('webpackAliases'),
    -  uniqueKeys('__globalImportAliases__'),
    -  mergeAtType
    -);
    -export const __bundleProvider__ = wrap(alias('uiBundleProviders'), flatConcatAtType);
    -export const __webpackPluginProvider__ = wrap(alias('webpackPluginProviders'), flatConcatAtType);
    -export const noParse = wrap(
    -  alias('webpackNoParseRules'),
    -  mapSpec((rule) => {
    -    if (typeof rule === 'string') {
    -      return new RegExp(`${isAbsolute(rule) ? '^' : ''}${escapeRegExp(rule)}`);
    -    }
    -
    -    if (rule instanceof RegExp) {
    -      return rule;
    -    }
    -
    -    throw new Error('Expected noParse rule to be a string or regexp');
    -  }),
    -  flatConcatAtType
    -);
    diff --git a/src/legacy/ui/ui_mixin.js b/src/legacy/ui/ui_mixin.js
    index 831c2c5deb829..432c4f02bc3e6 100644
    --- a/src/legacy/ui/ui_mixin.js
    +++ b/src/legacy/ui/ui_mixin.js
    @@ -18,13 +18,11 @@
      */
     
     import { uiAppsMixin } from './ui_apps';
    -import { uiBundlesMixin } from './ui_bundles';
     import { uiRenderMixin } from './ui_render';
     import { uiSettingsMixin } from './ui_settings';
     
     export async function uiMixin(kbnServer) {
       await kbnServer.mixin(uiAppsMixin);
    -  await kbnServer.mixin(uiBundlesMixin);
       await kbnServer.mixin(uiSettingsMixin);
       await kbnServer.mixin(uiRenderMixin);
     }
    diff --git a/src/legacy/ui/ui_render/bootstrap/template.js.hbs b/src/legacy/ui/ui_render/bootstrap/template.js.hbs
    index bbca051ce31a1..89c7125b39e36 100644
    --- a/src/legacy/ui/ui_render/bootstrap/template.js.hbs
    +++ b/src/legacy/ui/ui_render/bootstrap/template.js.hbs
    @@ -77,14 +77,9 @@ if (window.__kbnStrictCsp__ && window.__kbnCspNotEnforced__) {
             '{{this}}',
           {{/each}}
         ], function () {
    -      {{#unless legacyBundlePath}}
    -        __kbnBundles__.get('entry/core/public').__kbnBootstrap__();
    -      {{/unless}}
    +      __kbnBundles__.get('entry/core/public').__kbnBootstrap__();
     
           load([
    -        {{#if legacyBundlePath}}
    -          '{{legacyBundlePath}}',
    -        {{/if}}
             {{#each styleSheetPaths}}
               '{{this}}',
             {{/each}}
    diff --git a/src/legacy/ui/ui_render/ui_render_mixin.js b/src/legacy/ui/ui_render/ui_render_mixin.js
    index 12ae6390fdc22..23fb6028f84db 100644
    --- a/src/legacy/ui/ui_render/ui_render_mixin.js
    +++ b/src/legacy/ui/ui_render/ui_render_mixin.js
    @@ -19,7 +19,6 @@
     
     import { createHash } from 'crypto';
     import Boom from 'boom';
    -import Path from 'path';
     import { i18n } from '@kbn/i18n';
     import * as UiSharedDeps from '@kbn/ui-shared-deps';
     import { AppBootstrap } from './bootstrap';
    @@ -37,9 +36,6 @@ import { getApmConfig } from '../apm';
      * @param {KbnServer['config']} config
      */
     export function uiRenderMixin(kbnServer, server, config) {
    -  // render all views from ./views
    -  server.setupViews(Path.resolve(__dirname, 'views'));
    -
       const translationsCache = { translations: null, hash: null };
       server.route({
         path: '/translations/{locale}.json',
    @@ -76,17 +72,13 @@ export function uiRenderMixin(kbnServer, server, config) {
         const authEnabled = !!server.auth.settings.default;
     
         server.route({
    -      path: '/bundles/app/{id}/bootstrap.js',
    +      path: '/bootstrap.js',
           method: 'GET',
           config: {
             tags: ['api'],
             auth: authEnabled ? { mode: 'try' } : false,
           },
           async handler(request, h) {
    -        const { id } = request.params;
    -        const app = server.getUiAppById(id) || server.getHiddenUiAppById(id);
    -        const isCore = !app;
    -
             const uiSettings = request.getUiSettingsService();
     
             const darkMode =
    @@ -114,29 +106,14 @@ export function uiRenderMixin(kbnServer, server, config) {
                       ? `${regularBundlePath}/kbn-ui-shared-deps/${UiSharedDeps.darkCssDistFilename}`
                       : `${regularBundlePath}/kbn-ui-shared-deps/${UiSharedDeps.darkV8CssDistFilename}`,
                     `${basePath}/node_modules/@kbn/ui-framework/dist/kui_dark.css`,
    -                `${regularBundlePath}/dark_theme.style.css`,
    +                `${basePath}/ui/legacy_dark_theme.css`,
                   ]
                 : [
                     themeVersion === 'v7'
                       ? `${regularBundlePath}/kbn-ui-shared-deps/${UiSharedDeps.lightCssDistFilename}`
                       : `${regularBundlePath}/kbn-ui-shared-deps/${UiSharedDeps.lightV8CssDistFilename}`,
                     `${basePath}/node_modules/@kbn/ui-framework/dist/kui_light.css`,
    -                `${regularBundlePath}/light_theme.style.css`,
    -              ]),
    -          ...(isCore
    -            ? []
    -            : [
    -                `${regularBundlePath}/${app.getId()}.style.css`,
    -                ...kbnServer.uiExports.styleSheetPaths
    -                  .filter(
    -                    (path) => path.theme === '*' || path.theme === (darkMode ? 'dark' : 'light')
    -                  )
    -                  .map((path) =>
    -                    path.localPath.endsWith('.scss')
    -                      ? `${basePath}/${buildHash}/built_assets/css/${path.publicPath}`
    -                      : `${basePath}/${path.publicPath}`
    -                  )
    -                  .reverse(),
    +                `${basePath}/ui/legacy_light_theme.css`,
                   ]),
             ];
     
    @@ -182,7 +159,6 @@ export function uiRenderMixin(kbnServer, server, config) {
                 jsDependencyPaths,
                 styleSheetPaths,
                 publicPathMap,
    -            legacyBundlePath: isCore ? undefined : `${regularBundlePath}/${app.getId()}.bundle.js`,
               },
             });
     
    diff --git a/src/optimize/base_optimizer.js b/src/optimize/base_optimizer.js
    deleted file mode 100644
    index 74973887ae9c1..0000000000000
    --- a/src/optimize/base_optimizer.js
    +++ /dev/null
    @@ -1,520 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { writeFile } from 'fs';
    -import os from 'os';
    -
    -import Boom from 'boom';
    -import MiniCssExtractPlugin from 'mini-css-extract-plugin';
    -import TerserPlugin from 'terser-webpack-plugin';
    -import webpack from 'webpack';
    -import Stats from 'webpack/lib/Stats';
    -import * as threadLoader from 'thread-loader';
    -import webpackMerge from 'webpack-merge';
    -import WrapperPlugin from 'wrapper-webpack-plugin';
    -import * as UiSharedDeps from '@kbn/ui-shared-deps';
    -
    -import { IS_KIBANA_DISTRIBUTABLE } from '../legacy/utils';
    -import { fromRoot } from '../core/server/utils';
    -import { PUBLIC_PATH_PLACEHOLDER } from './public_path_placeholder';
    -
    -const POSTCSS_CONFIG_PATH = require.resolve('./postcss.config.js');
    -const BABEL_PRESET_PATH = require.resolve('@kbn/babel-preset/webpack_preset');
    -const ISTANBUL_PRESET_PATH = require.resolve('@kbn/babel-preset/istanbul_preset');
    -const EMPTY_MODULE_PATH = require.resolve('./intentionally_empty_module.js');
    -const BABEL_EXCLUDE_RE = [/[\/\\](webpackShims|node_modules|bower_components)[\/\\]/];
    -const STATS_WARNINGS_FILTER = new RegExp(
    -  [
    -    '(export .* was not found in)',
    -    '|(chunk .* \\[mini-css-extract-plugin\\]\\\nConflicting order between:)',
    -  ].join('')
    -);
    -const IS_CODE_COVERAGE = !!process.env.CODE_COVERAGE;
    -
    -const LEGACY_PRESETS = {
    -  plugins: [require.resolve('@babel/plugin-transform-modules-commonjs')],
    -};
    -
    -function recursiveIssuer(m) {
    -  if (m.issuer) {
    -    return recursiveIssuer(m.issuer);
    -  } else if (m.name) {
    -    return m.name;
    -  } else {
    -    return false;
    -  }
    -}
    -
    -export default class BaseOptimizer {
    -  constructor(opts) {
    -    this.logWithMetadata = opts.logWithMetadata || (() => null);
    -    this.uiBundles = opts.uiBundles;
    -    this.profile = opts.profile || false;
    -    this.workers = opts.workers;
    -
    -    switch (opts.sourceMaps) {
    -      case true:
    -        this.sourceMaps = 'source-map';
    -        break;
    -
    -      case 'fast':
    -        this.sourceMaps = 'cheap-module-eval-source-map';
    -        break;
    -
    -      default:
    -        this.sourceMaps = opts.sourceMaps || false;
    -        break;
    -    }
    -
    -    // Run some pre loading in order to prevent
    -    // high delay when booting thread loader workers
    -    this.warmupThreadLoaderPool();
    -  }
    -
    -  async init() {
    -    if (this.compiler) {
    -      return this;
    -    }
    -
    -    const compilerConfig = this.getConfig();
    -    this.compiler = webpack(compilerConfig);
    -
    -    // register the webpack compiler hooks
    -    // for the base optimizer
    -    this.registerCompilerHooks();
    -
    -    return this;
    -  }
    -
    -  registerCompilerHooks() {
    -    this.registerCompilerDoneHook();
    -  }
    -
    -  registerCompilerDoneHook() {
    -    this.compiler.hooks.done.tap('base_optimizer-done', (stats) => {
    -      // We are not done while we have an additional
    -      // compilation pass to run
    -      // We also don't need to emit the stats if we don't have
    -      // the profile option set
    -      if (!this.profile || stats.compilation.needAdditionalPass) {
    -        return;
    -      }
    -
    -      const path = this.uiBundles.resolvePath('stats.json');
    -      const content = JSON.stringify(stats.toJson());
    -      writeFile(path, content, function (err) {
    -        if (err) throw err;
    -      });
    -    });
    -  }
    -
    -  warmupThreadLoaderPool() {
    -    const baseModules = ['babel-loader', BABEL_PRESET_PATH, LEGACY_PRESETS];
    -
    -    threadLoader.warmup(
    -      // pool options, like passed to loader options
    -      // must match loader options to boot the correct pool
    -      this.getThreadLoaderPoolConfig(),
    -      [
    -        // modules to load on the pool
    -        ...baseModules,
    -      ]
    -    );
    -  }
    -
    -  getThreadPoolCpuCount() {
    -    if (this.workers) {
    -      return this.workers;
    -    }
    -
    -    const cpus = os.cpus();
    -    if (!cpus) {
    -      // sometimes this call returns undefined so we fall back to 1: https://github.com/nodejs/node/issues/19022
    -      return 1;
    -    }
    -
    -    return Math.max(1, Math.min(cpus.length - 1, 3));
    -  }
    -
    -  getThreadLoaderPoolConfig() {
    -    // Calculate the node options from the NODE_OPTIONS env var
    -    const parsedNodeOptions = process.env.NODE_OPTIONS ? process.env.NODE_OPTIONS.split(/\s/) : [];
    -
    -    return {
    -      name: 'optimizer-thread-loader-main-pool',
    -      workers: this.getThreadPoolCpuCount(),
    -      workerParallelJobs: 20,
    -      // This is a safe check in order to set
    -      // the parent node options applied from
    -      // the NODE_OPTIONS env var for every launched worker.
    -      // Otherwise, if the user sets max_old_space_size, as they
    -      // are used to, into NODE_OPTIONS, it won't affect the workers.
    -      workerNodeArgs: parsedNodeOptions,
    -      poolParallelJobs: this.getThreadPoolCpuCount() * 20,
    -      poolTimeout: this.uiBundles.isDevMode() ? Infinity : 2000,
    -    };
    -  }
    -
    -  getConfig() {
    -    function getStyleLoaderExtractor() {
    -      return [MiniCssExtractPlugin.loader];
    -    }
    -
    -    function getStyleLoaders(preProcessors = [], postProcessors = []) {
    -      return [
    -        ...postProcessors,
    -        {
    -          loader: 'css-loader',
    -          options: {
    -            // importLoaders needs to know the number of loaders that follow this one,
    -            // so we add 1 (for the postcss-loader) to the length of the preProcessors
    -            // array that we merge into this array
    -            importLoaders: 1 + preProcessors.length,
    -          },
    -        },
    -        {
    -          loader: 'postcss-loader',
    -          options: {
    -            config: {
    -              path: POSTCSS_CONFIG_PATH,
    -            },
    -          },
    -        },
    -        ...preProcessors,
    -      ];
    -    }
    -
    -    /**
    -     * Adds a cache loader if we're running in dev mode. The reason we're not adding
    -     * the cache-loader when running in production mode is that it creates cache
    -     * files in data/optimize/.cache that are not necessary for distributable versions
    -     * of Kibana and just make compressing and extracting it more difficult.
    -     */
    -    const maybeAddCacheLoader = (cacheName, loaders) => {
    -      return [
    -        {
    -          loader: 'cache-loader',
    -          options: {
    -            cacheContext: fromRoot('.'),
    -            cacheDirectory: this.uiBundles.getCacheDirectory(cacheName),
    -            readOnly: process.env.KBN_CACHE_LOADER_WRITABLE ? false : IS_KIBANA_DISTRIBUTABLE,
    -          },
    -        },
    -        ...loaders,
    -      ];
    -    };
    -
    -    /**
    -     * Creates the selection rules for a loader that will only pass for
    -     * source files that are eligible for automatic transpilation.
    -     */
    -    const createSourceFileResourceSelector = (test) => {
    -      return [
    -        {
    -          test,
    -          exclude: BABEL_EXCLUDE_RE.concat(this.uiBundles.getWebpackNoParseRules()),
    -        },
    -        {
    -          test,
    -          include: /[\/\\]node_modules[\/\\]x-pack[\/\\]/,
    -          exclude: /[\/\\]node_modules[\/\\]x-pack[\/\\](.+?[\/\\])*node_modules[\/\\]/,
    -        },
    -      ];
    -    };
    -
    -    const commonConfig = {
    -      mode: 'development',
    -      node: { fs: 'empty' },
    -      context: fromRoot('.'),
    -      cache: true,
    -      entry: {
    -        ...this.uiBundles.toWebpackEntries(),
    -        light_theme: [require.resolve('../legacy/ui/public/styles/bootstrap_light.less')],
    -        dark_theme: [require.resolve('../legacy/ui/public/styles/bootstrap_dark.less')],
    -      },
    -
    -      devtool: this.sourceMaps,
    -      profile: this.profile || false,
    -
    -      output: {
    -        futureEmitAssets: true, // TODO: remove on webpack 5
    -        path: this.uiBundles.getWorkingDir(),
    -        filename: '[name].bundle.js',
    -        sourceMapFilename: '[file].map',
    -        publicPath: PUBLIC_PATH_PLACEHOLDER,
    -        devtoolModuleFilenameTemplate: '[absolute-resource-path]',
    -      },
    -
    -      optimization: {
    -        splitChunks: {
    -          cacheGroups: {
    -            light_theme: {
    -              name: 'light_theme',
    -              test: (m) =>
    -                m.constructor.name === 'CssModule' && recursiveIssuer(m) === 'light_theme',
    -              chunks: 'all',
    -              enforce: true,
    -            },
    -            dark_theme: {
    -              name: 'dark_theme',
    -              test: (m) =>
    -                m.constructor.name === 'CssModule' && recursiveIssuer(m) === 'dark_theme',
    -              chunks: 'all',
    -              enforce: true,
    -            },
    -          },
    -        },
    -        noEmitOnErrors: true,
    -      },
    -
    -      plugins: [
    -        new MiniCssExtractPlugin({
    -          filename: '[name].style.css',
    -        }),
    -
    -        // ignore scss imports in new-platform code that finds its way into legacy bundles
    -        new webpack.NormalModuleReplacementPlugin(/\.scss$/, (resource) => {
    -          resource.request = EMPTY_MODULE_PATH;
    -        }),
    -
    -        // replace imports for `uiExports/*` modules with a synthetic module
    -        // created by create_ui_exports_module.js
    -        new webpack.NormalModuleReplacementPlugin(/^uiExports\//, (resource) => {
    -          // the map of uiExport types to module ids
    -          const extensions = this.uiBundles.getAppExtensions();
    -
    -          // everything following the first / in the request is
    -          // treated as a type of appExtension
    -          const type = resource.request.slice(resource.request.indexOf('/') + 1);
    -
    -          resource.request = [
    -            // the "val-loader" is used to execute create_ui_exports_module
    -            // and use its return value as the source for the module in the
    -            // bundle. This allows us to bypass writing to the file system
    -            require.resolve('val-loader'),
    -            '!',
    -            require.resolve('./create_ui_exports_module'),
    -            '?',
    -            // this JSON is parsed by create_ui_exports_module and determines
    -            // what require() calls it will execute within the bundle
    -            JSON.stringify({ type, modules: extensions[type] || [] }),
    -          ].join('');
    -        }),
    -
    -        ...this.uiBundles.getWebpackPluginProviders().map((provider) => provider(webpack)),
    -      ],
    -
    -      module: {
    -        rules: [
    -          {
    -            test: /\.less$/,
    -            use: [
    -              ...getStyleLoaderExtractor(),
    -              ...getStyleLoaders(['less-loader'], maybeAddCacheLoader('less', [])),
    -            ],
    -          },
    -          {
    -            test: /\.css$/,
    -            use: [
    -              ...getStyleLoaderExtractor(),
    -              ...getStyleLoaders([], maybeAddCacheLoader('css', [])),
    -            ],
    -          },
    -          {
    -            test: /\.(html|tmpl)$/,
    -            loader: 'raw-loader',
    -          },
    -          {
    -            test: /\.(woff|woff2|ttf|eot|svg|ico|png|jpg|gif|jpeg)(\?|$)/,
    -            loader: 'url-loader',
    -            options: {
    -              limit: 8192,
    -            },
    -          },
    -          {
    -            resource: createSourceFileResourceSelector(/\.(js|tsx?)$/),
    -            use: maybeAddCacheLoader('babel', [
    -              {
    -                loader: 'thread-loader',
    -                options: this.getThreadLoaderPoolConfig(),
    -              },
    -              {
    -                loader: 'babel-loader',
    -                options: {
    -                  babelrc: false,
    -                  presets: this.getPresets(),
    -                },
    -              },
    -            ]),
    -          },
    -          ...this.uiBundles.getPostLoaders().map((loader) => ({
    -            enforce: 'post',
    -            ...loader,
    -          })),
    -        ],
    -        noParse: this.uiBundles.getWebpackNoParseRules(),
    -      },
    -
    -      resolve: {
    -        extensions: ['.js', '.ts', '.tsx', '.json'],
    -        mainFields: ['browser', 'browserify', 'main'],
    -        modules: [
    -          'webpackShims',
    -          fromRoot('webpackShims'),
    -
    -          'node_modules',
    -          fromRoot('node_modules'),
    -        ],
    -        alias: {
    -          ...this.uiBundles.getAliases(),
    -          tinymath: require.resolve('tinymath/lib/tinymath.es5.js'),
    -        },
    -      },
    -
    -      performance: {
    -        // NOTE: we are disabling this as those hints
    -        // are more tailored for the final bundles result
    -        // and not for the webpack compilations performance itself
    -        hints: false,
    -      },
    -
    -      externals: {
    -        ...UiSharedDeps.externals,
    -      },
    -    };
    -
    -    // when running from the distributable define an environment variable we can use
    -    // to exclude chunks of code, modules, etc.
    -    const isDistributableConfig = {
    -      plugins: [
    -        new webpack.DefinePlugin({
    -          'process.env': {
    -            IS_KIBANA_DISTRIBUTABLE: `"true"`,
    -          },
    -        }),
    -      ],
    -    };
    -
    -    const watchingConfig = {
    -      plugins: [
    -        new webpack.WatchIgnorePlugin([
    -          // When our bundle entry files are fresh they cause webpack
    -          // to think they might have changed since the watcher was
    -          // initialized, which triggers a second compilation on startup.
    -          // Since we can't reliably update these files anyway, we can
    -          // just ignore them in the watcher and prevent the extra compilation
    -          /bundles[\/\\].+\.entry\.js/,
    -        ]),
    -      ],
    -    };
    -
    -    const coverageConfig = {
    -      plugins: [
    -        new WrapperPlugin({
    -          test: /commons\.bundle\.js$/, // only wrap output of bundle files with '.js' extension
    -          header: `
    -            window.flushCoverageToLog = function () {
    -              if (window.__coverage__) {
    -                console.log('coveragejson:' + btoa(JSON.stringify(window.__coverage__)));
    -              }
    -            };
    -            window.addEventListener('beforeunload', window.flushCoverageToLog);
    -          `,
    -        }),
    -      ],
    -    };
    -
    -    // in production we set the process.env.NODE_ENV and run
    -    // the terser minimizer over our bundles
    -    const productionConfig = {
    -      mode: 'production',
    -      optimization: {
    -        minimizer: [
    -          new TerserPlugin({
    -            parallel: false,
    -            sourceMap: false,
    -            cache: false,
    -            extractComments: false,
    -            terserOptions: {
    -              compress: false,
    -              mangle: false,
    -            },
    -          }),
    -        ],
    -      },
    -    };
    -
    -    return this.uiBundles.getExtendedConfig(
    -      webpackMerge(
    -        IS_CODE_COVERAGE ? coverageConfig : {},
    -        commonConfig,
    -        IS_KIBANA_DISTRIBUTABLE ? isDistributableConfig : {},
    -        this.uiBundles.isDevMode() ? watchingConfig : productionConfig
    -      )
    -    );
    -  }
    -
    -  isFailure(stats) {
    -    if (stats.hasErrors()) {
    -      return true;
    -    }
    -
    -    const { warnings } = stats.toJson({ all: false, warnings: true });
    -
    -    // 1 - when typescript doesn't do a full type check, as we have the ts-loader
    -    // configured here, it does not have enough information to determine
    -    // whether an imported name is a type or not, so when the name is then
    -    // exported, typescript has no choice but to emit the export. Fortunately,
    -    // the extraneous export should not be harmful, so we just suppress these warnings
    -    // https://github.com/TypeStrong/ts-loader#transpileonly-boolean-defaultfalse
    -    //
    -    // 2 - Mini Css Extract plugin tracks the order for each css import we have
    -    // through the project (and it's successive imports) since version 0.4.2.
    -    // In case we have the same imports more than one time with different
    -    // sequences, this plugin will throw a warning. This should not be harmful,
    -    // but the an issue was opened and can be followed on:
    -    // https://github.com/webpack-contrib/mini-css-extract-plugin/issues/250#issuecomment-415345126
    -    const filteredWarnings = Stats.filterWarnings(warnings, STATS_WARNINGS_FILTER);
    -
    -    return filteredWarnings.length > 0;
    -  }
    -
    -  failedStatsToError(stats) {
    -    const details = stats.toString({
    -      ...Stats.presetToOptions('minimal'),
    -      colors: true,
    -      warningsFilter: STATS_WARNINGS_FILTER,
    -    });
    -
    -    return Boom.internal(
    -      `Optimizations failure.\n${details.split('\n').join('\n    ')}\n`,
    -      stats.toJson({
    -        warningsFilter: STATS_WARNINGS_FILTER,
    -        ...Stats.presetToOptions('detailed'),
    -        maxModules: 1000,
    -      })
    -    );
    -  }
    -
    -  getPresets() {
    -    return IS_CODE_COVERAGE
    -      ? [ISTANBUL_PRESET_PATH, BABEL_PRESET_PATH, LEGACY_PRESETS]
    -      : [BABEL_PRESET_PATH, LEGACY_PRESETS];
    -  }
    -}
    diff --git a/src/optimize/bundles_route/__tests__/fixtures/outside_output.js b/src/optimize/bundles_route/__fixtures__/outside_output.js
    similarity index 100%
    rename from src/optimize/bundles_route/__tests__/fixtures/outside_output.js
    rename to src/optimize/bundles_route/__fixtures__/outside_output.js
    diff --git a/src/optimize/bundles_route/__tests__/fixtures/output/image.png b/src/optimize/bundles_route/__fixtures__/plugin/foo/image.png
    similarity index 100%
    rename from src/optimize/bundles_route/__tests__/fixtures/output/image.png
    rename to src/optimize/bundles_route/__fixtures__/plugin/foo/image.png
    diff --git a/src/optimize/bundles_route/__tests__/fixtures/plugin/no_placeholder/no_placeholder.plugin.js b/src/optimize/bundles_route/__fixtures__/plugin/foo/plugin.js
    similarity index 100%
    rename from src/optimize/bundles_route/__tests__/fixtures/plugin/no_placeholder/no_placeholder.plugin.js
    rename to src/optimize/bundles_route/__fixtures__/plugin/foo/plugin.js
    diff --git a/src/optimize/bundles_route/__tests__/bundles_route.js b/src/optimize/bundles_route/__tests__/bundles_route.js
    deleted file mode 100644
    index 5b42b658300fe..0000000000000
    --- a/src/optimize/bundles_route/__tests__/bundles_route.js
    +++ /dev/null
    @@ -1,440 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { resolve } from 'path';
    -import { readFileSync } from 'fs';
    -import crypto from 'crypto';
    -
    -import Chance from 'chance';
    -import expect from '@kbn/expect';
    -import Hapi from 'hapi';
    -import Inert from 'inert';
    -import sinon from 'sinon';
    -
    -import { createBundlesRoute } from '../bundles_route';
    -import { PUBLIC_PATH_PLACEHOLDER } from '../../public_path_placeholder';
    -
    -const chance = new Chance();
    -const outputFixture = resolve(__dirname, './fixtures/output');
    -const pluginNoPlaceholderFixture = resolve(__dirname, './fixtures/plugin/no_placeholder');
    -
    -const randomWordsCache = new Set();
    -const uniqueRandomWord = () => {
    -  const word = chance.word();
    -
    -  if (randomWordsCache.has(word)) {
    -    return uniqueRandomWord();
    -  }
    -
    -  randomWordsCache.add(word);
    -  return word;
    -};
    -
    -function replaceAll(source, replace, replaceWith) {
    -  return source.split(replace).join(replaceWith);
    -}
    -
    -describe('optimizer/bundle route', () => {
    -  const sandbox = sinon.createSandbox();
    -
    -  function createServer(options = {}) {
    -    const {
    -      regularBundlesPath = outputFixture,
    -      basePublicPath = '',
    -      builtCssPath = outputFixture,
    -      npUiPluginPublicDirs = [],
    -      buildHash = '1234',
    -      isDist = false,
    -    } = options;
    -
    -    const server = new Hapi.Server();
    -    server.register([Inert]);
    -
    -    server.route(
    -      createBundlesRoute({
    -        regularBundlesPath,
    -        basePublicPath,
    -        builtCssPath,
    -        npUiPluginPublicDirs,
    -        buildHash,
    -        isDist,
    -      })
    -    );
    -
    -    return server;
    -  }
    -
    -  afterEach(() => sandbox.restore());
    -
    -  describe('validation', () => {
    -    it('validates that regularBundlesPath is an absolute path', () => {
    -      expect(() => {
    -        createBundlesRoute({
    -          regularBundlesPath: null,
    -          basePublicPath: '',
    -        });
    -      }).to.throwError(/absolute path/);
    -      expect(() => {
    -        createBundlesRoute({
    -          regularBundlesPath: './relative',
    -          basePublicPath: '',
    -        });
    -      }).to.throwError(/absolute path/);
    -      expect(() => {
    -        createBundlesRoute({
    -          regularBundlesPath: 1234,
    -          basePublicPath: '',
    -        });
    -      }).to.throwError(/absolute path/);
    -      expect(() => {
    -        createBundlesRoute({
    -          regularBundlesPath: '/absolute/path',
    -          basePublicPath: '',
    -        });
    -      }).to.not.throwError();
    -    });
    -    it('validates that basePublicPath is valid', () => {
    -      expect(() => {
    -        createBundlesRoute({
    -          regularBundlesPath: '/bundles',
    -          basePublicPath: 123,
    -        });
    -      }).to.throwError(/string/);
    -      expect(() => {
    -        createBundlesRoute({
    -          regularBundlesPath: '/bundles',
    -          basePublicPath: {},
    -        });
    -      }).to.throwError(/string/);
    -      expect(() => {
    -        createBundlesRoute({
    -          regularBundlesPath: '/bundles',
    -          basePublicPath: '/a/',
    -        });
    -      }).to.throwError(/start and not end with a \//);
    -      expect(() => {
    -        createBundlesRoute({
    -          regularBundlesPath: '/bundles',
    -          basePublicPath: 'a/',
    -        });
    -      }).to.throwError(/start and not end with a \//);
    -      expect(() => {
    -        createBundlesRoute({
    -          regularBundlesPath: '/bundles',
    -          basePublicPath: '/a',
    -        });
    -      }).to.not.throwError();
    -      expect(() => {
    -        createBundlesRoute({
    -          regularBundlesPath: '/bundles',
    -          basePublicPath: '',
    -        });
    -      }).to.not.throwError();
    -    });
    -  });
    -
    -  describe('image', () => {
    -    it('responds with exact file data', async () => {
    -      const server = createServer();
    -      const response = await server.inject({
    -        url: '/1234/bundles/image.png',
    -      });
    -
    -      expect(response.statusCode).to.be(200);
    -      const image = readFileSync(resolve(outputFixture, 'image.png'));
    -      expect(response.headers).to.have.property('content-length', image.length);
    -      expect(response.headers).to.have.property('content-type', 'image/png');
    -      expect(image).to.eql(response.rawPayload);
    -    });
    -  });
    -
    -  describe('js file without placeholder', () => {
    -    it('responds with no content-length and exact file data', async () => {
    -      const server = createServer();
    -      const response = await server.inject({
    -        url: '/1234/bundles/no_placeholder.js',
    -      });
    -
    -      expect(response.statusCode).to.be(200);
    -      expect(response.headers).to.not.have.property('content-length');
    -      expect(response.headers).to.have.property(
    -        'content-type',
    -        'application/javascript; charset=utf-8'
    -      );
    -      expect(readFileSync(resolve(outputFixture, 'no_placeholder.js'))).to.eql(response.rawPayload);
    -    });
    -  });
    -
    -  describe('js file with placeholder', () => {
    -    it('responds with no content-length and modifiedfile data ', async () => {
    -      const basePublicPath = `/${uniqueRandomWord()}`;
    -      const server = createServer({ basePublicPath });
    -
    -      const response = await server.inject({
    -        url: '/1234/bundles/with_placeholder.js',
    -      });
    -
    -      expect(response.statusCode).to.be(200);
    -      const source = readFileSync(resolve(outputFixture, 'with_placeholder.js'), 'utf8');
    -      expect(response.headers).to.not.have.property('content-length');
    -      expect(response.headers).to.have.property(
    -        'content-type',
    -        'application/javascript; charset=utf-8'
    -      );
    -      expect(response.result.indexOf(source)).to.be(-1);
    -      expect(response.result).to.be(
    -        replaceAll(source, PUBLIC_PATH_PLACEHOLDER, `${basePublicPath}/1234/bundles/`)
    -      );
    -    });
    -  });
    -
    -  describe('css file without placeholder', () => {
    -    it('responds with no content-length and exact file data', async () => {
    -      const server = createServer();
    -      const response = await server.inject({
    -        url: '/1234/bundles/no_placeholder.css',
    -      });
    -
    -      expect(response.statusCode).to.be(200);
    -      expect(response.headers).to.not.have.property('content-length');
    -      expect(response.headers).to.have.property('content-type', 'text/css; charset=utf-8');
    -      expect(readFileSync(resolve(outputFixture, 'no_placeholder.css'))).to.eql(
    -        response.rawPayload
    -      );
    -    });
    -  });
    -
    -  describe('css file with placeholder', () => {
    -    it('responds with no content-length and modified file data', async () => {
    -      const basePublicPath = `/${uniqueRandomWord()}`;
    -      const server = createServer({ basePublicPath });
    -
    -      const response = await server.inject({
    -        url: '/1234/bundles/with_placeholder.css',
    -      });
    -
    -      expect(response.statusCode).to.be(200);
    -      const source = readFileSync(resolve(outputFixture, 'with_placeholder.css'), 'utf8');
    -      expect(response.headers).to.not.have.property('content-length');
    -      expect(response.headers).to.have.property('content-type', 'text/css; charset=utf-8');
    -      expect(response.result.indexOf(source)).to.be(-1);
    -      expect(response.result).to.be(
    -        replaceAll(source, PUBLIC_PATH_PLACEHOLDER, `${basePublicPath}/1234/bundles/`)
    -      );
    -    });
    -  });
    -
    -  describe('js file outside regularBundlesPath', () => {
    -    it('responds with a 404', async () => {
    -      const server = createServer();
    -
    -      const response = await server.inject({
    -        url: '/1234/bundles/../outside_output.js',
    -      });
    -
    -      expect(response.statusCode).to.be(404);
    -      expect(response.result).to.eql({
    -        error: 'Not Found',
    -        message: 'Not Found',
    -        statusCode: 404,
    -      });
    -    });
    -  });
    -
    -  describe('missing js file', () => {
    -    it('responds with 404', async () => {
    -      const server = createServer();
    -
    -      const response = await server.inject({
    -        url: '/1234/bundles/non_existent.js',
    -      });
    -
    -      expect(response.statusCode).to.be(404);
    -      expect(response.result).to.eql({
    -        error: 'Not Found',
    -        message: 'Not Found',
    -        statusCode: 404,
    -      });
    -    });
    -  });
    -
    -  describe('missing regularBundlesPath', () => {
    -    it('responds with 404', async () => {
    -      const server = createServer({
    -        regularBundlesPath: resolve(__dirname, 'fixtures/not_really_output'),
    -      });
    -
    -      const response = await server.inject({
    -        url: '/1234/bundles/with_placeholder.js',
    -      });
    -
    -      expect(response.statusCode).to.be(404);
    -      expect(response.result).to.eql({
    -        error: 'Not Found',
    -        message: 'Not Found',
    -        statusCode: 404,
    -      });
    -    });
    -  });
    -
    -  describe('etag', () => {
    -    it('only calculates hash of file on first request', async () => {
    -      const createHash = sandbox.spy(crypto, 'createHash');
    -
    -      const server = createServer();
    -
    -      sinon.assert.notCalled(createHash);
    -      const resp1 = await server.inject({
    -        url: '/1234/bundles/no_placeholder.js',
    -      });
    -
    -      sinon.assert.calledOnce(createHash);
    -      createHash.resetHistory();
    -      expect(resp1.statusCode).to.be(200);
    -
    -      const resp2 = await server.inject({
    -        url: '/1234/bundles/no_placeholder.js',
    -      });
    -
    -      sinon.assert.notCalled(createHash);
    -      expect(resp2.statusCode).to.be(200);
    -    });
    -
    -    it('is unique per basePublicPath although content is the same (by default)', async () => {
    -      const basePublicPath1 = `/${uniqueRandomWord()}`;
    -      const basePublicPath2 = `/${uniqueRandomWord()}`;
    -
    -      const [resp1, resp2] = await Promise.all([
    -        createServer({ basePublicPath: basePublicPath1 }).inject({
    -          url: '/1234/bundles/no_placeholder.js',
    -        }),
    -        createServer({ basePublicPath: basePublicPath2 }).inject({
    -          url: '/1234/bundles/no_placeholder.js',
    -        }),
    -      ]);
    -
    -      expect(resp1.statusCode).to.be(200);
    -      expect(resp2.statusCode).to.be(200);
    -
    -      expect(resp1.rawPayload).to.eql(resp2.rawPayload);
    -
    -      expect(resp1.headers.etag).to.be.a('string');
    -      expect(resp2.headers.etag).to.be.a('string');
    -      expect(resp1.headers.etag).to.not.eql(resp2.headers.etag);
    -    });
    -  });
    -
    -  describe('cache control', () => {
    -    it('responds with 304 when etag and last modified are sent back', async () => {
    -      const server = createServer();
    -      const resp = await server.inject({
    -        url: '/1234/bundles/with_placeholder.js',
    -      });
    -
    -      expect(resp.statusCode).to.be(200);
    -
    -      const resp2 = await server.inject({
    -        url: '/1234/bundles/with_placeholder.js',
    -        headers: {
    -          'if-modified-since': resp.headers['last-modified'],
    -          'if-none-match': resp.headers.etag,
    -        },
    -      });
    -
    -      expect(resp2.statusCode).to.be(304);
    -      expect(resp2.result).to.have.length(0);
    -    });
    -  });
    -
    -  describe('kibana platform assets', () => {
    -    describe('caching', () => {
    -      describe('for non-distributable mode', () => {
    -        it('uses "etag" header to invalidate cache', async () => {
    -          const basePublicPath = `/${uniqueRandomWord()}`;
    -
    -          const npUiPluginPublicDirs = [
    -            {
    -              id: 'no_placeholder',
    -              path: pluginNoPlaceholderFixture,
    -            },
    -          ];
    -          const responce = await createServer({ basePublicPath, npUiPluginPublicDirs }).inject({
    -            url: '/1234/bundles/plugin/no_placeholder/no_placeholder.plugin.js',
    -          });
    -
    -          expect(responce.statusCode).to.be(200);
    -
    -          expect(responce.headers.etag).to.be.a('string');
    -          expect(responce.headers['cache-control']).to.be('must-revalidate');
    -        });
    -
    -        it('creates the same "etag" header for the same content with the same basePath', async () => {
    -          const npUiPluginPublicDirs = [
    -            {
    -              id: 'no_placeholder',
    -              path: pluginNoPlaceholderFixture,
    -            },
    -          ];
    -          const [resp1, resp2] = await Promise.all([
    -            createServer({ basePublicPath: '', npUiPluginPublicDirs }).inject({
    -              url: '/1234/bundles/plugin/no_placeholder/no_placeholder.plugin.js',
    -            }),
    -            createServer({ basePublicPath: '', npUiPluginPublicDirs }).inject({
    -              url: '/1234/bundles/plugin/no_placeholder/no_placeholder.plugin.js',
    -            }),
    -          ]);
    -
    -          expect(resp1.statusCode).to.be(200);
    -          expect(resp2.statusCode).to.be(200);
    -
    -          expect(resp1.rawPayload).to.eql(resp2.rawPayload);
    -
    -          expect(resp1.headers.etag).to.be.a('string');
    -          expect(resp2.headers.etag).to.be.a('string');
    -          expect(resp1.headers.etag).to.eql(resp2.headers.etag);
    -        });
    -      });
    -
    -      describe('for distributable mode', () => {
    -        it('commands to cache assets for each release for a year', async () => {
    -          const basePublicPath = `/${uniqueRandomWord()}`;
    -
    -          const npUiPluginPublicDirs = [
    -            {
    -              id: 'no_placeholder',
    -              path: pluginNoPlaceholderFixture,
    -            },
    -          ];
    -          const responce = await createServer({
    -            basePublicPath,
    -            npUiPluginPublicDirs,
    -            isDist: true,
    -          }).inject({
    -            url: '/1234/bundles/plugin/no_placeholder/no_placeholder.plugin.js',
    -          });
    -
    -          expect(responce.statusCode).to.be(200);
    -
    -          expect(responce.headers.etag).to.be(undefined);
    -          expect(responce.headers['cache-control']).to.be('max-age=31536000');
    -        });
    -      });
    -    });
    -  });
    -});
    diff --git a/src/optimize/bundles_route/__tests__/fixtures/output/no_placeholder.css b/src/optimize/bundles_route/__tests__/fixtures/output/no_placeholder.css
    deleted file mode 100644
    index 31d9cc2684a72..0000000000000
    --- a/src/optimize/bundles_route/__tests__/fixtures/output/no_placeholder.css
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -body {
    -  background-color: goldenrod;
    -}
    diff --git a/src/optimize/bundles_route/__tests__/fixtures/output/no_placeholder.js b/src/optimize/bundles_route/__tests__/fixtures/output/no_placeholder.js
    deleted file mode 100644
    index bf04a775a1a8a..0000000000000
    --- a/src/optimize/bundles_route/__tests__/fixtures/output/no_placeholder.js
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -console.log('chunk2');
    diff --git a/src/optimize/bundles_route/__tests__/fixtures/output/with_placeholder.css b/src/optimize/bundles_route/__tests__/fixtures/output/with_placeholder.css
    deleted file mode 100644
    index 5b5979850daf7..0000000000000
    --- a/src/optimize/bundles_route/__tests__/fixtures/output/with_placeholder.css
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -body {
    -  background-image: url(__REPLACE_WITH_PUBLIC_PATH__/image.png);
    -}
    diff --git a/src/optimize/bundles_route/__tests__/fixtures/output/with_placeholder.js b/src/optimize/bundles_route/__tests__/fixtures/output/with_placeholder.js
    deleted file mode 100644
    index 1862127904a4c..0000000000000
    --- a/src/optimize/bundles_route/__tests__/fixtures/output/with_placeholder.js
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -console.log('__REPLACE_WITH_PUBLIC_PATH__');
    diff --git a/src/optimize/bundles_route/__tests__/fixtures/plugin/placeholder/placeholder.plugin.js b/src/optimize/bundles_route/__tests__/fixtures/plugin/placeholder/placeholder.plugin.js
    deleted file mode 100644
    index 8c959f9b4779f..0000000000000
    --- a/src/optimize/bundles_route/__tests__/fixtures/plugin/placeholder/placeholder.plugin.js
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -module.exports = '__REPLACE_WITH_PUBLIC_PATH__/FOO';
    diff --git a/src/optimize/bundles_route/bundles_route.test.ts b/src/optimize/bundles_route/bundles_route.test.ts
    new file mode 100644
    index 0000000000000..8cf4e9d72685c
    --- /dev/null
    +++ b/src/optimize/bundles_route/bundles_route.test.ts
    @@ -0,0 +1,307 @@
    +/*
    + * Licensed to Elasticsearch B.V. under one or more contributor
    + * license agreements. See the NOTICE file distributed with
    + * this work for additional information regarding copyright
    + * ownership. Elasticsearch B.V. licenses this file to you under
    + * the Apache License, Version 2.0 (the "License"); you may
    + * not use this file except in compliance with the License.
    + * You may obtain a copy of the License at
    + *
    + *    http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing,
    + * software distributed under the License is distributed on an
    + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    + * KIND, either express or implied.  See the License for the
    + * specific language governing permissions and limitations
    + * under the License.
    + */
    +
    +import { resolve } from 'path';
    +import { readFileSync } from 'fs';
    +import crypto from 'crypto';
    +
    +import Chance from 'chance';
    +import Hapi from 'hapi';
    +import Inert from 'inert';
    +
    +import { createBundlesRoute } from './bundles_route';
    +
    +const chance = new Chance();
    +const fooPluginFixture = resolve(__dirname, './__fixtures__/plugin/foo');
    +const createHashMock = jest.spyOn(crypto, 'createHash');
    +
    +const randomWordsCache = new Set();
    +const uniqueRandomWord = (): string => {
    +  const word = chance.word();
    +
    +  if (randomWordsCache.has(word)) {
    +    return uniqueRandomWord();
    +  }
    +
    +  randomWordsCache.add(word);
    +  return word;
    +};
    +
    +function createServer({
    +  basePublicPath = '',
    +  isDist = false,
    +}: {
    +  basePublicPath?: string;
    +  isDist?: boolean;
    +} = {}) {
    +  const buildHash = '1234';
    +  const npUiPluginPublicDirs = [
    +    {
    +      id: 'foo',
    +      path: fooPluginFixture,
    +    },
    +  ];
    +
    +  const server = new Hapi.Server();
    +  server.register([Inert]);
    +
    +  server.route(
    +    createBundlesRoute({
    +      basePublicPath,
    +      npUiPluginPublicDirs,
    +      buildHash,
    +      isDist,
    +    })
    +  );
    +
    +  return server;
    +}
    +
    +beforeEach(() => {
    +  jest.clearAllMocks();
    +});
    +
    +describe('validation', () => {
    +  it('validates that basePublicPath is valid', () => {
    +    expect(() => {
    +      createServer({
    +        // @ts-expect-error intentionally trying to break things
    +        basePublicPath: 123,
    +      });
    +    }).toThrowErrorMatchingInlineSnapshot(`"basePublicPath must be a string"`);
    +    expect(() => {
    +      createServer({
    +        // @ts-expect-error intentionally trying to break things
    +        basePublicPath: {},
    +      });
    +    }).toThrowErrorMatchingInlineSnapshot(`"basePublicPath must be a string"`);
    +    expect(() => {
    +      createServer({
    +        basePublicPath: '/a/',
    +      });
    +    }).toThrowErrorMatchingInlineSnapshot(
    +      `"basePublicPath must be empty OR start and not end with a /"`
    +    );
    +    expect(() => {
    +      createServer({
    +        basePublicPath: 'a/',
    +      });
    +    }).toThrowErrorMatchingInlineSnapshot(
    +      `"basePublicPath must be empty OR start and not end with a /"`
    +    );
    +    expect(() => {
    +      createServer({
    +        basePublicPath: '/a',
    +      });
    +    }).not.toThrowError();
    +    expect(() => {
    +      createServer({
    +        basePublicPath: '',
    +      });
    +    }).not.toThrowError();
    +  });
    +});
    +
    +describe('image', () => {
    +  it('responds with exact file data', async () => {
    +    const server = createServer();
    +    const response = await server.inject({
    +      url: '/1234/bundles/plugin/foo/image.png',
    +    });
    +
    +    expect(response.statusCode).toBe(200);
    +    const image = readFileSync(resolve(fooPluginFixture, 'image.png'));
    +    expect(response.headers).toHaveProperty('content-length', image.length);
    +    expect(response.headers).toHaveProperty('content-type', 'image/png');
    +    expect(image).toEqual(response.rawPayload);
    +  });
    +});
    +
    +describe('js file', () => {
    +  it('responds with no content-length and exact file data', async () => {
    +    const server = createServer();
    +    const response = await server.inject({
    +      url: '/1234/bundles/plugin/foo/plugin.js',
    +    });
    +
    +    expect(response.statusCode).toBe(200);
    +    expect(response.headers).not.toHaveProperty('content-length');
    +    expect(response.headers).toHaveProperty(
    +      'content-type',
    +      'application/javascript; charset=utf-8'
    +    );
    +    expect(readFileSync(resolve(fooPluginFixture, 'plugin.js'))).toEqual(response.rawPayload);
    +  });
    +});
    +
    +describe('js file outside plugin', () => {
    +  it('responds with a 404', async () => {
    +    const server = createServer();
    +
    +    const response = await server.inject({
    +      url: '/1234/bundles/plugin/foo/../outside_output.js',
    +    });
    +
    +    expect(response.statusCode).toBe(404);
    +    expect(response.result).toEqual({
    +      error: 'Not Found',
    +      message: 'Not Found',
    +      statusCode: 404,
    +    });
    +  });
    +});
    +
    +describe('missing js file', () => {
    +  it('responds with 404', async () => {
    +    const server = createServer();
    +
    +    const response = await server.inject({
    +      url: '/1234/bundles/plugin/foo/non_existent.js',
    +    });
    +
    +    expect(response.statusCode).toBe(404);
    +    expect(response.result).toEqual({
    +      error: 'Not Found',
    +      message: 'Not Found',
    +      statusCode: 404,
    +    });
    +  });
    +});
    +
    +describe('etag', () => {
    +  it('only calculates hash of file on first request', async () => {
    +    const server = createServer();
    +
    +    expect(createHashMock).not.toHaveBeenCalled();
    +    const resp1 = await server.inject({
    +      url: '/1234/bundles/plugin/foo/plugin.js',
    +    });
    +
    +    expect(createHashMock).toHaveBeenCalledTimes(1);
    +    createHashMock.mockClear();
    +    expect(resp1.statusCode).toBe(200);
    +
    +    const resp2 = await server.inject({
    +      url: '/1234/bundles/plugin/foo/plugin.js',
    +    });
    +
    +    expect(createHashMock).not.toHaveBeenCalled();
    +    expect(resp2.statusCode).toBe(200);
    +  });
    +
    +  it('is unique per basePublicPath although content is the same (by default)', async () => {
    +    const basePublicPath1 = `/${uniqueRandomWord()}`;
    +    const basePublicPath2 = `/${uniqueRandomWord()}`;
    +
    +    const [resp1, resp2] = await Promise.all([
    +      createServer({ basePublicPath: basePublicPath1 }).inject({
    +        url: '/1234/bundles/plugin/foo/plugin.js',
    +      }),
    +      createServer({ basePublicPath: basePublicPath2 }).inject({
    +        url: '/1234/bundles/plugin/foo/plugin.js',
    +      }),
    +    ]);
    +
    +    expect(resp1.statusCode).toBe(200);
    +    expect(resp2.statusCode).toBe(200);
    +
    +    expect(resp1.rawPayload).toEqual(resp2.rawPayload);
    +
    +    expect(resp1.headers.etag).toEqual(expect.any(String));
    +    expect(resp2.headers.etag).toEqual(expect.any(String));
    +    expect(resp1.headers.etag).not.toEqual(resp2.headers.etag);
    +  });
    +});
    +
    +describe('cache control', () => {
    +  it('responds with 304 when etag and last modified are sent back', async () => {
    +    const server = createServer();
    +    const resp = await server.inject({
    +      url: '/1234/bundles/plugin/foo/plugin.js',
    +    });
    +
    +    expect(resp.statusCode).toBe(200);
    +
    +    const resp2 = await server.inject({
    +      url: '/1234/bundles/plugin/foo/plugin.js',
    +      headers: {
    +        'if-modified-since': resp.headers['last-modified'],
    +        'if-none-match': resp.headers.etag,
    +      },
    +    });
    +
    +    expect(resp2.statusCode).toBe(304);
    +    expect(resp2.result).toHaveLength(0);
    +  });
    +});
    +
    +describe('caching', () => {
    +  describe('for non-distributable mode', () => {
    +    it('uses "etag" header to invalidate cache', async () => {
    +      const basePublicPath = `/${uniqueRandomWord()}`;
    +
    +      const responce = await createServer({ basePublicPath }).inject({
    +        url: '/1234/bundles/plugin/foo/plugin.js',
    +      });
    +
    +      expect(responce.statusCode).toBe(200);
    +
    +      expect(responce.headers.etag).toEqual(expect.any(String));
    +      expect(responce.headers['cache-control']).toBe('must-revalidate');
    +    });
    +
    +    it('creates the same "etag" header for the same content with the same basePath', async () => {
    +      const [resp1, resp2] = await Promise.all([
    +        createServer({ basePublicPath: '' }).inject({
    +          url: '/1234/bundles/plugin/foo/plugin.js',
    +        }),
    +        createServer({ basePublicPath: '' }).inject({
    +          url: '/1234/bundles/plugin/foo/plugin.js',
    +        }),
    +      ]);
    +
    +      expect(resp1.statusCode).toBe(200);
    +      expect(resp2.statusCode).toBe(200);
    +
    +      expect(resp1.rawPayload).toEqual(resp2.rawPayload);
    +
    +      expect(resp1.headers.etag).toEqual(expect.any(String));
    +      expect(resp2.headers.etag).toEqual(expect.any(String));
    +      expect(resp1.headers.etag).toEqual(resp2.headers.etag);
    +    });
    +  });
    +
    +  describe('for distributable mode', () => {
    +    it('commands to cache assets for each release for a year', async () => {
    +      const basePublicPath = `/${uniqueRandomWord()}`;
    +
    +      const responce = await createServer({
    +        basePublicPath,
    +        isDist: true,
    +      }).inject({
    +        url: '/1234/bundles/plugin/foo/plugin.js',
    +      });
    +
    +      expect(responce.statusCode).toBe(200);
    +
    +      expect(responce.headers.etag).toBe(undefined);
    +      expect(responce.headers['cache-control']).toBe('max-age=31536000');
    +    });
    +  });
    +});
    diff --git a/src/optimize/bundles_route/bundles_route.ts b/src/optimize/bundles_route/bundles_route.ts
    index 8c1092efed252..6d618fba50ccf 100644
    --- a/src/optimize/bundles_route/bundles_route.ts
    +++ b/src/optimize/bundles_route/bundles_route.ts
    @@ -17,7 +17,7 @@
      * under the License.
      */
     
    -import { isAbsolute, extname, join } from 'path';
    +import { extname, join } from 'path';
     
     import Hapi from 'hapi';
     import * as UiSharedDeps from '@kbn/ui-shared-deps';
    @@ -28,9 +28,7 @@ import { assertIsNpUiPluginPublicDirs, NpUiPluginPublicDirs } from '../np_ui_plu
     import { fromRoot } from '../../core/server/utils';
     
     /**
    - *  Creates the routes that serves files from `bundlesPath`. If the
    - *  file is js or css then it is searched for instances of
    - *  PUBLIC_PATH_PLACEHOLDER and replaces them with `publicPath`.
    + *  Creates the routes that serves files from `bundlesPath`.
      *
      *  @param {Object} options
      *  @property {Array<{id,path}>} options.npUiPluginPublicDirs array of ids and paths that should be served for new platform plugins
    @@ -40,16 +38,12 @@ import { fromRoot } from '../../core/server/utils';
      *  @return Array.of({Hapi.Route})
      */
     export function createBundlesRoute({
    -  regularBundlesPath,
       basePublicPath,
    -  builtCssPath,
       npUiPluginPublicDirs = [],
       buildHash,
       isDist = false,
     }: {
    -  regularBundlesPath: string;
       basePublicPath: string;
    -  builtCssPath: string;
       npUiPluginPublicDirs?: NpUiPluginPublicDirs;
       buildHash: string;
       isDist?: boolean;
    @@ -60,12 +54,6 @@ export function createBundlesRoute({
       const fileHashCache = new FileHashCache();
       assertIsNpUiPluginPublicDirs(npUiPluginPublicDirs);
     
    -  if (typeof regularBundlesPath !== 'string' || !isAbsolute(regularBundlesPath)) {
    -    throw new TypeError(
    -      'regularBundlesPath must be an absolute path to the directory containing the regular bundles'
    -    );
    -  }
    -
       if (typeof basePublicPath !== 'string') {
         throw new TypeError('basePublicPath must be a string');
       }
    @@ -80,7 +68,6 @@ export function createBundlesRoute({
           routePath: `/${buildHash}/bundles/kbn-ui-shared-deps/`,
           bundlesPath: UiSharedDeps.distDir,
           fileHashCache,
    -      replacePublicPath: false,
           isDist,
         }),
         ...npUiPluginPublicDirs.map(({ id, path }) =>
    @@ -89,7 +76,6 @@ export function createBundlesRoute({
             routePath: `/${buildHash}/bundles/plugin/${id}/`,
             bundlesPath: path,
             fileHashCache,
    -        replacePublicPath: false,
             isDist,
           })
         ),
    @@ -98,21 +84,6 @@ export function createBundlesRoute({
           routePath: `/${buildHash}/bundles/core/`,
           bundlesPath: fromRoot(join('src', 'core', 'target', 'public')),
           fileHashCache,
    -      replacePublicPath: false,
    -      isDist,
    -    }),
    -    buildRouteForBundles({
    -      publicPath: `${basePublicPath}/${buildHash}/bundles/`,
    -      routePath: `/${buildHash}/bundles/`,
    -      bundlesPath: regularBundlesPath,
    -      fileHashCache,
    -      isDist,
    -    }),
    -    buildRouteForBundles({
    -      publicPath: `${basePublicPath}/`,
    -      routePath: `/${buildHash}/built_assets/css/`,
    -      bundlesPath: builtCssPath,
    -      fileHashCache,
           isDist,
         }),
       ];
    @@ -123,14 +94,12 @@ function buildRouteForBundles({
       routePath,
       bundlesPath,
       fileHashCache,
    -  replacePublicPath = true,
       isDist,
     }: {
       publicPath: string;
       routePath: string;
       bundlesPath: string;
       fileHashCache: FileHashCache;
    -  replacePublicPath?: boolean;
       isDist: boolean;
     }) {
       return {
    @@ -153,7 +122,6 @@ function buildRouteForBundles({
                   bundlesPath,
                   fileHashCache,
                   publicPath,
    -              replacePublicPath,
                   isDist,
                 });
               },
    diff --git a/src/optimize/bundles_route/dynamic_asset_response.ts b/src/optimize/bundles_route/dynamic_asset_response.ts
    index 2f5395341abb1..ce839b33ccac0 100644
    --- a/src/optimize/bundles_route/dynamic_asset_response.ts
    +++ b/src/optimize/bundles_route/dynamic_asset_response.ts
    @@ -27,8 +27,6 @@ import Hapi from 'hapi';
     
     import { FileHashCache } from './file_hash_cache';
     import { getFileHash } from './file_hash';
    -// @ts-ignore
    -import { replacePlaceholder } from '../public_path_placeholder';
     
     const MINUTE = 60;
     const HOUR = 60 * MINUTE;
    @@ -86,8 +84,6 @@ async function selectCompressedFile(acceptEncodingHeader: string | undefined, pa
      *   - stream file to response
      *
      *  It differs from Inert in some important ways:
    - *   - the PUBLIC_PATH_PLACEHOLDER is replaced with the correct
    - *     public path as the response is streamed
      *   - cached hash/etag is based on the file on disk, but modified
      *     by the public path so that individual public paths have
      *     different etags, but can share a cache
    @@ -98,7 +94,6 @@ export async function createDynamicAssetResponse({
       bundlesPath,
       publicPath,
       fileHashCache,
    -  replacePublicPath,
       isDist,
     }: {
       request: Hapi.Request;
    @@ -106,7 +101,6 @@ export async function createDynamicAssetResponse({
       bundlesPath: string;
       publicPath: string;
       fileHashCache: FileHashCache;
    -  replacePublicPath: boolean;
       isDist: boolean;
     }) {
       let fd: number | undefined;
    @@ -128,15 +122,13 @@ export async function createDynamicAssetResponse({
         const stat = await asyncFstat(fd);
         const hash = isDist ? undefined : await getFileHash(fileHashCache, path, stat, fd);
     
    -    const read = Fs.createReadStream(null as any, {
    +    const content = Fs.createReadStream(null as any, {
           fd,
           start: 0,
           autoClose: true,
         });
         fd = undefined; // read stream is now responsible for fd
     
    -    const content = replacePublicPath ? replacePlaceholder(read, publicPath) : read;
    -
         const response = h
           .response(content)
           .takeover()
    diff --git a/src/optimize/bundles_route/proxy_bundles_route.ts b/src/optimize/bundles_route/proxy_bundles_route.ts
    index 108d253d45202..a5cd32333e495 100644
    --- a/src/optimize/bundles_route/proxy_bundles_route.ts
    +++ b/src/optimize/bundles_route/proxy_bundles_route.ts
    @@ -26,10 +26,7 @@ export function createProxyBundlesRoute({
       port: number;
       buildHash: string;
     }) {
    -  return [
    -    buildProxyRouteForBundles(`/${buildHash}/bundles/`, host, port),
    -    buildProxyRouteForBundles(`/${buildHash}/built_assets/css/`, host, port),
    -  ];
    +  return [buildProxyRouteForBundles(`/${buildHash}/bundles/`, host, port)];
     }
     
     function buildProxyRouteForBundles(routePath: string, host: string, port: number) {
    diff --git a/src/optimize/create_ui_exports_module.js b/src/optimize/create_ui_exports_module.js
    deleted file mode 100644
    index d20814b10931b..0000000000000
    --- a/src/optimize/create_ui_exports_module.js
    +++ /dev/null
    @@ -1,40 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -// We normalize all path separators to `/` in generated files
    -function normalizePath(path) {
    -  return path.replace(/[\\\/]+/g, '/');
    -}
    -
    -module.exports = function () {
    -  if (!module.id.includes('?')) {
    -    throw new Error('create_ui_exports_module loaded without JSON args in module.id');
    -  }
    -
    -  const { type, modules } = JSON.parse(module.id.slice(module.id.indexOf('?') + 1));
    -  const comment = `// dynamically generated to load ${type} uiExports from plugins`;
    -  const requires = modules
    -    .sort((a, b) => a.localeCompare(b))
    -    .map((m) => `require('${normalizePath(m)}')`)
    -    .join('\n        ');
    -
    -  return {
    -    code: `${comment}\n${requires}\n`,
    -  };
    -};
    diff --git a/src/optimize/fs_optimizer.js b/src/optimize/fs_optimizer.js
    deleted file mode 100644
    index 71a4c85a9e5a5..0000000000000
    --- a/src/optimize/fs_optimizer.js
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import BaseOptimizer from './base_optimizer';
    -import { fromNode } from 'bluebird';
    -
    -export default class FsOptimizer extends BaseOptimizer {
    -  async run() {
    -    if (!this.compiler) {
    -      await this.init();
    -    }
    -
    -    await fromNode((cb) => {
    -      this.compiler.run((err, stats) => {
    -        if (err || !stats) return cb(err);
    -
    -        if (this.isFailure(stats)) {
    -          return cb(this.failedStatsToError(stats));
    -        } else {
    -          cb(null, stats);
    -        }
    -      });
    -    });
    -  }
    -}
    diff --git a/src/optimize/index.js b/src/optimize/index.js
    deleted file mode 100644
    index 363f81a6a3a96..0000000000000
    --- a/src/optimize/index.js
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { optimizeMixin } from './optimize_mixin';
    -export default optimizeMixin;
    diff --git a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/public/hack.js b/src/optimize/index.ts
    similarity index 94%
    rename from packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/public/hack.js
    rename to src/optimize/index.ts
    index dbeba25f9dfec..73d2b9765f451 100644
    --- a/packages/kbn-plugin-helpers/src/tasks/build/integration_tests/__fixtures__/create_build_test_plugin/public/hack.js
    +++ b/src/optimize/index.ts
    @@ -17,4 +17,4 @@
      * under the License.
      */
     
    -console.log('this is my hack');
    +export { optimizeMixin } from './optimize_mixin';
    diff --git a/src/optimize/intentionally_empty_module.js b/src/optimize/intentionally_empty_module.js
    deleted file mode 100644
    index 9880b336e76e5..0000000000000
    --- a/src/optimize/intentionally_empty_module.js
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    diff --git a/src/optimize/optimize_mixin.ts b/src/optimize/optimize_mixin.ts
    index 947c918a567f5..37f8b08dde3b8 100644
    --- a/src/optimize/optimize_mixin.ts
    +++ b/src/optimize/optimize_mixin.ts
    @@ -19,10 +19,7 @@
     
     import Hapi from 'hapi';
     
    -// @ts-ignore not TS yet
    -import FsOptimizer from './fs_optimizer';
     import { createBundlesRoute } from './bundles_route';
    -import { fromRoot } from '../core/server/utils';
     import { getNpUiPluginPublicDirs } from './np_ui_plugin_public_dirs';
     import KbnServer, { KibanaConfig } from '../legacy/server/kbn_server';
     
    @@ -31,67 +28,12 @@ export const optimizeMixin = async (
       server: Hapi.Server,
       config: KibanaConfig
     ) => {
    -  if (!config.get('optimize.enabled')) return;
    -
    -  // the watch optimizer sets up two threads, one is the server listening
    -  // on 5601 and the other is a server listening on 5602 that builds the
    -  // bundles in a "middleware" style.
    -  //
    -  // the server listening on 5601 may be restarted a number of times, depending
    -  // on the watch setup managed by the cli. It proxies all bundles/*
    -  // requests to the other server. The server on 5602 is long running, in order
    -  // to prevent complete rebuilds of the optimize content.
    -  const watch = config.get('optimize.watch');
    -  if (watch) {
    -    // eslint-disable-next-line @typescript-eslint/no-var-requires
    -    return await kbnServer.mixin(require('./watch/watch'));
    -  }
    -
    -  const { uiBundles } = kbnServer;
       server.route(
         createBundlesRoute({
    -      regularBundlesPath: uiBundles.getWorkingDir(),
           basePublicPath: config.get('server.basePath'),
    -      builtCssPath: fromRoot('built_assets/css'),
           npUiPluginPublicDirs: getNpUiPluginPublicDirs(kbnServer),
           buildHash: kbnServer.newPlatform.env.packageInfo.buildNum.toString(),
           isDist: kbnServer.newPlatform.env.packageInfo.dist,
         })
       );
    -
    -  // in prod, only bundle when something is missing or invalid
    -  const reuseCache = config.get('optimize.useBundleCache')
    -    ? await uiBundles.areAllBundleCachesValid()
    -    : false;
    -
    -  // we might not have any work to do
    -  if (reuseCache) {
    -    server.log(['debug', 'optimize'], `All bundles are cached and ready to go!`);
    -    return;
    -  }
    -
    -  await uiBundles.resetBundleDir();
    -
    -  // only require the FsOptimizer when we need to
    -  const optimizer = new FsOptimizer({
    -    logWithMetadata: server.logWithMetadata,
    -    uiBundles,
    -    profile: config.get('optimize.profile'),
    -    sourceMaps: config.get('optimize.sourceMaps'),
    -    workers: config.get('optimize.workers'),
    -  });
    -
    -  server.log(
    -    ['info', 'optimize'],
    -    `Optimizing and caching ${uiBundles.getDescription()}. This may take a few minutes`
    -  );
    -
    -  const start = Date.now();
    -  await optimizer.run();
    -  const seconds = ((Date.now() - start) / 1000).toFixed(2);
    -
    -  server.log(
    -    ['info', 'optimize'],
    -    `Optimization of ${uiBundles.getDescription()} complete in ${seconds} seconds`
    -  );
     };
    diff --git a/src/optimize/postcss.config.js b/src/optimize/postcss.config.js
    deleted file mode 100644
    index 571bae86dee37..0000000000000
    --- a/src/optimize/postcss.config.js
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -module.exports = {
    -  plugins: [require('autoprefixer')()],
    -};
    diff --git a/src/optimize/public_path_placeholder.ts b/src/optimize/public_path_placeholder.ts
    deleted file mode 100644
    index d5f57a1586774..0000000000000
    --- a/src/optimize/public_path_placeholder.ts
    +++ /dev/null
    @@ -1,57 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import Stream from 'stream';
    -import Fs from 'fs';
    -
    -import * as Rx from 'rxjs';
    -import { take, takeUntil } from 'rxjs/operators';
    -import { createReplaceStream } from '../legacy/utils';
    -
    -export const PUBLIC_PATH_PLACEHOLDER = '__REPLACE_WITH_PUBLIC_PATH__';
    -
    -interface ClosableTransform extends Stream.Transform {
    -  close(): void;
    -}
    -
    -export function replacePlaceholder(read: Stream.Readable, replacement: string) {
    -  const replace = createReplaceStream(PUBLIC_PATH_PLACEHOLDER, replacement);
    -
    -  // handle errors on the read stream by proxying them
    -  // to the replace stream so that the consumer can
    -  // choose what to do with them.
    -  Rx.fromEvent(read, 'error')
    -    .pipe(take(1), takeUntil(Rx.fromEvent(read, 'end')))
    -    .forEach((error) => {
    -      replace.emit('error', error);
    -      replace.end();
    -    });
    -
    -  const closableReplace: ClosableTransform = Object.assign(replace, {
    -    close: () => {
    -      read.unpipe();
    -
    -      if ('close' in read) {
    -        (read as Fs.ReadStream).close();
    -      }
    -    },
    -  });
    -
    -  return read.pipe(closableReplace);
    -}
    diff --git a/src/optimize/watch/optmzr_role.js b/src/optimize/watch/optmzr_role.js
    deleted file mode 100644
    index 0057c04219ec6..0000000000000
    --- a/src/optimize/watch/optmzr_role.js
    +++ /dev/null
    @@ -1,74 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import WatchServer from './watch_server';
    -import WatchOptimizer, { STATUS } from './watch_optimizer';
    -import { getNpUiPluginPublicDirs } from '../np_ui_plugin_public_dirs';
    -
    -export default async (kbnServer, kibanaHapiServer, config) => {
    -  const logWithMetadata = (tags, message, metadata) =>
    -    kibanaHapiServer.logWithMetadata(tags, message, metadata);
    -
    -  const watchOptimizer = new WatchOptimizer({
    -    logWithMetadata,
    -    uiBundles: kbnServer.uiBundles,
    -    profile: config.get('optimize.profile'),
    -    sourceMaps: config.get('optimize.sourceMaps'),
    -    workers: config.get('optimize.workers'),
    -    prebuild: config.get('optimize.watchPrebuild'),
    -  });
    -
    -  const server = new WatchServer(
    -    config.get('optimize.watchHost'),
    -    config.get('optimize.watchPort'),
    -    config.get('server.basePath'),
    -    watchOptimizer,
    -    getNpUiPluginPublicDirs(kbnServer),
    -    kbnServer.newPlatform.env.packageInfo.buildNum.toString()
    -  );
    -
    -  watchOptimizer.status$.subscribe({
    -    next(status) {
    -      process.send([
    -        'OPTIMIZE_STATUS',
    -        {
    -          success: status.type === STATUS.SUCCESS,
    -        },
    -      ]);
    -    },
    -  });
    -
    -  let ready = false;
    -
    -  const sendReady = () => {
    -    if (!process.connected) return;
    -    process.send(['WORKER_BROADCAST', { optimizeReady: ready }]);
    -  };
    -
    -  process.on('message', (msg) => {
    -    if (msg && msg.optimizeReady === '?') sendReady();
    -  });
    -
    -  sendReady();
    -
    -  await server.init();
    -
    -  ready = true;
    -  sendReady();
    -};
    diff --git a/src/optimize/watch/proxy_role.js b/src/optimize/watch/proxy_role.js
    deleted file mode 100644
    index ce2d63aa2eff0..0000000000000
    --- a/src/optimize/watch/proxy_role.js
    +++ /dev/null
    @@ -1,57 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { createProxyBundlesRoute } from '../bundles_route';
    -import { fromNode } from 'bluebird';
    -import { get, once } from 'lodash';
    -
    -export default (kbnServer, server, config) => {
    -  server.route(
    -    createProxyBundlesRoute({
    -      host: config.get('optimize.watchHost'),
    -      port: config.get('optimize.watchPort'),
    -      buildHash: kbnServer.newPlatform.env.packageInfo.buildNum.toString(),
    -    })
    -  );
    -
    -  return fromNode((cb) => {
    -    const timeout = setTimeout(() => {
    -      cb(new Error('Timeout waiting for the optimizer to become ready'));
    -    }, config.get('optimize.watchProxyTimeout'));
    -
    -    const waiting = once(() => {
    -      server.log(['info', 'optimize'], 'Waiting for optimizer to be ready');
    -    });
    -
    -    if (!process.connected) return;
    -
    -    process.send(['WORKER_BROADCAST', { optimizeReady: '?' }]);
    -    process.on('message', (msg) => {
    -      switch (get(msg, 'optimizeReady')) {
    -        case true:
    -          clearTimeout(timeout);
    -          cb();
    -          break;
    -        case false:
    -          waiting();
    -          break;
    -      }
    -    });
    -  });
    -};
    diff --git a/src/optimize/watch/watch.js b/src/optimize/watch/watch.js
    deleted file mode 100644
    index 7774577fb7677..0000000000000
    --- a/src/optimize/watch/watch.js
    +++ /dev/null
    @@ -1,51 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { isWorker } from 'cluster';
    -
    -export default async (kbnServer) => {
    -  if (!isWorker) {
    -    throw new Error(`watch optimization is only available when using the "--dev" cli flag`);
    -  }
    -
    -  /**
    -   * When running in watch mode two processes run in one of the following modes:
    -   *
    -   * optmzr: this process runs the WatchOptimizer and the WatchServer
    -   *   which serves the WatchOptimizer's output and blocks requests
    -   *   while the optimizer is running
    -   *
    -   * server: this process runs the entire kibana server and proxies
    -   *   all requests for /bundles/* to the optmzr process
    -   *
    -   * @param  {string} process.env.kbnWorkerType
    -   */
    -  switch (process.env.kbnWorkerType) {
    -    case 'optmzr':
    -      await kbnServer.mixin(require('./optmzr_role'));
    -      break;
    -
    -    case 'server':
    -      await kbnServer.mixin(require('./proxy_role'));
    -      break;
    -
    -    default:
    -      throw new Error(`unknown kbnWorkerType "${process.env.kbnWorkerType}"`);
    -  }
    -};
    diff --git a/src/optimize/watch/watch_optimizer.js b/src/optimize/watch/watch_optimizer.js
    deleted file mode 100644
    index 000c03ffb34fe..0000000000000
    --- a/src/optimize/watch/watch_optimizer.js
    +++ /dev/null
    @@ -1,192 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import BaseOptimizer from '../base_optimizer';
    -import { createBundlesRoute } from '../bundles_route';
    -import { fromRoot } from '../../core/server/utils';
    -import * as Rx from 'rxjs';
    -import { mergeMap, take } from 'rxjs/operators';
    -
    -export const STATUS = {
    -  RUNNING: 'optimizer running',
    -  SUCCESS: 'optimizer completed successfully',
    -  FAILURE: 'optimizer failed with stats',
    -  FATAL: 'optimizer failed without stats',
    -};
    -
    -export default class WatchOptimizer extends BaseOptimizer {
    -  constructor(opts) {
    -    super(opts);
    -    this.prebuild = opts.prebuild || false;
    -    this.status$ = new Rx.ReplaySubject(1);
    -  }
    -
    -  async init() {
    -    this.initializing = true;
    -    this.initialBuildComplete = false;
    -
    -    // log status changes
    -    this.status$.subscribe(this.onStatusChangeHandler);
    -    await this.uiBundles.resetBundleDir();
    -    await super.init();
    -
    -    this.compiler.watch({ aggregateTimeout: 200 }, this.compilerWatchErrorHandler);
    -
    -    if (this.prebuild) {
    -      await this.onceBuildOutcome();
    -    }
    -
    -    this.initializing = false;
    -  }
    -
    -  /**
    -   *
    -   * Extends the base_optimizer registerCompilerHooks function
    -   * calling extended function also adding a new register function
    -   *
    -   * It gets called by super.init()
    -   */
    -  registerCompilerHooks() {
    -    super.registerCompilerHooks();
    -    this.registerCompilerWatchRunHook();
    -  }
    -
    -  registerCompilerWatchRunHook() {
    -    this.compiler.hooks.watchRun.tap('watch_optimizer-watchRun', () => {
    -      this.status$.next({
    -        type: STATUS.RUNNING,
    -      });
    -    });
    -  }
    -
    -  registerCompilerDoneHook() {
    -    super.registerCompilerDoneHook();
    -
    -    this.compiler.hooks.done.tap('watch_optimizer-done', (stats) => {
    -      if (stats.compilation.needAdditionalPass) {
    -        return;
    -      }
    -
    -      this.initialBuildComplete = true;
    -      const seconds = parseFloat((stats.endTime - stats.startTime) / 1000).toFixed(2);
    -
    -      if (this.isFailure(stats)) {
    -        this.status$.next({
    -          type: STATUS.FAILURE,
    -          seconds,
    -          error: this.failedStatsToError(stats),
    -        });
    -      } else {
    -        this.status$.next({
    -          type: STATUS.SUCCESS,
    -          seconds,
    -        });
    -      }
    -    });
    -  }
    -
    -  bindToServer(server, basePath, npUiPluginPublicDirs, buildHash) {
    -    // pause all requests received while the compiler is running
    -    // and continue once an outcome is reached (aborting the request
    -    // with an error if it was a failure).
    -    server.ext('onRequest', async (request, h) => {
    -      await this.onceBuildOutcome();
    -      return h.continue;
    -    });
    -
    -    server.route(
    -      createBundlesRoute({
    -        npUiPluginPublicDirs: npUiPluginPublicDirs,
    -        buildHash,
    -        regularBundlesPath: this.compiler.outputPath,
    -        basePublicPath: basePath,
    -        builtCssPath: fromRoot('built_assets/css'),
    -      })
    -    );
    -  }
    -
    -  async onceBuildOutcome() {
    -    return await this.status$.pipe(mergeMap(this.mapStatusToOutcomes), take(1)).toPromise();
    -  }
    -
    -  mapStatusToOutcomes({ type, error }) {
    -    switch (type) {
    -      case STATUS.RUNNING:
    -        return [];
    -
    -      case STATUS.SUCCESS:
    -        return [true];
    -
    -      case STATUS.FAILURE:
    -      case STATUS.FATAL:
    -        return Rx.throwError(error);
    -    }
    -  }
    -
    -  compilerWatchErrorHandler = (error) => {
    -    if (error) {
    -      this.status$.next({
    -        type: STATUS.FATAL,
    -        error,
    -      });
    -    }
    -  };
    -
    -  onStatusChangeHandler = ({ type, seconds, error }) => {
    -    switch (type) {
    -      case STATUS.RUNNING:
    -        if (!this.initialBuildComplete) {
    -          this.logWithMetadata(['info', 'optimize'], `Optimization started`, {
    -            bundles: this.uiBundles.getIds(),
    -          });
    -        }
    -        break;
    -
    -      case STATUS.SUCCESS:
    -        this.logWithMetadata(['info', 'optimize'], `Optimization success in ${seconds} seconds`, {
    -          bundles: this.uiBundles.getIds(),
    -          status: 'success',
    -          seconds,
    -        });
    -        break;
    -
    -      case STATUS.FAILURE:
    -        // errors during initialization to the server, unlike the rest of the
    -        // errors produced here. Lets not muddy the console with extra errors
    -        if (!this.initializing) {
    -          this.logWithMetadata(
    -            ['fatal', 'optimize'],
    -            `Optimization failed in ${seconds} seconds${error}`,
    -            {
    -              bundles: this.uiBundles.getIds(),
    -              status: 'failed',
    -              seconds,
    -              err: error,
    -            }
    -          );
    -        }
    -        break;
    -
    -      case STATUS.FATAL:
    -        this.logWithMetadata('fatal', error);
    -        process.exit(1);
    -        break;
    -    }
    -  };
    -}
    diff --git a/src/optimize/watch/watch_server.js b/src/optimize/watch/watch_server.js
    deleted file mode 100644
    index 81e04a5b83956..0000000000000
    --- a/src/optimize/watch/watch_server.js
    +++ /dev/null
    @@ -1,47 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import { Server } from 'hapi';
    -import { registerHapiPlugins } from '../../legacy/server/http/register_hapi_plugins';
    -
    -export default class WatchServer {
    -  constructor(host, port, basePath, optimizer, npUiPluginPublicDirs, buildHash) {
    -    this.basePath = basePath;
    -    this.optimizer = optimizer;
    -    this.npUiPluginPublicDirs = npUiPluginPublicDirs;
    -    this.buildHash = buildHash;
    -    this.server = new Server({
    -      host: host,
    -      port: port,
    -    });
    -
    -    registerHapiPlugins(this.server);
    -  }
    -
    -  async init() {
    -    await this.optimizer.init();
    -    this.optimizer.bindToServer(
    -      this.server,
    -      this.basePath,
    -      this.npUiPluginPublicDirs,
    -      this.buildHash
    -    );
    -    await this.server.start();
    -  }
    -}
    diff --git a/src/plugins/timelion/public/flot.js b/src/plugins/timelion/public/flot.js
    deleted file mode 100644
    index 1ccb40c93a3d6..0000000000000
    --- a/src/plugins/timelion/public/flot.js
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import './webpackShims/jquery.flot';
    -import './webpackShims/jquery.flot.time';
    -import './webpackShims/jquery.flot.symbol';
    -import './webpackShims/jquery.flot.crosshair';
    -import './webpackShims/jquery.flot.selection';
    -import './webpackShims/jquery.flot.stack';
    -import './webpackShims/jquery.flot.axislabels';
    diff --git a/src/dev/sass/index.js b/src/plugins/timelion/public/flot/index.js
    similarity index 78%
    rename from src/dev/sass/index.js
    rename to src/plugins/timelion/public/flot/index.js
    index f172370280fcb..a066fd3ab8607 100644
    --- a/src/dev/sass/index.js
    +++ b/src/plugins/timelion/public/flot/index.js
    @@ -17,4 +17,10 @@
      * under the License.
      */
     
    -export { buildSass } from './build_sass';
    +import './jquery.flot';
    +import './jquery.flot.time';
    +import './jquery.flot.symbol';
    +import './jquery.flot.crosshair';
    +import './jquery.flot.selection';
    +import './jquery.flot.stack';
    +import './jquery.flot.axislabels';
    diff --git a/src/plugins/timelion/public/webpackShims/jquery.flot.axislabels.js b/src/plugins/timelion/public/flot/jquery.flot.axislabels.js
    similarity index 100%
    rename from src/plugins/timelion/public/webpackShims/jquery.flot.axislabels.js
    rename to src/plugins/timelion/public/flot/jquery.flot.axislabels.js
    diff --git a/src/plugins/timelion/public/webpackShims/jquery.flot.crosshair.js b/src/plugins/timelion/public/flot/jquery.flot.crosshair.js
    similarity index 100%
    rename from src/plugins/timelion/public/webpackShims/jquery.flot.crosshair.js
    rename to src/plugins/timelion/public/flot/jquery.flot.crosshair.js
    diff --git a/src/plugins/timelion/public/webpackShims/jquery.flot.js b/src/plugins/timelion/public/flot/jquery.flot.js
    similarity index 100%
    rename from src/plugins/timelion/public/webpackShims/jquery.flot.js
    rename to src/plugins/timelion/public/flot/jquery.flot.js
    diff --git a/src/plugins/timelion/public/webpackShims/jquery.flot.selection.js b/src/plugins/timelion/public/flot/jquery.flot.selection.js
    similarity index 100%
    rename from src/plugins/timelion/public/webpackShims/jquery.flot.selection.js
    rename to src/plugins/timelion/public/flot/jquery.flot.selection.js
    diff --git a/src/plugins/timelion/public/webpackShims/jquery.flot.stack.js b/src/plugins/timelion/public/flot/jquery.flot.stack.js
    similarity index 100%
    rename from src/plugins/timelion/public/webpackShims/jquery.flot.stack.js
    rename to src/plugins/timelion/public/flot/jquery.flot.stack.js
    diff --git a/src/plugins/timelion/public/webpackShims/jquery.flot.symbol.js b/src/plugins/timelion/public/flot/jquery.flot.symbol.js
    similarity index 100%
    rename from src/plugins/timelion/public/webpackShims/jquery.flot.symbol.js
    rename to src/plugins/timelion/public/flot/jquery.flot.symbol.js
    diff --git a/src/plugins/timelion/public/webpackShims/jquery.flot.time.js b/src/plugins/timelion/public/flot/jquery.flot.time.js
    similarity index 100%
    rename from src/plugins/timelion/public/webpackShims/jquery.flot.time.js
    rename to src/plugins/timelion/public/flot/jquery.flot.time.js
    diff --git a/src/plugins/vis_type_timelion/public/flot.js b/src/plugins/vis_type_timelion/public/flot.js
    deleted file mode 100644
    index 1ccb40c93a3d6..0000000000000
    --- a/src/plugins/vis_type_timelion/public/flot.js
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import './webpackShims/jquery.flot';
    -import './webpackShims/jquery.flot.time';
    -import './webpackShims/jquery.flot.symbol';
    -import './webpackShims/jquery.flot.crosshair';
    -import './webpackShims/jquery.flot.selection';
    -import './webpackShims/jquery.flot.stack';
    -import './webpackShims/jquery.flot.axislabels';
    diff --git a/src/legacy/ui/ui_bundles/index.js b/src/plugins/vis_type_timelion/public/flot/index.js
    similarity index 78%
    rename from src/legacy/ui/ui_bundles/index.js
    rename to src/plugins/vis_type_timelion/public/flot/index.js
    index b6afcf71a1114..a066fd3ab8607 100644
    --- a/src/legacy/ui/ui_bundles/index.js
    +++ b/src/plugins/vis_type_timelion/public/flot/index.js
    @@ -17,4 +17,10 @@
      * under the License.
      */
     
    -export { uiBundlesMixin } from './ui_bundles_mixin';
    +import './jquery.flot';
    +import './jquery.flot.time';
    +import './jquery.flot.symbol';
    +import './jquery.flot.crosshair';
    +import './jquery.flot.selection';
    +import './jquery.flot.stack';
    +import './jquery.flot.axislabels';
    diff --git a/src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.axislabels.js b/src/plugins/vis_type_timelion/public/flot/jquery.flot.axislabels.js
    similarity index 100%
    rename from src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.axislabels.js
    rename to src/plugins/vis_type_timelion/public/flot/jquery.flot.axislabels.js
    diff --git a/src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.crosshair.js b/src/plugins/vis_type_timelion/public/flot/jquery.flot.crosshair.js
    similarity index 100%
    rename from src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.crosshair.js
    rename to src/plugins/vis_type_timelion/public/flot/jquery.flot.crosshair.js
    diff --git a/src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.js b/src/plugins/vis_type_timelion/public/flot/jquery.flot.js
    similarity index 100%
    rename from src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.js
    rename to src/plugins/vis_type_timelion/public/flot/jquery.flot.js
    diff --git a/src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.selection.js b/src/plugins/vis_type_timelion/public/flot/jquery.flot.selection.js
    similarity index 100%
    rename from src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.selection.js
    rename to src/plugins/vis_type_timelion/public/flot/jquery.flot.selection.js
    diff --git a/src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.stack.js b/src/plugins/vis_type_timelion/public/flot/jquery.flot.stack.js
    similarity index 100%
    rename from src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.stack.js
    rename to src/plugins/vis_type_timelion/public/flot/jquery.flot.stack.js
    diff --git a/src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.symbol.js b/src/plugins/vis_type_timelion/public/flot/jquery.flot.symbol.js
    similarity index 100%
    rename from src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.symbol.js
    rename to src/plugins/vis_type_timelion/public/flot/jquery.flot.symbol.js
    diff --git a/src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.time.js b/src/plugins/vis_type_timelion/public/flot/jquery.flot.time.js
    similarity index 100%
    rename from src/plugins/vis_type_timelion/public/webpackShims/jquery.flot.time.js
    rename to src/plugins/vis_type_timelion/public/flot/jquery.flot.time.js
    diff --git a/src/test_utils/kbn_server.ts b/src/test_utils/kbn_server.ts
    index 6a20261421b5b..e337a469f17e6 100644
    --- a/src/test_utils/kbn_server.ts
    +++ b/src/test_utils/kbn_server.ts
    @@ -49,7 +49,6 @@ const DEFAULTS_SETTINGS = {
       },
       logging: { silent: true },
       plugins: {},
    -  optimize: { enabled: false },
       migrations: { skip: true },
     };
     
    @@ -76,9 +75,11 @@ export function createRootWithSettings(
           watch: false,
           repl: false,
           basePath: false,
    -      optimize: false,
           runExamples: false,
           oss: true,
    +      disableOptimizer: true,
    +      cache: true,
    +      dist: false,
           ...cliArgs,
         },
         isDevClusterMaster: false,
    diff --git a/test/api_integration/config.js b/test/api_integration/config.js
    index 071e7fc6ba3fd..a7d31b8b2acce 100644
    --- a/test/api_integration/config.js
    +++ b/test/api_integration/config.js
    @@ -35,7 +35,6 @@ export default async function ({ readConfigFile }) {
           ...functionalConfig.get('kbnTestServer'),
           serverArgs: [
             ...functionalConfig.get('kbnTestServer.serverArgs'),
    -        '--optimize.enabled=false',
             '--elasticsearch.healthCheck.delay=3600000',
             '--server.xsrf.disableProtection=true',
             '--server.compression.referrerWhitelist=["some-host.com"]',
    diff --git a/test/common/config.js b/test/common/config.js
    index 9b58da4473738..6a62151b12814 100644
    --- a/test/common/config.js
    +++ b/test/common/config.js
    @@ -19,7 +19,7 @@
     
     import path from 'path';
     import { format as formatUrl } from 'url';
    -import { OPTIMIZE_BUNDLE_DIR, esTestConfig, kbnTestConfig, kibanaServerTestUser } from '@kbn/test';
    +import { esTestConfig, kbnTestConfig, kibanaServerTestUser } from '@kbn/test';
     import { services } from './services';
     
     export default function () {
    @@ -38,19 +38,12 @@ export default function () {
         },
     
         kbnTestServer: {
    -      buildArgs: ['--optimize.useBundleCache=true'],
    -      sourceArgs: [
    -        '--no-base-path',
    -        '--env.name=development',
    -        `--optimize.bundleDir=${OPTIMIZE_BUNDLE_DIR}`,
    -      ],
    +      buildArgs: [],
    +      sourceArgs: ['--no-base-path', '--env.name=development'],
           serverArgs: [
             '--logging.json=false',
             `--server.port=${kbnTestConfig.getPort()}`,
    -        `--optimize.watchPort=${kbnTestConfig.getPort() + 10}`,
    -        '--optimize.watchPrebuild=true',
             '--status.allowAnonymous=true',
    -        '--optimize.enabled=true',
             `--elasticsearch.hosts=${formatUrl(servers.elasticsearch)}`,
             `--elasticsearch.username=${kibanaServerTestUser.username}`,
             `--elasticsearch.password=${kibanaServerTestUser.password}`,
    diff --git a/test/functional/apps/bundles/index.js b/test/functional/apps/bundles/index.js
    index f106ea895c2e6..b9c64dae2064c 100644
    --- a/test/functional/apps/bundles/index.js
    +++ b/test/functional/apps/bundles/index.js
    @@ -62,12 +62,5 @@ export default function ({ getService }) {
             .set('Accept-Encoding', 'gzip;q=1.0, br;q=0.5')
             .expect(200)
             .expect('Content-Encoding', 'gzip'));
    -
    -    it('returns gzip files when no brotli version exists', () =>
    -      supertest
    -        .get(`/${buildNum}/bundles/light_theme.style.css`) // legacy optimizer does not create brotli outputs
    -        .set('Accept-Encoding', 'gzip, br')
    -        .expect(200)
    -        .expect('Content-Encoding', 'gzip'));
       });
     }
    diff --git a/test/plugin_functional/plugins/core_plugin_legacy/index.ts b/test/plugin_functional/plugins/core_plugin_legacy/index.ts
    deleted file mode 100644
    index 9584927c3cc89..0000000000000
    --- a/test/plugin_functional/plugins/core_plugin_legacy/index.ts
    +++ /dev/null
    @@ -1,50 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import KbnServer from 'src/legacy/server/kbn_server';
    -
    -// eslint-disable-next-line import/no-default-export
    -export default function (kibana: any) {
    -  return new kibana.Plugin({
    -    id: 'core_plugin_legacy',
    -    require: ['kibana'],
    -    uiExports: {
    -      app: {
    -        id: 'core_legacy_compat',
    -        title: 'Core Legacy Compat',
    -        description: 'This is a sample plugin to test core to legacy compatibility',
    -        main: 'plugins/core_plugin_legacy/index',
    -      },
    -    },
    -    init(server: KbnServer) {
    -      const { http } = server.newPlatform.setup.core;
    -      const router = http.createRouter();
    -
    -      router.get({ path: '/api/np-http-in-legacy', validate: false }, async (context, req, res) => {
    -        const response = await context.core.elasticsearch.legacy.client.callAsInternalUser('ping');
    -        return res.ok({ body: `Pong in legacy via new platform: ${response}` });
    -      });
    -
    -      router.get({ path: '/api/np-context-in-legacy', validate: false }, (context, req, res) => {
    -        const contexts = Object.keys(context);
    -        return res.ok({ body: { contexts } });
    -      });
    -    },
    -  });
    -}
    diff --git a/test/plugin_functional/plugins/core_plugin_legacy/package.json b/test/plugin_functional/plugins/core_plugin_legacy/package.json
    deleted file mode 100644
    index 41c311e8d7153..0000000000000
    --- a/test/plugin_functional/plugins/core_plugin_legacy/package.json
    +++ /dev/null
    @@ -1,17 +0,0 @@
    -{
    -  "name": "core_plugin_legacy",
    -  "version": "1.0.0",
    -  "main": "index.ts",
    -  "kibana": {
    -    "version": "kibana",
    -    "templateVersion": "1.0.0"
    -  },
    -  "license": "Apache-2.0",
    -  "scripts": {
    -    "kbn": "node ../../../../scripts/kbn.js",
    -    "build": "rm -rf './target' && tsc"
    -  },
    -  "devDependencies": {
    -    "typescript": "3.9.5"
    -  }
    -}
    diff --git a/test/plugin_functional/plugins/core_plugin_legacy/public/application.tsx b/test/plugin_functional/plugins/core_plugin_legacy/public/application.tsx
    deleted file mode 100644
    index ade618ca6cc46..0000000000000
    --- a/test/plugin_functional/plugins/core_plugin_legacy/public/application.tsx
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -/*
    - * Licensed to Elasticsearch B.V. under one or more contributor
    - * license agreements. See the NOTICE file distributed with
    - * this work for additional information regarding copyright
    - * ownership. Elasticsearch B.V. licenses this file to you under
    - * the Apache License, Version 2.0 (the "License"); you may
    - * not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *    http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing,
    - * software distributed under the License is distributed on an
    - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    - * KIND, either express or implied.  See the License for the
    - * specific language governing permissions and limitations
    - * under the License.
    - */
    -
    -import React from 'react';
    -import ReactDOM from 'react-dom';
    -
    -import { AppMountContext, AppMountParameters } from 'kibana/public';
    -
    -const App = () => 

    core_legacy_compat

    ; - -export const renderApp = ( - context: AppMountContext, - { appBasePath, element }: AppMountParameters -) => { - ReactDOM.render(, element); - - return () => ReactDOM.unmountComponentAtNode(element); -}; diff --git a/test/plugin_functional/plugins/core_plugin_legacy/public/index.ts b/test/plugin_functional/plugins/core_plugin_legacy/public/index.ts deleted file mode 100644 index 51b5d2aaf3587..0000000000000 --- a/test/plugin_functional/plugins/core_plugin_legacy/public/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { npSetup } from 'ui/new_platform'; - -npSetup.core.application.register({ - id: 'core_legacy_compat', - title: 'Core Legacy Compat', - async mount(context, params) { - const { renderApp } = await import('./application'); - return renderApp(context, params); - }, -}); diff --git a/test/plugin_functional/plugins/core_plugin_legacy/tsconfig.json b/test/plugin_functional/plugins/core_plugin_legacy/tsconfig.json deleted file mode 100644 index 1ba21f11b7de2..0000000000000 --- a/test/plugin_functional/plugins/core_plugin_legacy/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../../../../tsconfig.json", - "compilerOptions": { - "outDir": "./target", - "skipLibCheck": true - }, - "include": [ - "index.ts", - "public/**/*.ts", - "public/**/*.tsx", - "server/**/*.ts", - "../../../../typings/**/*", - ], - "exclude": [] -} diff --git a/test/plugin_functional/plugins/legacy_plugin/index.ts b/test/plugin_functional/plugins/legacy_plugin/index.ts deleted file mode 100644 index fe171cb24e7b7..0000000000000 --- a/test/plugin_functional/plugins/legacy_plugin/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -// eslint-disable-next-line import/no-default-export -export default function (kibana: any) { - return new kibana.Plugin({ - id: 'legacy_plugin', - require: ['kibana'], - uiExports: { - app: { - id: 'legacy_app', - title: 'Legacy App', - description: 'This is a sample plugin to test legacy apps', - main: 'plugins/legacy_plugin/index', - }, - }, - }); -} diff --git a/test/plugin_functional/plugins/legacy_plugin/package.json b/test/plugin_functional/plugins/legacy_plugin/package.json deleted file mode 100644 index c8ec7ffac865b..0000000000000 --- a/test/plugin_functional/plugins/legacy_plugin/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "legacy_plugin", - "version": "1.0.0", - "main": "index.tsx", - "kibana": { - "version": "kibana", - "templateVersion": "1.0.0" - }, - "license": "Apache-2.0", - "scripts": { - "kbn": "node ../../../../scripts/kbn.js", - "build": "rm -rf './target' && tsc" - }, - "devDependencies": { - "typescript": "3.9.5" - } -} diff --git a/test/plugin_functional/plugins/legacy_plugin/public/index.tsx b/test/plugin_functional/plugins/legacy_plugin/public/index.tsx deleted file mode 100644 index aa1b6b068d588..0000000000000 --- a/test/plugin_functional/plugins/legacy_plugin/public/index.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { IScope } from 'angular'; -import React from 'react'; -import ReactDOM from 'react-dom'; - -import chrome from 'ui/chrome'; - -const App = () =>

    legacy_app

    ; - -chrome.setRootController('legacy_app', ($scope: IScope, $element: JQLite) => { - const element = $element[0]; - - ReactDOM.render(, element); - $scope.$on('$destroy', () => { - ReactDOM.unmountComponentAtNode(element); - }); -}); diff --git a/test/plugin_functional/plugins/legacy_plugin/tsconfig.json b/test/plugin_functional/plugins/legacy_plugin/tsconfig.json deleted file mode 100644 index 1ba21f11b7de2..0000000000000 --- a/test/plugin_functional/plugins/legacy_plugin/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../../../../tsconfig.json", - "compilerOptions": { - "outDir": "./target", - "skipLibCheck": true - }, - "include": [ - "index.ts", - "public/**/*.ts", - "public/**/*.tsx", - "server/**/*.ts", - "../../../../typings/**/*", - ], - "exclude": [] -} diff --git a/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts b/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts index 98c59717fcac0..7c1e2bc561ac8 100644 --- a/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts +++ b/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts @@ -54,26 +54,5 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide expect(await browser.getCurrentUrl()).to.eql(getKibanaUrl('/app/appleave2')); }); }); - - describe('when navigating to a legacy app', () => { - it('prevents navigation if user click cancel on the alert dialog', async () => { - await PageObjects.common.navigateToApp('appleave1'); - await appsMenu.clickLink('Core Legacy Compat', { closeCollapsibleNav: false }); - - const alert = await browser.getAlert(); - expect(alert).not.to.eql(null); - alert!.dismiss(); - expect(await browser.getCurrentUrl()).to.eql(getKibanaUrl('/app/appleave1')); - }); - it('allows navigation if user click leave on the alert dialog', async () => { - await PageObjects.common.navigateToApp('appleave1'); - await appsMenu.clickLink('Core Legacy Compat', { closeCollapsibleNav: false }); - - const alert = await browser.getAlert(); - expect(alert).not.to.eql(null); - alert!.accept(); - expect(await browser.getCurrentUrl()).to.eql(getKibanaUrl('/app/core_legacy_compat')); - }); - }); }); } diff --git a/test/plugin_functional/test_suites/core_plugins/index.ts b/test/plugin_functional/test_suites/core_plugins/index.ts index cc498fa10818f..3d7cc751175c6 100644 --- a/test/plugin_functional/test_suites/core_plugins/index.ts +++ b/test/plugin_functional/test_suites/core_plugins/index.ts @@ -22,7 +22,6 @@ export default function ({ loadTestFile }: PluginFunctionalProviderContext) { describe('core plugins', () => { loadTestFile(require.resolve('./applications')); loadTestFile(require.resolve('./elasticsearch_client')); - loadTestFile(require.resolve('./legacy_plugins')); loadTestFile(require.resolve('./server_plugins')); loadTestFile(require.resolve('./ui_plugins')); loadTestFile(require.resolve('./ui_settings')); diff --git a/test/plugin_functional/test_suites/core_plugins/legacy_plugins.ts b/test/plugin_functional/test_suites/core_plugins/legacy_plugins.ts deleted file mode 100644 index d03185796000f..0000000000000 --- a/test/plugin_functional/test_suites/core_plugins/legacy_plugins.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import expect from '@kbn/expect'; -import { PluginFunctionalProviderContext } from '../../services'; - -export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { - const PageObjects = getPageObjects(['common']); - const testSubjects = getService('testSubjects'); - const supertest = getService('supertest'); - - describe('legacy plugins', () => { - describe('http', () => { - it('has access to New Platform HTTP service', async () => { - await supertest - .get('/api/np-http-in-legacy') - .expect(200) - .expect('Pong in legacy via new platform: true'); - }); - - it('has access to New Platform HTTP context providers', async () => { - await supertest - .get('/api/np-context-in-legacy') - .expect(200) - .expect(JSON.stringify({ contexts: ['core', 'pluginA'] })); - }); - }); - - describe('application service compatibility layer', () => { - it('can render legacy apps', async () => { - await PageObjects.common.navigateToApp('core_legacy_compat'); - expect(await testSubjects.exists('coreLegacyCompatH1')).to.be(true); - }); - }); - }); -} diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index 08fd576c036a4..5b83d2d565411 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -104,42 +104,6 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide expect(await exists('renderingHeader')).to.be(true); }); - it('renders "legacy" application', async () => { - await navigateTo('/render/legacy_app'); - - const [loadingMessage, legacyMode, userSettings] = await Promise.all([ - findLoadingMessage(), - getLegacyMode(), - getUserSettings(), - ]); - - expect(legacyMode).to.be(true); - expect(userSettings).to.not.be.empty(); - - await find.waitForElementStale(loadingMessage); - - expect(await exists('legacyAppH1')).to.be(true); - expect(await exists('renderingHeader')).to.be(false); - }); - - it('renders "legacy" application without user settings', async () => { - await navigateTo('/render/legacy_app?includeUserSettings=false'); - - const [loadingMessage, legacyMode, userSettings] = await Promise.all([ - findLoadingMessage(), - getLegacyMode(), - getUserSettings(), - ]); - - expect(legacyMode).to.be(true); - expect(userSettings).to.be.empty(); - - await find.waitForElementStale(loadingMessage); - - expect(await exists('legacyAppH1')).to.be(true); - expect(await exists('renderingHeader')).to.be(false); - }); - it('navigates between standard application and one with custom appRoute', async () => { await navigateTo('/'); await find.waitForElementStale(await findLoadingMessage()); diff --git a/test/scripts/jenkins_xpack.sh b/test/scripts/jenkins_xpack.sh index 77480554f738c..6a56b11344af5 100755 --- a/test/scripts/jenkins_xpack.sh +++ b/test/scripts/jenkins_xpack.sh @@ -3,12 +3,6 @@ source test/scripts/jenkins_test_setup.sh if [[ -z "$CODE_COVERAGE" ]] ; then - echo " -> Building legacy styles for x-pack canvas storyshot tests" - cd "$KIBANA_DIR" - node scripts/build_sass - echo "" - echo "" - echo " -> Running jest tests" cd "$XPACK_DIR" checks-reporter-with-killswitch "X-Pack Jest" node --max-old-space-size=6144 scripts/jest --ci --verbose diff --git a/test/server_integration/config.js b/test/server_integration/config.js index aa9266321664c..b4571dfe68ec4 100644 --- a/test/server_integration/config.js +++ b/test/server_integration/config.js @@ -43,7 +43,6 @@ export default async function ({ readConfigFile }) { ...functionalConfig.get('kbnTestServer'), serverArgs: [ ...functionalConfig.get('kbnTestServer.serverArgs'), - '--optimize.enabled=true', '--elasticsearch.healthCheck.delay=3600000', '--server.xsrf.disableProtection=true', ], diff --git a/test/server_integration/http/cache/index.js b/test/server_integration/http/cache/index.js index 8cca8cf7bd99d..5299ce361327e 100644 --- a/test/server_integration/http/cache/index.js +++ b/test/server_integration/http/cache/index.js @@ -37,10 +37,7 @@ export default function ({ getService }) { }); it('allows the bootstrap bundles to be cached', async () => { - await supertest - .get('/bundles/app/any-old-id-works/bootstrap.js') - .expect('Cache-Control', 'must-revalidate') - .expect(200); + await supertest.get('/bootstrap.js').expect('Cache-Control', 'must-revalidate').expect(200); }); }); } diff --git a/webpackShims/.eslintrc b/webpackShims/.eslintrc deleted file mode 100644 index 4e9ed6ff84316..0000000000000 --- a/webpackShims/.eslintrc +++ /dev/null @@ -1,2 +0,0 @@ -rules: - no-var: 0 diff --git a/webpackShims/ace.js b/webpackShims/ace.js deleted file mode 100644 index 61f319be574dd..0000000000000 --- a/webpackShims/ace.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -require('brace'); -require('brace/mode/json'); -require('../node_modules/@elastic/ui-ace/ui-ace'); - -module.exports = window.ace; diff --git a/webpackShims/elasticsearch.js b/webpackShims/elasticsearch.js deleted file mode 100644 index d0ab61818d7a7..0000000000000 --- a/webpackShims/elasticsearch.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -module.exports = false; -throw new Error( - 'The elasticsearch npm module is not designed for use in the browser. Please use elasticsearch-browser' -); diff --git a/webpackShims/lru-cache.js b/webpackShims/lru-cache.js deleted file mode 100644 index 9cc11a516378e..0000000000000 --- a/webpackShims/lru-cache.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -module.exports = require('../node_modules/lru-cache'); diff --git a/webpackShims/mocha.js b/webpackShims/mocha.js deleted file mode 100644 index 9ab12381b643c..0000000000000 --- a/webpackShims/mocha.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -module.exports = require('../node_modules/mocha/mocha.js'); diff --git a/webpackShims/sinon.js b/webpackShims/sinon.js deleted file mode 100644 index e201f405fb127..0000000000000 --- a/webpackShims/sinon.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -require('script-loader!../node_modules/sinon/pkg/sinon.js'); -module.exports = window.sinon; diff --git a/x-pack/.kibana-plugin-helpers.json b/x-pack/.kibana-plugin-helpers.json index ca0cae6dd3ca3..c73f2ec595a2a 100644 --- a/x-pack/.kibana-plugin-helpers.json +++ b/x-pack/.kibana-plugin-helpers.json @@ -19,7 +19,6 @@ "legacy/plugins/**/*", "legacy/server/**/*", "typings/**/*", - "webpackShims/*", "!**/README.md", "!__tests__", "!__tests__/**/*", diff --git a/x-pack/legacy/plugins/security/index.ts b/x-pack/legacy/plugins/security/index.ts index addeef34f63bf..3ab5126e52c5f 100644 --- a/x-pack/legacy/plugins/security/index.ts +++ b/x-pack/legacy/plugins/security/index.ts @@ -13,7 +13,6 @@ export const security = (kibana: Record) => publicDir: resolve(__dirname, 'public'), require: ['kibana'], configPrefix: 'xpack.security', - uiExports: { hacks: ['plugins/security/hacks/legacy'] }, config: (Joi: Root) => Joi.object({ enabled: Joi.boolean().default(true) }) .unknown() diff --git a/x-pack/legacy/plugins/security/public/hacks/legacy.ts b/x-pack/legacy/plugins/security/public/hacks/legacy.ts deleted file mode 100644 index ca7e3b7ce5190..0000000000000 --- a/x-pack/legacy/plugins/security/public/hacks/legacy.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -// @ts-ignore -import { uiModules } from 'ui/modules'; -import { npSetup, npStart } from 'ui/new_platform'; -import routes from 'ui/routes'; -import { isSystemApiRequest } from '../../../../../../src/plugins/kibana_legacy/public'; -import { SecurityPluginSetup } from '../../../../../plugins/security/public'; - -const securityPluginSetup = (npSetup.plugins as any).security as SecurityPluginSetup; -if (securityPluginSetup) { - routes.when('/account', { - template: '
    ', - controller: () => npStart.core.application.navigateToApp('security_account'), - }); - - const getNextParameter = () => { - const { location } = window; - const next = encodeURIComponent(`${location.pathname}${location.search}${location.hash}`); - return `&next=${next}`; - }; - - const getProviderParameter = (tenant: string) => { - const key = `${tenant}/session_provider`; - const providerName = sessionStorage.getItem(key); - return providerName ? `&provider=${encodeURIComponent(providerName)}` : ''; - }; - - const module = uiModules.get('security', []); - module.config(($httpProvider: ng.IHttpProvider) => { - $httpProvider.interceptors.push(($q, $window, Promise) => { - const isAnonymous = npSetup.core.http.anonymousPaths.isAnonymous(window.location.pathname); - - function interceptorFactory(responseHandler: (response: ng.IHttpResponse) => any) { - return function interceptor(response: ng.IHttpResponse) { - if (!isAnonymous && !isSystemApiRequest(response.config)) { - securityPluginSetup.sessionTimeout.extend(response.config.url); - } - - if (response.status !== 401 || isAnonymous) { - return responseHandler(response); - } - - const { logoutUrl, tenant } = securityPluginSetup.__legacyCompat; - const next = getNextParameter(); - const provider = getProviderParameter(tenant); - - $window.location.href = `${logoutUrl}?msg=SESSION_EXPIRED${next}${provider}`; - - return Promise.halt(); - }; - } - - return { - response: interceptorFactory((response) => response), - responseError: interceptorFactory($q.reject), - }; - }); - }); -} diff --git a/x-pack/legacy/plugins/spaces/index.ts b/x-pack/legacy/plugins/spaces/index.ts index 79c57e564b4e1..40339f198df6d 100644 --- a/x-pack/legacy/plugins/spaces/index.ts +++ b/x-pack/legacy/plugins/spaces/index.ts @@ -25,10 +25,6 @@ export const spaces = (kibana: Record) => .default(); }, uiExports: { - managementSections: [], - apps: [], - hacks: ['plugins/spaces/legacy'], - home: [], injectDefaultVars(server: Server) { return { serverBasePath: server.config().get('server.basePath'), diff --git a/x-pack/legacy/plugins/spaces/public/legacy.ts b/x-pack/legacy/plugins/spaces/public/legacy.ts deleted file mode 100644 index 277d6a10547b2..0000000000000 --- a/x-pack/legacy/plugins/spaces/public/legacy.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { npSetup } from 'ui/new_platform'; -import routes from 'ui/routes'; -import { SpacesPluginSetup } from '../../../../plugins/spaces/public'; - -const spaces = (npSetup.plugins as any).spaces as SpacesPluginSetup; -if (spaces) { - routes.when('/management/spaces/list', { redirectTo: '/management/kibana/spaces' }); - routes.when('/management/spaces/create', { redirectTo: '/management/kibana/spaces/create' }); - routes.when('/management/spaces/edit/:spaceId', { - redirectTo: '/management/kibana/spaces/edit/:spaceId', - }); -} diff --git a/x-pack/legacy/plugins/xpack_main/index.js b/x-pack/legacy/plugins/xpack_main/index.js index b3d4a5fa8214b..b83c5a5ff606e 100644 --- a/x-pack/legacy/plugins/xpack_main/index.js +++ b/x-pack/legacy/plugins/xpack_main/index.js @@ -5,7 +5,6 @@ */ import { resolve } from 'path'; -import dedent from 'dedent'; import { mirrorPluginStatus } from '../../server/lib/mirror_plugin_status'; import { replaceInjectedVars } from './server/lib/replace_injected_vars'; import { setupXPackMain } from './server/lib/setup_xpack_main'; @@ -35,7 +34,6 @@ export const xpackMain = (kibana) => { }, uiExports: { - hacks: ['plugins/xpack_main/hacks/check_xpack_info_change'], replaceInjectedVars, injectDefaultVars(server) { const config = server.config(); @@ -45,15 +43,6 @@ export const xpackMain = (kibana) => { spacesEnabled: config.get('xpack.spaces.enabled'), }; }, - __webpackPluginProvider__(webpack) { - return new webpack.BannerPlugin({ - banner: dedent` - /*! Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one or more contributor license agreements. - * Licensed under the Elastic License; you may not use this file except in compliance with the Elastic License. */ - `, - raw: true, - }); - }, }, init(server) { diff --git a/x-pack/legacy/plugins/xpack_main/public/components/index.js b/x-pack/legacy/plugins/xpack_main/public/components/index.js deleted file mode 100644 index 0fe056ec0d46f..0000000000000 --- a/x-pack/legacy/plugins/xpack_main/public/components/index.js +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -export { LicenseStatus } from '../../../../../plugins/license_management/public/application/sections/license_dashboard/license_status/license_status'; - -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -export { AddLicense } from '../../../../../plugins/license_management/public/application/sections/license_dashboard/add_license/add_license'; - -/* - * For to link to management - */ -export { BASE_PATH as MANAGEMENT_BASE_PATH } from '../../../../../plugins/license_management/common/constants'; diff --git a/x-pack/legacy/plugins/xpack_main/public/hacks/check_xpack_info_change.js b/x-pack/legacy/plugins/xpack_main/public/hacks/check_xpack_info_change.js deleted file mode 100644 index 9047cdc15e93c..0000000000000 --- a/x-pack/legacy/plugins/xpack_main/public/hacks/check_xpack_info_change.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { identity } from 'lodash'; -import { uiModules } from 'ui/modules'; -import { Path } from 'plugins/xpack_main/services/path'; -import { xpackInfo } from 'plugins/xpack_main/services/xpack_info'; -import { xpackInfoSignature } from 'plugins/xpack_main/services/xpack_info_signature'; - -const module = uiModules.get('xpack_main', []); - -module.factory('checkXPackInfoChange', ($q, Private, $injector) => { - /** - * Intercept each network response to look for the kbn-xpack-sig header. - * When that header is detected, compare its value with the value cached - * in the browser storage. When the value is new, call `xpackInfo.refresh()` - * so that it will pull down the latest x-pack info - * - * @param {object} response - the angular $http response object - * @param {function} handleResponse - callback, expects to receive the response - * @return - */ - function interceptor(response, handleResponse) { - if (Path.isUnauthenticated()) { - return handleResponse(response); - } - - const currentSignature = response.headers('kbn-xpack-sig'); - const cachedSignature = xpackInfoSignature.get(); - - if (currentSignature && cachedSignature !== currentSignature) { - // Signature from the server differ from the signature of our - // cached info, so we need to refresh it. - // Intentionally swallowing this error - // because nothing catches it and it's an ugly console error. - xpackInfo.refresh($injector).catch(() => {}); - } - - return handleResponse(response); - } - - return { - response: (response) => interceptor(response, identity), - responseError: (response) => interceptor(response, $q.reject), - }; -}); - -module.config(($httpProvider) => { - $httpProvider.interceptors.push('checkXPackInfoChange'); -}); diff --git a/x-pack/legacy/plugins/xpack_main/public/jquery_flot/index.js b/x-pack/legacy/plugins/xpack_main/public/jquery_flot/index.js deleted file mode 100644 index abf060aca8c08..0000000000000 --- a/x-pack/legacy/plugins/xpack_main/public/jquery_flot/index.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { default } from './jquery_flot'; diff --git a/x-pack/legacy/plugins/xpack_main/public/jquery_flot/jquery_flot.js b/x-pack/legacy/plugins/xpack_main/public/jquery_flot/jquery_flot.js deleted file mode 100644 index 696ff500f3c28..0000000000000 --- a/x-pack/legacy/plugins/xpack_main/public/jquery_flot/jquery_flot.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import $ from 'jquery'; -if (window) { - window.jQuery = $; -} -import 'ui/flot-charts/jquery.flot'; - -// load flot plugins -// avoid the `canvas` plugin, it causes blurry fonts -import 'ui/flot-charts/jquery.flot.time'; -import 'ui/flot-charts/jquery.flot.crosshair'; -import 'ui/flot-charts/jquery.flot.selection'; - -export default $; diff --git a/x-pack/legacy/plugins/xpack_main/public/services/__tests__/_mock_window.js b/x-pack/legacy/plugins/xpack_main/public/services/__tests__/_mock_window.js deleted file mode 100644 index 5e4e0dbf6c6be..0000000000000 --- a/x-pack/legacy/plugins/xpack_main/public/services/__tests__/_mock_window.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -const items = {}; -export const mockWindow = { - sessionStorage: { - setItem(key, value) { - items[key] = value; - }, - getItem(key) { - return items[key]; - }, - removeItem(key) { - delete items[key]; - }, - }, - location: { - pathname: '', - }, -}; diff --git a/x-pack/legacy/plugins/xpack_main/public/services/__tests__/xpack_info.js b/x-pack/legacy/plugins/xpack_main/public/services/__tests__/xpack_info.js deleted file mode 100644 index e951590c399e1..0000000000000 --- a/x-pack/legacy/plugins/xpack_main/public/services/__tests__/xpack_info.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { xpackInfo } from 'plugins/xpack_main/services/xpack_info'; - -const XPACK_INFO_KEY = 'xpackMain.info'; - -describe('xpack_info service', () => { - afterEach(() => { - sessionStorage.clear(); - }); - - it('updates the stored xpack info', () => { - const updatedXPackInfo = { - foo: { - bar: 17, - }, - }; - xpackInfo.setAll(updatedXPackInfo); - expect(sessionStorage.getItem(XPACK_INFO_KEY)).to.be(JSON.stringify(updatedXPackInfo)); - expect(xpackInfo.get('foo.bar')).to.be(17); - }); - - it('clears the stored xpack info', () => { - const updatedXPackInfo = { - foo: { - bar: 17, - }, - }; - xpackInfo.setAll(updatedXPackInfo); - expect(xpackInfo.get('foo.bar')).not.to.be(null); - - xpackInfo.clear(); - expect(sessionStorage.getItem(XPACK_INFO_KEY)).to.be(null); - expect(xpackInfo.get('foo.bar')).to.be(undefined); - }); - - it('defaults to the provided default value if the requested path is not found', () => { - xpackInfo.setAll({ foo: 'bar' }); - expect(xpackInfo.get('foo.baz', 17)).to.be(17); - }); -}); diff --git a/x-pack/legacy/plugins/xpack_main/public/services/__tests__/xpack_info_signature.js b/x-pack/legacy/plugins/xpack_main/public/services/__tests__/xpack_info_signature.js deleted file mode 100644 index 3a8bd99257995..0000000000000 --- a/x-pack/legacy/plugins/xpack_main/public/services/__tests__/xpack_info_signature.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { xpackInfoSignature } from 'plugins/xpack_main/services/xpack_info_signature'; - -describe('xpack_info_signature service', () => { - it('updates the stored xpack info signature', () => { - const updatedXPackInfoSignature = 'foobar'; - xpackInfoSignature.set(updatedXPackInfoSignature); - expect(xpackInfoSignature.get()).to.be(updatedXPackInfoSignature); - }); - - it('clears the stored xpack info signature', () => { - const updatedXPackInfoSignature = 'foobar'; - xpackInfoSignature.set(updatedXPackInfoSignature); - expect(xpackInfoSignature.get()).not.to.be(undefined); - xpackInfoSignature.clear(); - expect(xpackInfoSignature.get()).to.be(null); - }); -}); diff --git a/x-pack/legacy/plugins/xpack_main/public/services/path.js b/x-pack/legacy/plugins/xpack_main/public/services/path.js deleted file mode 100644 index d2fe550178e61..0000000000000 --- a/x-pack/legacy/plugins/xpack_main/public/services/path.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import chrome from 'ui/chrome'; - -export const Path = { - isUnauthenticated() { - const path = chrome.removeBasePath(window.location.pathname); - return ( - path === '/login' || - path === '/logout' || - path === '/security/logged_out' || - path === '/status' - ); - }, -}; diff --git a/x-pack/legacy/plugins/xpack_main/public/services/xpack_info.js b/x-pack/legacy/plugins/xpack_main/public/services/xpack_info.js deleted file mode 100644 index 8e514b7040520..0000000000000 --- a/x-pack/legacy/plugins/xpack_main/public/services/xpack_info.js +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { get } from 'lodash'; -import chrome from 'ui/chrome'; -import { xpackInfoSignature } from './xpack_info_signature'; -import { convertKeysToCamelCaseDeep } from '../../../../server/lib/key_case_converter'; - -const XPACK_INFO_KEY = 'xpackMain.info'; - -export class XPackInfo { - constructor(initialInfo = {}) { - this.inProgressRefreshPromise = null; - this.setAll(initialInfo); - } - - get = (path, defaultValue = undefined) => { - const xpackInfoValuesJson = window.sessionStorage.getItem(XPACK_INFO_KEY); - const xpackInfoValues = xpackInfoValuesJson ? JSON.parse(xpackInfoValuesJson) : {}; - return get(xpackInfoValues, path, defaultValue); - }; - - setAll = (updatedXPackInfo) => { - // The decision to convert kebab-case/snake-case keys to camel-case keys stemmed from an old - // convention of using kebabe-case/snake-case in API response bodies but camel-case in JS - // objects. See pull #29304 for more info. - const camelCasedXPackInfo = convertKeysToCamelCaseDeep(updatedXPackInfo); - // guarding sessionStorage for testing - typeof sessionStorage !== 'undefined' && - sessionStorage.setItem(XPACK_INFO_KEY, JSON.stringify(camelCasedXPackInfo)); - }; - - clear = () => { - sessionStorage.removeItem(XPACK_INFO_KEY); - }; - - refresh = ($injector) => { - if (this.inProgressRefreshPromise) { - return this.inProgressRefreshPromise; - } - - // store the promise in a shared location so that calls to - // refresh() before this is complete will get the same promise - const $http = $injector.get('$http'); - this.inProgressRefreshPromise = $http - .get(chrome.addBasePath('/api/xpack/v1/info')) - .catch((err) => { - // if we are unable to fetch the updated info, we should - // prevent reusing stale info - this.clear(); - xpackInfoSignature.clear(); - throw err; - }) - .then((xpackInfoResponse) => { - this.setAll(xpackInfoResponse.data); - xpackInfoSignature.set(xpackInfoResponse.headers('kbn-xpack-sig')); - }) - .finally(() => { - this.inProgressRefreshPromise = null; - }); - return this.inProgressRefreshPromise; - }; - - getLicense = () => { - return this.get('license', { - isActive: false, - type: undefined, - expiryDateInMillis: undefined, - }); - }; -} - -export const xpackInfo = new XPackInfo(chrome.getInjected('xpackInitialInfo')); diff --git a/x-pack/legacy/plugins/xpack_main/public/services/xpack_info_signature.js b/x-pack/legacy/plugins/xpack_main/public/services/xpack_info_signature.js deleted file mode 100644 index 75aba933d37e1..0000000000000 --- a/x-pack/legacy/plugins/xpack_main/public/services/xpack_info_signature.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -const XPACK_INFO_SIG_KEY = 'xpackMain.infoSignature'; - -export const xpackInfoSignature = { - get() { - return sessionStorage.getItem(XPACK_INFO_SIG_KEY); - }, - set(updatedXPackInfoSignature) { - sessionStorage.setItem(XPACK_INFO_SIG_KEY, updatedXPackInfoSignature); - }, - clear() { - sessionStorage.removeItem(XPACK_INFO_SIG_KEY); - }, -}; diff --git a/x-pack/plugins/canvas/public/components/datasource/datasource_preview/datasource_preview.js b/x-pack/plugins/canvas/public/components/datasource/datasource_preview/datasource_preview.js index 13cd2c5cd11f7..75f2736be3946 100644 --- a/x-pack/plugins/canvas/public/components/datasource/datasource_preview/datasource_preview.js +++ b/x-pack/plugins/canvas/public/components/datasource/datasource_preview/datasource_preview.js @@ -5,7 +5,6 @@ */ import React from 'react'; -import { FormattedMessage } from '@kbn/i18n/react'; import PropTypes from 'prop-types'; import { EuiOverlayMask, @@ -18,6 +17,7 @@ import { EuiEmptyPrompt, EuiSpacer, } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; import { Datatable } from '../../datatable'; import { Error } from '../../error'; import { ComponentStrings } from '../../../../i18n'; diff --git a/x-pack/plugins/canvas/public/expression_types/arg_types/font.js b/x-pack/plugins/canvas/public/expression_types/arg_types/font.js index 5d0e6b3dd688e..553d6c4ab5642 100644 --- a/x-pack/plugins/canvas/public/expression_types/arg_types/font.js +++ b/x-pack/plugins/canvas/public/expression_types/arg_types/font.js @@ -6,8 +6,8 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { set } from '@elastic/safer-lodash-set'; import { get, mapValues } from 'lodash'; +import { set } from '@elastic/safer-lodash-set'; import { openSans } from '../../../common/lib/fonts'; import { templateFromReactComponent } from '../../lib/template_from_react_component'; import { TextStylePicker } from '../../components/text_style_picker'; diff --git a/x-pack/plugins/canvas/scripts/shareable_runtime.js b/x-pack/plugins/canvas/scripts/shareable_runtime.js index f867e4dc77a11..a5f5f953727ac 100644 --- a/x-pack/plugins/canvas/scripts/shareable_runtime.js +++ b/x-pack/plugins/canvas/scripts/shareable_runtime.js @@ -30,12 +30,6 @@ run( buffer: false, }; - log.info('pre-req: Ensuring Kibana SCSS is built.'); - // Ensure SASS has been built completely before building the runtime. - execa.sync(process.execPath, ['scripts/build_sass'], { - ...options, - }); - const webpackConfig = path.resolve(SHAREABLE_RUNTIME_SRC, 'webpack.config.js'); const clean = () => { diff --git a/x-pack/plugins/canvas/scripts/storybook.js b/x-pack/plugins/canvas/scripts/storybook.js index 671de53d74407..23703810569b6 100644 --- a/x-pack/plugins/canvas/scripts/storybook.js +++ b/x-pack/plugins/canvas/scripts/storybook.js @@ -12,11 +12,6 @@ const storybook = require('@storybook/react/standalone'); const execa = require('execa'); const { DLL_OUTPUT } = require('./../storybook/constants'); -const options = { - stdio: ['ignore', 'inherit', 'inherit'], - buffer: false, -}; - const storybookOptions = { configDir: path.resolve(__dirname, './../storybook'), mode: 'dev', @@ -35,12 +30,6 @@ run( } } - // Ensure SASS dependencies have been built before doing anything. - execa.sync(process.execPath, ['scripts/build_sass'], { - cwd: path.resolve(__dirname, '../../../..'), - ...options, - }); - // Build the DLL if necessary. if (fs.existsSync(DLL_OUTPUT)) { log.info('storybook: DLL exists from previous build; skipping'); @@ -101,12 +90,6 @@ run( log.info('storybook: Starting Storybook'); - // Watch the SASS sheets for changes - execa(process.execPath, ['scripts/build_sass', '--watch'], { - cwd: path.resolve(__dirname, '../../../..'), - ...options, - }); - if (addon) { execa('node', ['scripts/build', '--watch'], { cwd: path.resolve(__dirname, '../storybook/addon'), diff --git a/x-pack/plugins/canvas/shareable_runtime/index.ts b/x-pack/plugins/canvas/shareable_runtime/index.ts index 11ada0a468cb2..6e32bd9014d46 100644 --- a/x-pack/plugins/canvas/shareable_runtime/index.ts +++ b/x-pack/plugins/canvas/shareable_runtime/index.ts @@ -5,23 +5,8 @@ */ export * from './api'; -import '../../../../built_assets/css/plugins/kibana/index.light.css'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import '../../../../src/core/server/core_app/assets/legacy_light_theme.css'; import '../public/style/index.scss'; import '@elastic/eui/dist/eui_theme_light.css'; import '@kbn/ui-framework/dist/kui_light.css'; - -const css = require.context( - '../../../../built_assets/css', - true, - /\.\/plugins\/(?!canvas).*light\.css/ -); -css.keys().forEach((filename) => { - css(filename); -}); - -const uiStyles = require.context( - '../../../../src/legacy/ui/public/styles', - false, - /[\/\\](?!mixins|variables|_|\.|bootstrap_(light|dark))[^\/\\]+\.less/ -); -uiStyles.keys().forEach((key) => uiStyles(key)); diff --git a/x-pack/plugins/canvas/shareable_runtime/webpack.config.js b/x-pack/plugins/canvas/shareable_runtime/webpack.config.js index 43e422a161569..3517c958b27b8 100644 --- a/x-pack/plugins/canvas/shareable_runtime/webpack.config.js +++ b/x-pack/plugins/canvas/shareable_runtime/webpack.config.js @@ -43,6 +43,7 @@ module.exports = { 'src/legacy/core_plugins/interpreter/public/types' ), tinymath: path.resolve(KIBANA_ROOT, 'node_modules/tinymath/lib/tinymath.es5.js'), + core_app_image_assets: path.resolve(KIBANA_ROOT, 'src/core/public/core_app/images'), }, extensions: ['.js', '.json', '.ts', '.tsx', '.scss'], }, @@ -123,22 +124,6 @@ module.exports = { }, ], }, - { - test: /\.less$/, - use: [ - { loader: 'style-loader' }, - { loader: 'css-loader', options: { importLoaders: 2 } }, - { - loader: 'postcss-loader', - options: { - config: { - path: require.resolve('./postcss.config.js'), - }, - }, - }, - { loader: 'less-loader' }, - ], - }, { test: /\.scss$/, exclude: [/node_modules/, /\.module\.s(a|c)ss$/], @@ -161,34 +146,13 @@ module.exports = { }, }, }, - { - loader: 'resolve-url-loader', - options: { - // eslint-disable-next-line no-unused-vars - join: (_, __) => (uri, base) => { - if (!base) { - return null; - } - - // manually force ui/* urls in legacy styles to resolve to ui/legacy/public - if (uri.startsWith('ui/') && base.split(path.sep).includes('legacy')) { - return path.resolve(KIBANA_ROOT, 'src/legacy/ui/public', uri.replace('ui/', '')); - } - - return null; - }, - }, - }, { loader: 'sass-loader', options: { - // must always be enabled as long as we're using the `resolve-url-loader` to - // rewrite `ui/*` urls. They're dropped by subsequent loaders though - sourceMap: true, prependData(loaderContext) { return `@import ${stringifyRequest( loaderContext, - path.resolve(KIBANA_ROOT, 'src/legacy/ui/public/styles/_globals_v7light.scss') + path.resolve(KIBANA_ROOT, 'src/core/public/core_app/styles/_globals_v7light.scss') )};\n`; }, webpackImporter: false, diff --git a/x-pack/plugins/canvas/storybook/constants.js b/x-pack/plugins/canvas/storybook/constants.js index 258bf208ed877..ff0162bf0a200 100644 --- a/x-pack/plugins/canvas/storybook/constants.js +++ b/x-pack/plugins/canvas/storybook/constants.js @@ -8,12 +8,10 @@ const path = require('path'); const DLL_NAME = 'canvas_storybook_dll'; const KIBANA_ROOT = path.resolve(__dirname, '../../../..'); -const BUILT_ASSETS = path.resolve(KIBANA_ROOT, 'built_assets'); -const DLL_OUTPUT = path.resolve(BUILT_ASSETS, DLL_NAME); +const DLL_OUTPUT = path.resolve(KIBANA_ROOT, 'built_assets', DLL_NAME); module.exports = { DLL_NAME, KIBANA_ROOT, - BUILT_ASSETS, DLL_OUTPUT, }; diff --git a/x-pack/plugins/canvas/storybook/dll_contexts.js b/x-pack/plugins/canvas/storybook/dll_contexts.js index 85f2ab66cab88..02ceafd0b3983 100644 --- a/x-pack/plugins/canvas/storybook/dll_contexts.js +++ b/x-pack/plugins/canvas/storybook/dll_contexts.js @@ -8,24 +8,8 @@ // is also require'd in the Storybook config so that the Storybook Webpack instance // is aware of them, and can load them from the DLL. -// Pull in the built CSS produced by the Kibana server, but not -// the Canvas CSS-- we want that in the HMR service. -const css = require.context( - '../../../../built_assets/css', - true, - /\.\/plugins\/(?!canvas).*light\.css/ -); -css.keys().forEach((filename) => { - css(filename); -}); - -// Include Legacy styles -const uiStyles = require.context( - '../../../../src/legacy/ui/public/styles', - false, - /[\/\\](?!mixins|variables|_|\.|bootstrap_(light|dark))[^\/\\]+\.less/ -); -uiStyles.keys().forEach((key) => uiStyles(key)); +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +require('../../../../src/core/server/core_app/assets/legacy_light_theme.css'); const json = require.context('../shareable_runtime/test/workpads', false, /\.json$/); json.keys().forEach((key) => json(key)); diff --git a/x-pack/plugins/canvas/storybook/preview.ts b/x-pack/plugins/canvas/storybook/preview.ts index fc194664c84b8..5eb40cad86d32 100644 --- a/x-pack/plugins/canvas/storybook/preview.ts +++ b/x-pack/plugins/canvas/storybook/preview.ts @@ -25,12 +25,3 @@ startServices({ }); addDecorators(); - -// Only gather and require CSS files related to Canvas. The other CSS files -// are built into the DLL. -const css = require.context( - '../../../../built_assets/css', - true, - /plugins\/(?=canvas).*light\.css/ -); -css.keys().forEach((filename) => css(filename)); diff --git a/x-pack/plugins/canvas/storybook/webpack.config.js b/x-pack/plugins/canvas/storybook/webpack.config.js index 1321ade30bbde..c9817de649c25 100644 --- a/x-pack/plugins/canvas/storybook/webpack.config.js +++ b/x-pack/plugins/canvas/storybook/webpack.config.js @@ -57,7 +57,10 @@ module.exports = async ({ config: storybookConfig }) => { prependData(loaderContext) { return `@import ${stringifyRequest( loaderContext, - path.resolve(KIBANA_ROOT, 'src/legacy/ui/public/styles/_globals_v7light.scss') + path.resolve( + KIBANA_ROOT, + 'src/core/public/core_app/styles/_globals_v7light.scss' + ) )};\n`; }, sassOptions: { diff --git a/x-pack/plugins/canvas/storybook/webpack.dll.config.js b/x-pack/plugins/canvas/storybook/webpack.dll.config.js index 4e54750f08eea..b830f72692ede 100644 --- a/x-pack/plugins/canvas/storybook/webpack.dll.config.js +++ b/x-pack/plugins/canvas/storybook/webpack.dll.config.js @@ -103,22 +103,6 @@ module.exports = { }, ], }, - { - test: /\.less$/, - use: [ - { loader: 'style-loader' }, - { loader: 'css-loader', options: { importLoaders: 2 } }, - { - loader: 'postcss-loader', - options: { - config: { - path: require.resolve('@kbn/optimizer/postcss.config.js'), - }, - }, - }, - { loader: 'less-loader' }, - ], - }, { test: /\.(woff|woff2|ttf|eot|svg|ico)(\?|$)/, loader: 'file-loader', diff --git a/x-pack/plugins/graph/public/application.ts b/x-pack/plugins/graph/public/application.ts index b249fe2be32c7..a9ba464016157 100644 --- a/x-pack/plugins/graph/public/application.ts +++ b/x-pack/plugins/graph/public/application.ts @@ -9,7 +9,11 @@ // They can stay even after NP cutover import angular from 'angular'; import { i18nDirective, i18nFilter, I18nProvider } from '@kbn/i18n/angular'; -import '../../../../webpackShims/ace'; + +import 'brace'; +import 'brace/mode/json'; +import '@elastic/ui-ace/ui-ace'; + // required for i18nIdDirective and `ngSanitize` angular module import 'angular-sanitize'; // required for ngRoute diff --git a/x-pack/test/api_integration/config.ts b/x-pack/test/api_integration/config.ts index 71c5bb82accef..3b4654fc357c0 100644 --- a/x-pack/test/api_integration/config.ts +++ b/x-pack/test/api_integration/config.ts @@ -26,7 +26,6 @@ export async function getApiIntegrationConfig({ readConfigFile }: FtrConfigProvi serverArgs: [ ...xPackFunctionalTestsConfig.get('kbnTestServer.serverArgs'), '--xpack.security.session.idleTimeout=3600000', // 1 hour - '--optimize.enabled=false', '--telemetry.optIn=true', '--xpack.ingestManager.enabled=true', '--xpack.ingestManager.fleet.pollingRequestTimeout=5000', // 5 seconds diff --git a/x-pack/test/login_selector_api_integration/config.ts b/x-pack/test/login_selector_api_integration/config.ts index 67bc2e6f17b56..fb711a8bef488 100644 --- a/x-pack/test/login_selector_api_integration/config.ts +++ b/x-pack/test/login_selector_api_integration/config.ts @@ -112,7 +112,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { serverArgs: [ ...xPackAPITestsConfig.get('kbnTestServer.serverArgs'), `--plugin-path=${oidcIdPPlugin}`, - '--optimize.enabled=false', '--server.ssl.enabled=true', `--server.ssl.key=${KBN_KEY_PATH}`, `--server.ssl.certificate=${KBN_CERT_PATH}`, diff --git a/x-pack/test/saml_api_integration/config.ts b/x-pack/test/saml_api_integration/config.ts index 1bc85a803a7c2..9edadca4c1667 100644 --- a/x-pack/test/saml_api_integration/config.ts +++ b/x-pack/test/saml_api_integration/config.ts @@ -49,7 +49,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { ...xPackAPITestsConfig.get('kbnTestServer'), serverArgs: [ ...xPackAPITestsConfig.get('kbnTestServer.serverArgs'), - '--optimize.enabled=false', `--xpack.security.authc.providers=${JSON.stringify(['saml', 'basic'])}`, '--xpack.security.authc.saml.realm=saml1', '--xpack.security.authc.saml.maxRedirectURLSize=100b', diff --git a/x-pack/test/saved_object_api_integration/common/config.ts b/x-pack/test/saved_object_api_integration/common/config.ts index 378f27082d9e0..4bae8e48173e4 100644 --- a/x-pack/test/saved_object_api_integration/common/config.ts +++ b/x-pack/test/saved_object_api_integration/common/config.ts @@ -53,7 +53,6 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) ...config.xpack.api.get('kbnTestServer'), serverArgs: [ ...config.xpack.api.get('kbnTestServer.serverArgs'), - '--optimize.enabled=false', '--server.xsrf.disableProtection=true', `--plugin-path=${path.join(__dirname, 'fixtures', 'saved_object_test_plugin')}`, ...disabledPlugins.map((key) => `--xpack.${key}.enabled=false`), diff --git a/x-pack/test/spaces_api_integration/common/config.ts b/x-pack/test/spaces_api_integration/common/config.ts index 89a49c7d3d4fa..d734c5a6ba422 100644 --- a/x-pack/test/spaces_api_integration/common/config.ts +++ b/x-pack/test/spaces_api_integration/common/config.ts @@ -62,7 +62,6 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) ...config.xpack.api.get('kbnTestServer'), serverArgs: [ ...config.xpack.api.get('kbnTestServer.serverArgs'), - '--optimize.enabled=false', // disable anonymouse access so that we're testing both on and off in different suites '--status.allowAnonymous=false', '--server.xsrf.disableProtection=true', diff --git a/x-pack/test/token_api_integration/config.js b/x-pack/test/token_api_integration/config.js index 31ec2f1bc6bfb..3e78a98067a8f 100644 --- a/x-pack/test/token_api_integration/config.js +++ b/x-pack/test/token_api_integration/config.js @@ -32,7 +32,6 @@ export default async function ({ readConfigFile }) { ...xPackAPITestsConfig.get('kbnTestServer'), serverArgs: [ ...xPackAPITestsConfig.get('kbnTestServer.serverArgs'), - '--optimize.enabled=false', '--xpack.security.authc.providers=["token"]', ], }, diff --git a/x-pack/test/upgrade_assistant_integration/config.js b/x-pack/test/upgrade_assistant_integration/config.js index 386e34f4f98b7..d11b39ff74e35 100644 --- a/x-pack/test/upgrade_assistant_integration/config.js +++ b/x-pack/test/upgrade_assistant_integration/config.js @@ -31,13 +31,7 @@ export default async function ({ readConfigFile }) { junit: { reportName: 'X-Pack Upgrade Assistant Integration Tests', }, - kbnTestServer: { - ...xPackFunctionalTestsConfig.get('kbnTestServer'), - serverArgs: [ - ...xPackFunctionalTestsConfig.get('kbnTestServer.serverArgs'), - '--optimize.enabled=false', - ], - }, + kbnTestServer: xPackFunctionalTestsConfig.get('kbnTestServer'), esTestCluster: { ...xPackFunctionalTestsConfig.get('esTestCluster'), dataArchive: path.resolve(__dirname, './fixtures/data_archives/upgrade_assistant.zip'), diff --git a/yarn.lock b/yarn.lock index 42c4b800e6b0c..3a6f59fa8ef3f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3399,7 +3399,7 @@ resolved "https://registry.yarnpkg.com/@types/async/-/async-2.0.49.tgz#92e33d13f74c895cb9a7f38ba97db8431ed14bc0" integrity sha512-Benr3i5odUkvpFkOpzGqrltGdbSs+EVCkEBGXbuR7uT0VzhXKIkhem6PDzHdx5EonA+rfbB3QvP6aDOw5+zp5Q== -"@types/babel-types@*", "@types/babel-types@^7.0.0": +"@types/babel-types@*": version "7.0.4" resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.4.tgz#bfd5b0d0d1ba13e351dff65b6e52783b816826c8" integrity sha512-WiZhq3SVJHFRgRYLXvpf65XnV6ipVHhnNaNvE8yCimejrGglkg38kEj0JcizqwSHxmPSjcTlig/6JouxLGEhGw== @@ -3462,13 +3462,6 @@ dependencies: "@types/babel-types" "*" -"@types/babylon@^6.16.2": - version "6.16.3" - resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb" - integrity sha512-lyJ8sW1PbY3uwuvpOBZ9zMYKshMnQpXmeDHh8dj9j2nJm/xrW0FgB5gLSYOArj5X0IfaXnmhFoJnhS4KbqIMug== - dependencies: - "@types/babel-types" "*" - "@types/base64-js@^1.2.5": version "1.2.5" resolved "https://registry.yarnpkg.com/@types/base64-js/-/base64-js-1.2.5.tgz#582b2476169a6cba460a214d476c744441d873d5" @@ -4243,13 +4236,6 @@ dependencies: "@types/node" "*" -"@types/node-sass@^4.11.0": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@types/node-sass/-/node-sass-4.11.0.tgz#b0372075546e83f39df52bd37359eab00165a04d" - integrity sha512-uNpVWhwVmbB5luE7b8vxcJwu5np75YkVTBJS0O3ar+hrxqLfyhOKXg9NYBwJ6mMQX/V6/8d6mMZTB7x2r5x9Bw== - dependencies: - "@types/node" "*" - "@types/node@*", "@types/node@8.10.54", "@types/node@>=10.17.17 <10.20.0", "@types/node@>=8.9.0", "@types/node@^12.0.2": version "10.17.26" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.26.tgz#a8a119960bff16b823be4c617da028570779bcfd" @@ -5332,13 +5318,6 @@ accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-globals@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= - dependencies: - acorn "^4.0.4" - acorn-globals@^4.3.0, acorn-globals@^4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" @@ -5383,16 +5362,11 @@ acorn@5.X, acorn@^5.0.3, acorn@^5.5.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== -acorn@^3.0.4, acorn@^3.1.0: +acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^4.0.4, acorn@~4.0.2: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= - acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" @@ -5418,17 +5392,6 @@ address@^1.0.1: resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" integrity sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg== -adjust-sourcemap-loader@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4" - integrity sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA== - dependencies: - assert "1.4.1" - camelcase "5.0.0" - loader-utils "1.2.3" - object-path "0.11.4" - regex-parser "2.2.10" - adm-zip@0.4.16: version "0.4.16" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" @@ -6185,11 +6148,6 @@ aria-query@3.0.0, aria-query@^3.0.0: ast-types-flow "0.0.7" commander "^2.11.0" -arity-n@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" - integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -6442,7 +6400,7 @@ assert-plus@^0.2.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= -assert@1.4.1, assert@^1.1.1: +assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= @@ -6530,16 +6488,11 @@ async-foreach@^0.1.3: resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= -async-limiter@^1.0.0: +async-limiter@^1.0.0, async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== - async-retry@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.2.3.tgz#a6521f338358d322b1a0012b79030c6f411d1ce0" @@ -6566,33 +6519,12 @@ async-value@^1.2.2: resolved "https://registry.yarnpkg.com/async-value/-/async-value-1.2.2.tgz#84517a1e7cb6b1a5b5e181fa31be10437b7fb125" integrity sha1-hFF6Hny2saW14YH6Mb4QQ3t/sSU= -async@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.4.0.tgz#4990200f18ea5b837c2cc4f8c031a6985c385611" - integrity sha1-SZAgDxjqW4N8LMT4wDGmmFw4VhE= - dependencies: - lodash "^4.14.0" - async@^1.4.2, async@^1.5.2, async@~1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.0.0, async@^2.1.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" - integrity sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw== - dependencies: - lodash "^4.14.0" - -async@^2.6.0, async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== - dependencies: - lodash "^4.17.10" - -async@^2.6.3: +async@^2.0.0, async@^2.1.4, async@^2.6.0, async@^2.6.1, async@^2.6.2, async@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -7832,11 +7764,6 @@ buffer-indexof@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== -buffer-json@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" - integrity sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw== - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -8001,18 +7928,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cache-loader@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz#9948cae353aec0a1fcb1eafda2300816ec85387e" - integrity sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw== - dependencies: - buffer-json "^2.0.0" - find-cache-dir "^3.0.0" - loader-utils "^1.2.3" - mkdirp "^0.5.1" - neo-async "^2.6.1" - schema-utils "^2.0.0" - cacheable-lookup@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz#87be64a18b925234875e10a9bb1ebca4adce6b38" @@ -8166,16 +8081,6 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@5.0.0, camelcase@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" - integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== - -camelcase@5.3.1, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -8196,6 +8101,11 @@ camelcase@^4.0.0, camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelcase@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" @@ -8436,13 +8346,6 @@ character-entities@^1.0.0: resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.1.tgz#f76871be5ef66ddb7f8f8e3478ecc374c27d6dca" integrity sha1-92hxvl72bdt/j440eOzDdMJ9bco= -character-parser@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" - integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= - dependencies: - is-regex "^1.0.3" - character-reference-invalid@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz#942835f750e4ec61a308e60c2ef8cc1011202efc" @@ -8512,7 +8415,7 @@ cheerio@^1.0.0-rc.3: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@2.1.2, chokidar@^2.0.2, chokidar@^2.0.4: +chokidar@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058" integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg== @@ -8561,7 +8464,7 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" -chokidar@^2.0.0, chokidar@^2.1.2, chokidar@^2.1.8: +chokidar@^2.0.0, chokidar@^2.0.4, chokidar@^2.1.2, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -8580,10 +8483,10 @@ chokidar@^2.0.0, chokidar@^2.1.2, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.2.2: - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== +chokidar@^3.2.2, chokidar@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" + integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -8591,7 +8494,7 @@ chokidar@^3.2.2: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.3.0" + readdirp "~3.4.0" optionalDependencies: fsevents "~2.1.2" @@ -8688,7 +8591,7 @@ classnames@2.x: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" integrity sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0= -clean-css@4.2.x, clean-css@^4.1.11: +clean-css@4.2.x: version "4.2.1" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== @@ -9116,15 +9019,10 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@^1.1.2, colors@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" - integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== - -colors@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" - integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== +colors@^1.1.2, colors@^1.2.1, colors@^1.3.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== colors@~1.1.2: version "1.1.2" @@ -9242,13 +9140,6 @@ component-emitter@^1.2.0, component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= -compose-function@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" - integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= - dependencies: - arity-n "^1.0.4" - compress-commons@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-2.1.1.tgz#9410d9a534cf8435e3fbbb7c6ce48de2dc2f0610" @@ -9450,16 +9341,6 @@ constant-case@^2.0.0: snake-case "^2.1.0" upper-case "^1.1.1" -constantinople@^3.0.1, constantinople@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647" - integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw== - dependencies: - "@types/babel-types" "^7.0.0" - "@types/babylon" "^6.16.2" - babel-types "^6.26.0" - babylon "^6.18.0" - constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -9514,23 +9395,13 @@ contour_plot@^0.0.1: resolved "https://registry.yarnpkg.com/contour_plot/-/contour_plot-0.0.1.tgz#475870f032b8e338412aa5fc507880f0bf495c77" integrity sha1-R1hw8DK44zhBKqX8UHiA8L9JXHc= -convert-source-map@1.7.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@1.X, convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" -convert-source-map@1.X, convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= - -convert-source-map@^0.3.3: - version "0.3.5" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" - integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= - cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -10059,7 +9930,7 @@ css.escape@^1.5.1: resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= -css@2.X, css@^2.0.0, css@^2.2.1, css@^2.2.4: +css@2.X, css@^2.2.1, css@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== @@ -10120,11 +9991,6 @@ csstype@^2.2.0, csstype@^2.5.5, csstype@^2.5.7, csstype@^2.6.7: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5" integrity sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ== -cuint@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" - integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= - currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -10492,7 +10358,7 @@ debug@3.1.0, debug@=3.1.0: dependencies: ms "2.0.0" -debug@3.2.6, debug@3.X, debug@^3.0.0, debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: +debug@3.2.6, debug@3.X, debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -10854,11 +10720,6 @@ delete-empty@^2.0.0: relative "^3.0.2" rimraf "^2.6.2" -depd@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -11195,11 +11056,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -doctypes@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" - integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= - dom-converter@~0.2: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -11970,7 +11826,7 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -es6-iterator@2.0.3, es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: +es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= @@ -13232,7 +13088,7 @@ file-exists-dazinatorfork@^1.0.2: resolved "https://registry.yarnpkg.com/file-exists-dazinatorfork/-/file-exists-dazinatorfork-1.0.2.tgz#cd8d0d85f63e39dc81eceb0b687c44a2cca95c47" integrity sha512-r70c72ln2YHzQINNfxDp02hAhbGkt1HffZ+Du8oetWDLjDtFja/Lm10lUaSh9e+wD+7VDvPee0b0C9SAy8pWZg== -file-loader@4.2.0, file-loader@^4.2.0: +file-loader@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.2.0.tgz#5fb124d2369d7075d70a9a5abecd12e60a95215e" integrity sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ== @@ -14163,20 +14019,13 @@ getopts@^2.2.5: resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b" integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA== -getos@3.2.1: +getos@3.2.1, getos@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== dependencies: async "^3.2.0" -getos@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.0.tgz#db3aa4df15a3295557ce5e81aa9e3e5cdfaa6567" - integrity sha512-i9vrxtDu5DlLVFcrbqUqGWYlZN/zZ4pGMICCAcZoYsX3JA54nYp8r5EThw5K+m2q3wszkx4Th746JstspB0H4Q== - dependencies: - async "2.4.0" - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -14322,7 +14171,7 @@ glob-watcher@5.0.3, glob-watcher@^5.0.3: just-debounce "^1.0.0" object.defaults "^1.1.0" -glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: +glob@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -14334,7 +14183,7 @@ glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.4, glob@~7.1.4: +glob@7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== @@ -14357,7 +14206,7 @@ glob@^6.0.1, glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1, glob@~7.1.4, glob@~7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -15711,10 +15560,10 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" -html-entities@^1.2.0, html-entities@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= +html-entities@^1.2.0, html-entities@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" + integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== html-escaper@^2.0.0: version "2.0.2" @@ -15812,7 +15661,7 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.6.3, http-errors@~1.6.3: +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= @@ -15822,7 +15671,7 @@ http-errors@1.6.3, http-errors@~1.6.3: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-errors@1.7.2, http-errors@~1.7.2: +http-errors@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== @@ -15833,17 +15682,7 @@ http-errors@1.7.2, http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-errors@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - -http-errors@~1.7.0: +http-errors@~1.7.0, http-errors@~1.7.2: version "1.7.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== @@ -15866,10 +15705,10 @@ http-https@^1.0.0: resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= -http-parser-js@>=0.4.0: - version "0.4.11" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.11.tgz#5b720849c650903c27e521633d94696ee95f3529" - integrity sha512-QCR5O2AjjMW8Mo4HyI1ctFcv+O99j/0g367V3YoVnrNw5hkDvAWZD0lWGcc+F4yN3V55USPCVix4efb75HxFfA== +http-parser-js@>=0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" + integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== http-proxy-agent@^2.1.0: version "2.1.0" @@ -16828,14 +16667,6 @@ is-dom@^1.0.9: resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.0.9.tgz#483832d52972073de12b9fe3f60320870da8370d" integrity sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0= -is-expression@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f" - integrity sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8= - dependencies: - acorn "~4.0.2" - object-assign "^4.0.1" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -17159,7 +16990,7 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-regex@^1.0.3, is-regex@^1.0.4, is-regex@^1.0.5, is-regex@~1.0.5: +is-regex@^1.0.4, is-regex@^1.0.5, is-regex@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== @@ -17440,7 +17271,7 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-instrumenter-loader@3.0.1, istanbul-instrumenter-loader@^3.0.1: +istanbul-instrumenter-loader@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz#9957bd59252b373fae5c52b7b5188e6fde2a0949" integrity sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w== @@ -18214,11 +18045,6 @@ js-sha3@0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-stringify@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" - integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= - js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -18536,7 +18362,7 @@ jstransformer-handlebars@^1.0.0: dependencies: handlebars "^4.0.1" -jstransformer@1.0.0, jstransformer@^1.0.0: +jstransformer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= @@ -18878,15 +18704,6 @@ leaflet@1.5.1: resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.5.1.tgz#9afb9d963d66c870066b1342e7a06f92840f46bf" integrity sha512-ekM9KAeG99tYisNBg0IzEywAlp0hYI5XRipsqRXyRTeuU8jcuntilpp+eFf5gaE0xubc9RuSNIVtByEKwqFV0w== -less-loader@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466" - integrity sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg== - dependencies: - clone "^2.1.1" - loader-utils "^1.1.0" - pify "^4.0.1" - "less@npm:@elastic/less@2.7.3-kibana": version "2.7.3-kibana" resolved "https://registry.yarnpkg.com/@elastic/less/-/less-2.7.3-kibana.tgz#3de5e0b06bb095b1cc1149043d67f8dc36272d23" @@ -19160,7 +18977,7 @@ load-source-map@^1.0.0: semver "^5.3.0" source-map "^0.5.6" -loader-runner@^2.3.1, loader-runner@^2.4.0: +loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== @@ -19476,7 +19293,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.11, lodash@4.17.19, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.19, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: +lodash@4.17.11, lodash@4.17.19, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.19, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== @@ -19571,10 +19388,10 @@ logform@^2.2.0: ms "^2.1.1" triple-beam "^1.3.0" -loglevel@^1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.4.tgz#f408f4f006db8354d0577dcf6d33485b3cb90d56" - integrity sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g== +loglevel@^1.6.8: + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== loglevelnext@^1.0.1: version "1.0.5" @@ -20257,15 +20074,10 @@ mime@1.6.0, mime@^1.2.11, mime@^1.3.4, mime@^1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.0.3, mime@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" - integrity sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg== - -mime@^2.4.2, mime@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== +mime@^2.0.3, mime@^2.4.4: + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== mimic-fn@^1.0.0: version "1.2.0" @@ -20389,12 +20201,12 @@ minimist@1.1.x: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= -minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: +minimist@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@1.2.5, minimist@^1.2.5: +minimist@1.2.5, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.0: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -20504,7 +20316,7 @@ mkdirp@0.5.3: dependencies: minimist "^1.2.5" -mkdirp@0.5.4, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.4, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== @@ -21655,11 +21467,6 @@ object-path-immutable@^3.1.1: dependencies: is-plain-object "3.0.0" -object-path@0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" - integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= - object-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/object-values/-/object-values-1.0.0.tgz#72af839630119e5b98c3b02bb8c27e3237158105" @@ -22772,7 +22579,7 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -22961,14 +22768,14 @@ popper.js@^1.14.4: resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.7.tgz#e31ec06cfac6a97a53280c3e55e4e0c860e7738e" integrity sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ== -portfinder@^1.0.24: - version "1.0.24" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.24.tgz#11efbc6865f12f37624b6531ead1d809ed965cfa" - integrity sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg== +portfinder@^1.0.26: + version "1.0.27" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.27.tgz#a41333c116b5e5f3d380f9745ac2f35084c4c758" + integrity sha512-bJ3U3MThKnyJ9Dx1Idtm5pQmxXqw08+XOHhi/Lie8OF1OlhVaBFhsntAIhkZYjfDcCzszSr0w1yCbccThhzgxQ== dependencies: - async "^1.5.2" - debug "^2.2.0" - mkdirp "0.5.x" + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" posix-character-classes@^0.1.0: version "0.1.1" @@ -23049,17 +22856,6 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-url@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-8.0.0.tgz#7b10059bd12929cdbb1971c60f61a0e5af86b4ca" - integrity sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw== - dependencies: - mime "^2.3.1" - minimatch "^3.0.4" - mkdirp "^0.5.0" - postcss "^7.0.2" - xxhashjs "^0.2.1" - postcss-value-parser@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz#99a983d365f7b2ad8d0f9b8c3094926eab4b936d" @@ -23084,25 +22880,7 @@ postcss-values-parser@^1.5.0: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@7.0.21: - version "7.0.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" - integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.26" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" - integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7.0.32: +postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: version "7.0.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== @@ -23457,111 +23235,6 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" -pug-attrs@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.4.tgz#b2f44c439e4eb4ad5d4ef25cac20d18ad28cc336" - integrity sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ== - dependencies: - constantinople "^3.0.1" - js-stringify "^1.0.1" - pug-runtime "^2.0.5" - -pug-code-gen@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.2.tgz#ad0967162aea077dcf787838d94ed14acb0217c2" - integrity sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw== - dependencies: - constantinople "^3.1.2" - doctypes "^1.1.0" - js-stringify "^1.0.1" - pug-attrs "^2.0.4" - pug-error "^1.3.3" - pug-runtime "^2.0.5" - void-elements "^2.0.1" - with "^5.0.0" - -pug-error@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.3.tgz#f342fb008752d58034c185de03602dd9ffe15fa6" - integrity sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ== - -pug-filters@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.1.tgz#ab2cc82db9eeccf578bda89130e252a0db026aa7" - integrity sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg== - dependencies: - clean-css "^4.1.11" - constantinople "^3.0.1" - jstransformer "1.0.0" - pug-error "^1.3.3" - pug-walk "^1.1.8" - resolve "^1.1.6" - uglify-js "^2.6.1" - -pug-lexer@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.1.0.tgz#531cde48c7c0b1fcbbc2b85485c8665e31489cfd" - integrity sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA== - dependencies: - character-parser "^2.1.1" - is-expression "^3.0.0" - pug-error "^1.3.3" - -pug-linker@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.6.tgz#f5bf218b0efd65ce6670f7afc51658d0f82989fb" - integrity sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg== - dependencies: - pug-error "^1.3.3" - pug-walk "^1.1.8" - -pug-load@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.12.tgz#d38c85eb85f6e2f704dea14dcca94144d35d3e7b" - integrity sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg== - dependencies: - object-assign "^4.1.0" - pug-walk "^1.1.8" - -pug-parser@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.1.tgz#03e7ada48b6840bd3822f867d7d90f842d0ffdc9" - integrity sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA== - dependencies: - pug-error "^1.3.3" - token-stream "0.0.1" - -pug-runtime@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.5.tgz#6da7976c36bf22f68e733c359240d8ae7a32953a" - integrity sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw== - -pug-strip-comments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz#cc1b6de1f6e8f5931cf02ec66cdffd3f50eaf8a8" - integrity sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw== - dependencies: - pug-error "^1.3.3" - -pug-walk@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz#b408f67f27912f8c21da2f45b7230c4bd2a5ea7a" - integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA== - -pug@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.4.tgz#ee7682ec0a60494b38d48a88f05f3b0ac931377d" - integrity sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw== - dependencies: - pug-code-gen "^2.0.2" - pug-filters "^3.1.1" - pug-lexer "^4.1.0" - pug-linker "^3.0.6" - pug-load "^2.0.12" - pug-parser "^5.0.1" - pug-runtime "^2.0.5" - pug-strip-comments "^1.0.4" - puid@1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/puid/-/puid-1.0.7.tgz#fa638a737d7b20419059d93965aed36ca20e1c84" @@ -23823,16 +23496,11 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@^1.2.1, range-parser@~1.2.1: +range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= - raw-body@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" @@ -23869,11 +23537,6 @@ raw-loader@3.1.0, raw-loader@^3.1.0: loader-utils "^1.1.0" schema-utils "^2.0.1" -raw-loader@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= - rbush@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/rbush/-/rbush-3.0.1.tgz#5fafa8a79b3b9afdfe5008403a720cc1de882ecf" @@ -24897,12 +24560,12 @@ readdirp@~3.2.0: dependencies: picomatch "^2.0.4" -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== dependencies: - picomatch "^2.0.7" + picomatch "^2.2.1" readline2@^1.0.1: version "1.0.1" @@ -25206,11 +24869,6 @@ regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regex-parser@2.2.10: - version "2.2.10" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" - integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== - regexp.prototype.flags@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" @@ -25778,22 +25436,6 @@ resolve-protobuf-schema@^2.1.0: dependencies: protocol-buffers-schema "^3.3.1" -resolve-url-loader@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" - integrity sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ== - dependencies: - adjust-sourcemap-loader "2.0.0" - camelcase "5.3.1" - compose-function "3.0.3" - convert-source-map "1.7.0" - es6-iterator "2.0.3" - loader-utils "1.2.3" - postcss "7.0.21" - rework "1.0.1" - rework-visit "1.0.0" - source-map "0.6.1" - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -25904,19 +25546,6 @@ reusify@^1.0.0: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rework-visit@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" - integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= - -rework@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" - integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= - dependencies: - convert-source-map "^0.3.3" - css "^2.0.0" - right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" @@ -25924,35 +25553,28 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== +rimraf@2, rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: - glob "^7.0.5" + glob "^7.1.3" -rimraf@2.6.3, rimraf@^2.6.3, rimraf@~2.6.2: +rimraf@2.6.3, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" -rimraf@3.0.0, rimraf@^3.0.0: +rimraf@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -26131,6 +25753,11 @@ safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@>=5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" @@ -26342,13 +25969,6 @@ screenfull@^5.0.0: resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.0.0.tgz#5c2010c0e84fd4157bf852877698f90b8cbe96f6" integrity sha512-yShzhaIoE9OtOhWVyBBffA6V98CDCoyHTsp8228blmqYy1Z5bddzE/4FPiJKlr8DVR4VBiiUyfPzIQPIYDkeMA== -script-loader@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/script-loader/-/script-loader-0.7.2.tgz#2016db6f86f25f5cf56da38915d83378bb166ba7" - integrity sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA== - dependencies: - raw-loader "~0.5.1" - scss-tokenizer@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" @@ -26634,11 +26254,6 @@ setimmediate@^1.0.4, setimmediate@^1.0.5: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -26978,13 +26593,14 @@ sockjs-client@1.4.0: json3 "^3.3.2" url-parse "^1.4.3" -sockjs@0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== +sockjs@0.3.20: + version "0.3.20" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== dependencies: faye-websocket "^0.10.0" - uuid "^3.0.1" + uuid "^3.4.0" + websocket-driver "0.6.5" sort-keys@^1.0.0: version "1.1.2" @@ -27056,11 +26672,6 @@ source-map@0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - source-map@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" @@ -27073,6 +26684,11 @@ source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, sour resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" @@ -27211,10 +26827,10 @@ spdy-transport@^3.0.0: readable-stream "^3.0.6" wbuf "^1.7.3" -spdy@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" - integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" handle-thing "^2.0.0" @@ -27417,16 +27033,16 @@ stats-lite@^2.2.0: dependencies: isnumber "~1.0.0" -"statuses@>= 1.3.1 < 2", statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== - "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + stdout-stream@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" @@ -28400,7 +28016,7 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser-webpack-plugin@^2.1.2, terser-webpack-plugin@^2.3.4: +terser-webpack-plugin@^2.1.2: version "2.3.7" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.7.tgz#4910ff5d1a872168cc7fa6cd3749e2b0d60a8a0b" integrity sha512-xzYyaHUNhzgaAdBsXxk2Yvo/x1NJdslUaussK3fdpBbvttm1iIwU+c26dj9UxJcwk2c5UWt5F55MUTIA8BE7Dg== @@ -28463,15 +28079,6 @@ textextensions@2: resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" integrity sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA== -thread-loader@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-2.1.3.tgz#cbd2c139fc2b2de6e9d28f62286ab770c1acbdda" - integrity sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg== - dependencies: - loader-runner "^2.3.1" - loader-utils "^1.1.0" - neo-async "^2.6.0" - throat@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" @@ -28819,11 +28426,6 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -token-stream@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" - integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo= - topo@3.x.x: version "3.0.0" resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.0.tgz#37e48c330efeac784538e0acd3e62ca5e231fe7a" @@ -29159,15 +28761,7 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.16: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.18" - -type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.16, type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -29258,7 +28852,7 @@ uglify-js@3.4.x, uglify-js@^3.1.4: commander "~2.17.1" source-map "~0.6.1" -uglify-js@^2.6.1, uglify-js@^2.6.2: +uglify-js@^2.6.2: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= @@ -29887,7 +29481,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@3.3.2, uuid@^3.0.1, uuid@^3.3.2: +uuid@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== @@ -29897,12 +29491,7 @@ uuid@^2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - integrity sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g== - -uuid@^3.1.0, uuid@^3.3.3: +uuid@^3.0.0, uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -30509,11 +30098,6 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== -void-elements@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= - vscode-jsonrpc@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz#a7bf74ef3254d0a0c272fab15c82128e378b3be9" @@ -30622,14 +30206,23 @@ warning@^4.0.2, warning@^4.0.3: dependencies: loose-envify "^1.0.0" +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + version "1.7.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" + integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== dependencies: - chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.0" + watchpack-chokidar2 "^2.0.0" wbuf@^1.1.0: version "1.7.2" @@ -30679,17 +30272,7 @@ webpack-cli@^3.3.10: v8-compile-cache "2.0.3" yargs "13.2.4" -webpack-dev-middleware@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz#ef751d25f4e9a5c8a35da600c5fda3582b5c6cff" - integrity sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.2" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-middleware@^3.7.2: +webpack-dev-middleware@^3.7.0, webpack-dev-middleware@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== @@ -30701,9 +30284,9 @@ webpack-dev-middleware@^3.7.2: webpack-log "^2.0.0" webpack-dev-server@^3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.8.2.tgz#3292427bf6510da9a3ac2d500b924a4197667ff9" - integrity sha512-0xxogS7n5jHDQWy0WST0q6Ykp7UGj4YvWh+HVN71JoE7BwPxMZrwgraBvmdEMbDVMBzF0u+mEzn8TQzBm5NYJQ== + version "3.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -30713,31 +30296,31 @@ webpack-dev-server@^3.8.2: debug "^4.1.1" del "^4.1.1" express "^4.17.1" - html-entities "^1.2.1" + html-entities "^1.3.1" http-proxy-middleware "0.19.1" import-local "^2.0.0" internal-ip "^4.3.0" ip "^1.1.5" is-absolute-url "^3.0.3" killable "^1.0.1" - loglevel "^1.6.4" + loglevel "^1.6.8" opn "^5.5.0" p-retry "^3.0.1" - portfinder "^1.0.24" + portfinder "^1.0.26" schema-utils "^1.0.0" selfsigned "^1.10.7" semver "^6.3.0" serve-index "^1.9.1" - sockjs "0.3.19" + sockjs "0.3.20" sockjs-client "1.4.0" - spdy "^4.0.1" + spdy "^4.0.2" strip-ansi "^3.0.1" supports-color "^6.1.0" url "^0.11.0" webpack-dev-middleware "^3.7.2" webpack-log "^2.0.0" ws "^6.2.1" - yargs "12.0.5" + yargs "^13.3.2" webpack-hot-middleware@^2.25.0: version "2.25.0" @@ -30767,7 +30350,7 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-merge@4.2.2, webpack-merge@^4.2.2: +webpack-merge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== @@ -30818,12 +30401,20 @@ webpack@^4.33.0, webpack@^4.38.0, webpack@^4.41.5: watchpack "^1.6.0" webpack-sources "^1.4.1" +websocket-driver@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= + dependencies: + websocket-extensions ">=0.1.1" + websocket-driver@>=0.5.1: - version "0.7.0" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" - integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: - http-parser-js ">=0.4.0" + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: @@ -30934,28 +30525,14 @@ which-typed-array@^1.1.2: has-symbols "^1.0.1" is-typed-array "^1.1.3" -which@1, which@1.3.1, which@^1.2.9, which@^1.3.1, which@~1.3.0: +which@1, which@1.3.1, which@^1.2.14, which@^1.2.8, which@^1.2.9, which@^1.3.1, which@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@^1.2.14, which@^1.2.8: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.1.tgz#f1cf94d07a8e571b6ff006aeb91d0300c47ef0a4" - integrity sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w== - dependencies: - isexe "^2.0.0" - -which@^2.0.2: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -31072,14 +30649,6 @@ winston@^3.3.3: triple-beam "^1.3.0" winston-transport "^4.4.0" -with@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe" - integrity sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4= - dependencies: - acorn "^3.1.0" - acorn-globals "^3.0.0" - word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -31159,13 +30728,6 @@ wrap-fn@^0.1.0: dependencies: co "3.1.0" -wrapper-webpack-plugin@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrapper-webpack-plugin/-/wrapper-webpack-plugin-2.1.0.tgz#2b5d80f46af84c9eeb707d08796a115e233adeac" - integrity sha512-e+2FhSYGCxhDq3PcUw5mRhH+8vcYa+9d9AuLChJUZ9ZbUPhQOHZ/O2dnN98iTqeUuvrzSSOv13+x/NhrAm5JEg== - dependencies: - webpack-sources "^1.1.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -31405,13 +30967,6 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -xxhashjs@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" - integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== - dependencies: - cuint "^0.2.2" - y18n@^3.2.0, y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" @@ -31508,24 +31063,6 @@ yargs-unparser@1.6.0: lodash "^4.17.15" yargs "^13.3.0" -yargs@12.0.5, yargs@^12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - yargs@13.2.4: version "13.2.4" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" @@ -31543,7 +31080,7 @@ yargs@13.2.4: y18n "^4.0.0" yargs-parser "^13.1.0" -yargs@13.3.2, yargs@^13.2.2, yargs@^13.3.0: +yargs@13.3.2, yargs@^13.2.2, yargs@^13.3.0, yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== @@ -31579,24 +31116,25 @@ yargs@4.8.1: y18n "^3.2.1" yargs-parser "^2.4.1" -yargs@^15.0.2, yargs@^15.1.0, yargs@^15.3.1, yargs@~15.3.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== +yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== dependencies: - cliui "^6.0.0" + cliui "^4.0.0" decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" require-directory "^2.1.1" - require-main-filename "^2.0.0" + require-main-filename "^1.0.1" set-blocking "^2.0.0" - string-width "^4.2.0" + string-width "^2.0.0" which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.1" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" -yargs@^15.4.0: +yargs@^15.0.2, yargs@^15.1.0, yargs@^15.3.1, yargs@^15.4.0: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -31645,6 +31183,23 @@ yargs@^7.0.0, yargs@^7.1.0: y18n "^3.2.1" yargs-parser "5.0.0-security.0" +yargs@~15.3.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== + 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.1" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" From cdc7d255616074b60d633660f19bf97b50334801 Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper Date: Thu, 13 Aug 2020 12:21:29 -0500 Subject: [PATCH 103/113] [Metrics UI] Fix inventory footer misalignment (#74707) --- .../inventory_view/components/layout.tsx | 72 ++++++++++--------- .../components/nodes_overview.tsx | 3 + .../inventory_view/components/waffle/map.tsx | 11 ++- 3 files changed, 52 insertions(+), 34 deletions(-) diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/layout.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/layout.tsx index ad92c054ee459..47616c7f4f7fd 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/layout.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/layout.tsx @@ -8,6 +8,7 @@ import React, { useCallback, useEffect } from 'react'; import { useInterval } from 'react-use'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { AutoSizer } from '../../../../components/auto_sizer'; import { convertIntervalToString } from '../../../../utils/convert_interval_to_string'; import { NodesOverview } from './nodes_overview'; import { calculateBoundsFromNodes } from '../lib/calculate_bounds_from_nodes'; @@ -110,37 +111,44 @@ export const Layout = () => { - - - - - - - - + {({ measureRef, bounds: { height = 0 } }) => ( + <> + - - - - - - + + + + + + + + + + + + + + + )} + @@ -159,9 +167,9 @@ const TopActionContainer = euiStyled.div` const BottomActionContainer = euiStyled.div` background-color: ${(props) => props.theme.eui.euiPageBackgroundColor}; padding: ${(props) => props.theme.eui.paddingSizes.m} ${(props) => - props.theme.eui.paddingSizes.m} ${(props) => props.theme.eui.paddingSizes.s}; - position: absolute; + props.theme.eui.paddingSizes.m}; + position: fixed; left: 0; - bottom: 4px; + bottom: 0; right: 0; `; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/nodes_overview.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/nodes_overview.tsx index 723e8e581cdaa..a705a0be3a39e 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/nodes_overview.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/nodes_overview.tsx @@ -34,6 +34,7 @@ interface Props { boundsOverride: InfraWaffleMapBounds; autoBounds: boolean; formatter: InfraFormatter; + bottomMargin: number; } export const NodesOverview = ({ @@ -48,6 +49,7 @@ export const NodesOverview = ({ options, formatter, onDrilldown, + bottomMargin, }: Props) => { const handleDrilldown = useCallback( (filter: string) => { @@ -118,6 +120,7 @@ export const NodesOverview = ({ onFilter={handleDrilldown} bounds={bounds} dataBounds={dataBounds} + bottomMargin={bottomMargin} /> ); diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/map.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/map.tsx index 5838317f07100..89b1b9b2211d9 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/map.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/map.tsx @@ -26,6 +26,7 @@ interface Props { onFilter: (filter: string) => void; bounds: InfraWaffleMapBounds; dataBounds: InfraWaffleMapBounds; + bottomMargin: number; } export const Map: React.FC = ({ @@ -37,6 +38,7 @@ export const Map: React.FC = ({ bounds, nodeType, dataBounds, + bottomMargin, }) => { const sortedNodes = sortNodes(options.sort, nodes); const map = nodesToWaffleMap(sortedNodes); @@ -45,7 +47,11 @@ export const Map: React.FC = ({ {({ measureRef, content: { width = 0, height = 0 } }) => { const groupsWithLayout = applyWaffleMapLayout(map, width, height); return ( - measureRef(el)} data-test-subj="waffleMap"> + measureRef(el)} + bottomMargin={bottomMargin} + data-test-subj="waffleMap" + > {groupsWithLayout.map((group) => { if (isWaffleMapGroupWithGroups(group)) { @@ -86,13 +92,14 @@ export const Map: React.FC = ({ ); }; -const WaffleMapOuterContainer = euiStyled.div` +const WaffleMapOuterContainer = euiStyled.div<{ bottomMargin: number }>` flex: 1 0 0%; display: flex; justify-content: flex-start; flex-direction: column; overflow-x: hidden; overflow-y: auto; + margin-bottom: ${(props) => props.bottomMargin}px; `; const WaffleMapInnerContainer = euiStyled.div` From ad3d87517f882dc0f32ec365692ba4dea502217c Mon Sep 17 00:00:00 2001 From: Ryan Keairns Date: Thu, 13 Aug 2020 12:38:57 -0500 Subject: [PATCH 104/113] Add kibana-core-ui-designers team (#74970) --- .github/CODEOWNERS | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6863b91858ff6..1f076e3c84001 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,7 +8,7 @@ /x-pack/plugins/lens/ @elastic/kibana-app /x-pack/plugins/graph/ @elastic/kibana-app /src/plugins/dashboard/ @elastic/kibana-app -/src/plugins/dashboard/**/*.scss @elastic/kibana-core-ui +/src/plugins/dashboard/**/*.scss @elastic/kibana-core-ui-designers /src/plugins/discover/ @elastic/kibana-app /src/plugins/input_control_vis/ @elastic/kibana-app /src/plugins/kibana_legacy/ @elastic/kibana-app @@ -70,7 +70,7 @@ # Canvas /x-pack/plugins/canvas/ @elastic/kibana-canvas -/x-pack/plugins/canvas/**/*.scss @elastic/kibana-core-ui +/x-pack/plugins/canvas/**/*.scss @elastic/kibana-core-ui-designers /x-pack/test/functional/apps/canvas/ @elastic/kibana-canvas # Core UI @@ -80,7 +80,7 @@ /src/plugins/home/server/services/ @elastic/kibana-core-ui # Exclude tutorial resources folder for now because they are not owned by Kibana app and most will move out soon /src/legacy/core_plugins/kibana/public/home/*.ts @elastic/kibana-core-ui -/src/legacy/core_plugins/kibana/public/home/**/*.scss @elastic/kibana-core-ui +/src/legacy/core_plugins/kibana/public/home/**/*.scss @elastic/kibana-core-ui-designers /src/legacy/core_plugins/kibana/public/home/np_ready/ @elastic/kibana-core-ui # Observability UIs @@ -165,14 +165,14 @@ # Security /src/core/server/csp/ @elastic/kibana-security @elastic/kibana-platform /x-pack/legacy/plugins/security/ @elastic/kibana-security -/x-pack/legacy/plugins/security/**/*.scss @elastic/kibana-core-ui +/x-pack/legacy/plugins/security/**/*.scss @elastic/kibana-core-ui-designers /x-pack/legacy/plugins/spaces/ @elastic/kibana-security -/x-pack/legacy/plugins/spaces/**/*.scss @elastic/kibana-core-ui +/x-pack/legacy/plugins/spaces/**/*.scss @elastic/kibana-core-ui-designers /x-pack/plugins/spaces/ @elastic/kibana-security -/x-pack/plugins/spaces/**/*.scss @elastic/kibana-core-ui +/x-pack/plugins/spaces/**/*.scss @elastic/kibana-core-ui-designers /x-pack/plugins/encrypted_saved_objects/ @elastic/kibana-security /x-pack/plugins/security/ @elastic/kibana-security -/x-pack/plugins/security/**/*.scss @elastic/kibana-core-ui +/x-pack/plugins/security/**/*.scss @elastic/kibana-core-ui-designers /x-pack/test/api_integration/apis/security/ @elastic/kibana-security # Kibana Localization From 479a991b988cbfeefab8bb4754718e727b009009 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Thu, 13 Aug 2020 14:17:33 -0400 Subject: [PATCH 105/113] [ML] DF Analytics: allow failed job to be stopped by force via the UI (#74710) * allow force stop from ui if job is failed * update wording in confirm modal --- .../components/action_stop/index.ts | 2 + .../action_stop/stop_button_modal.tsx | 56 +++++++++++++++++++ .../action_stop/use_force_stop_action.ts | 38 +++++++++++++ .../components/analytics_list/use_actions.tsx | 16 +++++- 4 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/stop_button_modal.tsx create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/use_force_stop_action.ts diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/index.ts index 858b6c70501b3..ce03305e3d859 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/index.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/index.ts @@ -5,3 +5,5 @@ */ export { StopButton } from './stop_button'; +export { StopButtonModal } from './stop_button_modal'; +export { useForceStopAction } from './use_force_stop_action'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/stop_button_modal.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/stop_button_modal.tsx new file mode 100644 index 0000000000000..387f42cc85ef3 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/stop_button_modal.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FC } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiConfirmModal, EuiOverlayMask, EUI_MODAL_CONFIRM_BUTTON } from '@elastic/eui'; + +import { ForceStopAction } from './use_force_stop_action'; + +export const StopButtonModal: FC = ({ + closeModal, + item, + forceStopAndCloseModal, +}) => { + return ( + <> + {item !== undefined && ( + + +

    + +

    +
    +
    + )} + + ); +}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/use_force_stop_action.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/use_force_stop_action.ts new file mode 100644 index 0000000000000..5a4e748948731 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/use_force_stop_action.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useState } from 'react'; + +import { DataFrameAnalyticsListRow } from '../analytics_list/common'; +import { stopAnalytics } from '../../services/analytics_service'; + +export type ForceStopAction = ReturnType; +export const useForceStopAction = () => { + const [isModalVisible, setModalVisible] = useState(false); + + const [item, setItem] = useState(); + + const closeModal = () => setModalVisible(false); + const forceStopAndCloseModal = () => { + if (item !== undefined) { + setModalVisible(false); + stopAnalytics(item); + } + }; + + const openModal = (newItem: DataFrameAnalyticsListRow) => { + setItem(newItem); + setModalVisible(true); + }; + + return { + closeModal, + isModalVisible, + item, + openModal, + forceStopAndCloseModal, + }; +}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_actions.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_actions.tsx index 373b9991d4d3c..d355335039085 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_actions.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_actions.tsx @@ -21,12 +21,13 @@ import { EditButtonFlyout, } from '../action_edit'; import { useStartAction, StartButton, StartButtonModal } from '../action_start'; -import { StopButton } from '../action_stop'; +import { StopButton, useForceStopAction, StopButtonModal } from '../action_stop'; import { getViewAction } from '../action_view'; import { isCompletedAnalyticsJob, isDataFrameAnalyticsRunning, + isDataFrameAnalyticsFailed, DataFrameAnalyticsListRow, } from './common'; @@ -53,11 +54,13 @@ export const useActions = ( const deleteAction = useDeleteAction(); const editAction = useEditAction(); const startAction = useStartAction(); + const stopAction = useForceStopAction(); /* eslint-disable react-hooks/rules-of-hooks */ modals = ( <> {startAction.isModalVisible && } + {stopAction.isModalVisible && } {deleteAction.isModalVisible && } {isEditActionFlyoutVisible(editAction) && } @@ -78,7 +81,10 @@ export const useActions = ( ...[ { render: (item: DataFrameAnalyticsListRow) => { - if (!isDataFrameAnalyticsRunning(item.stats.state)) { + if ( + !isDataFrameAnalyticsRunning(item.stats.state) && + !isDataFrameAnalyticsFailed(item.stats.state) + ) { return ( { if (canStartStopDataFrameAnalytics) { - stopAnalytics(item); + if (isDataFrameAnalyticsFailed(item.stats.state)) { + stopAction.openModal(item); + } else { + stopAnalytics(item); + } } }} /> From 250a0b17b03f8924462d484c2254a5af7d64f1ff Mon Sep 17 00:00:00 2001 From: spalger Date: Thu, 13 Aug 2020 11:41:52 -0700 Subject: [PATCH 106/113] attempt excluding a codeowners directory --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1f076e3c84001..5a8271302a72b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -118,6 +118,7 @@ # Operations /src/dev/ @elastic/kibana-operations +!/src/dev/i18n/ @elastic/kibana-operations /src/setup_node_env/ @elastic/kibana-operations /src/optimize/ @elastic/kibana-operations /packages/*eslint*/ @elastic/kibana-operations From c34e30ed0b29938228659afc57c6ec1f155ad47b Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola Date: Thu, 13 Aug 2020 14:55:43 -0400 Subject: [PATCH 107/113] [Security Solution][Resolver] Graph Control Tests and Update Simulator Selectors (#74680) Co-authored-by: oatkiller --- .../resolver/test_utilities/extend_jest.ts | 65 ++++++ .../test_utilities/simulator/index.tsx | 97 +++----- .../simulator/mock_resolver.tsx | 15 +- .../resolver/view/clickthrough.test.tsx | 37 +-- .../resolver/view/graph_controls.test.tsx | 221 ++++++++++++++++++ .../public/resolver/view/graph_controls.tsx | 25 +- .../public/resolver/view/panel.test.tsx | 24 +- 7 files changed, 379 insertions(+), 105 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/resolver/view/graph_controls.test.tsx diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/extend_jest.ts b/x-pack/plugins/security_solution/public/resolver/test_utilities/extend_jest.ts index 9fc7af38beb42..df8f32d15a7ab 100644 --- a/x-pack/plugins/security_solution/public/resolver/test_utilities/extend_jest.ts +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/extend_jest.ts @@ -17,6 +17,7 @@ declare global { namespace jest { interface Matchers { toYieldEqualTo(expectedYield: T extends AsyncIterable ? E : never): Promise; + toYieldObjectEqualTo(expectedYield: unknown): Promise; } } } @@ -57,6 +58,70 @@ expect.extend({ } } + // Use `pass` as set in the above loop (or initialized to `false`) + // See https://jestjs.io/docs/en/expect#custom-matchers-api and https://jestjs.io/docs/en/expect#thisutils + const message = pass + ? () => + `${this.utils.matcherHint(matcherName, undefined, undefined, options)}\n\n` + + `Expected: not ${this.utils.printExpected(expected)}\n${ + this.utils.stringify(expected) !== this.utils.stringify(received[received.length - 1]!) + ? `Received: ${this.utils.printReceived(received[received.length - 1])}` + : '' + }` + : () => + `${this.utils.matcherHint(matcherName, undefined, undefined, options)}\n\nCompared ${ + received.length + } yields.\n\n${received + .map( + (next, index) => + `yield ${index + 1}:\n\n${this.utils.printDiffOrStringify( + expected, + next, + 'Expected', + 'Received', + this.expand + )}` + ) + .join(`\n\n`)}`; + + return { message, pass }; + }, + /** + * A custom matcher that takes an async generator and compares each value it yields to an expected value. + * This uses the same equality logic as `toMatchObject`. + * If any yielded value equals the expected value, the matcher will pass. + * If the generator ends with none of the yielded values matching, it will fail. + */ + async toYieldObjectEqualTo( + this: jest.MatcherContext, + receivedIterable: AsyncIterable, + expected: T + ): Promise<{ pass: boolean; message: () => string }> { + // Used in printing out the pass or fail message + const matcherName = 'toSometimesYieldEqualTo'; + const options: jest.MatcherHintOptions = { + comment: 'deep equality with any yielded value', + isNot: this.isNot, + promise: this.promise, + }; + // The last value received: Used in printing the message + const received: T[] = []; + + // Set to true if the test passes. + let pass: boolean = false; + + // Async iterate over the iterable + for await (const next of receivedIterable) { + // keep track of all received values. Used in pass and fail messages + received.push(next); + // Use deep equals to compare the value to the expected value + if ((this.equals(next, expected), [this.utils.iterableEquality, this.utils.subsetEquality])) { + // If the value is equal, break + pass = true; + break; + } + } + // Use `pass` as set in the above loop (or initialized to `false`) // See https://jestjs.io/docs/en/expect#custom-matchers-api and https://jestjs.io/docs/en/expect#thisutils const message = pass diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx index cae6a18576ebd..355b53e374092 100644 --- a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx @@ -14,8 +14,9 @@ import { spyMiddlewareFactory } from '../spy_middleware_factory'; import { resolverMiddlewareFactory } from '../../store/middleware'; import { resolverReducer } from '../../store/reducer'; import { MockResolver } from './mock_resolver'; -import { ResolverState, DataAccessLayer, SpyMiddleware } from '../../types'; +import { ResolverState, DataAccessLayer, SpyMiddleware, SideEffectSimulator } from '../../types'; import { ResolverAction } from '../../store/actions'; +import { sideEffectSimulatorFactory } from '../../view/side_effect_simulator_factory'; /** * Test a Resolver instance using jest, enzyme, and a mock data layer. @@ -43,6 +44,11 @@ export class Simulator { * This is used by `debugActions`. */ private readonly spyMiddleware: SpyMiddleware; + /** + * Simulator which allows you to explicitly simulate resize events and trigger animation frames + */ + private readonly sideEffectSimulator: SideEffectSimulator; + constructor({ dataAccessLayer, resolverComponentInstanceID, @@ -87,11 +93,14 @@ export class Simulator { // Used for `KibanaContextProvider` const coreStart: CoreStart = coreMock.createStart(); + this.sideEffectSimulator = sideEffectSimulatorFactory(); + // Render Resolver via the `MockResolver` component, using `enzyme`. this.wrapper = mount( { + return this.resolveWrapper(() => this.domNodes(`[data-test-subj="${selector}"]`)); } /** - * The icon element for the node detail title. + * Given a 'data-test-subj' selector, it will return the domNode */ - public nodeDetailViewTitleIcon(): ReactWrapper { - return this.domNodes('[data-test-subj="resolver:node-detail:title-icon"]'); + public testSubject(selector: string): ReactWrapper { + return this.domNodes(`[data-test-subj="${selector}"]`); } /** @@ -297,7 +266,7 @@ export class Simulator { public async resolveWrapper( wrapperFactory: () => ReactWrapper, predicate: (wrapper: ReactWrapper) => boolean = (wrapper) => wrapper.length > 0 - ): Promise { + ): Promise { for await (const wrapper of this.map(wrapperFactory)) { if (predicate(wrapper)) { return wrapper; diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx index 7de7cf48e6039..5d5a414761dbf 100644 --- a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx @@ -6,7 +6,7 @@ /* eslint-disable react/display-name */ -import React, { useMemo, useEffect, useState, useCallback } from 'react'; +import React, { useEffect, useState, useCallback } from 'react'; import { Router } from 'react-router-dom'; import { I18nProvider } from '@kbn/i18n/react'; import { Provider } from 'react-redux'; @@ -17,7 +17,6 @@ import { ResolverState, SideEffectSimulator, ResolverProps } from '../../types'; import { ResolverAction } from '../../store/actions'; import { ResolverWithoutProviders } from '../../view/resolver_without_providers'; import { SideEffectContext } from '../../view/side_effect_context'; -import { sideEffectSimulatorFactory } from '../../view/side_effect_simulator_factory'; type MockResolverProps = { /** @@ -38,6 +37,10 @@ type MockResolverProps = { history: React.ComponentProps['history']; /** Pass a resolver store. See `storeFactory` and `mockDataAccessLayer` */ store: Store; + /** + * Pass the side effect simulator which handles animations and resizing. See `sideEffectSimulatorFactory` + */ + sideEffectSimulator: SideEffectSimulator; /** * All the props from `ResolverWithoutStore` can be passed. These aren't defaulted to anything (you might want to test what happens when they aren't present.) */ @@ -66,8 +69,6 @@ export const MockResolver = React.memo((props: MockResolverProps) => { setResolverElement(element); }, []); - const simulator: SideEffectSimulator = useMemo(() => sideEffectSimulatorFactory(), []); - // Resize the Resolver element to match the passed in props. Resolver is size dependent. useEffect(() => { if (resolverElement) { @@ -84,15 +85,15 @@ export const MockResolver = React.memo((props: MockResolverProps) => { return this; }, }; - simulator.controls.simulateElementResize(resolverElement, size); + props.sideEffectSimulator.controls.simulateElementResize(resolverElement, size); } - }, [props.rasterWidth, props.rasterHeight, simulator.controls, resolverElement]); + }, [props.rasterWidth, props.rasterHeight, props.sideEffectSimulator.controls, resolverElement]); return ( - + ({ - graphElements: simulator.graphElement().length, - graphLoadingElements: simulator.graphLoadingElement().length, - graphErrorElements: simulator.graphErrorElement().length, + graphElements: simulator.testSubject('resolver:graph').length, + graphLoadingElements: simulator.testSubject('resolver:graph:loading').length, + graphErrorElements: simulator.testSubject('resolver:graph:error').length, })) ).toYieldEqualTo({ // it should have 1 graph element, an no error or loading elements. @@ -72,8 +72,12 @@ describe('Resolver, when analyzing a tree that has no ancestors and 2 children', }); it(`should show links to the 3 nodes (with icons) in the node list.`, async () => { - await expect(simulator.map(() => simulator.nodeListNodeLinkText().length)).toYieldEqualTo(3); - await expect(simulator.map(() => simulator.nodeListNodeLinkIcons().length)).toYieldEqualTo(3); + await expect( + simulator.map(() => simulator.testSubject('resolver:node-list:node-link:title').length) + ).toYieldEqualTo(3); + await expect( + simulator.map(() => simulator.testSubject('resolver:node-list:node-link:title').length) + ).toYieldEqualTo(3); }); describe("when the second child node's first button has been clicked", () => { @@ -131,9 +135,9 @@ describe('Resolver, when analyzing a tree that has two related events for the or beforeEach(async () => { await expect( simulator.map(() => ({ - graphElements: simulator.graphElement().length, - graphLoadingElements: simulator.graphLoadingElement().length, - graphErrorElements: simulator.graphErrorElement().length, + graphElements: simulator.testSubject('resolver:graph').length, + graphLoadingElements: simulator.testSubject('resolver:graph:loading').length, + graphErrorElements: simulator.testSubject('resolver:graph:error').length, originNode: simulator.processNodeElements({ entityID: entityIDs.origin }).length, })) ).toYieldEqualTo({ @@ -147,7 +151,10 @@ describe('Resolver, when analyzing a tree that has two related events for the or it('should render a related events button', async () => { await expect( simulator.map(() => ({ - relatedEventButtons: simulator.processNodeRelatedEventButton(entityIDs.origin).length, + relatedEventButtons: simulator.processNodeChildElements( + entityIDs.origin, + 'resolver:submenu:button' + ).length, })) ).toYieldEqualTo({ relatedEventButtons: 1, @@ -156,7 +163,7 @@ describe('Resolver, when analyzing a tree that has two related events for the or describe('when the related events button is clicked', () => { beforeEach(async () => { const button = await simulator.resolveWrapper(() => - simulator.processNodeRelatedEventButton(entityIDs.origin) + simulator.processNodeChildElements(entityIDs.origin, 'resolver:submenu:button') ); if (button) { button.simulate('click'); @@ -164,17 +171,19 @@ describe('Resolver, when analyzing a tree that has two related events for the or }); it('should open the submenu and display exactly one option with the correct count', async () => { await expect( - simulator.map(() => simulator.processNodeSubmenuItems().map((node) => node.text())) + simulator.map(() => + simulator.testSubject('resolver:map:node-submenu-item').map((node) => node.text()) + ) ).toYieldEqualTo(['2 registry']); await expect( - simulator.map(() => simulator.processNodeSubmenuItems().length) + simulator.map(() => simulator.testSubject('resolver:map:node-submenu-item').length) ).toYieldEqualTo(1); }); }); describe('and when the related events button is clicked again', () => { beforeEach(async () => { const button = await simulator.resolveWrapper(() => - simulator.processNodeRelatedEventButton(entityIDs.origin) + simulator.processNodeChildElements(entityIDs.origin, 'resolver:submenu:button') ); if (button) { button.simulate('click'); @@ -182,7 +191,7 @@ describe('Resolver, when analyzing a tree that has two related events for the or }); it('should close the submenu', async () => { await expect( - simulator.map(() => simulator.processNodeSubmenuItems().length) + simulator.map(() => simulator.testSubject('resolver:map:node-submenu-item').length) ).toYieldEqualTo(0); }); }); diff --git a/x-pack/plugins/security_solution/public/resolver/view/graph_controls.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/graph_controls.test.tsx new file mode 100644 index 0000000000000..6497cc2971980 --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/view/graph_controls.test.tsx @@ -0,0 +1,221 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Simulator } from '../test_utilities/simulator'; +import { noAncestorsTwoChildren } from '../data_access_layer/mocks/no_ancestors_two_children'; +import { nudgeAnimationDuration } from '../store/camera/scaling_constants'; +import '../test_utilities/extend_jest'; + +describe('graph controls: when relsover is loaded with an origin node', () => { + let simulator: Simulator; + let originEntityID: string; + let originNodeStyle: () => AsyncIterable; + const resolverComponentInstanceID = 'graph-controls-test'; + + const originalPositionStyle: Readonly<{ left: string; top: string }> = { + left: '746.93132px', + top: '535.5792px', + }; + const originalSizeStyle: Readonly<{ width: string; height: string }> = { + width: '360px', + height: '120px', + }; + + beforeEach(async () => { + const { + metadata: { databaseDocumentID, entityIDs }, + dataAccessLayer, + } = noAncestorsTwoChildren(); + + simulator = new Simulator({ + dataAccessLayer, + databaseDocumentID, + resolverComponentInstanceID, + }); + originEntityID = entityIDs.origin; + + originNodeStyle = () => + simulator.map(() => { + const wrapper = simulator.processNodeElements({ entityID: originEntityID }); + // `getDOMNode` can only be called on a wrapper of a single node: https://enzymejs.github.io/enzyme/docs/api/ReactWrapper/getDOMNode.html + if (wrapper.length === 1) { + return wrapper.getDOMNode().style; + } + return null; + }); + }); + + it('should display all cardinal panning buttons and the center button', async () => { + await expect( + simulator.map(() => ({ + westPanButton: simulator.testSubject('resolver:graph-controls:west-button').length, + southPanButton: simulator.testSubject('resolver:graph-controls:south-button').length, + eastPanButton: simulator.testSubject('resolver:graph-controls:east-button').length, + northPanButton: simulator.testSubject('resolver:graph-controls:north-button').length, + centerButton: simulator.testSubject('resolver:graph-controls:center-button').length, + })) + ).toYieldEqualTo({ + westPanButton: 1, + southPanButton: 1, + eastPanButton: 1, + northPanButton: 1, + centerButton: 1, + }); + }); + + it('should display the zoom buttons and slider', async () => { + await expect( + simulator.map(() => ({ + zoomInButton: simulator.testSubject('resolver:graph-controls:zoom-in').length, + zoomOutButton: simulator.testSubject('resolver:graph-controls:zoom-out').length, + zoomSlider: simulator.testSubject('resolver:graph-controls:zoom-slider').length, + })) + ).toYieldEqualTo({ + zoomInButton: 1, + zoomOutButton: 1, + zoomSlider: 1, + }); + }); + + it("should show the origin node in it's original position", async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo(originalPositionStyle); + }); + + describe('when the user clicks the west panning button', () => { + beforeEach(async () => { + (await simulator.resolve('resolver:graph-controls:west-button'))!.simulate('click'); + simulator.runAnimationFramesTimeFromNow(nudgeAnimationDuration); + }); + + it('should show the origin node further left on the screen', async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo({ + left: '796.93132px', + top: '535.5792px', + }); + }); + }); + + describe('when the user clicks the south panning button', () => { + beforeEach(async () => { + (await simulator.resolve('resolver:graph-controls:south-button'))!.simulate('click'); + simulator.runAnimationFramesTimeFromNow(nudgeAnimationDuration); + }); + + it('should show the origin node lower on the screen', async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo({ + left: '746.93132px', + top: '485.5792px', + }); + }); + }); + + describe('when the user clicks the east panning button', () => { + beforeEach(async () => { + (await simulator.resolve('resolver:graph-controls:east-button'))!.simulate('click'); + simulator.runAnimationFramesTimeFromNow(nudgeAnimationDuration); + }); + + it('should show the origin node further right on the screen', async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo({ + left: '696.93132px', + top: '535.5792px', + }); + }); + }); + + describe('when the user clicks the north panning button', () => { + beforeEach(async () => { + (await simulator.resolve('resolver:graph-controls:north-button'))!.simulate('click'); + simulator.runAnimationFramesTimeFromNow(nudgeAnimationDuration); + }); + + it('should show the origin node higher on the screen', async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo({ + left: '746.93132px', + top: '585.5792px', + }); + }); + }); + + describe('when the user clicks the center panning button', () => { + beforeEach(async () => { + (await simulator.resolve('resolver:graph-controls:north-button'))!.simulate('click'); + simulator.runAnimationFramesTimeFromNow(nudgeAnimationDuration); + (await simulator.resolve('resolver:graph-controls:center-button'))!.simulate('click'); + simulator.runAnimationFramesTimeFromNow(nudgeAnimationDuration); + }); + + it("should return the origin node to it's original position", async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo(originalPositionStyle); + }); + }); + + it('should show the origin node as larger on the screen', async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo(originalSizeStyle); + }); + + describe('when the zoom in button is clicked', () => { + beforeEach(async () => { + (await simulator.resolve('resolver:graph-controls:zoom-in'))!.simulate('click'); + simulator.runAnimationFramesTimeFromNow(nudgeAnimationDuration); + }); + + it('should show the origin node as larger on the screen', async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo({ + width: '427.7538290724795px', + height: '142.5846096908265px', + }); + }); + }); + + describe('when the zoom out button is clicked', () => { + beforeEach(async () => { + (await simulator.resolve('resolver:graph-controls:zoom-out'))!.simulate('click'); + simulator.runAnimationFramesTimeFromNow(nudgeAnimationDuration); + }); + + it('should show the origin node as smaller on the screen', async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo({ + width: '303.0461709275204px', + height: '101.01539030917347px', + }); + }); + }); + + describe('when the slider is moved upwards', () => { + beforeEach(async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo(originalSizeStyle); + + (await simulator.resolve('resolver:graph-controls:zoom-slider'))!.simulate('change', { + target: { value: 0.8 }, + }); + simulator.runAnimationFramesTimeFromNow(nudgeAnimationDuration); + }); + + it('should show the origin node as large on the screen', async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo({ + width: '525.6000000000001px', + height: '175.20000000000005px', + }); + }); + }); + + describe('when the slider is moved downwards', () => { + beforeEach(async () => { + (await simulator.resolve('resolver:graph-controls:zoom-slider'))!.simulate('change', { + target: { value: 0.2 }, + }); + simulator.runAnimationFramesTimeFromNow(nudgeAnimationDuration); + }); + + it('should show the origin node as smaller on the screen', async () => { + await expect(originNodeStyle()).toYieldObjectEqualTo({ + width: '201.60000000000002px', + height: '67.2px', + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/resolver/view/graph_controls.tsx b/x-pack/plugins/security_solution/public/resolver/view/graph_controls.tsx index c2a7bbaacbf1d..610deef07775b 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/graph_controls.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/graph_controls.tsx @@ -125,12 +125,13 @@ const GraphControlsComponent = React.memo( className={className} graphControlsBackground={colorMap.graphControlsBackground} graphControlsIconColor={colorMap.graphControls} + data-test-subj="resolver:graph-controls" >
    - - diff --git a/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx index 4d391a6c9ce59..21b5a30ee9890 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx @@ -72,8 +72,8 @@ describe(`Resolver: when analyzing a tree with no ancestors and two children, an it('should show the node details for the origin', async () => { await expect( simulator().map(() => { - const titleWrapper = simulator().nodeDetailViewTitle(); - const titleIconWrapper = simulator().nodeDetailViewTitleIcon(); + const titleWrapper = simulator().testSubject('resolver:node-detail:title'); + const titleIconWrapper = simulator().testSubject('resolver:node-detail:title-icon'); return { title: titleWrapper.exists() ? titleWrapper.text() : null, titleIcon: titleIconWrapper.exists() ? titleIconWrapper.text() : null, @@ -122,17 +122,17 @@ describe(`Resolver: when analyzing a tree with no ancestors and two children, an }); it('should have 3 nodes (with icons) in the node list', async () => { - await expect(simulator().map(() => simulator().nodeListNodeLinkText().length)).toYieldEqualTo( - 3 - ); - await expect(simulator().map(() => simulator().nodeListNodeLinkIcons().length)).toYieldEqualTo( - 3 - ); + await expect( + simulator().map(() => simulator().testSubject('resolver:node-list:node-link:title').length) + ).toYieldEqualTo(3); + await expect( + simulator().map(() => simulator().testSubject('resolver:node-list:node-link:icon').length) + ).toYieldEqualTo(3); }); describe('when there is an item in the node list and its text has been clicked', () => { beforeEach(async () => { - const nodeLinks = await simulator().resolveWrapper(() => simulator().nodeListNodeLinkText()); + const nodeLinks = await simulator().resolve('resolver:node-list:node-link:title'); expect(nodeLinks).toBeTruthy(); if (nodeLinks) { nodeLinks.first().simulate('click'); @@ -158,8 +158,8 @@ describe(`Resolver: when analyzing a tree with no ancestors and two children, an }); describe('and when the node list link has been clicked', () => { beforeEach(async () => { - const nodeListLink = await simulator().resolveWrapper(() => - simulator().nodeDetailBreadcrumbNodeListLink() + const nodeListLink = await simulator().resolve( + 'resolver:node-detail:breadcrumbs:node-list-link' ); if (nodeListLink) { nodeListLink.simulate('click'); @@ -169,7 +169,7 @@ describe(`Resolver: when analyzing a tree with no ancestors and two children, an await expect( simulator().map(() => { return simulator() - .nodeListNodeLinkText() + .testSubject('resolver:node-list:node-link:title') .map((node) => node.text()); }) ).toYieldEqualTo(['c', 'd', 'e']); From fe017f52dd5b64ab8d5945cd8a4483a350651850 Mon Sep 17 00:00:00 2001 From: Luke Elmers Date: Thu, 13 Aug 2020 13:38:16 -0600 Subject: [PATCH 108/113] Make data.search.aggs available on the server. (#74472) --- ...lugins-data-public.baseformatterspublic.md | 2 +- ...ibana-plugin-plugins-data-public.search.md | 8 +- ...in-plugins-data-server.aggconfigoptions.md | 13 + ...ugin-plugins-data-server.agggrouplabels.md | 15 + ...plugin-plugins-data-server.agggroupname.md | 11 + ...lugin-plugins-data-server.agggroupnames.md | 15 + ...ana-plugin-plugins-data-server.aggparam.md | 11 + ...gins-data-server.aggparamoption.display.md | 11 + ...gins-data-server.aggparamoption.enabled.md | 22 ++ ...ugin-plugins-data-server.aggparamoption.md | 25 ++ ...-plugins-data-server.aggparamoption.val.md | 11 + ...-data-server.aggparamtype._constructor_.md | 20 ++ ...ns-data-server.aggparamtype.allowedaggs.md | 11 + ...lugins-data-server.aggparamtype.makeagg.md | 11 + ...plugin-plugins-data-server.aggparamtype.md | 25 ++ ...plugin-plugins-data-server.bucket_types.md | 28 ++ ...a-plugin-plugins-data-server.iaggconfig.md | 15 + ...ana-plugin-plugins-data-server.iaggtype.md | 11 + ...gin-plugins-data-server.ifieldparamtype.md | 11 + ...ugin-plugins-data-server.imetricaggtype.md | 11 + ...n-plugins-data-server.isearchsetup.aggs.md | 11 + ...plugin-plugins-data-server.isearchsetup.md | 1 + ...n-plugins-data-server.isearchstart.aggs.md | 11 + ...plugin-plugins-data-server.isearchstart.md | 1 + .../kibana-plugin-plugins-data-server.md | 18 + ...plugin-plugins-data-server.metric_types.md | 38 +++ ...-server.optionedparamtype._constructor_.md | 20 ++ ...n-plugins-data-server.optionedparamtype.md | 24 ++ ...s-data-server.optionedparamtype.options.md | 11 + ...-data-server.optionedvalueprop.disabled.md | 11 + ...a-server.optionedvalueprop.iscompatible.md | 11 + ...n-plugins-data-server.optionedvalueprop.md | 21 ++ ...gins-data-server.optionedvalueprop.text.md | 11 + ...ins-data-server.optionedvalueprop.value.md | 11 + ...plugin-plugins-data-server.plugin.setup.md | 10 +- ...ibana-plugin-plugins-data-server.search.md | 20 ++ ...s-data-server.tabbedaggcolumn.aggconfig.md | 11 + ...-plugins-data-server.tabbedaggcolumn.id.md | 11 + ...gin-plugins-data-server.tabbedaggcolumn.md | 22 ++ ...lugins-data-server.tabbedaggcolumn.name.md | 11 + ...plugin-plugins-data-server.tabbedaggrow.md | 13 + ...plugins-data-server.tabbedtable.columns.md | 11 + ...-plugin-plugins-data-server.tabbedtable.md | 21 ++ ...in-plugins-data-server.tabbedtable.rows.md | 11 + .../new_platform/new_platform.karma_mock.js | 14 +- .../common/field_formats/converters/source.ts | 2 +- .../field_formats/field_formats_registry.ts | 2 +- .../data/common/field_formats/mocks.ts | 1 + src/plugins/data/common/index.ts | 2 - .../index_patterns/fields/field_list.ts | 3 +- .../fields/index_pattern_field.ts | 11 +- .../search/aggs/agg_config.test.ts | 5 +- .../search/aggs/agg_config.ts | 5 +- .../search/aggs/agg_configs.test.ts | 5 +- .../search/aggs/agg_configs.ts | 5 +- .../search/aggs/agg_groups.ts | 0 .../search/aggs/agg_params.test.ts | 0 .../search/aggs/agg_params.ts | 0 .../search/aggs/agg_type.test.ts | 0 .../search/aggs/agg_type.ts | 2 +- .../search/aggs/agg_types.ts | 86 +++-- .../search/aggs/agg_types_registry.test.ts | 60 ++-- .../search/aggs/agg_types_registry.ts | 46 ++- .../common/search/aggs/aggs_service.test.ts | 217 ++++++++++++ .../data/common/search/aggs/aggs_service.ts | 92 ++++++ .../search/aggs/buckets/_interval_options.ts | 0 .../_terms_other_bucket_helper.test.ts | 0 .../buckets/_terms_other_bucket_helper.ts | 0 .../search/aggs/buckets/bucket_agg_type.ts | 0 .../search/aggs/buckets/bucket_agg_types.ts | 0 .../create_filter/date_histogram.test.ts | 19 +- .../buckets/create_filter/date_histogram.ts | 0 .../buckets/create_filter/date_range.test.ts | 17 +- .../aggs/buckets/create_filter/date_range.ts | 0 .../buckets/create_filter/filters.test.ts | 12 +- .../aggs/buckets/create_filter/filters.ts | 0 .../buckets/create_filter/histogram.test.ts | 21 +- .../aggs/buckets/create_filter/histogram.ts | 12 +- .../buckets/create_filter/ip_range.test.ts | 3 +- .../aggs/buckets/create_filter/ip_range.ts | 0 .../aggs/buckets/create_filter/range.test.ts | 30 +- .../aggs/buckets/create_filter/range.ts | 12 +- .../aggs/buckets/create_filter/terms.test.ts | 3 +- .../aggs/buckets/create_filter/terms.ts | 0 .../search/aggs/buckets/date_histogram.ts | 41 ++- .../aggs/buckets/date_histogram_fn.test.ts | 0 .../search/aggs/buckets/date_histogram_fn.ts | 0 .../search/aggs/buckets/date_range.test.ts | 22 +- .../search/aggs/buckets/date_range.ts | 14 +- .../search/aggs/buckets/date_range_fn.test.ts | 0 .../search/aggs/buckets/date_range_fn.ts | 0 .../search/aggs/buckets/filter.ts | 0 .../search/aggs/buckets/filter_fn.test.ts | 0 .../search/aggs/buckets/filter_fn.ts | 0 .../search/aggs/buckets/filters.test.ts | 18 +- .../search/aggs/buckets/filters.ts | 11 +- .../search/aggs/buckets/filters_fn.test.ts | 0 .../search/aggs/buckets/filters_fn.ts | 0 .../search/aggs/buckets/geo_hash.test.ts | 0 .../search/aggs/buckets/geo_hash.ts | 0 .../search/aggs/buckets/geo_hash_fn.test.ts | 0 .../search/aggs/buckets/geo_hash_fn.ts | 0 .../search/aggs/buckets/geo_tile.ts | 0 .../search/aggs/buckets/geo_tile_fn.test.ts | 0 .../search/aggs/buckets/geo_tile_fn.ts | 0 .../search/aggs/buckets/histogram.test.ts | 32 +- .../search/aggs/buckets/histogram.ts | 22 +- .../search/aggs/buckets/histogram_fn.test.ts | 0 .../search/aggs/buckets/histogram_fn.ts | 0 .../search/aggs/buckets/index.ts | 1 + .../search/aggs/buckets/ip_range.ts | 0 .../search/aggs/buckets/ip_range_fn.test.ts | 0 .../search/aggs/buckets/ip_range_fn.ts | 0 .../search/aggs/buckets/lib/cidr_mask.test.ts | 0 .../search/aggs/buckets/lib/cidr_mask.ts | 2 +- .../search/aggs/buckets/lib/date_range.ts | 0 .../aggs/buckets/lib/extended_bounds.ts | 0 .../search/aggs/buckets/lib/geo_point.ts | 0 .../search/aggs/buckets/lib/ip_range.ts | 0 .../time_buckets/calc_auto_interval.test.ts | 0 .../lib/time_buckets/calc_auto_interval.ts | 0 .../lib/time_buckets/calc_es_interval.ts | 2 +- .../aggs/buckets/lib/time_buckets/index.ts | 0 .../lib/time_buckets/time_buckets.test.ts | 0 .../buckets/lib/time_buckets/time_buckets.ts | 2 +- .../buckets/migrate_include_exclude_format.ts | 0 .../search/aggs/buckets/range.test.ts | 18 +- .../search/aggs/buckets/range.ts | 14 +- .../search/aggs/buckets/range_fn.test.ts | 0 .../search/aggs/buckets/range_fn.ts | 0 .../search/aggs/buckets/range_key.ts | 0 .../aggs/buckets/significant_terms.test.ts | 3 +- .../search/aggs/buckets/significant_terms.ts | 0 .../aggs/buckets/significant_terms_fn.test.ts | 0 .../aggs/buckets/significant_terms_fn.ts | 0 .../search/aggs/buckets/terms.test.ts | 0 .../search/aggs/buckets/terms.ts | 0 .../search/aggs/buckets/terms_fn.test.ts | 0 .../search/aggs/buckets/terms_fn.ts | 0 .../search/aggs/index.test.ts | 32 +- src/plugins/data/common/search/aggs/index.ts | 14 +- .../search/aggs/metrics/avg.ts | 0 .../search/aggs/metrics/avg_fn.test.ts | 0 .../search/aggs/metrics/avg_fn.ts | 0 .../search/aggs/metrics/bucket_avg.ts | 0 .../search/aggs/metrics/bucket_avg_fn.test.ts | 0 .../search/aggs/metrics/bucket_avg_fn.ts | 0 .../search/aggs/metrics/bucket_max.ts | 0 .../search/aggs/metrics/bucket_max_fn.test.ts | 0 .../search/aggs/metrics/bucket_max_fn.ts | 0 .../search/aggs/metrics/bucket_min.ts | 0 .../search/aggs/metrics/bucket_min_fn.test.ts | 0 .../search/aggs/metrics/bucket_min_fn.ts | 0 .../search/aggs/metrics/bucket_sum.ts | 0 .../search/aggs/metrics/bucket_sum_fn.test.ts | 0 .../search/aggs/metrics/bucket_sum_fn.ts | 0 .../search/aggs/metrics/cardinality.ts | 0 .../aggs/metrics/cardinality_fn.test.ts | 0 .../search/aggs/metrics/cardinality_fn.ts | 0 .../search/aggs/metrics/count.ts | 0 .../search/aggs/metrics/count_fn.test.ts | 0 .../search/aggs/metrics/count_fn.ts | 0 .../search/aggs/metrics/cumulative_sum.ts | 0 .../aggs/metrics/cumulative_sum_fn.test.ts | 0 .../search/aggs/metrics/cumulative_sum_fn.ts | 0 .../search/aggs/metrics/derivative.ts | 0 .../search/aggs/metrics/derivative_fn.test.ts | 0 .../search/aggs/metrics/derivative_fn.ts | 0 .../search/aggs/metrics/geo_bounds.ts | 0 .../search/aggs/metrics/geo_bounds_fn.test.ts | 0 .../search/aggs/metrics/geo_bounds_fn.ts | 0 .../search/aggs/metrics/geo_centroid.ts | 0 .../aggs/metrics/geo_centroid_fn.test.ts | 0 .../search/aggs/metrics/geo_centroid_fn.ts | 0 .../search/aggs/metrics/index.ts | 0 .../lib/get_response_agg_config_class.ts | 0 .../metrics/lib/make_nested_label.test.ts | 0 .../aggs/metrics/lib/make_nested_label.ts | 0 .../aggs/metrics/lib/nested_agg_helpers.ts | 0 .../aggs/metrics/lib/ordinal_suffix.test.ts | 0 .../search/aggs/metrics/lib/ordinal_suffix.ts | 0 .../metrics/lib/parent_pipeline_agg_helper.ts | 0 .../metrics/lib/parent_pipeline_agg_writer.ts | 0 .../lib/sibling_pipeline_agg_helper.ts | 0 .../lib/sibling_pipeline_agg_writer.ts | 0 .../search/aggs/metrics/max.ts | 0 .../search/aggs/metrics/max_fn.test.ts | 0 .../search/aggs/metrics/max_fn.ts | 0 .../search/aggs/metrics/median.test.ts | 3 +- .../search/aggs/metrics/median.ts | 0 .../search/aggs/metrics/median_fn.test.ts | 0 .../search/aggs/metrics/median_fn.ts | 0 .../search/aggs/metrics/metric_agg_type.ts | 0 .../search/aggs/metrics/metric_agg_types.ts | 0 .../search/aggs/metrics/min.ts | 0 .../search/aggs/metrics/min_fn.test.ts | 0 .../search/aggs/metrics/min_fn.ts | 0 .../search/aggs/metrics/moving_avg.ts | 0 .../search/aggs/metrics/moving_avg_fn.test.ts | 0 .../search/aggs/metrics/moving_avg_fn.ts | 0 .../aggs/metrics/parent_pipeline.test.ts | 0 .../aggs/metrics/percentile_ranks.test.ts | 19 +- .../search/aggs/metrics/percentile_ranks.ts | 26 +- .../aggs/metrics/percentile_ranks_fn.test.ts | 0 .../aggs/metrics/percentile_ranks_fn.ts | 0 .../search/aggs/metrics/percentiles.test.ts | 2 +- .../search/aggs/metrics/percentiles.ts | 0 .../aggs/metrics/percentiles_fn.test.ts | 0 .../search/aggs/metrics/percentiles_fn.ts | 0 .../aggs/metrics/percentiles_get_value.ts | 0 .../search/aggs/metrics/serial_diff.ts | 0 .../aggs/metrics/serial_diff_fn.test.ts | 0 .../search/aggs/metrics/serial_diff_fn.ts | 0 .../aggs/metrics/sibling_pipeline.test.ts | 0 .../search/aggs/metrics/std_deviation.test.ts | 2 +- .../search/aggs/metrics/std_deviation.ts | 0 .../aggs/metrics/std_deviation_fn.test.ts | 0 .../search/aggs/metrics/std_deviation_fn.ts | 0 .../search/aggs/metrics/sum.ts | 0 .../search/aggs/metrics/sum_fn.test.ts | 0 .../search/aggs/metrics/sum_fn.ts | 0 .../search/aggs/metrics/top_hit.test.ts | 2 +- .../search/aggs/metrics/top_hit.ts | 0 .../search/aggs/metrics/top_hit_fn.test.ts | 0 .../search/aggs/metrics/top_hit_fn.ts | 0 .../search/aggs/param_types/agg.ts | 0 .../search/aggs/param_types/base.ts | 3 +- .../search/aggs/param_types/field.test.ts | 0 .../search/aggs/param_types/field.ts | 4 +- .../search/aggs/param_types/index.ts | 0 .../search/aggs/param_types/json.test.ts | 0 .../search/aggs/param_types/json.ts | 0 .../search/aggs/param_types/optioned.test.ts | 0 .../search/aggs/param_types/optioned.ts | 0 .../search/aggs/param_types/string.test.ts | 0 .../search/aggs/param_types/string.ts | 0 .../aggs/test_helpers/function_wrapper.ts | 0 .../search/aggs/test_helpers/index.ts | 4 +- .../test_helpers/mock_agg_types_registry.ts | 81 +++-- src/plugins/data/common/search/aggs/types.ts | 157 +++++++++ .../utils/calculate_auto_time_expression.ts | 15 +- .../date_histogram_interval.test.ts | 0 .../date_histogram_interval.ts | 0 .../{ => utils}/date_interval_utils/index.ts | 0 .../invalid_es_calendar_interval_error.ts | 0 .../invalid_es_interval_format_error.ts | 0 .../is_valid_es_interval.ts | 0 .../date_interval_utils/is_valid_interval.ts | 0 .../least_common_interval.test.ts | 0 .../least_common_interval.ts | 0 .../least_common_multiple.test.ts | 0 .../least_common_multiple.ts | 0 .../parse_es_interval.test.ts | 0 .../date_interval_utils/parse_es_interval.ts | 0 .../parse_interval.test.ts | 0 .../date_interval_utils/parse_interval.ts | 0 .../date_interval_utils/to_absolute_dates.ts | 2 +- .../aggs/utils/get_format_with_aggs.test.ts | 5 +- .../search/aggs/utils/get_format_with_aggs.ts | 9 +- .../search/aggs/utils/get_parsed_value.ts | 0 .../search/aggs/utils/index.ts | 2 + .../aggs/{ => utils}/ipv4_address.test.ts | 0 .../search/aggs/{ => utils}/ipv4_address.ts | 0 .../search/aggs/utils/prop_filter.test.ts | 0 .../search/aggs/utils/prop_filter.ts | 0 .../search/aggs/utils/to_angular_json.ts | 0 .../data/common/search/expressions/index.ts | 1 + .../utils/courier_inspector_stats.ts | 2 +- .../common/search/expressions/utils/index.ts | 20 ++ src/plugins/data/common/search/index.ts | 9 +- .../search/tabify/buckets.test.ts | 0 .../search/tabify/buckets.ts | 0 .../search/tabify/get_columns.test.ts | 0 .../search/tabify/get_columns.ts | 0 .../{public => common}/search/tabify/index.ts | 0 .../search/tabify/response_writer.test.ts | 0 .../search/tabify/response_writer.ts | 0 .../search/tabify/tabify.test.ts | 2 +- .../search/tabify/tabify.ts | 0 .../{public => common}/search/tabify/types.ts | 0 .../public/field_formats/utils/deserialize.ts | 2 +- src/plugins/data/public/index.ts | 62 ++-- src/plugins/data/public/mocks.ts | 2 +- src/plugins/data/public/plugin.ts | 19 +- src/plugins/data/public/public.api.md | 14 +- .../public/search/aggs/aggs_service.test.ts | 182 +++++++++++ .../data/public/search/aggs/aggs_service.ts | 152 +++++++++ src/plugins/data/public/search/aggs/index.ts | 11 +- src/plugins/data/public/search/aggs/mocks.ts | 19 +- src/plugins/data/public/search/aggs/types.ts | 130 +------- .../build_tabular_inspector_data.ts | 2 +- .../search/expressions/create_filter.test.ts | 14 +- .../search/expressions/create_filter.ts | 4 +- .../data/public/search/expressions/esaggs.ts | 14 +- .../public/search/expressions/utils/index.ts | 1 - .../expressions/utils/serialize_agg_config.ts | 2 +- src/plugins/data/public/search/index.ts | 2 - .../data/public/search/search_service.test.ts | 11 +- .../data/public/search/search_service.ts | 94 ++---- src/plugins/data/public/search/types.ts | 16 +- src/plugins/data/public/types.ts | 12 - src/plugins/data/server/index.ts | 51 +++ src/plugins/data/server/plugin.ts | 37 ++- .../server/search/aggs/aggs_service.test.ts | 113 +++++++ .../data/server/search/aggs/aggs_service.ts | 122 +++++++ src/plugins/data/server/search/aggs/index.ts | 21 ++ src/plugins/data/server/search/aggs/mocks.ts | 81 +++++ src/plugins/data/server/search/aggs/types.ts | 27 ++ src/plugins/data/server/search/index.ts | 2 + src/plugins/data/server/search/mocks.ts | 9 +- .../data/server/search/search_service.test.ts | 21 +- .../data/server/search/search_service.ts | 39 ++- src/plugins/data/server/search/types.ts | 3 + src/plugins/data/server/server.api.md | 309 ++++++++++++++++-- .../definitions/date_histogram.test.tsx | 10 +- 315 files changed, 2712 insertions(+), 831 deletions(-) create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggconfigoptions.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggrouplabels.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggroupname.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggroupnames.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparam.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.display.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.enabled.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.val.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype._constructor_.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.allowedaggs.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.makeagg.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.bucket_types.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iaggconfig.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iaggtype.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.ifieldparamtype.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.imetricaggtype.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.aggs.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.aggs.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.metric_types.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype._constructor_.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype.options.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.disabled.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.iscompatible.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.text.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.value.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.aggconfig.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.id.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.name.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggrow.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.columns.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.rows.md rename src/plugins/data/{public => common}/search/aggs/agg_config.test.ts (98%) rename src/plugins/data/{public => common}/search/aggs/agg_config.ts (99%) rename src/plugins/data/{public => common}/search/aggs/agg_configs.test.ts (98%) rename src/plugins/data/{public => common}/search/aggs/agg_configs.ts (98%) rename src/plugins/data/{public => common}/search/aggs/agg_groups.ts (100%) rename src/plugins/data/{public => common}/search/aggs/agg_params.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/agg_params.ts (100%) rename src/plugins/data/{public => common}/search/aggs/agg_type.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/agg_type.ts (99%) rename src/plugins/data/{public => common}/search/aggs/agg_types.ts (66%) rename src/plugins/data/{public => common}/search/aggs/agg_types_registry.test.ts (54%) rename src/plugins/data/{public => common}/search/aggs/agg_types_registry.ts (57%) create mode 100644 src/plugins/data/common/search/aggs/aggs_service.test.ts create mode 100644 src/plugins/data/common/search/aggs/aggs_service.ts rename src/plugins/data/{public => common}/search/aggs/buckets/_interval_options.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/_terms_other_bucket_helper.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/_terms_other_bucket_helper.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/bucket_agg_type.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/bucket_agg_types.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/date_histogram.test.ts (87%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/date_histogram.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/date_range.test.ts (78%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/date_range.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/filters.test.ts (83%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/filters.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/histogram.test.ts (77%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/histogram.ts (80%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/ip_range.test.ts (96%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/ip_range.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/range.test.ts (73%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/range.ts (78%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/terms.test.ts (97%) rename src/plugins/data/{public => common}/search/aggs/buckets/create_filter/terms.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/date_histogram.ts (92%) rename src/plugins/data/{public => common}/search/aggs/buckets/date_histogram_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/date_histogram_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/date_range.test.ts (84%) rename src/plugins/data/{public => common}/search/aggs/buckets/date_range.ts (88%) rename src/plugins/data/{public => common}/search/aggs/buckets/date_range_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/date_range_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/filter.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/filter_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/filter_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/filters.test.ts (93%) rename src/plugins/data/{public => common}/search/aggs/buckets/filters.ts (90%) rename src/plugins/data/{public => common}/search/aggs/buckets/filters_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/filters_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/geo_hash.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/geo_hash.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/geo_hash_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/geo_hash_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/geo_tile.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/geo_tile_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/geo_tile_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/histogram.test.ts (90%) rename src/plugins/data/{public => common}/search/aggs/buckets/histogram.ts (93%) rename src/plugins/data/{public => common}/search/aggs/buckets/histogram_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/histogram_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/index.ts (97%) rename src/plugins/data/{public => common}/search/aggs/buckets/ip_range.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/ip_range_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/ip_range_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/cidr_mask.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/cidr_mask.ts (97%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/date_range.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/extended_bounds.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/geo_point.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/ip_range.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/time_buckets/calc_auto_interval.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/time_buckets/calc_auto_interval.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/time_buckets/calc_es_interval.ts (97%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/time_buckets/index.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/lib/time_buckets/time_buckets.ts (99%) rename src/plugins/data/{public => common}/search/aggs/buckets/migrate_include_exclude_format.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/range.test.ts (79%) rename src/plugins/data/{public => common}/search/aggs/buckets/range.ts (90%) rename src/plugins/data/{public => common}/search/aggs/buckets/range_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/range_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/range_key.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/significant_terms.test.ts (95%) rename src/plugins/data/{public => common}/search/aggs/buckets/significant_terms.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/significant_terms_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/significant_terms_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/terms.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/terms.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/terms_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/buckets/terms_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/index.test.ts (63%) rename src/plugins/data/{public => common}/search/aggs/metrics/avg.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/avg_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/avg_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_avg.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_avg_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_avg_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_max.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_max_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_max_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_min.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_min_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_min_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_sum.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_sum_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/bucket_sum_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/cardinality.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/cardinality_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/cardinality_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/count.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/count_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/count_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/cumulative_sum.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/cumulative_sum_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/cumulative_sum_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/derivative.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/derivative_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/derivative_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/geo_bounds.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/geo_bounds_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/geo_bounds_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/geo_centroid.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/geo_centroid_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/geo_centroid_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/index.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/lib/get_response_agg_config_class.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/lib/make_nested_label.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/lib/make_nested_label.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/lib/nested_agg_helpers.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/lib/ordinal_suffix.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/lib/ordinal_suffix.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/lib/parent_pipeline_agg_writer.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/lib/sibling_pipeline_agg_writer.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/max.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/max_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/max_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/median.test.ts (94%) rename src/plugins/data/{public => common}/search/aggs/metrics/median.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/median_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/median_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/metric_agg_type.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/metric_agg_types.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/min.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/min_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/min_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/moving_avg.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/moving_avg_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/moving_avg_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/parent_pipeline.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/percentile_ranks.test.ts (77%) rename src/plugins/data/{public => common}/search/aggs/metrics/percentile_ranks.ts (86%) rename src/plugins/data/{public => common}/search/aggs/metrics/percentile_ranks_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/percentile_ranks_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/percentiles.test.ts (96%) rename src/plugins/data/{public => common}/search/aggs/metrics/percentiles.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/percentiles_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/percentiles_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/percentiles_get_value.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/serial_diff.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/serial_diff_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/serial_diff_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/sibling_pipeline.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/std_deviation.test.ts (97%) rename src/plugins/data/{public => common}/search/aggs/metrics/std_deviation.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/std_deviation_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/std_deviation_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/sum.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/sum_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/sum_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/top_hit.test.ts (99%) rename src/plugins/data/{public => common}/search/aggs/metrics/top_hit.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/top_hit_fn.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/metrics/top_hit_fn.ts (100%) rename src/plugins/data/{public => common}/search/aggs/param_types/agg.ts (100%) rename src/plugins/data/{public => common}/search/aggs/param_types/base.ts (96%) rename src/plugins/data/{public => common}/search/aggs/param_types/field.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/param_types/field.ts (96%) rename src/plugins/data/{public => common}/search/aggs/param_types/index.ts (100%) rename src/plugins/data/{public => common}/search/aggs/param_types/json.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/param_types/json.ts (100%) rename src/plugins/data/{public => common}/search/aggs/param_types/optioned.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/param_types/optioned.ts (100%) rename src/plugins/data/{public => common}/search/aggs/param_types/string.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/param_types/string.ts (100%) rename src/plugins/data/{public => common}/search/aggs/test_helpers/function_wrapper.ts (100%) rename src/plugins/data/{public => common}/search/aggs/test_helpers/index.ts (86%) rename src/plugins/data/{public => common}/search/aggs/test_helpers/mock_agg_types_registry.ts (52%) create mode 100644 src/plugins/data/common/search/aggs/types.ts rename src/plugins/data/{public => common}/search/aggs/utils/calculate_auto_time_expression.ts (71%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/date_histogram_interval.test.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/date_histogram_interval.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/index.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/invalid_es_calendar_interval_error.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/invalid_es_interval_format_error.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/is_valid_es_interval.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/is_valid_interval.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/least_common_interval.test.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/least_common_interval.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/least_common_multiple.test.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/least_common_multiple.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/parse_es_interval.test.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/parse_es_interval.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/parse_interval.test.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/parse_interval.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/date_interval_utils/to_absolute_dates.ts (95%) rename src/plugins/data/{public => common}/search/aggs/utils/get_format_with_aggs.test.ts (95%) rename src/plugins/data/{public => common}/search/aggs/utils/get_format_with_aggs.ts (95%) rename src/plugins/data/{public => common}/search/aggs/utils/get_parsed_value.ts (100%) rename src/plugins/data/{public => common}/search/aggs/utils/index.ts (93%) rename src/plugins/data/common/search/aggs/{ => utils}/ipv4_address.test.ts (100%) rename src/plugins/data/common/search/aggs/{ => utils}/ipv4_address.ts (100%) rename src/plugins/data/{public => common}/search/aggs/utils/prop_filter.test.ts (100%) rename src/plugins/data/{public => common}/search/aggs/utils/prop_filter.ts (100%) rename src/plugins/data/{public => common}/search/aggs/utils/to_angular_json.ts (100%) rename src/plugins/data/{public => common}/search/expressions/utils/courier_inspector_stats.ts (98%) create mode 100644 src/plugins/data/common/search/expressions/utils/index.ts rename src/plugins/data/{public => common}/search/tabify/buckets.test.ts (100%) rename src/plugins/data/{public => common}/search/tabify/buckets.ts (100%) rename src/plugins/data/{public => common}/search/tabify/get_columns.test.ts (100%) rename src/plugins/data/{public => common}/search/tabify/get_columns.ts (100%) rename src/plugins/data/{public => common}/search/tabify/index.ts (100%) rename src/plugins/data/{public => common}/search/tabify/response_writer.test.ts (100%) rename src/plugins/data/{public => common}/search/tabify/response_writer.ts (100%) rename src/plugins/data/{public => common}/search/tabify/tabify.test.ts (98%) rename src/plugins/data/{public => common}/search/tabify/tabify.ts (100%) rename src/plugins/data/{public => common}/search/tabify/types.ts (100%) create mode 100644 src/plugins/data/public/search/aggs/aggs_service.test.ts create mode 100644 src/plugins/data/public/search/aggs/aggs_service.ts create mode 100644 src/plugins/data/server/search/aggs/aggs_service.test.ts create mode 100644 src/plugins/data/server/search/aggs/aggs_service.ts create mode 100644 src/plugins/data/server/search/aggs/index.ts create mode 100644 src/plugins/data/server/search/aggs/mocks.ts create mode 100644 src/plugins/data/server/search/aggs/types.ts diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.baseformatterspublic.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.baseformatterspublic.md index 25f046983cbce..1aa9f460c4fac 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.baseformatterspublic.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.baseformatterspublic.md @@ -7,5 +7,5 @@ Signature: ```typescript -baseFormattersPublic: (import("../../common").FieldFormatInstanceType | typeof DateNanosFormat | typeof DateFormat)[] +baseFormattersPublic: (import("../../common").FieldFormatInstanceType | typeof DateFormat | typeof DateNanosFormat)[] ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md index 6c8f7fbdb170b..22dc92c275670 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.search.md @@ -14,7 +14,7 @@ search: { intervalOptions: ({ display: string; val: string; - enabled(agg: import("./search/aggs/buckets/bucket_agg_type").IBucketAggConfig): boolean | "" | undefined; + enabled(agg: import("../common").IBucketAggConfig): boolean | "" | undefined; } | { display: string; val: string; @@ -23,9 +23,9 @@ search: { InvalidEsIntervalFormatError: typeof InvalidEsIntervalFormatError; Ipv4Address: typeof Ipv4Address; isDateHistogramBucketAggConfig: typeof isDateHistogramBucketAggConfig; - isNumberType: (agg: import("./search").AggConfig) => boolean; - isStringType: (agg: import("./search").AggConfig) => boolean; - isType: (...types: string[]) => (agg: import("./search").AggConfig) => boolean; + isNumberType: (agg: import("../common").AggConfig) => boolean; + isStringType: (agg: import("../common").AggConfig) => boolean; + isType: (...types: string[]) => (agg: import("../common").AggConfig) => boolean; isValidEsInterval: typeof isValidEsInterval; isValidInterval: typeof isValidInterval; parentPipelineType: string; diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggconfigoptions.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggconfigoptions.md new file mode 100644 index 0000000000000..effb2e798ad6f --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggconfigoptions.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggConfigOptions](./kibana-plugin-plugins-data-server.aggconfigoptions.md) + +## AggConfigOptions type + +Signature: + +```typescript +export declare type AggConfigOptions = Assign; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggrouplabels.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggrouplabels.md new file mode 100644 index 0000000000000..cf0caee6ac33e --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggrouplabels.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggGroupLabels](./kibana-plugin-plugins-data-server.agggrouplabels.md) + +## AggGroupLabels variable + +Signature: + +```typescript +AggGroupLabels: { + buckets: string; + metrics: string; + none: string; +} +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggroupname.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggroupname.md new file mode 100644 index 0000000000000..403294eba1367 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggroupname.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggGroupName](./kibana-plugin-plugins-data-server.agggroupname.md) + +## AggGroupName type + +Signature: + +```typescript +export declare type AggGroupName = $Values; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggroupnames.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggroupnames.md new file mode 100644 index 0000000000000..11d194723c521 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.agggroupnames.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggGroupNames](./kibana-plugin-plugins-data-server.agggroupnames.md) + +## AggGroupNames variable + +Signature: + +```typescript +AggGroupNames: Readonly<{ + Buckets: "buckets"; + Metrics: "metrics"; + None: "none"; +}> +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparam.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparam.md new file mode 100644 index 0000000000000..893501666b9a0 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparam.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggParam](./kibana-plugin-plugins-data-server.aggparam.md) + +## AggParam type + +Signature: + +```typescript +export declare type AggParam = BaseParamType; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.display.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.display.md new file mode 100644 index 0000000000000..1030056e16afe --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.display.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggParamOption](./kibana-plugin-plugins-data-server.aggparamoption.md) > [display](./kibana-plugin-plugins-data-server.aggparamoption.display.md) + +## AggParamOption.display property + +Signature: + +```typescript +display: string; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.enabled.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.enabled.md new file mode 100644 index 0000000000000..8b1fcc4a1bbd0 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.enabled.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggParamOption](./kibana-plugin-plugins-data-server.aggparamoption.md) > [enabled](./kibana-plugin-plugins-data-server.aggparamoption.enabled.md) + +## AggParamOption.enabled() method + +Signature: + +```typescript +enabled?(agg: AggConfig): boolean; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| agg | AggConfig | | + +Returns: + +`boolean` + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.md new file mode 100644 index 0000000000000..a7ddcf395cab4 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.md @@ -0,0 +1,25 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggParamOption](./kibana-plugin-plugins-data-server.aggparamoption.md) + +## AggParamOption interface + +Signature: + +```typescript +export interface AggParamOption +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [display](./kibana-plugin-plugins-data-server.aggparamoption.display.md) | string | | +| [val](./kibana-plugin-plugins-data-server.aggparamoption.val.md) | string | | + +## Methods + +| Method | Description | +| --- | --- | +| [enabled(agg)](./kibana-plugin-plugins-data-server.aggparamoption.enabled.md) | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.val.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.val.md new file mode 100644 index 0000000000000..2c87c91c294d9 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamoption.val.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggParamOption](./kibana-plugin-plugins-data-server.aggparamoption.md) > [val](./kibana-plugin-plugins-data-server.aggparamoption.val.md) + +## AggParamOption.val property + +Signature: + +```typescript +val: string; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype._constructor_.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype._constructor_.md new file mode 100644 index 0000000000000..2e1b16855987e --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype._constructor_.md @@ -0,0 +1,20 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggParamType](./kibana-plugin-plugins-data-server.aggparamtype.md) > [(constructor)](./kibana-plugin-plugins-data-server.aggparamtype._constructor_.md) + +## AggParamType.(constructor) + +Constructs a new instance of the `AggParamType` class + +Signature: + +```typescript +constructor(config: Record); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| config | Record<string, any> | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.allowedaggs.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.allowedaggs.md new file mode 100644 index 0000000000000..36179a9ce3569 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.allowedaggs.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggParamType](./kibana-plugin-plugins-data-server.aggparamtype.md) > [allowedAggs](./kibana-plugin-plugins-data-server.aggparamtype.allowedaggs.md) + +## AggParamType.allowedAggs property + +Signature: + +```typescript +allowedAggs: string[]; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.makeagg.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.makeagg.md new file mode 100644 index 0000000000000..bd5d2fca77659 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.makeagg.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggParamType](./kibana-plugin-plugins-data-server.aggparamtype.md) > [makeAgg](./kibana-plugin-plugins-data-server.aggparamtype.makeagg.md) + +## AggParamType.makeAgg property + +Signature: + +```typescript +makeAgg: (agg: TAggConfig, state?: AggConfigSerialized) => TAggConfig; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.md new file mode 100644 index 0000000000000..00c1906dd880b --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggparamtype.md @@ -0,0 +1,25 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggParamType](./kibana-plugin-plugins-data-server.aggparamtype.md) + +## AggParamType class + +Signature: + +```typescript +export declare class AggParamType extends BaseParamType +``` + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(config)](./kibana-plugin-plugins-data-server.aggparamtype._constructor_.md) | | Constructs a new instance of the AggParamType class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [allowedAggs](./kibana-plugin-plugins-data-server.aggparamtype.allowedaggs.md) | | string[] | | +| [makeAgg](./kibana-plugin-plugins-data-server.aggparamtype.makeagg.md) | | (agg: TAggConfig, state?: AggConfigSerialized) => TAggConfig | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.bucket_types.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.bucket_types.md new file mode 100644 index 0000000000000..568e435754545 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.bucket_types.md @@ -0,0 +1,28 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [BUCKET\_TYPES](./kibana-plugin-plugins-data-server.bucket_types.md) + +## BUCKET\_TYPES enum + +Signature: + +```typescript +export declare enum BUCKET_TYPES +``` + +## Enumeration Members + +| Member | Value | Description | +| --- | --- | --- | +| DATE\_HISTOGRAM | "date_histogram" | | +| DATE\_RANGE | "date_range" | | +| FILTER | "filter" | | +| FILTERS | "filters" | | +| GEOHASH\_GRID | "geohash_grid" | | +| GEOTILE\_GRID | "geotile_grid" | | +| HISTOGRAM | "histogram" | | +| IP\_RANGE | "ip_range" | | +| RANGE | "range" | | +| SIGNIFICANT\_TERMS | "significant_terms" | | +| TERMS | "terms" | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iaggconfig.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iaggconfig.md new file mode 100644 index 0000000000000..261b6e0b3bac1 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iaggconfig.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IAggConfig](./kibana-plugin-plugins-data-server.iaggconfig.md) + +## IAggConfig type + + AggConfig + + This class represents an aggregation, which is displayed in the left-hand nav of the Visualize app. + +Signature: + +```typescript +export declare type IAggConfig = AggConfig; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iaggtype.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iaggtype.md new file mode 100644 index 0000000000000..d5868e1b0917e --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iaggtype.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IAggType](./kibana-plugin-plugins-data-server.iaggtype.md) + +## IAggType type + +Signature: + +```typescript +export declare type IAggType = AggType; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.ifieldparamtype.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.ifieldparamtype.md new file mode 100644 index 0000000000000..4937245647f4e --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.ifieldparamtype.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IFieldParamType](./kibana-plugin-plugins-data-server.ifieldparamtype.md) + +## IFieldParamType type + +Signature: + +```typescript +export declare type IFieldParamType = FieldParamType; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.imetricaggtype.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.imetricaggtype.md new file mode 100644 index 0000000000000..ae779c2b1510f --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.imetricaggtype.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IMetricAggType](./kibana-plugin-plugins-data-server.imetricaggtype.md) + +## IMetricAggType type + +Signature: + +```typescript +export declare type IMetricAggType = MetricAggType; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.aggs.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.aggs.md new file mode 100644 index 0000000000000..86bd4ab694e11 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.aggs.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [ISearchSetup](./kibana-plugin-plugins-data-server.isearchsetup.md) > [aggs](./kibana-plugin-plugins-data-server.isearchsetup.aggs.md) + +## ISearchSetup.aggs property + +Signature: + +```typescript +aggs: AggsSetup; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.md index d9749bc44f45a..e5b11a0b997ea 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.md @@ -14,6 +14,7 @@ export interface ISearchSetup | Property | Type | Description | | --- | --- | --- | +| [aggs](./kibana-plugin-plugins-data-server.isearchsetup.aggs.md) | AggsSetup | | | [registerSearchStrategy](./kibana-plugin-plugins-data-server.isearchsetup.registersearchstrategy.md) | (name: string, strategy: ISearchStrategy) => void | Extension point exposed for other plugins to register their own search strategies. | | [usage](./kibana-plugin-plugins-data-server.isearchsetup.usage.md) | SearchUsage | Used internally for telemetry | diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.aggs.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.aggs.md new file mode 100644 index 0000000000000..8da429a07708c --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.aggs.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [ISearchStart](./kibana-plugin-plugins-data-server.isearchstart.md) > [aggs](./kibana-plugin-plugins-data-server.isearchstart.aggs.md) + +## ISearchStart.aggs property + +Signature: + +```typescript +aggs: AggsStart; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md index 308ce3cb568bc..3762da963d4d9 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md @@ -14,6 +14,7 @@ export interface ISearchStart | Property | Type | Description | | --- | --- | --- | +| [aggs](./kibana-plugin-plugins-data-server.isearchstart.aggs.md) | AggsStart | | | [getSearchStrategy](./kibana-plugin-plugins-data-server.isearchstart.getsearchstrategy.md) | (name: string) => ISearchStrategy | Get other registered search strategies. For example, if a new strategy needs to use the already-registered ES search strategy, it can use this function to accomplish that. | | [search](./kibana-plugin-plugins-data-server.isearchstart.search.md) | (context: RequestHandlerContext, request: IKibanaSearchRequest, options: ISearchOptions) => Promise<IKibanaSearchResponse> | | diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md index f472064c87755..0292e08063fbb 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md @@ -8,15 +8,19 @@ | Class | Description | | --- | --- | +| [AggParamType](./kibana-plugin-plugins-data-server.aggparamtype.md) | | | [IndexPatternsFetcher](./kibana-plugin-plugins-data-server.indexpatternsfetcher.md) | | +| [OptionedParamType](./kibana-plugin-plugins-data-server.optionedparamtype.md) | | | [Plugin](./kibana-plugin-plugins-data-server.plugin.md) | | ## Enumerations | Enumeration | Description | | --- | --- | +| [BUCKET\_TYPES](./kibana-plugin-plugins-data-server.bucket_types.md) | | | [ES\_FIELD\_TYPES](./kibana-plugin-plugins-data-server.es_field_types.md) | \* | | [KBN\_FIELD\_TYPES](./kibana-plugin-plugins-data-server.kbn_field_types.md) | \* | +| [METRIC\_TYPES](./kibana-plugin-plugins-data-server.metric_types.md) | | ## Functions @@ -33,6 +37,7 @@ | Interface | Description | | --- | --- | +| [AggParamOption](./kibana-plugin-plugins-data-server.aggparamoption.md) | | | [EsQueryConfig](./kibana-plugin-plugins-data-server.esqueryconfig.md) | | | [FieldFormatConfig](./kibana-plugin-plugins-data-server.fieldformatconfig.md) | | | [Filter](./kibana-plugin-plugins-data-server.filter.md) | | @@ -48,17 +53,22 @@ | [ISearchStart](./kibana-plugin-plugins-data-server.isearchstart.md) | | | [ISearchStrategy](./kibana-plugin-plugins-data-server.isearchstrategy.md) | Search strategy interface contains a search method that takes in a request and returns a promise that resolves to a response. | | [KueryNode](./kibana-plugin-plugins-data-server.kuerynode.md) | | +| [OptionedValueProp](./kibana-plugin-plugins-data-server.optionedvalueprop.md) | | | [PluginSetup](./kibana-plugin-plugins-data-server.pluginsetup.md) | | | [PluginStart](./kibana-plugin-plugins-data-server.pluginstart.md) | | | [Query](./kibana-plugin-plugins-data-server.query.md) | | | [RefreshInterval](./kibana-plugin-plugins-data-server.refreshinterval.md) | | | [SearchUsage](./kibana-plugin-plugins-data-server.searchusage.md) | | +| [TabbedAggColumn](./kibana-plugin-plugins-data-server.tabbedaggcolumn.md) | \* | +| [TabbedTable](./kibana-plugin-plugins-data-server.tabbedtable.md) | \* | | [TimeRange](./kibana-plugin-plugins-data-server.timerange.md) | | ## Variables | Variable | Description | | --- | --- | +| [AggGroupLabels](./kibana-plugin-plugins-data-server.agggrouplabels.md) | | +| [AggGroupNames](./kibana-plugin-plugins-data-server.agggroupnames.md) | | | [castEsToKbnFieldTypeName](./kibana-plugin-plugins-data-server.castestokbnfieldtypename.md) | Get the KbnFieldType name for an esType string | | [config](./kibana-plugin-plugins-data-server.config.md) | | | [esFilters](./kibana-plugin-plugins-data-server.esfilters.md) | | @@ -73,8 +83,16 @@ | Type Alias | Description | | --- | --- | +| [AggConfigOptions](./kibana-plugin-plugins-data-server.aggconfigoptions.md) | | +| [AggGroupName](./kibana-plugin-plugins-data-server.agggroupname.md) | | +| [AggParam](./kibana-plugin-plugins-data-server.aggparam.md) | | | [EsaggsExpressionFunctionDefinition](./kibana-plugin-plugins-data-server.esaggsexpressionfunctiondefinition.md) | | | [FieldFormatsGetConfigFn](./kibana-plugin-plugins-data-server.fieldformatsgetconfigfn.md) | | +| [IAggConfig](./kibana-plugin-plugins-data-server.iaggconfig.md) | AggConfig This class represents an aggregation, which is displayed in the left-hand nav of the Visualize app. | +| [IAggType](./kibana-plugin-plugins-data-server.iaggtype.md) | | | [IFieldFormatsRegistry](./kibana-plugin-plugins-data-server.ifieldformatsregistry.md) | | +| [IFieldParamType](./kibana-plugin-plugins-data-server.ifieldparamtype.md) | | +| [IMetricAggType](./kibana-plugin-plugins-data-server.imetricaggtype.md) | | | [ParsedInterval](./kibana-plugin-plugins-data-server.parsedinterval.md) | | +| [TabbedAggRow](./kibana-plugin-plugins-data-server.tabbedaggrow.md) | \* | diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.metric_types.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.metric_types.md new file mode 100644 index 0000000000000..49df98b6d70a1 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.metric_types.md @@ -0,0 +1,38 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [METRIC\_TYPES](./kibana-plugin-plugins-data-server.metric_types.md) + +## METRIC\_TYPES enum + +Signature: + +```typescript +export declare enum METRIC_TYPES +``` + +## Enumeration Members + +| Member | Value | Description | +| --- | --- | --- | +| AVG | "avg" | | +| AVG\_BUCKET | "avg_bucket" | | +| CARDINALITY | "cardinality" | | +| COUNT | "count" | | +| CUMULATIVE\_SUM | "cumulative_sum" | | +| DERIVATIVE | "derivative" | | +| GEO\_BOUNDS | "geo_bounds" | | +| GEO\_CENTROID | "geo_centroid" | | +| MAX | "max" | | +| MAX\_BUCKET | "max_bucket" | | +| MEDIAN | "median" | | +| MIN | "min" | | +| MIN\_BUCKET | "min_bucket" | | +| MOVING\_FN | "moving_avg" | | +| PERCENTILE\_RANKS | "percentile_ranks" | | +| PERCENTILES | "percentiles" | | +| SERIAL\_DIFF | "serial_diff" | | +| STD\_DEV | "std_dev" | | +| SUM | "sum" | | +| SUM\_BUCKET | "sum_bucket" | | +| TOP\_HITS | "top_hits" | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype._constructor_.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype._constructor_.md new file mode 100644 index 0000000000000..3b2fd2218709a --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype._constructor_.md @@ -0,0 +1,20 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [OptionedParamType](./kibana-plugin-plugins-data-server.optionedparamtype.md) > [(constructor)](./kibana-plugin-plugins-data-server.optionedparamtype._constructor_.md) + +## OptionedParamType.(constructor) + +Constructs a new instance of the `OptionedParamType` class + +Signature: + +```typescript +constructor(config: Record); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| config | Record<string, any> | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype.md new file mode 100644 index 0000000000000..6bf2ef4baa915 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [OptionedParamType](./kibana-plugin-plugins-data-server.optionedparamtype.md) + +## OptionedParamType class + +Signature: + +```typescript +export declare class OptionedParamType extends BaseParamType +``` + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(config)](./kibana-plugin-plugins-data-server.optionedparamtype._constructor_.md) | | Constructs a new instance of the OptionedParamType class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [options](./kibana-plugin-plugins-data-server.optionedparamtype.options.md) | | OptionedValueProp[] | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype.options.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype.options.md new file mode 100644 index 0000000000000..868619ad5a9e0 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedparamtype.options.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [OptionedParamType](./kibana-plugin-plugins-data-server.optionedparamtype.md) > [options](./kibana-plugin-plugins-data-server.optionedparamtype.options.md) + +## OptionedParamType.options property + +Signature: + +```typescript +options: OptionedValueProp[]; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.disabled.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.disabled.md new file mode 100644 index 0000000000000..e0a21a8727614 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.disabled.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [OptionedValueProp](./kibana-plugin-plugins-data-server.optionedvalueprop.md) > [disabled](./kibana-plugin-plugins-data-server.optionedvalueprop.disabled.md) + +## OptionedValueProp.disabled property + +Signature: + +```typescript +disabled?: boolean; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.iscompatible.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.iscompatible.md new file mode 100644 index 0000000000000..de3ecc0b97a64 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.iscompatible.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [OptionedValueProp](./kibana-plugin-plugins-data-server.optionedvalueprop.md) > [isCompatible](./kibana-plugin-plugins-data-server.optionedvalueprop.iscompatible.md) + +## OptionedValueProp.isCompatible property + +Signature: + +```typescript +isCompatible: (agg: IAggConfig) => boolean; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.md new file mode 100644 index 0000000000000..ef2440035c83b --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [OptionedValueProp](./kibana-plugin-plugins-data-server.optionedvalueprop.md) + +## OptionedValueProp interface + +Signature: + +```typescript +export interface OptionedValueProp +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [disabled](./kibana-plugin-plugins-data-server.optionedvalueprop.disabled.md) | boolean | | +| [isCompatible](./kibana-plugin-plugins-data-server.optionedvalueprop.iscompatible.md) | (agg: IAggConfig) => boolean | | +| [text](./kibana-plugin-plugins-data-server.optionedvalueprop.text.md) | string | | +| [value](./kibana-plugin-plugins-data-server.optionedvalueprop.value.md) | string | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.text.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.text.md new file mode 100644 index 0000000000000..0a2b3ac708038 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.text.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [OptionedValueProp](./kibana-plugin-plugins-data-server.optionedvalueprop.md) > [text](./kibana-plugin-plugins-data-server.optionedvalueprop.text.md) + +## OptionedValueProp.text property + +Signature: + +```typescript +text: string; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.value.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.value.md new file mode 100644 index 0000000000000..76618558d0479 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.optionedvalueprop.value.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [OptionedValueProp](./kibana-plugin-plugins-data-server.optionedvalueprop.md) > [value](./kibana-plugin-plugins-data-server.optionedvalueprop.value.md) + +## OptionedValueProp.value property + +Signature: + +```typescript +value: string; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.plugin.setup.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.plugin.setup.md index a6fdfdf6891c8..18fca3d2c8a66 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.plugin.setup.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.plugin.setup.md @@ -7,10 +7,10 @@ Signature: ```typescript -setup(core: CoreSetup, { usageCollection }: DataPluginSetupDependencies): { +setup(core: CoreSetup, { expressions, usageCollection }: DataPluginSetupDependencies): { search: ISearchSetup; fieldFormats: { - register: (customFieldFormat: import("../common").FieldFormatInstanceType) => number; + register: (customFieldFormat: import("../public").FieldFormatInstanceType) => number; }; }; ``` @@ -19,15 +19,15 @@ setup(core: CoreSetup, { usageCollection }: DataPluginS | Parameter | Type | Description | | --- | --- | --- | -| core | CoreSetup<object, DataPluginStart> | | -| { usageCollection } | DataPluginSetupDependencies | | +| core | CoreSetup<DataPluginStartDependencies, DataPluginStart> | | +| { expressions, usageCollection } | DataPluginSetupDependencies | | Returns: `{ search: ISearchSetup; fieldFormats: { - register: (customFieldFormat: import("../common").FieldFormatInstanceType) => number; + register: (customFieldFormat: import("../public").FieldFormatInstanceType) => number; }; }` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.search.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.search.md index 09563358100b3..9e38ce3f64f38 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.search.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.search.md @@ -9,15 +9,35 @@ ```typescript search: { aggs: { + CidrMask: typeof CidrMask; dateHistogramInterval: typeof dateHistogramInterval; + intervalOptions: ({ + display: string; + val: string; + enabled(agg: import("../common").IBucketAggConfig): boolean | "" | undefined; + } | { + display: string; + val: string; + })[]; InvalidEsCalendarIntervalError: typeof InvalidEsCalendarIntervalError; InvalidEsIntervalFormatError: typeof InvalidEsIntervalFormatError; Ipv4Address: typeof Ipv4Address; + isNumberType: (agg: import("../common").AggConfig) => boolean; + isStringType: (agg: import("../common").AggConfig) => boolean; + isType: (...types: string[]) => (agg: import("../common").AggConfig) => boolean; isValidEsInterval: typeof isValidEsInterval; isValidInterval: typeof isValidInterval; + parentPipelineType: string; parseEsInterval: typeof parseEsInterval; parseInterval: typeof parseInterval; + propFilter: typeof propFilter; + siblingPipelineType: string; + termsAggFilter: string[]; toAbsoluteDates: typeof toAbsoluteDates; }; + getRequestInspectorStats: typeof getRequestInspectorStats; + getResponseInspectorStats: typeof getResponseInspectorStats; + tabifyAggResponse: typeof tabifyAggResponse; + tabifyGetColumns: typeof tabifyGetColumns; } ``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.aggconfig.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.aggconfig.md new file mode 100644 index 0000000000000..9870f7380e16a --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.aggconfig.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [TabbedAggColumn](./kibana-plugin-plugins-data-server.tabbedaggcolumn.md) > [aggConfig](./kibana-plugin-plugins-data-server.tabbedaggcolumn.aggconfig.md) + +## TabbedAggColumn.aggConfig property + +Signature: + +```typescript +aggConfig: IAggConfig; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.id.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.id.md new file mode 100644 index 0000000000000..4f5a964a07a0c --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.id.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [TabbedAggColumn](./kibana-plugin-plugins-data-server.tabbedaggcolumn.md) > [id](./kibana-plugin-plugins-data-server.tabbedaggcolumn.id.md) + +## TabbedAggColumn.id property + +Signature: + +```typescript +id: string; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.md new file mode 100644 index 0000000000000..5e47f745fa17a --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [TabbedAggColumn](./kibana-plugin-plugins-data-server.tabbedaggcolumn.md) + +## TabbedAggColumn interface + +\* + +Signature: + +```typescript +export interface TabbedAggColumn +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [aggConfig](./kibana-plugin-plugins-data-server.tabbedaggcolumn.aggconfig.md) | IAggConfig | | +| [id](./kibana-plugin-plugins-data-server.tabbedaggcolumn.id.md) | string | | +| [name](./kibana-plugin-plugins-data-server.tabbedaggcolumn.name.md) | string | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.name.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.name.md new file mode 100644 index 0000000000000..8a07e2708066f --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggcolumn.name.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [TabbedAggColumn](./kibana-plugin-plugins-data-server.tabbedaggcolumn.md) > [name](./kibana-plugin-plugins-data-server.tabbedaggcolumn.name.md) + +## TabbedAggColumn.name property + +Signature: + +```typescript +name: string; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggrow.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggrow.md new file mode 100644 index 0000000000000..d592aeff89639 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedaggrow.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [TabbedAggRow](./kibana-plugin-plugins-data-server.tabbedaggrow.md) + +## TabbedAggRow type + +\* + +Signature: + +```typescript +export declare type TabbedAggRow = Record; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.columns.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.columns.md new file mode 100644 index 0000000000000..55f079c581c8b --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.columns.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [TabbedTable](./kibana-plugin-plugins-data-server.tabbedtable.md) > [columns](./kibana-plugin-plugins-data-server.tabbedtable.columns.md) + +## TabbedTable.columns property + +Signature: + +```typescript +columns: TabbedAggColumn[]; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.md new file mode 100644 index 0000000000000..1bb055a2a3ce9 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [TabbedTable](./kibana-plugin-plugins-data-server.tabbedtable.md) + +## TabbedTable interface + +\* + +Signature: + +```typescript +export interface TabbedTable +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [columns](./kibana-plugin-plugins-data-server.tabbedtable.columns.md) | TabbedAggColumn[] | | +| [rows](./kibana-plugin-plugins-data-server.tabbedtable.rows.md) | TabbedAggRow[] | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.rows.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.rows.md new file mode 100644 index 0000000000000..b783919a26573 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.tabbedtable.rows.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [TabbedTable](./kibana-plugin-plugins-data-server.tabbedtable.md) > [rows](./kibana-plugin-plugins-data-server.tabbedtable.rows.md) + +## TabbedTable.rows property + +Signature: + +```typescript +rows: TabbedAggRow[]; +``` diff --git a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js index 35380ada51a0a..5ef1149146afe 100644 --- a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js +++ b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js @@ -26,7 +26,7 @@ import { getAggTypes, AggConfigs, // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../../../src/plugins/data/public/search/aggs'; +} from '../../../../../src/plugins/data/common/search/aggs'; import { ComponentRegistry } from '../../../../../src/plugins/advanced_settings/public/'; import { UI_SETTINGS } from '../../../../../src/plugins/data/public/'; import { @@ -184,12 +184,13 @@ const mockAggTypesRegistry = () => { const registry = new AggTypesRegistry(); const registrySetup = registry.setup(); const aggTypes = getAggTypes({ - uiSettings: mockCoreSetup.uiSettings, - query: querySetup, - getInternalStartServices: () => ({ - fieldFormats: getFieldFormatsRegistry(mockCoreStart), - notifications: mockCoreStart.notifications, + calculateBounds: sinon.fake(), + getConfig: sinon.fake(), + getFieldFormatsStart: () => ({ + deserialize: sinon.fake(), + getDefaultInstance: sinon.fake(), }), + isDefaultTimezone: () => true, }); aggTypes.buckets.forEach((type) => registrySetup.registerBucket(type)); aggTypes.metrics.forEach((type) => registrySetup.registerMetric(type)); @@ -240,7 +241,6 @@ export const npSetup = { query: querySetup, search: { aggs: { - calculateAutoTimeExpression: sinon.fake(), types: aggTypesRegistry.setup(), }, __LEGACY: { diff --git a/src/plugins/data/common/field_formats/converters/source.ts b/src/plugins/data/common/field_formats/converters/source.ts index f00261e00971a..9c81bb011e127 100644 --- a/src/plugins/data/common/field_formats/converters/source.ts +++ b/src/plugins/data/common/field_formats/converters/source.ts @@ -22,7 +22,7 @@ import { shortenDottedString } from '../../utils'; import { KBN_FIELD_TYPES } from '../../kbn_field_types/types'; import { FieldFormat } from '../field_format'; import { TextContextTypeConvert, HtmlContextTypeConvert, FIELD_FORMAT_IDS } from '../types'; -import { UI_SETTINGS } from '../../'; +import { UI_SETTINGS } from '../../constants'; /** * Remove all of the whitespace between html tags diff --git a/src/plugins/data/common/field_formats/field_formats_registry.ts b/src/plugins/data/common/field_formats/field_formats_registry.ts index 84bedd2f9dee0..4b847ebc358d7 100644 --- a/src/plugins/data/common/field_formats/field_formats_registry.ts +++ b/src/plugins/data/common/field_formats/field_formats_registry.ts @@ -33,7 +33,7 @@ import { baseFormatters } from './constants/base_formatters'; import { FieldFormat } from './field_format'; import { SerializedFieldFormat } from '../../../expressions/common/types'; import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '../types'; -import { UI_SETTINGS } from '../'; +import { UI_SETTINGS } from '../constants'; export class FieldFormatsRegistry { protected fieldFormats: Map = new Map(); diff --git a/src/plugins/data/common/field_formats/mocks.ts b/src/plugins/data/common/field_formats/mocks.ts index 9bbaefe2d146a..ddf9cf246ec7d 100644 --- a/src/plugins/data/common/field_formats/mocks.ts +++ b/src/plugins/data/common/field_formats/mocks.ts @@ -24,6 +24,7 @@ export const fieldFormatsMock: IFieldFormatsRegistry = { getByFieldType: jest.fn(), getDefaultConfig: jest.fn(), getDefaultInstance: jest.fn().mockImplementation(() => ({ + convert: jest.fn().mockImplementation((t: string) => t), getConverterFor: jest.fn().mockImplementation(() => (t: string) => t), })) as any, getDefaultInstanceCacheResolver: jest.fn(), diff --git a/src/plugins/data/common/index.ts b/src/plugins/data/common/index.ts index ca6bc965d48c5..bc7080e7d450b 100644 --- a/src/plugins/data/common/index.ts +++ b/src/plugins/data/common/index.ts @@ -25,7 +25,5 @@ export * from './index_patterns'; export * from './kbn_field_types'; export * from './query'; export * from './search'; -export * from './search/aggs'; -export * from './search/expressions'; export * from './types'; export * from './utils'; diff --git a/src/plugins/data/common/index_patterns/fields/field_list.ts b/src/plugins/data/common/index_patterns/fields/field_list.ts index 172da9f9ca43f..34bd69230a2e4 100644 --- a/src/plugins/data/common/index_patterns/fields/field_list.ts +++ b/src/plugins/data/common/index_patterns/fields/field_list.ts @@ -18,10 +18,11 @@ */ import { findIndex } from 'lodash'; -import { IFieldType, shortenDottedString } from '../../../common'; +import { IFieldType } from './types'; import { IndexPatternField } from './index_pattern_field'; import { OnNotification, FieldSpec } from '../types'; import { IndexPattern } from '../index_patterns'; +import { shortenDottedString } from '../../utils'; type FieldMap = Map; diff --git a/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts b/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts index 679de103f8019..965f1a7f63065 100644 --- a/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts +++ b/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts @@ -18,13 +18,10 @@ */ import { i18n } from '@kbn/i18n'; -import { - IFieldType, - KbnFieldType, - getKbnFieldType, - KBN_FIELD_TYPES, - FieldFormat, -} from '../../../common'; +import { KbnFieldType, getKbnFieldType } from '../../kbn_field_types'; +import { KBN_FIELD_TYPES } from '../../kbn_field_types/types'; +import { FieldFormat } from '../../field_formats'; +import { IFieldType } from './types'; import { OnNotification, FieldSpec } from '../types'; import { IndexPattern } from '../index_patterns'; diff --git a/src/plugins/data/public/search/aggs/agg_config.test.ts b/src/plugins/data/common/search/aggs/agg_config.test.ts similarity index 98% rename from src/plugins/data/public/search/aggs/agg_config.test.ts rename to src/plugins/data/common/search/aggs/agg_config.test.ts index f9279e06d14a9..a443eacee731c 100644 --- a/src/plugins/data/public/search/aggs/agg_config.test.ts +++ b/src/plugins/data/common/search/aggs/agg_config.test.ts @@ -25,7 +25,8 @@ import { AggType } from './agg_type'; import { AggTypesRegistryStart } from './agg_types_registry'; import { mockAggTypesRegistry } from './test_helpers'; import { MetricAggType } from './metrics/metric_agg_type'; -import { IndexPattern, IIndexPatternFieldList } from '../../index_patterns'; +import { IndexPattern } from '../../index_patterns/index_patterns/index_pattern'; +import { IIndexPatternFieldList } from '../../index_patterns/fields'; describe('AggConfig', () => { let indexPattern: IndexPattern; @@ -622,7 +623,7 @@ describe('AggConfig', () => { it('creates a subexpression for param types other than "agg" which have specified toExpressionAst', () => { // Overwrite the `ranges` param in the `range` agg with a mock toExpressionAst function - const range: MetricAggType = typesRegistry.get('range'); + const range = typesRegistry.get('range') as MetricAggType; range.expressionName = 'aggRange'; const rangesParam = range.params.find((p) => p.name === 'ranges'); rangesParam!.toExpressionAst = (val: any) => ({ diff --git a/src/plugins/data/public/search/aggs/agg_config.ts b/src/plugins/data/common/search/aggs/agg_config.ts similarity index 99% rename from src/plugins/data/public/search/aggs/agg_config.ts rename to src/plugins/data/common/search/aggs/agg_config.ts index 31618eac18e98..b5747ce7bb9bd 100644 --- a/src/plugins/data/public/search/aggs/agg_config.ts +++ b/src/plugins/data/common/search/aggs/agg_config.ts @@ -20,16 +20,17 @@ import _ from 'lodash'; import { i18n } from '@kbn/i18n'; import { Assign, Ensure } from '@kbn/utility-types'; + +import { FetchOptions, ISearchSource } from 'src/plugins/data/public'; import { ExpressionAstFunction, ExpressionAstArgument, SerializedFieldFormat, } from 'src/plugins/expressions/common'; + import { IAggType } from './agg_type'; import { writeParams } from './agg_params'; import { IAggConfigs } from './agg_configs'; -import { FetchOptions } from '../fetch'; -import { ISearchSource } from '../search_source'; type State = string | number | boolean | null | undefined | SerializableState; diff --git a/src/plugins/data/public/search/aggs/agg_configs.test.ts b/src/plugins/data/common/search/aggs/agg_configs.test.ts similarity index 98% rename from src/plugins/data/public/search/aggs/agg_configs.test.ts rename to src/plugins/data/common/search/aggs/agg_configs.test.ts index ff0cc3341929e..803ccc70b98a7 100644 --- a/src/plugins/data/public/search/aggs/agg_configs.test.ts +++ b/src/plugins/data/common/search/aggs/agg_configs.test.ts @@ -22,8 +22,9 @@ import { AggConfig } from './agg_config'; import { AggConfigs } from './agg_configs'; import { AggTypesRegistryStart } from './agg_types_registry'; import { mockAggTypesRegistry } from './test_helpers'; -import { IndexPatternField, IndexPattern } from '../../index_patterns'; -import { stubIndexPattern, stubIndexPatternWithFields } from '../../../public/stubs'; +import type { IndexPatternField } from '../../index_patterns'; +import { IndexPattern } from '../../index_patterns/index_patterns/index_pattern'; +import { stubIndexPattern, stubIndexPatternWithFields } from '../../../common/stubs'; describe('AggConfigs', () => { let indexPattern: IndexPattern; diff --git a/src/plugins/data/public/search/aggs/agg_configs.ts b/src/plugins/data/common/search/aggs/agg_configs.ts similarity index 98% rename from src/plugins/data/public/search/aggs/agg_configs.ts rename to src/plugins/data/common/search/aggs/agg_configs.ts index b272dfd3c7468..203eda3a907ee 100644 --- a/src/plugins/data/public/search/aggs/agg_configs.ts +++ b/src/plugins/data/common/search/aggs/agg_configs.ts @@ -20,13 +20,12 @@ import _ from 'lodash'; import { Assign } from '@kbn/utility-types'; +import { FetchOptions, ISearchSource } from 'src/plugins/data/public'; import { AggConfig, AggConfigSerialized, IAggConfig } from './agg_config'; import { IAggType } from './agg_type'; import { AggTypesRegistryStart } from './agg_types_registry'; import { AggGroupNames } from './agg_groups'; -import { IndexPattern } from '../../index_patterns'; -import { ISearchSource } from '../search_source'; -import { FetchOptions } from '../fetch'; +import { IndexPattern } from '../../index_patterns/index_patterns/index_pattern'; import { TimeRange } from '../../../common'; function removeParentAggs(obj: any) { diff --git a/src/plugins/data/public/search/aggs/agg_groups.ts b/src/plugins/data/common/search/aggs/agg_groups.ts similarity index 100% rename from src/plugins/data/public/search/aggs/agg_groups.ts rename to src/plugins/data/common/search/aggs/agg_groups.ts diff --git a/src/plugins/data/public/search/aggs/agg_params.test.ts b/src/plugins/data/common/search/aggs/agg_params.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/agg_params.test.ts rename to src/plugins/data/common/search/aggs/agg_params.test.ts diff --git a/src/plugins/data/public/search/aggs/agg_params.ts b/src/plugins/data/common/search/aggs/agg_params.ts similarity index 100% rename from src/plugins/data/public/search/aggs/agg_params.ts rename to src/plugins/data/common/search/aggs/agg_params.ts diff --git a/src/plugins/data/public/search/aggs/agg_type.test.ts b/src/plugins/data/common/search/aggs/agg_type.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/agg_type.test.ts rename to src/plugins/data/common/search/aggs/agg_type.test.ts diff --git a/src/plugins/data/public/search/aggs/agg_type.ts b/src/plugins/data/common/search/aggs/agg_type.ts similarity index 99% rename from src/plugins/data/public/search/aggs/agg_type.ts rename to src/plugins/data/common/search/aggs/agg_type.ts index de7ca48e71d57..0ba2bb66e7758 100644 --- a/src/plugins/data/public/search/aggs/agg_type.ts +++ b/src/plugins/data/common/search/aggs/agg_type.ts @@ -20,6 +20,7 @@ import { constant, noop, identity } from 'lodash'; import { i18n } from '@kbn/i18n'; +import { ISearchSource } from 'src/plugins/data/public'; import { SerializedFieldFormat } from 'src/plugins/expressions/common'; import type { RequestAdapter } from 'src/plugins/inspector/common'; @@ -28,7 +29,6 @@ import { AggConfig } from './agg_config'; import { IAggConfigs } from './agg_configs'; import { BaseParamType } from './param_types/base'; import { AggParamType } from './param_types/agg'; -import { ISearchSource } from '../search_source'; export interface AggTypeConfig< TAggConfig extends AggConfig = AggConfig, diff --git a/src/plugins/data/public/search/aggs/agg_types.ts b/src/plugins/data/common/search/aggs/agg_types.ts similarity index 66% rename from src/plugins/data/public/search/aggs/agg_types.ts rename to src/plugins/data/common/search/aggs/agg_types.ts index 2820ae495f318..8565de13aed5b 100644 --- a/src/plugins/data/public/search/aggs/agg_types.ts +++ b/src/plugins/data/common/search/aggs/agg_types.ts @@ -17,9 +17,9 @@ * under the License. */ -import { IUiSettingsClient } from 'src/core/public'; -import { TimeRange, TimeRangeBounds } from '../../../common'; -import { GetInternalStartServicesFn } from '../../types'; +import { FieldFormatsStartCommon } from '../../field_formats'; +import { BUCKET_TYPES } from './buckets'; +import { METRIC_TYPES } from './metrics'; import { getCountMetricAgg } from './metrics/count'; import { getAvgMetricAgg } from './metrics/avg'; @@ -39,7 +39,7 @@ import { getCumulativeSumMetricAgg } from './metrics/cumulative_sum'; import { getMovingAvgMetricAgg } from './metrics/moving_avg'; import { getSerialDiffMetricAgg } from './metrics/serial_diff'; -import { getDateHistogramBucketAgg } from './buckets/date_histogram'; +import { getDateHistogramBucketAgg, CalculateBoundsFn } from './buckets/date_histogram'; import { getHistogramBucketAgg } from './buckets/histogram'; import { getRangeBucketAgg } from './buckets/range'; import { getDateRangeBucketAgg } from './buckets/date_range'; @@ -55,52 +55,50 @@ import { getBucketAvgMetricAgg } from './metrics/bucket_avg'; import { getBucketMinMetricAgg } from './metrics/bucket_min'; import { getBucketMaxMetricAgg } from './metrics/bucket_max'; +/** @internal */ export interface AggTypesDependencies { - calculateBounds: (timeRange: TimeRange) => TimeRangeBounds; - getInternalStartServices: GetInternalStartServicesFn; - uiSettings: IUiSettingsClient; + calculateBounds: CalculateBoundsFn; + getConfig: (key: string) => T; + getFieldFormatsStart: () => Pick; + isDefaultTimezone: () => boolean; } -export const getAggTypes = ({ - calculateBounds, - getInternalStartServices, - uiSettings, -}: AggTypesDependencies) => ({ +export const getAggTypes = () => ({ metrics: [ - getCountMetricAgg(), - getAvgMetricAgg(), - getSumMetricAgg(), - getMedianMetricAgg(), - getMinMetricAgg(), - getMaxMetricAgg(), - getStdDeviationMetricAgg(), - getCardinalityMetricAgg(), - getPercentilesMetricAgg(), - getPercentileRanksMetricAgg({ getInternalStartServices }), - getTopHitMetricAgg(), - getDerivativeMetricAgg(), - getCumulativeSumMetricAgg(), - getMovingAvgMetricAgg(), - getSerialDiffMetricAgg(), - getBucketAvgMetricAgg(), - getBucketSumMetricAgg(), - getBucketMinMetricAgg(), - getBucketMaxMetricAgg(), - getGeoBoundsMetricAgg(), - getGeoCentroidMetricAgg(), + { name: METRIC_TYPES.COUNT, fn: getCountMetricAgg }, + { name: METRIC_TYPES.AVG, fn: getAvgMetricAgg }, + { name: METRIC_TYPES.SUM, fn: getSumMetricAgg }, + { name: METRIC_TYPES.MEDIAN, fn: getMedianMetricAgg }, + { name: METRIC_TYPES.MIN, fn: getMinMetricAgg }, + { name: METRIC_TYPES.MAX, fn: getMaxMetricAgg }, + { name: METRIC_TYPES.STD_DEV, fn: getStdDeviationMetricAgg }, + { name: METRIC_TYPES.CARDINALITY, fn: getCardinalityMetricAgg }, + { name: METRIC_TYPES.PERCENTILES, fn: getPercentilesMetricAgg }, + { name: METRIC_TYPES.PERCENTILE_RANKS, fn: getPercentileRanksMetricAgg }, + { name: METRIC_TYPES.TOP_HITS, fn: getTopHitMetricAgg }, + { name: METRIC_TYPES.DERIVATIVE, fn: getDerivativeMetricAgg }, + { name: METRIC_TYPES.CUMULATIVE_SUM, fn: getCumulativeSumMetricAgg }, + { name: METRIC_TYPES.MOVING_FN, fn: getMovingAvgMetricAgg }, + { name: METRIC_TYPES.SERIAL_DIFF, fn: getSerialDiffMetricAgg }, + { name: METRIC_TYPES.AVG_BUCKET, fn: getBucketAvgMetricAgg }, + { name: METRIC_TYPES.SUM_BUCKET, fn: getBucketSumMetricAgg }, + { name: METRIC_TYPES.MIN_BUCKET, fn: getBucketMinMetricAgg }, + { name: METRIC_TYPES.MAX_BUCKET, fn: getBucketMaxMetricAgg }, + { name: METRIC_TYPES.GEO_BOUNDS, fn: getGeoBoundsMetricAgg }, + { name: METRIC_TYPES.GEO_CENTROID, fn: getGeoCentroidMetricAgg }, ], buckets: [ - getDateHistogramBucketAgg({ calculateBounds, uiSettings }), - getHistogramBucketAgg({ uiSettings, getInternalStartServices }), - getRangeBucketAgg({ getInternalStartServices }), - getDateRangeBucketAgg({ uiSettings }), - getIpRangeBucketAgg(), - getTermsBucketAgg(), - getFilterBucketAgg(), - getFiltersBucketAgg({ uiSettings }), - getSignificantTermsBucketAgg(), - getGeoHashBucketAgg(), - getGeoTitleBucketAgg(), + { name: BUCKET_TYPES.DATE_HISTOGRAM, fn: getDateHistogramBucketAgg }, + { name: BUCKET_TYPES.HISTOGRAM, fn: getHistogramBucketAgg }, + { name: BUCKET_TYPES.RANGE, fn: getRangeBucketAgg }, + { name: BUCKET_TYPES.DATE_RANGE, fn: getDateRangeBucketAgg }, + { name: BUCKET_TYPES.IP_RANGE, fn: getIpRangeBucketAgg }, + { name: BUCKET_TYPES.TERMS, fn: getTermsBucketAgg }, + { name: BUCKET_TYPES.FILTER, fn: getFilterBucketAgg }, + { name: BUCKET_TYPES.FILTERS, fn: getFiltersBucketAgg }, + { name: BUCKET_TYPES.SIGNIFICANT_TERMS, fn: getSignificantTermsBucketAgg }, + { name: BUCKET_TYPES.GEOHASH_GRID, fn: getGeoHashBucketAgg }, + { name: BUCKET_TYPES.GEOTILE_GRID, fn: getGeoTitleBucketAgg }, ], }); diff --git a/src/plugins/data/public/search/aggs/agg_types_registry.test.ts b/src/plugins/data/common/search/aggs/agg_types_registry.test.ts similarity index 54% rename from src/plugins/data/public/search/aggs/agg_types_registry.test.ts rename to src/plugins/data/common/search/aggs/agg_types_registry.test.ts index 58d1a07d965e2..df3dddfcd9c6f 100644 --- a/src/plugins/data/public/search/aggs/agg_types_registry.test.ts +++ b/src/plugins/data/common/search/aggs/agg_types_registry.test.ts @@ -17,21 +17,17 @@ * under the License. */ -import { - AggTypesRegistry, - AggTypesRegistrySetup, - AggTypesRegistryStart, -} from './agg_types_registry'; +import { AggTypesRegistry, AggTypesRegistrySetup } from './agg_types_registry'; import { BucketAggType } from './buckets/bucket_agg_type'; import { MetricAggType } from './metrics/metric_agg_type'; -const bucketType = { name: 'terms', type: 'bucket' } as BucketAggType; -const metricType = { name: 'count', type: 'metric' } as MetricAggType; +const bucketType = () => ({ name: 'terms', type: 'buckets' } as BucketAggType); +const metricType = () => ({ name: 'count', type: 'metrics' } as MetricAggType); describe('AggTypesRegistry', () => { let registry: AggTypesRegistry; let setup: AggTypesRegistrySetup; - let start: AggTypesRegistryStart; + let start: ReturnType; beforeEach(() => { registry = new AggTypesRegistry(); @@ -40,49 +36,53 @@ describe('AggTypesRegistry', () => { }); it('registerBucket adds new buckets', () => { - setup.registerBucket(bucketType); - expect(start.getBuckets()).toEqual([bucketType]); + setup.registerBucket('terms', bucketType); + expect(start.getAll().buckets).toEqual([bucketType]); }); it('registerBucket throws error when registering duplicate bucket', () => { expect(() => { - setup.registerBucket(bucketType); - setup.registerBucket(bucketType); + setup.registerBucket('terms', bucketType); + setup.registerBucket('terms', bucketType); }).toThrow(/already been registered with name: terms/); + + const fooBucket = () => ({ name: 'foo', type: 'buckets' } as BucketAggType); + const fooMetric = () => ({ name: 'foo', type: 'metrics' } as MetricAggType); + expect(() => { + setup.registerBucket('foo', fooBucket); + setup.registerMetric('foo', fooMetric); + }).toThrow(/already been registered with name: foo/); }); it('registerMetric adds new metrics', () => { - setup.registerMetric(metricType); - expect(start.getMetrics()).toEqual([metricType]); + setup.registerMetric('count', metricType); + expect(start.getAll().metrics).toEqual([metricType]); }); it('registerMetric throws error when registering duplicate metric', () => { expect(() => { - setup.registerMetric(metricType); - setup.registerMetric(metricType); + setup.registerMetric('count', metricType); + setup.registerMetric('count', metricType); }).toThrow(/already been registered with name: count/); + + const fooBucket = () => ({ name: 'foo', type: 'buckets' } as BucketAggType); + const fooMetric = () => ({ name: 'foo', type: 'metrics' } as MetricAggType); + expect(() => { + setup.registerMetric('foo', fooMetric); + setup.registerBucket('foo', fooBucket); + }).toThrow(/already been registered with name: foo/); }); it('gets either buckets or metrics by id', () => { - setup.registerBucket(bucketType); - setup.registerMetric(metricType); + setup.registerBucket('terms', bucketType); + setup.registerMetric('count', metricType); expect(start.get('terms')).toEqual(bucketType); expect(start.get('count')).toEqual(metricType); }); - it('getBuckets retrieves only buckets', () => { - setup.registerBucket(bucketType); - expect(start.getBuckets()).toEqual([bucketType]); - }); - - it('getMetrics retrieves only metrics', () => { - setup.registerMetric(metricType); - expect(start.getMetrics()).toEqual([metricType]); - }); - it('getAll returns all buckets and metrics', () => { - setup.registerBucket(bucketType); - setup.registerMetric(metricType); + setup.registerBucket('terms', bucketType); + setup.registerMetric('count', metricType); expect(start.getAll()).toEqual({ buckets: [bucketType], metrics: [metricType], diff --git a/src/plugins/data/public/search/aggs/agg_types_registry.ts b/src/plugins/data/common/search/aggs/agg_types_registry.ts similarity index 57% rename from src/plugins/data/public/search/aggs/agg_types_registry.ts rename to src/plugins/data/common/search/aggs/agg_types_registry.ts index 5a0c58120d810..ce22fa840bafa 100644 --- a/src/plugins/data/public/search/aggs/agg_types_registry.ts +++ b/src/plugins/data/common/search/aggs/agg_types_registry.ts @@ -19,9 +19,21 @@ import { BucketAggType } from './buckets/bucket_agg_type'; import { MetricAggType } from './metrics/metric_agg_type'; +import { AggTypesDependencies } from './agg_types'; export type AggTypesRegistrySetup = ReturnType; -export type AggTypesRegistryStart = ReturnType; +/** + * AggsCommonStart returns the _unitialized_ agg type providers, but in our + * real start contract we will need to return the initialized versions. + * So we need to provide the correct typings so they can be overwritten + * on client/server. + * + * @internal + */ +export interface AggTypesRegistryStart { + get: (id: string) => BucketAggType | MetricAggType; + getAll: () => { buckets: Array>; metrics: Array> }; +} export class AggTypesRegistry { private readonly bucketAggs = new Map(); @@ -29,17 +41,27 @@ export class AggTypesRegistry { setup = () => { return { - registerBucket: >(type: T): void => { - const { name } = type; - if (this.bucketAggs.get(name)) { - throw new Error(`Bucket agg has already been registered with name: ${name}`); + registerBucket: < + N extends string, + T extends (deps: AggTypesDependencies) => BucketAggType + >( + name: N, + type: T + ): void => { + if (this.bucketAggs.get(name) || this.metricAggs.get(name)) { + throw new Error(`Agg has already been registered with name: ${name}`); } this.bucketAggs.set(name, type); }, - registerMetric: >(type: T): void => { - const { name } = type; - if (this.metricAggs.get(name)) { - throw new Error(`Metric agg has already been registered with name: ${name}`); + registerMetric: < + N extends string, + T extends (deps: AggTypesDependencies) => MetricAggType + >( + name: N, + type: T + ): void => { + if (this.bucketAggs.get(name) || this.metricAggs.get(name)) { + throw new Error(`Agg has already been registered with name: ${name}`); } this.metricAggs.set(name, type); }, @@ -51,12 +73,6 @@ export class AggTypesRegistry { get: (name: string) => { return this.bucketAggs.get(name) || this.metricAggs.get(name); }, - getBuckets: () => { - return Array.from(this.bucketAggs.values()); - }, - getMetrics: () => { - return Array.from(this.metricAggs.values()); - }, getAll: () => { return { buckets: Array.from(this.bucketAggs.values()), diff --git a/src/plugins/data/common/search/aggs/aggs_service.test.ts b/src/plugins/data/common/search/aggs/aggs_service.test.ts new file mode 100644 index 0000000000000..bcf2101704c80 --- /dev/null +++ b/src/plugins/data/common/search/aggs/aggs_service.test.ts @@ -0,0 +1,217 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + AggsCommonService, + AggsCommonSetupDependencies, + AggsCommonStartDependencies, +} from './aggs_service'; +import { AggTypesDependencies, getAggTypes } from './agg_types'; +import { BucketAggType } from './buckets/bucket_agg_type'; +import { MetricAggType } from './metrics/metric_agg_type'; + +describe('Aggs service', () => { + let service: AggsCommonService; + let setupDeps: AggsCommonSetupDependencies; + let startDeps: AggsCommonStartDependencies; + const aggTypesDependencies: AggTypesDependencies = { + calculateBounds: jest.fn(), + getFieldFormatsStart: jest.fn(), + getConfig: jest.fn(), + isDefaultTimezone: () => true, + }; + + beforeEach(() => { + service = new AggsCommonService(); + setupDeps = { + registerFunction: jest.fn(), + }; + startDeps = { + getConfig: jest.fn(), + }; + }); + + describe('setup()', () => { + test('exposes proper contract', () => { + const setup = service.setup(setupDeps); + expect(Object.keys(setup).length).toBe(1); + expect(setup).toHaveProperty('types'); + }); + + test('instantiates a new registry', () => { + const a = new AggsCommonService(); + const b = new AggsCommonService(); + const bSetupDeps = { + registerFunction: jest.fn(), + }; + + const aSetup = a.setup(setupDeps); + aSetup.types.registerBucket( + 'foo', + () => ({ name: 'foo', type: 'buckets' } as BucketAggType) + ); + const aStart = a.start(startDeps); + expect(aStart.types.getAll().buckets.map((t) => t(aggTypesDependencies).name)) + .toMatchInlineSnapshot(` + Array [ + "date_histogram", + "histogram", + "range", + "date_range", + "ip_range", + "terms", + "filter", + "filters", + "significant_terms", + "geohash_grid", + "geotile_grid", + "foo", + ] + `); + expect(aStart.types.getAll().metrics.map((t) => t(aggTypesDependencies).name)) + .toMatchInlineSnapshot(` + Array [ + "count", + "avg", + "sum", + "median", + "min", + "max", + "std_dev", + "cardinality", + "percentiles", + "percentile_ranks", + "top_hits", + "derivative", + "cumulative_sum", + "moving_avg", + "serial_diff", + "avg_bucket", + "sum_bucket", + "min_bucket", + "max_bucket", + "geo_bounds", + "geo_centroid", + ] + `); + + b.setup(bSetupDeps); + const bStart = b.start(startDeps); + expect(bStart.types.getAll().buckets.map((t) => t(aggTypesDependencies).name)) + .toMatchInlineSnapshot(` + Array [ + "date_histogram", + "histogram", + "range", + "date_range", + "ip_range", + "terms", + "filter", + "filters", + "significant_terms", + "geohash_grid", + "geotile_grid", + ] + `); + expect(bStart.types.getAll().metrics.map((t) => t(aggTypesDependencies).name)) + .toMatchInlineSnapshot(` + Array [ + "count", + "avg", + "sum", + "median", + "min", + "max", + "std_dev", + "cardinality", + "percentiles", + "percentile_ranks", + "top_hits", + "derivative", + "cumulative_sum", + "moving_avg", + "serial_diff", + "avg_bucket", + "sum_bucket", + "min_bucket", + "max_bucket", + "geo_bounds", + "geo_centroid", + ] + `); + }); + + test('registers default agg types', () => { + service.setup(setupDeps); + const start = service.start(startDeps); + + const aggTypes = getAggTypes(); + expect(start.types.getAll().buckets.length).toBe(aggTypes.buckets.length); + expect(start.types.getAll().metrics.length).toBe(aggTypes.metrics.length); + }); + + test('merges default agg types with types registered during setup', () => { + const setup = service.setup(setupDeps); + setup.types.registerBucket( + 'foo', + () => ({ name: 'foo', type: 'buckets' } as BucketAggType) + ); + setup.types.registerMetric( + 'bar', + () => ({ name: 'bar', type: 'metrics' } as MetricAggType) + ); + const start = service.start(startDeps); + + const aggTypes = getAggTypes(); + expect(start.types.getAll().buckets.length).toBe(aggTypes.buckets.length + 1); + expect(start.types.getAll().buckets.some((t) => t(aggTypesDependencies).name === 'foo')).toBe( + true + ); + expect(start.types.getAll().metrics.length).toBe(aggTypes.metrics.length + 1); + expect(start.types.getAll().metrics.some((t) => t(aggTypesDependencies).name === 'bar')).toBe( + true + ); + }); + + test('registers all agg type expression functions', () => { + service.setup(setupDeps); + const aggTypes = getAggTypes(); + expect(setupDeps.registerFunction).toHaveBeenCalledTimes( + aggTypes.buckets.length + aggTypes.metrics.length + ); + }); + }); + + describe('start()', () => { + test('exposes proper contract', () => { + const start = service.start(startDeps); + expect(Object.keys(start).length).toBe(3); + expect(start).toHaveProperty('calculateAutoTimeExpression'); + expect(start).toHaveProperty('createAggConfigs'); + expect(start).toHaveProperty('types'); + }); + + test('types registry returns uninitialized type providers', () => { + service.setup(setupDeps); + const start = service.start(startDeps); + expect(typeof start.types.get('terms')).toBe('function'); + expect(start.types.get('terms')(aggTypesDependencies).name).toBe('terms'); + }); + }); +}); diff --git a/src/plugins/data/common/search/aggs/aggs_service.ts b/src/plugins/data/common/search/aggs/aggs_service.ts new file mode 100644 index 0000000000000..59c54fcce6838 --- /dev/null +++ b/src/plugins/data/common/search/aggs/aggs_service.ts @@ -0,0 +1,92 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ExpressionsServiceSetup } from 'src/plugins/expressions/common'; +import { UI_SETTINGS } from '../../../common'; +import { + AggConfigs, + AggTypesRegistry, + getAggTypes, + getAggTypesFunctions, + getCalculateAutoTimeExpression, +} from './'; +import { AggsCommonSetup, AggsCommonStart } from './types'; + +/** @internal */ +export const aggsRequiredUiSettings = [ + 'dateFormat', + 'dateFormat:scaled', + 'dateFormat:tz', + UI_SETTINGS.HISTOGRAM_BAR_TARGET, + UI_SETTINGS.HISTOGRAM_MAX_BARS, + UI_SETTINGS.SEARCH_QUERY_LANGUAGE, + UI_SETTINGS.QUERY_ALLOW_LEADING_WILDCARDS, + UI_SETTINGS.QUERY_STRING_OPTIONS, + UI_SETTINGS.COURIER_IGNORE_FILTER_IF_FIELD_NOT_IN_INDEX, +]; + +/** @internal */ +export interface AggsCommonSetupDependencies { + registerFunction: ExpressionsServiceSetup['registerFunction']; +} + +/** @internal */ +export interface AggsCommonStartDependencies { + getConfig: (key: string) => T; +} + +/** + * The aggs service provides a means of modeling and manipulating the various + * Elasticsearch aggregations supported by Kibana, providing the ability to + * output the correct DSL when you are ready to send your request to ES. + */ +export class AggsCommonService { + private readonly aggTypesRegistry = new AggTypesRegistry(); + + public setup({ registerFunction }: AggsCommonSetupDependencies): AggsCommonSetup { + const aggTypesSetup = this.aggTypesRegistry.setup(); + + // register each agg type + const aggTypes = getAggTypes(); + aggTypes.buckets.forEach(({ name, fn }) => aggTypesSetup.registerBucket(name, fn)); + aggTypes.metrics.forEach(({ name, fn }) => aggTypesSetup.registerMetric(name, fn)); + + // register expression functions for each agg type + const aggFunctions = getAggTypesFunctions(); + aggFunctions.forEach((fn) => registerFunction(fn)); + + return { + types: aggTypesSetup, + }; + } + + public start({ getConfig }: AggsCommonStartDependencies): AggsCommonStart { + const aggTypesStart = this.aggTypesRegistry.start(); + + return { + calculateAutoTimeExpression: getCalculateAutoTimeExpression(getConfig), + createAggConfigs: (indexPattern, configStates = [], schemas) => { + return new AggConfigs(indexPattern, configStates, { + typesRegistry: aggTypesStart, + }); + }, + types: aggTypesStart, + }; + } +} diff --git a/src/plugins/data/public/search/aggs/buckets/_interval_options.ts b/src/plugins/data/common/search/aggs/buckets/_interval_options.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/_interval_options.ts rename to src/plugins/data/common/search/aggs/buckets/_interval_options.ts diff --git a/src/plugins/data/public/search/aggs/buckets/_terms_other_bucket_helper.test.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/_terms_other_bucket_helper.test.ts rename to src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/_terms_other_bucket_helper.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/_terms_other_bucket_helper.ts rename to src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts diff --git a/src/plugins/data/public/search/aggs/buckets/bucket_agg_type.ts b/src/plugins/data/common/search/aggs/buckets/bucket_agg_type.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/bucket_agg_type.ts rename to src/plugins/data/common/search/aggs/buckets/bucket_agg_type.ts diff --git a/src/plugins/data/public/search/aggs/buckets/bucket_agg_types.ts b/src/plugins/data/common/search/aggs/buckets/bucket_agg_types.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/bucket_agg_types.ts rename to src/plugins/data/common/search/aggs/buckets/bucket_agg_types.ts diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/date_histogram.test.ts similarity index 87% rename from src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/date_histogram.test.ts index 24a17b60566cc..143d549836900 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/create_filter/date_histogram.test.ts @@ -22,32 +22,17 @@ import { createFilterDateHistogram } from './date_histogram'; import { intervalOptions } from '../_interval_options'; import { AggConfigs } from '../../agg_configs'; import { mockAggTypesRegistry } from '../../test_helpers'; -import { - getDateHistogramBucketAgg, - DateHistogramBucketAggDependencies, - IBucketDateHistogramAggConfig, -} from '../date_histogram'; +import { IBucketDateHistogramAggConfig } from '../date_histogram'; import { BUCKET_TYPES } from '../bucket_agg_types'; import { RangeFilter } from '../../../../../common'; -import { coreMock } from '../../../../../../../core/public/mocks'; describe('AggConfig Filters', () => { describe('date_histogram', () => { - let aggTypesDependencies: DateHistogramBucketAggDependencies; let agg: IBucketDateHistogramAggConfig; let filter: RangeFilter; let bucketStart: any; let field: any; - beforeEach(() => { - const { uiSettings } = coreMock.createSetup(); - - aggTypesDependencies = { - calculateBounds: jest.fn(), - uiSettings, - }; - }); - const init = (interval: string = 'auto', duration: any = moment.duration(15, 'minutes')) => { field = { name: 'date', @@ -71,7 +56,7 @@ describe('AggConfig Filters', () => { }, ], { - typesRegistry: mockAggTypesRegistry([getDateHistogramBucketAgg(aggTypesDependencies)]), + typesRegistry: mockAggTypesRegistry(), } ); const bucketKey = 1422579600000; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/date_histogram.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/date_histogram.ts diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/date_range.test.ts similarity index 78% rename from src/plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/date_range.test.ts index c272c037c5927..8def27f1d8ee5 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/create_filter/date_range.test.ts @@ -18,31 +18,18 @@ */ import moment from 'moment'; -import { getDateRangeBucketAgg, DateRangeBucketAggDependencies } from '../date_range'; import { createFilterDateRange } from './date_range'; -import { FieldFormatsGetConfigFn } from '../../../../../common'; -import { DateFormat } from '../../../../field_formats'; import { AggConfigs } from '../../agg_configs'; import { mockAggTypesRegistry } from '../../test_helpers'; import { BUCKET_TYPES } from '../bucket_agg_types'; import { IBucketAggConfig } from '../bucket_agg_type'; -import { coreMock } from '../../../../../../../core/public/mocks'; describe('AggConfig Filters', () => { describe('Date range', () => { - let aggTypesDependencies: DateRangeBucketAggDependencies; - - beforeEach(() => { - const { uiSettings } = coreMock.createSetup(); - - aggTypesDependencies = { uiSettings }; - }); - - const getConfig = (() => {}) as FieldFormatsGetConfigFn; const getAggConfigs = () => { const field = { name: '@timestamp', - format: new DateFormat({}, getConfig), + format: {}, }; const indexPattern = { @@ -66,7 +53,7 @@ describe('AggConfig Filters', () => { }, ], { - typesRegistry: mockAggTypesRegistry([getDateRangeBucketAgg(aggTypesDependencies)]), + typesRegistry: mockAggTypesRegistry(), } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/date_range.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/date_range.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/create_filter/date_range.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/date_range.ts diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/filters.test.ts similarity index 83% rename from src/plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/filters.test.ts index ff66d80c6d8d0..aec99bd00af55 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/create_filter/filters.test.ts @@ -17,23 +17,13 @@ * under the License. */ -import { getFiltersBucketAgg, FiltersBucketAggDependencies } from '../filters'; import { createFilterFilters } from './filters'; import { AggConfigs } from '../../agg_configs'; import { mockAggTypesRegistry } from '../../test_helpers'; import { IBucketAggConfig } from '../bucket_agg_type'; -import { coreMock } from '../../../../../../../core/public/mocks'; describe('AggConfig Filters', () => { describe('filters', () => { - let aggTypesDependencies: FiltersBucketAggDependencies; - - beforeEach(() => { - const { uiSettings } = coreMock.createSetup(); - - aggTypesDependencies = { uiSettings }; - }); - const getAggConfigs = () => { const field = { name: 'bytes', @@ -63,7 +53,7 @@ describe('AggConfig Filters', () => { }, ], { - typesRegistry: mockAggTypesRegistry([getFiltersBucketAgg(aggTypesDependencies)]), + typesRegistry: mockAggTypesRegistry(), } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/filters.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/filters.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/create_filter/filters.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/filters.ts diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/histogram.test.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/histogram.test.ts similarity index 77% rename from src/plugins/data/public/search/aggs/buckets/create_filter/histogram.test.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/histogram.test.ts index 3f9f5dd5672f0..b57d530ef40e8 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/histogram.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/create_filter/histogram.test.ts @@ -17,25 +17,14 @@ * under the License. */ -import { createFilterHistogram } from './histogram'; +import { BytesFormat, FieldFormatsGetConfigFn } from '../../../../../common/field_formats'; import { AggConfigs } from '../../agg_configs'; -import { mockAggTypesRegistry } from '../../test_helpers'; +import { mockAggTypesRegistry, mockGetFieldFormatsStart } from '../../test_helpers'; import { BUCKET_TYPES } from '../bucket_agg_types'; import { IBucketAggConfig } from '../bucket_agg_type'; -import { BytesFormat, FieldFormatsGetConfigFn } from '../../../../../common'; -import { GetInternalStartServicesFn, InternalStartServices } from '../../../../types'; -import { FieldFormatsStart } from '../../../../field_formats'; -import { fieldFormatsServiceMock } from '../../../../field_formats/mocks'; +import { createFilterHistogram } from './histogram'; describe('AggConfig Filters', () => { - let getInternalStartServices: GetInternalStartServicesFn; - let fieldFormats: FieldFormatsStart; - - beforeEach(() => { - fieldFormats = fieldFormatsServiceMock.createStartContract(); - getInternalStartServices = () => (({ fieldFormats } as unknown) as InternalStartServices); - }); - describe('histogram', () => { const getConfig = (() => {}) as FieldFormatsGetConfigFn; const getAggConfigs = () => { @@ -72,12 +61,12 @@ describe('AggConfig Filters', () => { test('should return an range filter for histogram', () => { const aggConfigs = getAggConfigs(); - const filter = createFilterHistogram(getInternalStartServices)( + const filter = createFilterHistogram(mockGetFieldFormatsStart)( aggConfigs.aggs[0] as IBucketAggConfig, '2048' ); - expect(fieldFormats.deserialize).toHaveBeenCalledTimes(1); + expect(mockGetFieldFormatsStart().deserialize).toHaveBeenCalledTimes(1); expect(filter).toHaveProperty('meta'); expect(filter.meta).toHaveProperty('index', '1234'); expect(filter).toHaveProperty('range'); diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/histogram.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/histogram.ts similarity index 80% rename from src/plugins/data/public/search/aggs/buckets/create_filter/histogram.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/histogram.ts index f3626bc9130ad..4684b1640cd82 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/histogram.ts +++ b/src/plugins/data/common/search/aggs/buckets/create_filter/histogram.ts @@ -17,14 +17,16 @@ * under the License. */ -import { IBucketAggConfig } from '../bucket_agg_type'; import { buildRangeFilter, RangeFilterParams } from '../../../../../common'; -import { GetInternalStartServicesFn } from '../../../../types'; +import { AggTypesDependencies } from '../../agg_types'; +import { IBucketAggConfig } from '../bucket_agg_type'; /** @internal */ -export const createFilterHistogram = (getInternalStartServices: GetInternalStartServicesFn) => { +export const createFilterHistogram = ( + getFieldFormatsStart: AggTypesDependencies['getFieldFormatsStart'] +) => { return (aggConfig: IBucketAggConfig, key: string) => { - const { fieldFormats } = getInternalStartServices(); + const { deserialize } = getFieldFormatsStart(); const value = parseInt(key, 10); const params: RangeFilterParams = { gte: value, lt: value + aggConfig.params.interval }; @@ -32,7 +34,7 @@ export const createFilterHistogram = (getInternalStartServices: GetInternalStart aggConfig.params.field, params, aggConfig.getIndexPattern(), - fieldFormats.deserialize(aggConfig.toSerializedFieldFormat()).convert(key) + deserialize(aggConfig.toSerializedFieldFormat()).convert(key) ); }; }; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/ip_range.test.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/ip_range.test.ts similarity index 96% rename from src/plugins/data/public/search/aggs/buckets/create_filter/ip_range.test.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/ip_range.test.ts index 852685a505afd..9f823001aac8c 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/ip_range.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/create_filter/ip_range.test.ts @@ -17,7 +17,6 @@ * under the License. */ -import { getIpRangeBucketAgg } from '../ip_range'; import { createFilterIpRange } from './ip_range'; import { AggConfigs, CreateAggConfigParams } from '../../agg_configs'; import { mockAggTypesRegistry } from '../../test_helpers'; @@ -27,7 +26,7 @@ import { IBucketAggConfig } from '../bucket_agg_type'; describe('AggConfig Filters', () => { describe('IP range', () => { - const typesRegistry = mockAggTypesRegistry([getIpRangeBucketAgg()]); + const typesRegistry = mockAggTypesRegistry(); const getAggConfigs = (aggs: CreateAggConfigParams[]) => { const field = { name: 'ip', diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/ip_range.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/ip_range.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/create_filter/ip_range.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/ip_range.ts diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/range.test.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/range.test.ts similarity index 73% rename from src/plugins/data/public/search/aggs/buckets/create_filter/range.test.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/range.test.ts index faffad3beb8c1..30af970f55aa9 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/range.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/create_filter/range.test.ts @@ -17,31 +17,15 @@ * under the License. */ -import { getRangeBucketAgg } from '../range'; -import { createFilterRange } from './range'; -import { BytesFormat, FieldFormatsGetConfigFn } from '../../../../../common'; +import { BytesFormat, FieldFormatsGetConfigFn } from '../../../../../common/field_formats'; import { AggConfigs } from '../../agg_configs'; -import { mockAggTypesRegistry } from '../../test_helpers'; -import { BUCKET_TYPES } from '../bucket_agg_types'; +import { mockAggTypesRegistry, mockGetFieldFormatsStart } from '../../test_helpers'; import { IBucketAggConfig } from '../bucket_agg_type'; -import { FieldFormatsStart } from '../../../../field_formats'; -import { fieldFormatsServiceMock } from '../../../../field_formats/mocks'; -import { GetInternalStartServicesFn, InternalStartServices } from '../../../../types'; +import { BUCKET_TYPES } from '../bucket_agg_types'; +import { createFilterRange } from './range'; describe('AggConfig Filters', () => { describe('range', () => { - let getInternalStartServices: GetInternalStartServicesFn; - let fieldFormats: FieldFormatsStart; - - beforeEach(() => { - fieldFormats = fieldFormatsServiceMock.createStartContract(); - - getInternalStartServices = () => - (({ - fieldFormats, - } as unknown) as InternalStartServices); - }); - const getConfig = (() => {}) as FieldFormatsGetConfigFn; const getAggConfigs = () => { const field = { @@ -72,14 +56,14 @@ describe('AggConfig Filters', () => { }, ], { - typesRegistry: mockAggTypesRegistry([getRangeBucketAgg({ getInternalStartServices })]), + typesRegistry: mockAggTypesRegistry(), } ); }; test('should return a range filter for range agg', () => { const aggConfigs = getAggConfigs(); - const filter = createFilterRange(getInternalStartServices)( + const filter = createFilterRange(mockGetFieldFormatsStart)( aggConfigs.aggs[0] as IBucketAggConfig, { gte: 1024, @@ -87,7 +71,7 @@ describe('AggConfig Filters', () => { } ); - expect(fieldFormats.deserialize).toHaveBeenCalledTimes(1); + expect(mockGetFieldFormatsStart().deserialize).toHaveBeenCalledTimes(1); expect(filter).toHaveProperty('range'); expect(filter).toHaveProperty('meta'); expect(filter.meta).toHaveProperty('index', '1234'); diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/range.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/range.ts similarity index 78% rename from src/plugins/data/public/search/aggs/buckets/create_filter/range.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/range.ts index f9db2973af136..8dea33a450c5d 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/range.ts +++ b/src/plugins/data/common/search/aggs/buckets/create_filter/range.ts @@ -17,19 +17,21 @@ * under the License. */ -import { IBucketAggConfig } from '../bucket_agg_type'; import { buildRangeFilter } from '../../../../../common'; -import { GetInternalStartServicesFn } from '../../../../types'; +import { AggTypesDependencies } from '../../agg_types'; +import { IBucketAggConfig } from '../bucket_agg_type'; /** @internal */ -export const createFilterRange = (getInternalStartServices: GetInternalStartServicesFn) => { +export const createFilterRange = ( + getFieldFormatsStart: AggTypesDependencies['getFieldFormatsStart'] +) => { return (aggConfig: IBucketAggConfig, params: any) => { - const { fieldFormats } = getInternalStartServices(); + const { deserialize } = getFieldFormatsStart(); return buildRangeFilter( aggConfig.params.field, params, aggConfig.getIndexPattern(), - fieldFormats.deserialize(aggConfig.toSerializedFieldFormat()).convert(params) + deserialize(aggConfig.toSerializedFieldFormat()).convert(params) ); }; }; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/terms.test.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/terms.test.ts similarity index 97% rename from src/plugins/data/public/search/aggs/buckets/create_filter/terms.test.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/terms.test.ts index 1c165f0d29ab6..c3c661296e1cf 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/terms.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/create_filter/terms.test.ts @@ -17,7 +17,6 @@ * under the License. */ -import { getTermsBucketAgg } from '../terms'; import { createFilterTerms } from './terms'; import { AggConfigs, CreateAggConfigParams } from '../../agg_configs'; import { mockAggTypesRegistry } from '../../test_helpers'; @@ -43,7 +42,7 @@ describe('AggConfig Filters', () => { }; return new AggConfigs(indexPattern, aggs, { - typesRegistry: mockAggTypesRegistry([getTermsBucketAgg()]), + typesRegistry: mockAggTypesRegistry(), }); }; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/terms.ts b/src/plugins/data/common/search/aggs/buckets/create_filter/terms.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/create_filter/terms.ts rename to src/plugins/data/common/search/aggs/buckets/create_filter/terms.ts diff --git a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts b/src/plugins/data/common/search/aggs/buckets/date_histogram.ts similarity index 92% rename from src/plugins/data/public/search/aggs/buckets/date_histogram.ts rename to src/plugins/data/common/search/aggs/buckets/date_histogram.ts index fa1725eccbd28..fdf9c456b3876 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_histogram.ts +++ b/src/plugins/data/common/search/aggs/buckets/date_histogram.ts @@ -20,27 +20,23 @@ import { get, noop, find, every } from 'lodash'; import moment from 'moment-timezone'; import { i18n } from '@kbn/i18n'; -import { IUiSettingsClient } from 'src/core/public'; -import { TimeBuckets } from './lib/time_buckets'; +import { KBN_FIELD_TYPES, TimeRange, TimeRangeBounds, UI_SETTINGS } from '../../../../common'; + +import { intervalOptions } from './_interval_options'; +import { createFilterDateHistogram } from './create_filter/date_histogram'; import { BucketAggType, IBucketAggConfig } from './bucket_agg_type'; import { BUCKET_TYPES } from './bucket_agg_types'; -import { createFilterDateHistogram } from './create_filter/date_histogram'; -import { intervalOptions } from './_interval_options'; +import { ExtendedBounds } from './lib/extended_bounds'; +import { TimeBuckets } from './lib/time_buckets'; + import { writeParams } from '../agg_params'; import { isMetricAggType } from '../metrics/metric_agg_type'; - -import { - dateHistogramInterval, - KBN_FIELD_TYPES, - TimeRange, - TimeRangeBounds, - UI_SETTINGS, -} from '../../../../common'; import { BaseAggParams } from '../types'; -import { ExtendedBounds } from './lib/extended_bounds'; +import { dateHistogramInterval } from '../utils'; -type CalculateBoundsFn = (timeRange: TimeRange) => TimeRangeBounds; +/** @internal */ +export type CalculateBoundsFn = (timeRange: TimeRange) => TimeRangeBounds; const updateTimeBuckets = ( agg: IBucketDateHistogramAggConfig, @@ -58,7 +54,8 @@ const updateTimeBuckets = ( export interface DateHistogramBucketAggDependencies { calculateBounds: CalculateBoundsFn; - uiSettings: IUiSettingsClient; + isDefaultTimezone: () => boolean; + getConfig: (key: string) => T; } export interface IBucketDateHistogramAggConfig extends IBucketAggConfig { @@ -84,7 +81,8 @@ export interface AggParamsDateHistogram extends BaseAggParams { export const getDateHistogramBucketAgg = ({ calculateBounds, - uiSettings, + isDefaultTimezone, + getConfig, }: DateHistogramBucketAggDependencies) => new BucketAggType({ name: BUCKET_TYPES.DATE_HISTOGRAM, @@ -122,10 +120,10 @@ export const getDateHistogramBucketAgg = ({ if (buckets) return buckets; buckets = new TimeBuckets({ - 'histogram:maxBars': uiSettings.get(UI_SETTINGS.HISTOGRAM_MAX_BARS), - 'histogram:barTarget': uiSettings.get(UI_SETTINGS.HISTOGRAM_BAR_TARGET), - dateFormat: uiSettings.get('dateFormat'), - 'dateFormat:scaled': uiSettings.get('dateFormat:scaled'), + 'histogram:maxBars': getConfig(UI_SETTINGS.HISTOGRAM_MAX_BARS), + 'histogram:barTarget': getConfig(UI_SETTINGS.HISTOGRAM_BAR_TARGET), + dateFormat: getConfig('dateFormat'), + 'dateFormat:scaled': getConfig('dateFormat:scaled'), }); updateTimeBuckets(this, calculateBounds, buckets); @@ -252,10 +250,9 @@ export const getDateHistogramBucketAgg = ({ } if (!tz) { // If the index pattern typeMeta data, didn't had a time zone assigned for the selected field use the configured tz - const isDefaultTimezone = uiSettings.isDefault('dateFormat:tz'); const detectedTimezone = moment.tz.guess(); const tzOffset = moment().format('Z'); - tz = isDefaultTimezone ? detectedTimezone || tzOffset : uiSettings.get('dateFormat:tz'); + tz = isDefaultTimezone() ? detectedTimezone || tzOffset : getConfig('dateFormat:tz'); } output.params.time_zone = tz; }, diff --git a/src/plugins/data/public/search/aggs/buckets/date_histogram_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/date_histogram_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/date_histogram_fn.test.ts rename to src/plugins/data/common/search/aggs/buckets/date_histogram_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/date_histogram_fn.ts b/src/plugins/data/common/search/aggs/buckets/date_histogram_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/date_histogram_fn.ts rename to src/plugins/data/common/search/aggs/buckets/date_histogram_fn.ts diff --git a/src/plugins/data/public/search/aggs/buckets/date_range.test.ts b/src/plugins/data/common/search/aggs/buckets/date_range.test.ts similarity index 84% rename from src/plugins/data/public/search/aggs/buckets/date_range.test.ts rename to src/plugins/data/common/search/aggs/buckets/date_range.test.ts index 69515dfee87fe..66f8e269cd38d 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_range.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/date_range.test.ts @@ -17,19 +17,20 @@ * under the License. */ -import { coreMock } from '../../../../../../../src/core/public/mocks'; -import { getDateRangeBucketAgg, DateRangeBucketAggDependencies } from './date_range'; import { AggConfigs } from '../agg_configs'; -import { mockAggTypesRegistry } from '../test_helpers'; +import { AggTypesDependencies } from '../agg_types'; +import { mockAggTypesRegistry, mockAggTypesDependencies } from '../test_helpers'; import { BUCKET_TYPES } from './bucket_agg_types'; describe('date_range params', () => { - let aggTypesDependencies: DateRangeBucketAggDependencies; + let aggTypesDependencies: AggTypesDependencies; beforeEach(() => { - const { uiSettings } = coreMock.createSetup(); - - aggTypesDependencies = { uiSettings }; + aggTypesDependencies = { + ...mockAggTypesDependencies, + getConfig: jest.fn(), + isDefaultTimezone: jest.fn().mockReturnValue(false), + }; }); const getAggConfigs = (params: Record = {}, hasIncludeTypeMeta: boolean = true) => { @@ -68,7 +69,7 @@ describe('date_range params', () => { }, ], { - typesRegistry: mockAggTypesRegistry([getDateRangeBucketAgg(aggTypesDependencies)]), + typesRegistry: mockAggTypesRegistry(aggTypesDependencies), } ); }; @@ -108,10 +109,7 @@ describe('date_range params', () => { test('should use the Kibana time_zone if no parameter specified', () => { aggTypesDependencies = { ...aggTypesDependencies, - uiSettings: { - ...aggTypesDependencies.uiSettings, - get: () => 'kibanaTimeZone' as any, - }, + getConfig: () => 'kibanaTimeZone' as any, }; const aggConfigs = getAggConfigs( diff --git a/src/plugins/data/public/search/aggs/buckets/date_range.ts b/src/plugins/data/common/search/aggs/buckets/date_range.ts similarity index 88% rename from src/plugins/data/public/search/aggs/buckets/date_range.ts rename to src/plugins/data/common/search/aggs/buckets/date_range.ts index 8c576023f0239..eda35a77afa5f 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_range.ts +++ b/src/plugins/data/common/search/aggs/buckets/date_range.ts @@ -20,14 +20,13 @@ import { get } from 'lodash'; import moment from 'moment-timezone'; import { i18n } from '@kbn/i18n'; -import { IUiSettingsClient } from 'src/core/public'; import { BUCKET_TYPES } from './bucket_agg_types'; import { BucketAggType, IBucketAggConfig } from './bucket_agg_type'; import { createFilterDateRange } from './create_filter/date_range'; import { DateRangeKey } from './lib/date_range'; -import { KBN_FIELD_TYPES } from '../../../../common'; +import { KBN_FIELD_TYPES } from '../../../../common/kbn_field_types/types'; import { BaseAggParams } from '../types'; const dateRangeTitle = i18n.translate('data.search.aggs.buckets.dateRangeTitle', { @@ -35,7 +34,8 @@ const dateRangeTitle = i18n.translate('data.search.aggs.buckets.dateRangeTitle', }); export interface DateRangeBucketAggDependencies { - uiSettings: IUiSettingsClient; + isDefaultTimezone: () => boolean; + getConfig: (key: string) => T; } export interface AggParamsDateRange extends BaseAggParams { @@ -44,7 +44,10 @@ export interface AggParamsDateRange extends BaseAggParams { time_zone?: string; } -export const getDateRangeBucketAgg = ({ uiSettings }: DateRangeBucketAggDependencies) => +export const getDateRangeBucketAgg = ({ + isDefaultTimezone, + getConfig, +}: DateRangeBucketAggDependencies) => new BucketAggType({ name: BUCKET_TYPES.DATE_RANGE, title: dateRangeTitle, @@ -100,9 +103,8 @@ export const getDateRangeBucketAgg = ({ uiSettings }: DateRangeBucketAggDependen if (!tz) { const detectedTimezone = moment.tz.guess(); const tzOffset = moment().format('Z'); - const isDefaultTimezone = uiSettings.isDefault('dateFormat:tz'); - tz = isDefaultTimezone ? detectedTimezone || tzOffset : uiSettings.get('dateFormat:tz'); + tz = isDefaultTimezone() ? detectedTimezone || tzOffset : getConfig('dateFormat:tz'); } output.params.time_zone = tz; }, diff --git a/src/plugins/data/public/search/aggs/buckets/date_range_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/date_range_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/date_range_fn.test.ts rename to src/plugins/data/common/search/aggs/buckets/date_range_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/date_range_fn.ts b/src/plugins/data/common/search/aggs/buckets/date_range_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/date_range_fn.ts rename to src/plugins/data/common/search/aggs/buckets/date_range_fn.ts diff --git a/src/plugins/data/public/search/aggs/buckets/filter.ts b/src/plugins/data/common/search/aggs/buckets/filter.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/filter.ts rename to src/plugins/data/common/search/aggs/buckets/filter.ts diff --git a/src/plugins/data/public/search/aggs/buckets/filter_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/filter_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/filter_fn.test.ts rename to src/plugins/data/common/search/aggs/buckets/filter_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/filter_fn.ts b/src/plugins/data/common/search/aggs/buckets/filter_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/filter_fn.ts rename to src/plugins/data/common/search/aggs/buckets/filter_fn.ts diff --git a/src/plugins/data/public/search/aggs/buckets/filters.test.ts b/src/plugins/data/common/search/aggs/buckets/filters.test.ts similarity index 93% rename from src/plugins/data/public/search/aggs/buckets/filters.test.ts rename to src/plugins/data/common/search/aggs/buckets/filters.test.ts index bcb82b5f99649..f745b4537131a 100644 --- a/src/plugins/data/public/search/aggs/buckets/filters.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/filters.test.ts @@ -18,20 +18,20 @@ */ import { Query } from '../../../../common'; -import { coreMock } from '../../../../../../../src/core/public/mocks'; import { AggConfigs } from '../agg_configs'; -import { mockAggTypesRegistry } from '../test_helpers'; +import { AggTypesDependencies } from '../agg_types'; +import { mockAggTypesRegistry, mockAggTypesDependencies } from '../test_helpers'; import { BUCKET_TYPES } from './bucket_agg_types'; -import { getFiltersBucketAgg, FiltersBucketAggDependencies } from './filters'; describe('Filters Agg', () => { - let aggTypesDependencies: FiltersBucketAggDependencies; + let aggTypesDependencies: AggTypesDependencies; beforeEach(() => { jest.resetAllMocks(); - const { uiSettings } = coreMock.createSetup(); - - aggTypesDependencies = { uiSettings }; + aggTypesDependencies = { + ...mockAggTypesDependencies, + getConfig: jest.fn(), + }; }); describe('order agg editor UI', () => { @@ -61,7 +61,7 @@ describe('Filters Agg', () => { }, ], { - typesRegistry: mockAggTypesRegistry([getFiltersBucketAgg(aggTypesDependencies)]), + typesRegistry: mockAggTypesRegistry(aggTypesDependencies), } ); }; @@ -218,7 +218,7 @@ describe('Filters Agg', () => { }); test('works with leading wildcards if allowed', () => { - aggTypesDependencies.uiSettings.get = (s: any) => + aggTypesDependencies.getConfig = (s: any) => s === 'query:allowLeadingWildcards' ? true : s; const aggConfigs = getAggConfigs({ diff --git a/src/plugins/data/public/search/aggs/buckets/filters.ts b/src/plugins/data/common/search/aggs/buckets/filters.ts similarity index 90% rename from src/plugins/data/public/search/aggs/buckets/filters.ts rename to src/plugins/data/common/search/aggs/buckets/filters.ts index cd4ed721fda77..7310fa08b68e0 100644 --- a/src/plugins/data/public/search/aggs/buckets/filters.ts +++ b/src/plugins/data/common/search/aggs/buckets/filters.ts @@ -19,7 +19,6 @@ import { i18n } from '@kbn/i18n'; import { size, transform, cloneDeep } from 'lodash'; -import { IUiSettingsClient } from 'src/core/public'; import { createFilterFilters } from './create_filter/filters'; import { toAngularJSON } from '../utils'; @@ -41,7 +40,7 @@ interface FilterValue { } export interface FiltersBucketAggDependencies { - uiSettings: IUiSettingsClient; + getConfig: (key: string) => any; } export interface AggParamsFilters extends Omit { @@ -51,7 +50,7 @@ export interface AggParamsFilters extends Omit { }>; } -export const getFiltersBucketAgg = ({ uiSettings }: FiltersBucketAggDependencies) => +export const getFiltersBucketAgg = ({ getConfig }: FiltersBucketAggDependencies) => new BucketAggType({ name: BUCKET_TYPES.FILTERS, title: filtersTitle, @@ -60,9 +59,9 @@ export const getFiltersBucketAgg = ({ uiSettings }: FiltersBucketAggDependencies params: [ { name: 'filters', - default: [ + default: () => [ { - input: { query: '', language: uiSettings.get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE) }, + input: { query: '', language: getConfig(UI_SETTINGS.SEARCH_QUERY_LANGUAGE) }, label: '', }, ], @@ -80,7 +79,7 @@ export const getFiltersBucketAgg = ({ uiSettings }: FiltersBucketAggDependencies return; } - const esQueryConfigs = getEsQueryConfig(uiSettings); + const esQueryConfigs = getEsQueryConfig({ get: getConfig }); const query = buildEsQuery(aggConfig.getIndexPattern(), [input], [], esQueryConfigs); if (!query) { diff --git a/src/plugins/data/public/search/aggs/buckets/filters_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/filters_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/filters_fn.test.ts rename to src/plugins/data/common/search/aggs/buckets/filters_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/filters_fn.ts b/src/plugins/data/common/search/aggs/buckets/filters_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/filters_fn.ts rename to src/plugins/data/common/search/aggs/buckets/filters_fn.ts diff --git a/src/plugins/data/public/search/aggs/buckets/geo_hash.test.ts b/src/plugins/data/common/search/aggs/buckets/geo_hash.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/geo_hash.test.ts rename to src/plugins/data/common/search/aggs/buckets/geo_hash.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/geo_hash.ts b/src/plugins/data/common/search/aggs/buckets/geo_hash.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/geo_hash.ts rename to src/plugins/data/common/search/aggs/buckets/geo_hash.ts diff --git a/src/plugins/data/public/search/aggs/buckets/geo_hash_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/geo_hash_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/geo_hash_fn.test.ts rename to src/plugins/data/common/search/aggs/buckets/geo_hash_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/geo_hash_fn.ts b/src/plugins/data/common/search/aggs/buckets/geo_hash_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/geo_hash_fn.ts rename to src/plugins/data/common/search/aggs/buckets/geo_hash_fn.ts diff --git a/src/plugins/data/public/search/aggs/buckets/geo_tile.ts b/src/plugins/data/common/search/aggs/buckets/geo_tile.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/geo_tile.ts rename to src/plugins/data/common/search/aggs/buckets/geo_tile.ts diff --git a/src/plugins/data/public/search/aggs/buckets/geo_tile_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/geo_tile_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/geo_tile_fn.test.ts rename to src/plugins/data/common/search/aggs/buckets/geo_tile_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/geo_tile_fn.ts b/src/plugins/data/common/search/aggs/buckets/geo_tile_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/geo_tile_fn.ts rename to src/plugins/data/common/search/aggs/buckets/geo_tile_fn.ts diff --git a/src/plugins/data/public/search/aggs/buckets/histogram.test.ts b/src/plugins/data/common/search/aggs/buckets/histogram.test.ts similarity index 90% rename from src/plugins/data/public/search/aggs/buckets/histogram.test.ts rename to src/plugins/data/common/search/aggs/buckets/histogram.test.ts index 6ac77f207d9ce..3727747984d3e 100644 --- a/src/plugins/data/public/search/aggs/buckets/histogram.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/histogram.test.ts @@ -17,33 +17,18 @@ * under the License. */ -import { coreMock } from '../../../../../../../src/core/public/mocks'; import { AggConfigs } from '../agg_configs'; -import { mockAggTypesRegistry } from '../test_helpers'; +import { mockAggTypesRegistry, mockAggTypesDependencies } from '../test_helpers'; +import { AggTypesDependencies } from '../agg_types'; import { BUCKET_TYPES } from './bucket_agg_types'; -import { - IBucketHistogramAggConfig, - getHistogramBucketAgg, - AutoBounds, - HistogramBucketAggDependencies, -} from './histogram'; +import { IBucketHistogramAggConfig, getHistogramBucketAgg, AutoBounds } from './histogram'; import { BucketAggType } from './bucket_agg_type'; -import { fieldFormatsServiceMock } from '../../../field_formats/mocks'; -import { InternalStartServices } from '../../../types'; describe('Histogram Agg', () => { - let aggTypesDependencies: HistogramBucketAggDependencies; + let aggTypesDependencies: AggTypesDependencies; beforeEach(() => { - const { uiSettings } = coreMock.createSetup(); - - aggTypesDependencies = { - uiSettings, - getInternalStartServices: () => - (({ - fieldFormats: fieldFormatsServiceMock.createStartContract(), - } as unknown) as InternalStartServices), - }; + aggTypesDependencies = { ...mockAggTypesDependencies }; }); const getAggConfigs = (params: Record) => { @@ -72,7 +57,7 @@ describe('Histogram Agg', () => { }, ], { - typesRegistry: mockAggTypesRegistry([getHistogramBucketAgg(aggTypesDependencies)]), + typesRegistry: mockAggTypesRegistry(aggTypesDependencies), } ); }; @@ -167,10 +152,7 @@ describe('Histogram Agg', () => { ) => { aggTypesDependencies = { ...aggTypesDependencies, - uiSettings: { - ...aggTypesDependencies.uiSettings, - get: () => maxBars as any, - }, + getConfig: () => maxBars as any, }; const aggConfigs = getAggConfigs({ diff --git a/src/plugins/data/public/search/aggs/buckets/histogram.ts b/src/plugins/data/common/search/aggs/buckets/histogram.ts similarity index 93% rename from src/plugins/data/public/search/aggs/buckets/histogram.ts rename to src/plugins/data/common/search/aggs/buckets/histogram.ts index 500b6eab75d77..2b263013e55a2 100644 --- a/src/plugins/data/public/search/aggs/buckets/histogram.ts +++ b/src/plugins/data/common/search/aggs/buckets/histogram.ts @@ -19,14 +19,14 @@ import { get } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { IUiSettingsClient } from 'src/core/public'; + +import { KBN_FIELD_TYPES, UI_SETTINGS } from '../../../../common'; +import { AggTypesDependencies } from '../agg_types'; +import { BaseAggParams } from '../types'; import { BucketAggType, IBucketAggConfig } from './bucket_agg_type'; import { createFilterHistogram } from './create_filter/histogram'; import { BUCKET_TYPES } from './bucket_agg_types'; -import { KBN_FIELD_TYPES, UI_SETTINGS } from '../../../../common'; -import { GetInternalStartServicesFn } from '../../../types'; -import { BaseAggParams } from '../types'; import { ExtendedBounds } from './lib/extended_bounds'; export interface AutoBounds { @@ -35,8 +35,8 @@ export interface AutoBounds { } export interface HistogramBucketAggDependencies { - uiSettings: IUiSettingsClient; - getInternalStartServices: GetInternalStartServicesFn; + getConfig: (key: string) => T; + getFieldFormatsStart: AggTypesDependencies['getFieldFormatsStart']; } export interface IBucketHistogramAggConfig extends IBucketAggConfig { @@ -54,8 +54,8 @@ export interface AggParamsHistogram extends BaseAggParams { } export const getHistogramBucketAgg = ({ - uiSettings, - getInternalStartServices, + getConfig, + getFieldFormatsStart, }: HistogramBucketAggDependencies) => new BucketAggType({ name: BUCKET_TYPES.HISTOGRAM, @@ -66,7 +66,7 @@ export const getHistogramBucketAgg = ({ makeLabel(aggConfig) { return aggConfig.getFieldDisplayName(); }, - createFilter: createFilterHistogram(getInternalStartServices), + createFilter: createFilterHistogram(getFieldFormatsStart), decorateAggConfig() { let autoBounds: AutoBounds; @@ -154,8 +154,8 @@ export const getHistogramBucketAgg = ({ const range = autoBounds.max - autoBounds.min; const bars = range / interval; - if (bars > uiSettings.get(UI_SETTINGS.HISTOGRAM_MAX_BARS)) { - const minInterval = range / uiSettings.get(UI_SETTINGS.HISTOGRAM_MAX_BARS); + if (bars > getConfig(UI_SETTINGS.HISTOGRAM_MAX_BARS)) { + const minInterval = range / getConfig(UI_SETTINGS.HISTOGRAM_MAX_BARS); // Round interval by order of magnitude to provide clean intervals // Always round interval up so there will always be less buckets than histogram:maxBars diff --git a/src/plugins/data/public/search/aggs/buckets/histogram_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/histogram_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/histogram_fn.test.ts rename to src/plugins/data/common/search/aggs/buckets/histogram_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/histogram_fn.ts b/src/plugins/data/common/search/aggs/buckets/histogram_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/histogram_fn.ts rename to src/plugins/data/common/search/aggs/buckets/histogram_fn.ts diff --git a/src/plugins/data/public/search/aggs/buckets/index.ts b/src/plugins/data/common/search/aggs/buckets/index.ts similarity index 97% rename from src/plugins/data/public/search/aggs/buckets/index.ts rename to src/plugins/data/common/search/aggs/buckets/index.ts index 7036cc7785db7..b16242e519872 100644 --- a/src/plugins/data/public/search/aggs/buckets/index.ts +++ b/src/plugins/data/common/search/aggs/buckets/index.ts @@ -18,6 +18,7 @@ */ export * from './_interval_options'; +export * from './bucket_agg_type'; export * from './bucket_agg_types'; export * from './histogram'; export * from './date_histogram'; diff --git a/src/plugins/data/public/search/aggs/buckets/ip_range.ts b/src/plugins/data/common/search/aggs/buckets/ip_range.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/ip_range.ts rename to src/plugins/data/common/search/aggs/buckets/ip_range.ts diff --git a/src/plugins/data/public/search/aggs/buckets/ip_range_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/ip_range_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/ip_range_fn.test.ts rename to src/plugins/data/common/search/aggs/buckets/ip_range_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/ip_range_fn.ts b/src/plugins/data/common/search/aggs/buckets/ip_range_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/ip_range_fn.ts rename to src/plugins/data/common/search/aggs/buckets/ip_range_fn.ts diff --git a/src/plugins/data/public/search/aggs/buckets/lib/cidr_mask.test.ts b/src/plugins/data/common/search/aggs/buckets/lib/cidr_mask.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/lib/cidr_mask.test.ts rename to src/plugins/data/common/search/aggs/buckets/lib/cidr_mask.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/lib/cidr_mask.ts b/src/plugins/data/common/search/aggs/buckets/lib/cidr_mask.ts similarity index 97% rename from src/plugins/data/public/search/aggs/buckets/lib/cidr_mask.ts rename to src/plugins/data/common/search/aggs/buckets/lib/cidr_mask.ts index 57a7b378f305f..e4f6ab1e8da3c 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/cidr_mask.ts +++ b/src/plugins/data/common/search/aggs/buckets/lib/cidr_mask.ts @@ -17,7 +17,7 @@ * under the License. */ -import { Ipv4Address } from '../../../../../common'; +import { Ipv4Address } from '../../utils'; const NUM_BITS = 32; diff --git a/src/plugins/data/public/search/aggs/buckets/lib/date_range.ts b/src/plugins/data/common/search/aggs/buckets/lib/date_range.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/lib/date_range.ts rename to src/plugins/data/common/search/aggs/buckets/lib/date_range.ts diff --git a/src/plugins/data/public/search/aggs/buckets/lib/extended_bounds.ts b/src/plugins/data/common/search/aggs/buckets/lib/extended_bounds.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/lib/extended_bounds.ts rename to src/plugins/data/common/search/aggs/buckets/lib/extended_bounds.ts diff --git a/src/plugins/data/public/search/aggs/buckets/lib/geo_point.ts b/src/plugins/data/common/search/aggs/buckets/lib/geo_point.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/lib/geo_point.ts rename to src/plugins/data/common/search/aggs/buckets/lib/geo_point.ts diff --git a/src/plugins/data/public/search/aggs/buckets/lib/ip_range.ts b/src/plugins/data/common/search/aggs/buckets/lib/ip_range.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/lib/ip_range.ts rename to src/plugins/data/common/search/aggs/buckets/lib/ip_range.ts diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/calc_auto_interval.test.ts b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/calc_auto_interval.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/lib/time_buckets/calc_auto_interval.test.ts rename to src/plugins/data/common/search/aggs/buckets/lib/time_buckets/calc_auto_interval.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/calc_auto_interval.ts b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/calc_auto_interval.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/lib/time_buckets/calc_auto_interval.ts rename to src/plugins/data/common/search/aggs/buckets/lib/time_buckets/calc_auto_interval.ts diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/calc_es_interval.ts b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/calc_es_interval.ts similarity index 97% rename from src/plugins/data/public/search/aggs/buckets/lib/time_buckets/calc_es_interval.ts rename to src/plugins/data/common/search/aggs/buckets/lib/time_buckets/calc_es_interval.ts index 3e7d315a0a42a..0ef2c571ca8fa 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/calc_es_interval.ts +++ b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/calc_es_interval.ts @@ -20,7 +20,7 @@ import moment from 'moment'; import dateMath, { Unit } from '@elastic/datemath'; -import { parseEsInterval } from '../../../../../../common'; +import { parseEsInterval } from '../../../utils'; const unitsDesc = dateMath.unitsDesc; const largeMax = unitsDesc.indexOf('M'); diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/index.ts b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/index.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/lib/time_buckets/index.ts rename to src/plugins/data/common/search/aggs/buckets/lib/time_buckets/index.ts diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts rename to src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.ts similarity index 99% rename from src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts rename to src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.ts index 017f646258c01..6402a6e83ead9 100644 --- a/src/plugins/data/public/search/aggs/buckets/lib/time_buckets/time_buckets.ts +++ b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.ts @@ -20,7 +20,7 @@ import { isString, isObject as isObjectLodash, isPlainObject, sortBy } from 'lodash'; import moment, { Moment } from 'moment'; -import { parseInterval } from '../../../../../../common'; +import { parseInterval } from '../../../utils'; import { TimeRangeBounds } from '../../../../../query'; import { calcAutoIntervalLessThan, calcAutoIntervalNear } from './calc_auto_interval'; import { diff --git a/src/plugins/data/public/search/aggs/buckets/migrate_include_exclude_format.ts b/src/plugins/data/common/search/aggs/buckets/migrate_include_exclude_format.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/migrate_include_exclude_format.ts rename to src/plugins/data/common/search/aggs/buckets/migrate_include_exclude_format.ts diff --git a/src/plugins/data/public/search/aggs/buckets/range.test.ts b/src/plugins/data/common/search/aggs/buckets/range.test.ts similarity index 79% rename from src/plugins/data/public/search/aggs/buckets/range.test.ts rename to src/plugins/data/common/search/aggs/buckets/range.test.ts index f7c61a638158c..b23b03db6a9ec 100644 --- a/src/plugins/data/public/search/aggs/buckets/range.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/range.test.ts @@ -17,26 +17,12 @@ * under the License. */ -import { getRangeBucketAgg, RangeBucketAggDependencies } from './range'; import { AggConfigs } from '../agg_configs'; import { mockAggTypesRegistry } from '../test_helpers'; import { BUCKET_TYPES } from './bucket_agg_types'; -import { FieldFormatsGetConfigFn, NumberFormat } from '../../../../common'; -import { fieldFormatsServiceMock } from '../../../field_formats/mocks'; -import { InternalStartServices } from '../../../types'; +import { FieldFormatsGetConfigFn, NumberFormat } from '../../../../common/field_formats'; describe('Range Agg', () => { - let aggTypesDependencies: RangeBucketAggDependencies; - - beforeEach(() => { - aggTypesDependencies = { - getInternalStartServices: () => - (({ - fieldFormats: fieldFormatsServiceMock.createStartContract(), - } as unknown) as InternalStartServices), - }; - }); - const getConfig = (() => {}) as FieldFormatsGetConfigFn; const getAggConfigs = () => { const field = { @@ -74,7 +60,7 @@ describe('Range Agg', () => { }, ], { - typesRegistry: mockAggTypesRegistry([getRangeBucketAgg(aggTypesDependencies)]), + typesRegistry: mockAggTypesRegistry(), } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/range.ts b/src/plugins/data/common/search/aggs/buckets/range.ts similarity index 90% rename from src/plugins/data/public/search/aggs/buckets/range.ts rename to src/plugins/data/common/search/aggs/buckets/range.ts index 9f54f9fd0704e..91a357b635950 100644 --- a/src/plugins/data/public/search/aggs/buckets/range.ts +++ b/src/plugins/data/common/search/aggs/buckets/range.ts @@ -18,20 +18,22 @@ */ import { i18n } from '@kbn/i18n'; -import { BucketAggType } from './bucket_agg_type'; + import { KBN_FIELD_TYPES } from '../../../../common'; +import { AggTypesDependencies } from '../agg_types'; +import { BaseAggParams } from '../types'; + +import { BucketAggType } from './bucket_agg_type'; import { RangeKey } from './range_key'; import { createFilterRange } from './create_filter/range'; import { BUCKET_TYPES } from './bucket_agg_types'; -import { GetInternalStartServicesFn } from '../../../types'; -import { BaseAggParams } from '../types'; const rangeTitle = i18n.translate('data.search.aggs.buckets.rangeTitle', { defaultMessage: 'Range', }); export interface RangeBucketAggDependencies { - getInternalStartServices: GetInternalStartServicesFn; + getFieldFormatsStart: AggTypesDependencies['getFieldFormatsStart']; } export interface AggParamsRange extends BaseAggParams { @@ -42,13 +44,13 @@ export interface AggParamsRange extends BaseAggParams { }>; } -export const getRangeBucketAgg = ({ getInternalStartServices }: RangeBucketAggDependencies) => { +export const getRangeBucketAgg = ({ getFieldFormatsStart }: RangeBucketAggDependencies) => { const keyCaches = new WeakMap(); return new BucketAggType({ name: BUCKET_TYPES.RANGE, title: rangeTitle, - createFilter: createFilterRange(getInternalStartServices), + createFilter: createFilterRange(getFieldFormatsStart), makeLabel(aggConfig) { return i18n.translate('data.search.aggs.aggTypesLabel', { defaultMessage: '{fieldName} ranges', diff --git a/src/plugins/data/public/search/aggs/buckets/range_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/range_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/range_fn.test.ts rename to src/plugins/data/common/search/aggs/buckets/range_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/range_fn.ts b/src/plugins/data/common/search/aggs/buckets/range_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/range_fn.ts rename to src/plugins/data/common/search/aggs/buckets/range_fn.ts diff --git a/src/plugins/data/public/search/aggs/buckets/range_key.ts b/src/plugins/data/common/search/aggs/buckets/range_key.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/range_key.ts rename to src/plugins/data/common/search/aggs/buckets/range_key.ts diff --git a/src/plugins/data/public/search/aggs/buckets/significant_terms.test.ts b/src/plugins/data/common/search/aggs/buckets/significant_terms.test.ts similarity index 95% rename from src/plugins/data/public/search/aggs/buckets/significant_terms.test.ts rename to src/plugins/data/common/search/aggs/buckets/significant_terms.test.ts index f13fafc2b17e6..e6c7bbee72a72 100644 --- a/src/plugins/data/public/search/aggs/buckets/significant_terms.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/significant_terms.test.ts @@ -20,7 +20,6 @@ import { AggConfigs, IAggConfigs } from '../agg_configs'; import { mockAggTypesRegistry } from '../test_helpers'; import { BUCKET_TYPES } from './bucket_agg_types'; -import { getSignificantTermsBucketAgg } from './significant_terms'; describe('Significant Terms Agg', () => { describe('order agg editor UI', () => { @@ -51,7 +50,7 @@ describe('Significant Terms Agg', () => { }, ], { - typesRegistry: mockAggTypesRegistry([getSignificantTermsBucketAgg()]), + typesRegistry: mockAggTypesRegistry(), } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/significant_terms.ts b/src/plugins/data/common/search/aggs/buckets/significant_terms.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/significant_terms.ts rename to src/plugins/data/common/search/aggs/buckets/significant_terms.ts diff --git a/src/plugins/data/public/search/aggs/buckets/significant_terms_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/significant_terms_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/significant_terms_fn.test.ts rename to src/plugins/data/common/search/aggs/buckets/significant_terms_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/significant_terms_fn.ts b/src/plugins/data/common/search/aggs/buckets/significant_terms_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/significant_terms_fn.ts rename to src/plugins/data/common/search/aggs/buckets/significant_terms_fn.ts diff --git a/src/plugins/data/public/search/aggs/buckets/terms.test.ts b/src/plugins/data/common/search/aggs/buckets/terms.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/terms.test.ts rename to src/plugins/data/common/search/aggs/buckets/terms.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/terms.ts b/src/plugins/data/common/search/aggs/buckets/terms.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/terms.ts rename to src/plugins/data/common/search/aggs/buckets/terms.ts diff --git a/src/plugins/data/public/search/aggs/buckets/terms_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/terms_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/terms_fn.test.ts rename to src/plugins/data/common/search/aggs/buckets/terms_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/buckets/terms_fn.ts b/src/plugins/data/common/search/aggs/buckets/terms_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/buckets/terms_fn.ts rename to src/plugins/data/common/search/aggs/buckets/terms_fn.ts diff --git a/src/plugins/data/public/search/aggs/index.test.ts b/src/plugins/data/common/search/aggs/index.test.ts similarity index 63% rename from src/plugins/data/public/search/aggs/index.test.ts rename to src/plugins/data/common/search/aggs/index.test.ts index 73068326ca97e..1fdc28d1c7839 100644 --- a/src/plugins/data/public/search/aggs/index.test.ts +++ b/src/plugins/data/common/search/aggs/index.test.ts @@ -17,42 +17,34 @@ * under the License. */ -import { coreMock } from '../../../../../../src/core/public/mocks'; import { getAggTypes } from './index'; +import { mockGetFieldFormatsStart } from './test_helpers'; import { isBucketAggType } from './buckets/bucket_agg_type'; import { isMetricAggType } from './metrics/metric_agg_type'; -import { FieldFormatsStart } from '../../field_formats'; -import { InternalStartServices } from '../../types'; describe('AggTypesComponent', () => { - const coreSetup = coreMock.createSetup(); - const coreStart = coreMock.createSetup(); - - const aggTypes = getAggTypes({ - calculateBounds: jest.fn(), - getInternalStartServices: () => - (({ - notifications: coreStart.notifications, - fieldFormats: {} as FieldFormatsStart, - } as unknown) as InternalStartServices), - uiSettings: coreSetup.uiSettings, - }); - + const aggTypes = getAggTypes(); const { buckets, metrics } = aggTypes; + const aggTypesDependencies = { + calculateBounds: jest.fn(), + getConfig: jest.fn(), + getFieldFormatsStart: mockGetFieldFormatsStart, + isDefaultTimezone: jest.fn().mockReturnValue(true), + }; describe('bucket aggs', () => { test('all extend BucketAggType', () => { - buckets.forEach((bucketAgg) => { - expect(isBucketAggType(bucketAgg)).toBeTruthy(); + buckets.forEach(({ fn }) => { + expect(isBucketAggType(fn(aggTypesDependencies))).toBeTruthy(); }); }); }); describe('metric aggs', () => { test('all extend MetricAggType', () => { - metrics.forEach((metricAgg) => { - expect(isMetricAggType(metricAgg)).toBeTruthy(); + metrics.forEach(({ fn }) => { + expect(isMetricAggType(fn(aggTypesDependencies))).toBeTruthy(); }); }); }); diff --git a/src/plugins/data/common/search/aggs/index.ts b/src/plugins/data/common/search/aggs/index.ts index 7a5b7d509c940..1c4ae27e49530 100644 --- a/src/plugins/data/common/search/aggs/index.ts +++ b/src/plugins/data/common/search/aggs/index.ts @@ -17,5 +17,15 @@ * under the License. */ -export * from './date_interval_utils'; -export * from './ipv4_address'; +export * from './agg_config'; +export * from './agg_configs'; +export * from './agg_groups'; +export * from './agg_type'; +export * from './agg_types'; +export * from './agg_types_registry'; +export * from './aggs_service'; +export * from './buckets'; +export * from './metrics'; +export * from './param_types'; +export * from './types'; +export * from './utils'; diff --git a/src/plugins/data/public/search/aggs/metrics/avg.ts b/src/plugins/data/common/search/aggs/metrics/avg.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/avg.ts rename to src/plugins/data/common/search/aggs/metrics/avg.ts diff --git a/src/plugins/data/public/search/aggs/metrics/avg_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/avg_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/avg_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/avg_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/avg_fn.ts b/src/plugins/data/common/search/aggs/metrics/avg_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/avg_fn.ts rename to src/plugins/data/common/search/aggs/metrics/avg_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_avg.ts b/src/plugins/data/common/search/aggs/metrics/bucket_avg.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_avg.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_avg.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_avg_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/bucket_avg_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_avg_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_avg_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_avg_fn.ts b/src/plugins/data/common/search/aggs/metrics/bucket_avg_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_avg_fn.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_avg_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_max.ts b/src/plugins/data/common/search/aggs/metrics/bucket_max.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_max.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_max.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_max_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/bucket_max_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_max_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_max_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_max_fn.ts b/src/plugins/data/common/search/aggs/metrics/bucket_max_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_max_fn.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_max_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_min.ts b/src/plugins/data/common/search/aggs/metrics/bucket_min.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_min.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_min.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_min_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/bucket_min_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_min_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_min_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_min_fn.ts b/src/plugins/data/common/search/aggs/metrics/bucket_min_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_min_fn.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_min_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_sum.ts b/src/plugins/data/common/search/aggs/metrics/bucket_sum.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_sum.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_sum.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_sum_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/bucket_sum_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_sum_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_sum_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/bucket_sum_fn.ts b/src/plugins/data/common/search/aggs/metrics/bucket_sum_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/bucket_sum_fn.ts rename to src/plugins/data/common/search/aggs/metrics/bucket_sum_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/cardinality.ts b/src/plugins/data/common/search/aggs/metrics/cardinality.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/cardinality.ts rename to src/plugins/data/common/search/aggs/metrics/cardinality.ts diff --git a/src/plugins/data/public/search/aggs/metrics/cardinality_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/cardinality_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/cardinality_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/cardinality_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/cardinality_fn.ts b/src/plugins/data/common/search/aggs/metrics/cardinality_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/cardinality_fn.ts rename to src/plugins/data/common/search/aggs/metrics/cardinality_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/count.ts b/src/plugins/data/common/search/aggs/metrics/count.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/count.ts rename to src/plugins/data/common/search/aggs/metrics/count.ts diff --git a/src/plugins/data/public/search/aggs/metrics/count_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/count_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/count_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/count_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/count_fn.ts b/src/plugins/data/common/search/aggs/metrics/count_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/count_fn.ts rename to src/plugins/data/common/search/aggs/metrics/count_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/cumulative_sum.ts b/src/plugins/data/common/search/aggs/metrics/cumulative_sum.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/cumulative_sum.ts rename to src/plugins/data/common/search/aggs/metrics/cumulative_sum.ts diff --git a/src/plugins/data/public/search/aggs/metrics/cumulative_sum_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/cumulative_sum_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/cumulative_sum_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/cumulative_sum_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/cumulative_sum_fn.ts b/src/plugins/data/common/search/aggs/metrics/cumulative_sum_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/cumulative_sum_fn.ts rename to src/plugins/data/common/search/aggs/metrics/cumulative_sum_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/derivative.ts b/src/plugins/data/common/search/aggs/metrics/derivative.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/derivative.ts rename to src/plugins/data/common/search/aggs/metrics/derivative.ts diff --git a/src/plugins/data/public/search/aggs/metrics/derivative_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/derivative_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/derivative_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/derivative_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/derivative_fn.ts b/src/plugins/data/common/search/aggs/metrics/derivative_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/derivative_fn.ts rename to src/plugins/data/common/search/aggs/metrics/derivative_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/geo_bounds.ts b/src/plugins/data/common/search/aggs/metrics/geo_bounds.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/geo_bounds.ts rename to src/plugins/data/common/search/aggs/metrics/geo_bounds.ts diff --git a/src/plugins/data/public/search/aggs/metrics/geo_bounds_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/geo_bounds_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/geo_bounds_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/geo_bounds_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/geo_bounds_fn.ts b/src/plugins/data/common/search/aggs/metrics/geo_bounds_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/geo_bounds_fn.ts rename to src/plugins/data/common/search/aggs/metrics/geo_bounds_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/geo_centroid.ts b/src/plugins/data/common/search/aggs/metrics/geo_centroid.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/geo_centroid.ts rename to src/plugins/data/common/search/aggs/metrics/geo_centroid.ts diff --git a/src/plugins/data/public/search/aggs/metrics/geo_centroid_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/geo_centroid_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/geo_centroid_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/geo_centroid_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/geo_centroid_fn.ts b/src/plugins/data/common/search/aggs/metrics/geo_centroid_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/geo_centroid_fn.ts rename to src/plugins/data/common/search/aggs/metrics/geo_centroid_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/index.ts b/src/plugins/data/common/search/aggs/metrics/index.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/index.ts rename to src/plugins/data/common/search/aggs/metrics/index.ts diff --git a/src/plugins/data/public/search/aggs/metrics/lib/get_response_agg_config_class.ts b/src/plugins/data/common/search/aggs/metrics/lib/get_response_agg_config_class.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/lib/get_response_agg_config_class.ts rename to src/plugins/data/common/search/aggs/metrics/lib/get_response_agg_config_class.ts diff --git a/src/plugins/data/public/search/aggs/metrics/lib/make_nested_label.test.ts b/src/plugins/data/common/search/aggs/metrics/lib/make_nested_label.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/lib/make_nested_label.test.ts rename to src/plugins/data/common/search/aggs/metrics/lib/make_nested_label.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/lib/make_nested_label.ts b/src/plugins/data/common/search/aggs/metrics/lib/make_nested_label.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/lib/make_nested_label.ts rename to src/plugins/data/common/search/aggs/metrics/lib/make_nested_label.ts diff --git a/src/plugins/data/public/search/aggs/metrics/lib/nested_agg_helpers.ts b/src/plugins/data/common/search/aggs/metrics/lib/nested_agg_helpers.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/lib/nested_agg_helpers.ts rename to src/plugins/data/common/search/aggs/metrics/lib/nested_agg_helpers.ts diff --git a/src/plugins/data/public/search/aggs/metrics/lib/ordinal_suffix.test.ts b/src/plugins/data/common/search/aggs/metrics/lib/ordinal_suffix.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/lib/ordinal_suffix.test.ts rename to src/plugins/data/common/search/aggs/metrics/lib/ordinal_suffix.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/lib/ordinal_suffix.ts b/src/plugins/data/common/search/aggs/metrics/lib/ordinal_suffix.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/lib/ordinal_suffix.ts rename to src/plugins/data/common/search/aggs/metrics/lib/ordinal_suffix.ts diff --git a/src/plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts b/src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts rename to src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts diff --git a/src/plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_writer.ts b/src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_writer.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/lib/parent_pipeline_agg_writer.ts rename to src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_writer.ts diff --git a/src/plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts b/src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts rename to src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts diff --git a/src/plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_writer.ts b/src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_writer.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/lib/sibling_pipeline_agg_writer.ts rename to src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_writer.ts diff --git a/src/plugins/data/public/search/aggs/metrics/max.ts b/src/plugins/data/common/search/aggs/metrics/max.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/max.ts rename to src/plugins/data/common/search/aggs/metrics/max.ts diff --git a/src/plugins/data/public/search/aggs/metrics/max_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/max_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/max_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/max_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/max_fn.ts b/src/plugins/data/common/search/aggs/metrics/max_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/max_fn.ts rename to src/plugins/data/common/search/aggs/metrics/max_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/median.test.ts b/src/plugins/data/common/search/aggs/metrics/median.test.ts similarity index 94% rename from src/plugins/data/public/search/aggs/metrics/median.test.ts rename to src/plugins/data/common/search/aggs/metrics/median.test.ts index 22d907330e2a3..f3f2d157ebafc 100644 --- a/src/plugins/data/public/search/aggs/metrics/median.test.ts +++ b/src/plugins/data/common/search/aggs/metrics/median.test.ts @@ -17,7 +17,6 @@ * under the License. */ -import { getMedianMetricAgg } from './median'; import { AggConfigs, IAggConfigs } from '../agg_configs'; import { mockAggTypesRegistry } from '../test_helpers'; import { METRIC_TYPES } from './metric_agg_types'; @@ -26,7 +25,7 @@ describe('AggTypeMetricMedianProvider class', () => { let aggConfigs: IAggConfigs; beforeEach(() => { - const typesRegistry = mockAggTypesRegistry([getMedianMetricAgg()]); + const typesRegistry = mockAggTypesRegistry(); const field = { name: 'bytes', }; diff --git a/src/plugins/data/public/search/aggs/metrics/median.ts b/src/plugins/data/common/search/aggs/metrics/median.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/median.ts rename to src/plugins/data/common/search/aggs/metrics/median.ts diff --git a/src/plugins/data/public/search/aggs/metrics/median_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/median_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/median_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/median_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/median_fn.ts b/src/plugins/data/common/search/aggs/metrics/median_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/median_fn.ts rename to src/plugins/data/common/search/aggs/metrics/median_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/metric_agg_type.ts b/src/plugins/data/common/search/aggs/metrics/metric_agg_type.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/metric_agg_type.ts rename to src/plugins/data/common/search/aggs/metrics/metric_agg_type.ts diff --git a/src/plugins/data/public/search/aggs/metrics/metric_agg_types.ts b/src/plugins/data/common/search/aggs/metrics/metric_agg_types.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/metric_agg_types.ts rename to src/plugins/data/common/search/aggs/metrics/metric_agg_types.ts diff --git a/src/plugins/data/public/search/aggs/metrics/min.ts b/src/plugins/data/common/search/aggs/metrics/min.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/min.ts rename to src/plugins/data/common/search/aggs/metrics/min.ts diff --git a/src/plugins/data/public/search/aggs/metrics/min_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/min_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/min_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/min_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/min_fn.ts b/src/plugins/data/common/search/aggs/metrics/min_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/min_fn.ts rename to src/plugins/data/common/search/aggs/metrics/min_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/moving_avg.ts b/src/plugins/data/common/search/aggs/metrics/moving_avg.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/moving_avg.ts rename to src/plugins/data/common/search/aggs/metrics/moving_avg.ts diff --git a/src/plugins/data/public/search/aggs/metrics/moving_avg_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/moving_avg_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/moving_avg_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/moving_avg_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/moving_avg_fn.ts b/src/plugins/data/common/search/aggs/metrics/moving_avg_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/moving_avg_fn.ts rename to src/plugins/data/common/search/aggs/metrics/moving_avg_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/parent_pipeline.test.ts b/src/plugins/data/common/search/aggs/metrics/parent_pipeline.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/parent_pipeline.test.ts rename to src/plugins/data/common/search/aggs/metrics/parent_pipeline.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/percentile_ranks.test.ts b/src/plugins/data/common/search/aggs/metrics/percentile_ranks.test.ts similarity index 77% rename from src/plugins/data/public/search/aggs/metrics/percentile_ranks.test.ts rename to src/plugins/data/common/search/aggs/metrics/percentile_ranks.test.ts index 348aecc23243a..970daf5b62458 100644 --- a/src/plugins/data/public/search/aggs/metrics/percentile_ranks.test.ts +++ b/src/plugins/data/common/search/aggs/metrics/percentile_ranks.test.ts @@ -23,29 +23,16 @@ import { PercentileRanksMetricAggDependencies, } from './percentile_ranks'; import { AggConfigs, IAggConfigs } from '../agg_configs'; -import { mockAggTypesRegistry } from '../test_helpers'; +import { mockAggTypesRegistry, mockGetFieldFormatsStart } from '../test_helpers'; import { METRIC_TYPES } from './metric_agg_types'; -import { FieldFormatsStart } from '../../../field_formats'; -import { fieldFormatsServiceMock } from '../../../field_formats/mocks'; -import { InternalStartServices } from '../../../types'; describe('AggTypesMetricsPercentileRanksProvider class', function () { let aggConfigs: IAggConfigs; - let fieldFormats: FieldFormatsStart; let aggTypesDependencies: PercentileRanksMetricAggDependencies; beforeEach(() => { - fieldFormats = fieldFormatsServiceMock.createStartContract(); - fieldFormats.getDefaultInstance = (() => ({ - convert: (t?: string) => t, - })) as any; - aggTypesDependencies = { - getInternalStartServices: () => - (({ - fieldFormats, - } as unknown) as InternalStartServices), - }; - const typesRegistry = mockAggTypesRegistry([getPercentileRanksMetricAgg(aggTypesDependencies)]); + aggTypesDependencies = { getFieldFormatsStart: mockGetFieldFormatsStart }; + const typesRegistry = mockAggTypesRegistry(); const field = { name: 'bytes', }; diff --git a/src/plugins/data/public/search/aggs/metrics/percentile_ranks.ts b/src/plugins/data/common/search/aggs/metrics/percentile_ranks.ts similarity index 86% rename from src/plugins/data/public/search/aggs/metrics/percentile_ranks.ts rename to src/plugins/data/common/search/aggs/metrics/percentile_ranks.ts index 3c0be229f1bbd..664cc1ad02ada 100644 --- a/src/plugins/data/public/search/aggs/metrics/percentile_ranks.ts +++ b/src/plugins/data/common/search/aggs/metrics/percentile_ranks.ts @@ -18,13 +18,15 @@ */ import { i18n } from '@kbn/i18n'; + +import { KBN_FIELD_TYPES } from '../../../../common'; +import { AggTypesDependencies } from '../agg_types'; +import { BaseAggParams } from '../types'; + import { MetricAggType } from './metric_agg_type'; import { getResponseAggConfigClass, IResponseAggConfig } from './lib/get_response_agg_config_class'; import { getPercentileValue } from './percentiles_get_value'; import { METRIC_TYPES } from './metric_agg_types'; -import { KBN_FIELD_TYPES } from '../../../../common'; -import { GetInternalStartServicesFn } from '../../../types'; -import { BaseAggParams } from '../types'; export interface AggParamsPercentileRanks extends BaseAggParams { field: string; @@ -35,16 +37,17 @@ export interface AggParamsPercentileRanks extends BaseAggParams { export type IPercentileRanksAggConfig = IResponseAggConfig; export interface PercentileRanksMetricAggDependencies { - getInternalStartServices: GetInternalStartServicesFn; + getFieldFormatsStart: AggTypesDependencies['getFieldFormatsStart']; } -const getValueProps = (getInternalStartServices: GetInternalStartServicesFn) => { +const getValueProps = ( + getFieldFormatsStart: PercentileRanksMetricAggDependencies['getFieldFormatsStart'] +) => { return { makeLabel(this: IPercentileRanksAggConfig) { - const { fieldFormats } = getInternalStartServices(); + const { getDefaultInstance } = getFieldFormatsStart(); const field = this.getField(); - const format = - (field && field.format) || fieldFormats.getDefaultInstance(KBN_FIELD_TYPES.NUMBER); + const format = (field && field.format) || getDefaultInstance(KBN_FIELD_TYPES.NUMBER); const customLabel = this.getParam('customLabel'); const label = customLabel || this.getFieldDisplayName(); @@ -57,7 +60,7 @@ const getValueProps = (getInternalStartServices: GetInternalStartServicesFn) => }; export const getPercentileRanksMetricAgg = ({ - getInternalStartServices, + getFieldFormatsStart, }: PercentileRanksMetricAggDependencies) => { return new MetricAggType({ name: METRIC_TYPES.PERCENTILE_RANKS, @@ -87,10 +90,7 @@ export const getPercentileRanksMetricAgg = ({ }, ], getResponseAggs(agg) { - const ValueAggConfig = getResponseAggConfigClass( - agg, - getValueProps(getInternalStartServices) - ); + const ValueAggConfig = getResponseAggConfigClass(agg, getValueProps(getFieldFormatsStart)); const values = agg.getParam('values'); return values.map((value: any) => new ValueAggConfig(value)); diff --git a/src/plugins/data/public/search/aggs/metrics/percentile_ranks_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/percentile_ranks_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/percentile_ranks_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/percentile_ranks_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/percentile_ranks_fn.ts b/src/plugins/data/common/search/aggs/metrics/percentile_ranks_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/percentile_ranks_fn.ts rename to src/plugins/data/common/search/aggs/metrics/percentile_ranks_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/percentiles.test.ts b/src/plugins/data/common/search/aggs/metrics/percentiles.test.ts similarity index 96% rename from src/plugins/data/public/search/aggs/metrics/percentiles.test.ts rename to src/plugins/data/common/search/aggs/metrics/percentiles.test.ts index a44c0e5075ef9..10e98df5a4eeb 100644 --- a/src/plugins/data/public/search/aggs/metrics/percentiles.test.ts +++ b/src/plugins/data/common/search/aggs/metrics/percentiles.test.ts @@ -26,7 +26,7 @@ describe('AggTypesMetricsPercentilesProvider class', () => { let aggConfigs: IAggConfigs; beforeEach(() => { - const typesRegistry = mockAggTypesRegistry([getPercentilesMetricAgg()]); + const typesRegistry = mockAggTypesRegistry(); const field = { name: 'bytes', }; diff --git a/src/plugins/data/public/search/aggs/metrics/percentiles.ts b/src/plugins/data/common/search/aggs/metrics/percentiles.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/percentiles.ts rename to src/plugins/data/common/search/aggs/metrics/percentiles.ts diff --git a/src/plugins/data/public/search/aggs/metrics/percentiles_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/percentiles_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/percentiles_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/percentiles_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/percentiles_fn.ts b/src/plugins/data/common/search/aggs/metrics/percentiles_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/percentiles_fn.ts rename to src/plugins/data/common/search/aggs/metrics/percentiles_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/percentiles_get_value.ts b/src/plugins/data/common/search/aggs/metrics/percentiles_get_value.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/percentiles_get_value.ts rename to src/plugins/data/common/search/aggs/metrics/percentiles_get_value.ts diff --git a/src/plugins/data/public/search/aggs/metrics/serial_diff.ts b/src/plugins/data/common/search/aggs/metrics/serial_diff.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/serial_diff.ts rename to src/plugins/data/common/search/aggs/metrics/serial_diff.ts diff --git a/src/plugins/data/public/search/aggs/metrics/serial_diff_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/serial_diff_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/serial_diff_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/serial_diff_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/serial_diff_fn.ts b/src/plugins/data/common/search/aggs/metrics/serial_diff_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/serial_diff_fn.ts rename to src/plugins/data/common/search/aggs/metrics/serial_diff_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts b/src/plugins/data/common/search/aggs/metrics/sibling_pipeline.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts rename to src/plugins/data/common/search/aggs/metrics/sibling_pipeline.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/std_deviation.test.ts b/src/plugins/data/common/search/aggs/metrics/std_deviation.test.ts similarity index 97% rename from src/plugins/data/public/search/aggs/metrics/std_deviation.test.ts rename to src/plugins/data/common/search/aggs/metrics/std_deviation.test.ts index c3efe95f44a56..f2f30fcde42eb 100644 --- a/src/plugins/data/public/search/aggs/metrics/std_deviation.test.ts +++ b/src/plugins/data/common/search/aggs/metrics/std_deviation.test.ts @@ -23,7 +23,7 @@ import { mockAggTypesRegistry } from '../test_helpers'; import { METRIC_TYPES } from './metric_agg_types'; describe('AggTypeMetricStandardDeviationProvider class', () => { - const typesRegistry = mockAggTypesRegistry([getStdDeviationMetricAgg()]); + const typesRegistry = mockAggTypesRegistry(); const getAggConfigs = (customLabel?: string) => { const field = { name: 'memory', diff --git a/src/plugins/data/public/search/aggs/metrics/std_deviation.ts b/src/plugins/data/common/search/aggs/metrics/std_deviation.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/std_deviation.ts rename to src/plugins/data/common/search/aggs/metrics/std_deviation.ts diff --git a/src/plugins/data/public/search/aggs/metrics/std_deviation_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/std_deviation_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/std_deviation_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/std_deviation_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/std_deviation_fn.ts b/src/plugins/data/common/search/aggs/metrics/std_deviation_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/std_deviation_fn.ts rename to src/plugins/data/common/search/aggs/metrics/std_deviation_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/sum.ts b/src/plugins/data/common/search/aggs/metrics/sum.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/sum.ts rename to src/plugins/data/common/search/aggs/metrics/sum.ts diff --git a/src/plugins/data/public/search/aggs/metrics/sum_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/sum_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/sum_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/sum_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/sum_fn.ts b/src/plugins/data/common/search/aggs/metrics/sum_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/sum_fn.ts rename to src/plugins/data/common/search/aggs/metrics/sum_fn.ts diff --git a/src/plugins/data/public/search/aggs/metrics/top_hit.test.ts b/src/plugins/data/common/search/aggs/metrics/top_hit.test.ts similarity index 99% rename from src/plugins/data/public/search/aggs/metrics/top_hit.test.ts rename to src/plugins/data/common/search/aggs/metrics/top_hit.test.ts index c2434df3ae53c..c0cbfb33c842b 100644 --- a/src/plugins/data/public/search/aggs/metrics/top_hit.test.ts +++ b/src/plugins/data/common/search/aggs/metrics/top_hit.test.ts @@ -36,7 +36,7 @@ describe('Top hit metric', () => { fieldType = KBN_FIELD_TYPES.NUMBER, size = 1, }: any) => { - const typesRegistry = mockAggTypesRegistry([getTopHitMetricAgg()]); + const typesRegistry = mockAggTypesRegistry(); const field = { name: fieldName, displayName: fieldName, diff --git a/src/plugins/data/public/search/aggs/metrics/top_hit.ts b/src/plugins/data/common/search/aggs/metrics/top_hit.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/top_hit.ts rename to src/plugins/data/common/search/aggs/metrics/top_hit.ts diff --git a/src/plugins/data/public/search/aggs/metrics/top_hit_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/top_hit_fn.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/top_hit_fn.test.ts rename to src/plugins/data/common/search/aggs/metrics/top_hit_fn.test.ts diff --git a/src/plugins/data/public/search/aggs/metrics/top_hit_fn.ts b/src/plugins/data/common/search/aggs/metrics/top_hit_fn.ts similarity index 100% rename from src/plugins/data/public/search/aggs/metrics/top_hit_fn.ts rename to src/plugins/data/common/search/aggs/metrics/top_hit_fn.ts diff --git a/src/plugins/data/public/search/aggs/param_types/agg.ts b/src/plugins/data/common/search/aggs/param_types/agg.ts similarity index 100% rename from src/plugins/data/public/search/aggs/param_types/agg.ts rename to src/plugins/data/common/search/aggs/param_types/agg.ts diff --git a/src/plugins/data/public/search/aggs/param_types/base.ts b/src/plugins/data/common/search/aggs/param_types/base.ts similarity index 96% rename from src/plugins/data/public/search/aggs/param_types/base.ts rename to src/plugins/data/common/search/aggs/param_types/base.ts index 1ba8a75e98cbe..3a12a9a54500f 100644 --- a/src/plugins/data/public/search/aggs/param_types/base.ts +++ b/src/plugins/data/common/search/aggs/param_types/base.ts @@ -17,11 +17,10 @@ * under the License. */ +import { FetchOptions, ISearchSource } from 'src/plugins/data/public'; import { ExpressionAstFunction } from 'src/plugins/expressions/common'; import { IAggConfigs } from '../agg_configs'; import { IAggConfig } from '../agg_config'; -import { FetchOptions } from '../../fetch'; -import { ISearchSource } from '../../search_source'; export class BaseParamType { name: string; diff --git a/src/plugins/data/public/search/aggs/param_types/field.test.ts b/src/plugins/data/common/search/aggs/param_types/field.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/param_types/field.test.ts rename to src/plugins/data/common/search/aggs/param_types/field.test.ts diff --git a/src/plugins/data/public/search/aggs/param_types/field.ts b/src/plugins/data/common/search/aggs/param_types/field.ts similarity index 96% rename from src/plugins/data/public/search/aggs/param_types/field.ts rename to src/plugins/data/common/search/aggs/param_types/field.ts index 7c00bc668a39f..492294bdf4e5f 100644 --- a/src/plugins/data/public/search/aggs/param_types/field.ts +++ b/src/plugins/data/common/search/aggs/param_types/field.ts @@ -22,8 +22,8 @@ import { IAggConfig } from '../agg_config'; import { SavedObjectNotFound } from '../../../../../../plugins/kibana_utils/common'; import { BaseParamType } from './base'; import { propFilter } from '../utils'; -import { isNestedField, KBN_FIELD_TYPES } from '../../../../common'; -import { IndexPatternField } from '../../../index_patterns'; +import { KBN_FIELD_TYPES } from '../../../kbn_field_types/types'; +import { isNestedField, IndexPatternField } from '../../../index_patterns/fields'; const filterByType = propFilter('type'); diff --git a/src/plugins/data/public/search/aggs/param_types/index.ts b/src/plugins/data/common/search/aggs/param_types/index.ts similarity index 100% rename from src/plugins/data/public/search/aggs/param_types/index.ts rename to src/plugins/data/common/search/aggs/param_types/index.ts diff --git a/src/plugins/data/public/search/aggs/param_types/json.test.ts b/src/plugins/data/common/search/aggs/param_types/json.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/param_types/json.test.ts rename to src/plugins/data/common/search/aggs/param_types/json.test.ts diff --git a/src/plugins/data/public/search/aggs/param_types/json.ts b/src/plugins/data/common/search/aggs/param_types/json.ts similarity index 100% rename from src/plugins/data/public/search/aggs/param_types/json.ts rename to src/plugins/data/common/search/aggs/param_types/json.ts diff --git a/src/plugins/data/public/search/aggs/param_types/optioned.test.ts b/src/plugins/data/common/search/aggs/param_types/optioned.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/param_types/optioned.test.ts rename to src/plugins/data/common/search/aggs/param_types/optioned.test.ts diff --git a/src/plugins/data/public/search/aggs/param_types/optioned.ts b/src/plugins/data/common/search/aggs/param_types/optioned.ts similarity index 100% rename from src/plugins/data/public/search/aggs/param_types/optioned.ts rename to src/plugins/data/common/search/aggs/param_types/optioned.ts diff --git a/src/plugins/data/public/search/aggs/param_types/string.test.ts b/src/plugins/data/common/search/aggs/param_types/string.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/param_types/string.test.ts rename to src/plugins/data/common/search/aggs/param_types/string.test.ts diff --git a/src/plugins/data/public/search/aggs/param_types/string.ts b/src/plugins/data/common/search/aggs/param_types/string.ts similarity index 100% rename from src/plugins/data/public/search/aggs/param_types/string.ts rename to src/plugins/data/common/search/aggs/param_types/string.ts diff --git a/src/plugins/data/public/search/aggs/test_helpers/function_wrapper.ts b/src/plugins/data/common/search/aggs/test_helpers/function_wrapper.ts similarity index 100% rename from src/plugins/data/public/search/aggs/test_helpers/function_wrapper.ts rename to src/plugins/data/common/search/aggs/test_helpers/function_wrapper.ts diff --git a/src/plugins/data/public/search/aggs/test_helpers/index.ts b/src/plugins/data/common/search/aggs/test_helpers/index.ts similarity index 86% rename from src/plugins/data/public/search/aggs/test_helpers/index.ts rename to src/plugins/data/common/search/aggs/test_helpers/index.ts index d47317d8b4725..30f315f276741 100644 --- a/src/plugins/data/public/search/aggs/test_helpers/index.ts +++ b/src/plugins/data/common/search/aggs/test_helpers/index.ts @@ -17,5 +17,5 @@ * under the License. */ -export { functionWrapper } from './function_wrapper'; -export { mockAggTypesRegistry } from './mock_agg_types_registry'; +export * from './function_wrapper'; +export * from './mock_agg_types_registry'; diff --git a/src/plugins/data/public/search/aggs/test_helpers/mock_agg_types_registry.ts b/src/plugins/data/common/search/aggs/test_helpers/mock_agg_types_registry.ts similarity index 52% rename from src/plugins/data/public/search/aggs/test_helpers/mock_agg_types_registry.ts rename to src/plugins/data/common/search/aggs/test_helpers/mock_agg_types_registry.ts index 4a0820c349b5f..14631a9d53055 100644 --- a/src/plugins/data/public/search/aggs/test_helpers/mock_agg_types_registry.ts +++ b/src/plugins/data/common/search/aggs/test_helpers/mock_agg_types_registry.ts @@ -17,17 +17,14 @@ * under the License. */ -import { coreMock } from '../../../../../../../src/core/public/mocks'; +import { fieldFormatsMock } from '../../../field_formats/mocks'; + import { AggTypesRegistry, AggTypesRegistryStart } from '../agg_types_registry'; -import { getAggTypes } from '../agg_types'; -import { BucketAggType } from '../buckets/bucket_agg_type'; -import { MetricAggType } from '../metrics/metric_agg_type'; -import { fieldFormatsServiceMock } from '../../../field_formats/mocks'; -import { InternalStartServices } from '../../../types'; +import { AggTypesDependencies, getAggTypes } from '../agg_types'; import { TimeBucketsConfig } from '../buckets/lib/time_buckets/time_buckets'; // Mocked uiSettings shared among aggs unit tests -const mockUiSettings = jest.fn().mockImplementation((key: string) => { +const mockGetConfig = jest.fn().mockImplementation((key: string) => { const config: TimeBucketsConfig = { 'histogram:maxBars': 4, 'histogram:barTarget': 3, @@ -44,6 +41,23 @@ const mockUiSettings = jest.fn().mockImplementation((key: string) => { return config[key] ?? key; }); +/** @internal */ +export function mockGetFieldFormatsStart() { + const { deserialize, getDefaultInstance } = fieldFormatsMock; + return { + deserialize, + getDefaultInstance, + }; +} + +/** @internal */ +export const mockAggTypesDependencies: AggTypesDependencies = { + calculateBounds: jest.fn(), + getFieldFormatsStart: mockGetFieldFormatsStart, + getConfig: mockGetConfig, + isDefaultTimezone: () => true, +}; + /** * Testing utility which creates a new instance of AggTypesRegistry, * registers the provided agg types, and returns AggTypesRegistry.start() @@ -56,36 +70,37 @@ const mockUiSettings = jest.fn().mockImplementation((key: string) => { * * @internal */ -export function mockAggTypesRegistry | MetricAggType>( - types?: T[] -): AggTypesRegistryStart { +export function mockAggTypesRegistry(deps?: AggTypesDependencies): AggTypesRegistryStart { const registry = new AggTypesRegistry(); + const initializedAggTypes = new Map(); const registrySetup = registry.setup(); - if (types) { - types.forEach((type) => { - if (type instanceof BucketAggType) { - registrySetup.registerBucket(type); - } else if (type instanceof MetricAggType) { - registrySetup.registerMetric(type); - } - }); - } else { - const coreSetup = coreMock.createSetup(); - coreSetup.uiSettings.get = mockUiSettings; + const aggTypes = getAggTypes(); + + aggTypes.buckets.forEach(({ name, fn }) => registrySetup.registerBucket(name, fn)); + aggTypes.metrics.forEach(({ name, fn }) => registrySetup.registerMetric(name, fn)); - const aggTypes = getAggTypes({ - calculateBounds: jest.fn(), - getInternalStartServices: () => - (({ - fieldFormats: fieldFormatsServiceMock.createStartContract(), - } as unknown) as InternalStartServices), - uiSettings: coreSetup.uiSettings, - }); + const registryStart = registry.start(); - aggTypes.buckets.forEach((type) => registrySetup.registerBucket(type)); - aggTypes.metrics.forEach((type) => registrySetup.registerMetric(type)); - } + // initialize each agg type and store in memory + registryStart.getAll().buckets.forEach((type) => { + const agg = type(deps ?? mockAggTypesDependencies); + initializedAggTypes.set(agg.name, agg); + }); + registryStart.getAll().metrics.forEach((type) => { + const agg = type(deps ?? mockAggTypesDependencies); + initializedAggTypes.set(agg.name, agg); + }); - return registry.start(); + return { + get: (name: string) => { + return initializedAggTypes.get(name); + }, + getAll: () => { + return { + buckets: Array.from(initializedAggTypes.values()).filter((agg) => agg.type === 'buckets'), + metrics: Array.from(initializedAggTypes.values()).filter((agg) => agg.type === 'metrics'), + }; + }, + }; } diff --git a/src/plugins/data/common/search/aggs/types.ts b/src/plugins/data/common/search/aggs/types.ts new file mode 100644 index 0000000000000..dabd653463d4f --- /dev/null +++ b/src/plugins/data/common/search/aggs/types.ts @@ -0,0 +1,157 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Assign } from '@kbn/utility-types'; +import { IndexPattern } from '../../index_patterns/index_patterns/index_pattern'; +import { + AggConfigSerialized, + AggConfigs, + AggParamsRange, + AggParamsIpRange, + AggParamsDateRange, + AggParamsFilter, + AggParamsFilters, + AggParamsSignificantTerms, + AggParamsGeoTile, + AggParamsGeoHash, + AggParamsTerms, + AggParamsAvg, + AggParamsCardinality, + AggParamsGeoBounds, + AggParamsGeoCentroid, + AggParamsMax, + AggParamsMedian, + AggParamsMin, + AggParamsStdDeviation, + AggParamsSum, + AggParamsBucketAvg, + AggParamsBucketMax, + AggParamsBucketMin, + AggParamsBucketSum, + AggParamsCumulativeSum, + AggParamsDerivative, + AggParamsMovingAvg, + AggParamsPercentileRanks, + AggParamsPercentiles, + AggParamsSerialDiff, + AggParamsTopHit, + AggParamsHistogram, + AggParamsDateHistogram, + AggTypesRegistry, + AggTypesRegistrySetup, + AggTypesRegistryStart, + CreateAggConfigParams, + getCalculateAutoTimeExpression, + METRIC_TYPES, + BUCKET_TYPES, +} from './'; + +export { IAggConfig, AggConfigSerialized } from './agg_config'; +export { CreateAggConfigParams, IAggConfigs } from './agg_configs'; +export { IAggType } from './agg_type'; +export { AggParam, AggParamOption } from './agg_params'; +export { IFieldParamType } from './param_types'; +export { IMetricAggType } from './metrics/metric_agg_type'; +export { DateRangeKey } from './buckets/lib/date_range'; +export { IpRangeKey } from './buckets/lib/ip_range'; +export { OptionedValueProp } from './param_types/optioned'; + +/** @internal */ +export interface AggsCommonSetup { + types: AggTypesRegistrySetup; +} + +/** @internal */ +export interface AggsCommonStart { + calculateAutoTimeExpression: ReturnType; + createAggConfigs: ( + indexPattern: IndexPattern, + configStates?: CreateAggConfigParams[], + schemas?: Record + ) => InstanceType; + types: ReturnType; +} + +/** + * AggsStart represents the actual external contract as AggsCommonStart + * is only used internally. The difference is that AggsStart includes the + * typings for the registry with initialized agg types. + * + * @internal + */ +export type AggsStart = Assign; + +/** @internal */ +export interface BaseAggParams { + json?: string; + customLabel?: string; +} + +/** @internal */ +export interface AggExpressionType { + type: 'agg_type'; + value: AggConfigSerialized; +} + +/** @internal */ +export type AggExpressionFunctionArgs< + Name extends keyof AggParamsMapping +> = AggParamsMapping[Name] & Pick; + +/** + * A global list of the param interfaces for each agg type. + * For now this is internal, but eventually we will probably + * want to make it public. + * + * @internal + */ +export interface AggParamsMapping { + [BUCKET_TYPES.RANGE]: AggParamsRange; + [BUCKET_TYPES.IP_RANGE]: AggParamsIpRange; + [BUCKET_TYPES.DATE_RANGE]: AggParamsDateRange; + [BUCKET_TYPES.FILTER]: AggParamsFilter; + [BUCKET_TYPES.FILTERS]: AggParamsFilters; + [BUCKET_TYPES.SIGNIFICANT_TERMS]: AggParamsSignificantTerms; + [BUCKET_TYPES.GEOTILE_GRID]: AggParamsGeoTile; + [BUCKET_TYPES.GEOHASH_GRID]: AggParamsGeoHash; + [BUCKET_TYPES.HISTOGRAM]: AggParamsHistogram; + [BUCKET_TYPES.DATE_HISTOGRAM]: AggParamsDateHistogram; + [BUCKET_TYPES.TERMS]: AggParamsTerms; + [METRIC_TYPES.AVG]: AggParamsAvg; + [METRIC_TYPES.CARDINALITY]: AggParamsCardinality; + [METRIC_TYPES.COUNT]: BaseAggParams; + [METRIC_TYPES.GEO_BOUNDS]: AggParamsGeoBounds; + [METRIC_TYPES.GEO_CENTROID]: AggParamsGeoCentroid; + [METRIC_TYPES.MAX]: AggParamsMax; + [METRIC_TYPES.MEDIAN]: AggParamsMedian; + [METRIC_TYPES.MIN]: AggParamsMin; + [METRIC_TYPES.STD_DEV]: AggParamsStdDeviation; + [METRIC_TYPES.SUM]: AggParamsSum; + [METRIC_TYPES.AVG_BUCKET]: AggParamsBucketAvg; + [METRIC_TYPES.MAX_BUCKET]: AggParamsBucketMax; + [METRIC_TYPES.MIN_BUCKET]: AggParamsBucketMin; + [METRIC_TYPES.SUM_BUCKET]: AggParamsBucketSum; + [METRIC_TYPES.CUMULATIVE_SUM]: AggParamsCumulativeSum; + [METRIC_TYPES.DERIVATIVE]: AggParamsDerivative; + [METRIC_TYPES.MOVING_FN]: AggParamsMovingAvg; + [METRIC_TYPES.PERCENTILE_RANKS]: AggParamsPercentileRanks; + [METRIC_TYPES.PERCENTILES]: AggParamsPercentiles; + [METRIC_TYPES.SERIAL_DIFF]: AggParamsSerialDiff; + [METRIC_TYPES.TOP_HITS]: AggParamsTopHit; +} diff --git a/src/plugins/data/public/search/aggs/utils/calculate_auto_time_expression.ts b/src/plugins/data/common/search/aggs/utils/calculate_auto_time_expression.ts similarity index 71% rename from src/plugins/data/public/search/aggs/utils/calculate_auto_time_expression.ts rename to src/plugins/data/common/search/aggs/utils/calculate_auto_time_expression.ts index 30fcdd9d83a38..622e8101f34ab 100644 --- a/src/plugins/data/public/search/aggs/utils/calculate_auto_time_expression.ts +++ b/src/plugins/data/common/search/aggs/utils/calculate_auto_time_expression.ts @@ -17,11 +17,12 @@ * under the License. */ import moment from 'moment'; -import { IUiSettingsClient } from 'src/core/public'; +import { UI_SETTINGS } from '../../../../common/constants'; +import { TimeRange } from '../../../../common/query'; import { TimeBuckets } from '../buckets/lib/time_buckets'; -import { toAbsoluteDates, TimeRange, UI_SETTINGS } from '../../../../common'; +import { toAbsoluteDates } from './date_interval_utils'; -export function getCalculateAutoTimeExpression(uiSettings: IUiSettingsClient) { +export function getCalculateAutoTimeExpression(getConfig: (key: string) => any) { return function calculateAutoTimeExpression(range: TimeRange) { const dates = toAbsoluteDates(range); if (!dates) { @@ -29,10 +30,10 @@ export function getCalculateAutoTimeExpression(uiSettings: IUiSettingsClient) { } const buckets = new TimeBuckets({ - 'histogram:maxBars': uiSettings.get(UI_SETTINGS.HISTOGRAM_MAX_BARS), - 'histogram:barTarget': uiSettings.get(UI_SETTINGS.HISTOGRAM_BAR_TARGET), - dateFormat: uiSettings.get('dateFormat'), - 'dateFormat:scaled': uiSettings.get('dateFormat:scaled'), + 'histogram:maxBars': getConfig(UI_SETTINGS.HISTOGRAM_MAX_BARS), + 'histogram:barTarget': getConfig(UI_SETTINGS.HISTOGRAM_BAR_TARGET), + dateFormat: getConfig('dateFormat'), + 'dateFormat:scaled': getConfig('dateFormat:scaled'), }); buckets.setInterval('auto'); diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/date_histogram_interval.test.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/date_histogram_interval.test.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/date_histogram_interval.test.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/date_histogram_interval.test.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/date_histogram_interval.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/date_histogram_interval.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/date_histogram_interval.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/date_histogram_interval.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/index.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/index.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/index.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/index.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/invalid_es_calendar_interval_error.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/invalid_es_calendar_interval_error.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/invalid_es_calendar_interval_error.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/invalid_es_calendar_interval_error.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/invalid_es_interval_format_error.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/invalid_es_interval_format_error.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/invalid_es_interval_format_error.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/invalid_es_interval_format_error.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/is_valid_es_interval.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/is_valid_es_interval.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/is_valid_es_interval.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/is_valid_es_interval.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/is_valid_interval.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/is_valid_interval.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/is_valid_interval.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/is_valid_interval.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/least_common_interval.test.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/least_common_interval.test.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/least_common_interval.test.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/least_common_interval.test.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/least_common_interval.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/least_common_interval.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/least_common_interval.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/least_common_interval.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/least_common_multiple.test.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/least_common_multiple.test.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/least_common_multiple.test.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/least_common_multiple.test.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/least_common_multiple.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/least_common_multiple.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/least_common_multiple.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/least_common_multiple.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/parse_es_interval.test.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_es_interval.test.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/parse_es_interval.test.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_es_interval.test.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/parse_es_interval.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_es_interval.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/parse_es_interval.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_es_interval.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/parse_interval.test.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_interval.test.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/parse_interval.test.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_interval.test.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/parse_interval.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_interval.ts similarity index 100% rename from src/plugins/data/common/search/aggs/date_interval_utils/parse_interval.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_interval.ts diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/to_absolute_dates.ts b/src/plugins/data/common/search/aggs/utils/date_interval_utils/to_absolute_dates.ts similarity index 95% rename from src/plugins/data/common/search/aggs/date_interval_utils/to_absolute_dates.ts rename to src/plugins/data/common/search/aggs/utils/date_interval_utils/to_absolute_dates.ts index 98d752a72e28a..99809e06df38f 100644 --- a/src/plugins/data/common/search/aggs/date_interval_utils/to_absolute_dates.ts +++ b/src/plugins/data/common/search/aggs/utils/date_interval_utils/to_absolute_dates.ts @@ -18,7 +18,7 @@ */ import dateMath from '@elastic/datemath'; -import { TimeRange } from '../../../../common'; +import { TimeRange } from '../../../../../common'; export function toAbsoluteDates(range: TimeRange) { const fromDate = dateMath.parse(range.from); diff --git a/src/plugins/data/public/search/aggs/utils/get_format_with_aggs.test.ts b/src/plugins/data/common/search/aggs/utils/get_format_with_aggs.test.ts similarity index 95% rename from src/plugins/data/public/search/aggs/utils/get_format_with_aggs.test.ts rename to src/plugins/data/common/search/aggs/utils/get_format_with_aggs.test.ts index 3b440bc50c93b..20d8cfc105e49 100644 --- a/src/plugins/data/public/search/aggs/utils/get_format_with_aggs.test.ts +++ b/src/plugins/data/common/search/aggs/utils/get_format_with_aggs.test.ts @@ -19,9 +19,8 @@ import { identity } from 'lodash'; -import { SerializedFieldFormat } from '../../../../../expressions/common/types'; -import { FieldFormat } from '../../../../common'; -import { IFieldFormat } from '../../../../public'; +import { SerializedFieldFormat } from 'src/plugins/expressions/common/types'; +import { FieldFormat, IFieldFormat } from '../../../../common'; import { getFormatWithAggs } from './get_format_with_aggs'; diff --git a/src/plugins/data/public/search/aggs/utils/get_format_with_aggs.ts b/src/plugins/data/common/search/aggs/utils/get_format_with_aggs.ts similarity index 95% rename from src/plugins/data/public/search/aggs/utils/get_format_with_aggs.ts rename to src/plugins/data/common/search/aggs/utils/get_format_with_aggs.ts index e0db249c7cf86..01369206ab3cf 100644 --- a/src/plugins/data/public/search/aggs/utils/get_format_with_aggs.ts +++ b/src/plugins/data/common/search/aggs/utils/get_format_with_aggs.ts @@ -19,9 +19,12 @@ import { i18n } from '@kbn/i18n'; -import { SerializedFieldFormat } from '../../../../../expressions/common/types'; -import { FieldFormat } from '../../../../common'; -import { FieldFormatsContentType, IFieldFormat } from '../../../../public'; +import { SerializedFieldFormat } from 'src/plugins/expressions/common/types'; +import { + FieldFormat, + FieldFormatsContentType, + IFieldFormat, +} from '../../../../common/field_formats'; import { convertDateRangeToString, DateRangeKey } from '../buckets/lib/date_range'; import { convertIPRangeToString, IpRangeKey } from '../buckets/lib/ip_range'; diff --git a/src/plugins/data/public/search/aggs/utils/get_parsed_value.ts b/src/plugins/data/common/search/aggs/utils/get_parsed_value.ts similarity index 100% rename from src/plugins/data/public/search/aggs/utils/get_parsed_value.ts rename to src/plugins/data/common/search/aggs/utils/get_parsed_value.ts diff --git a/src/plugins/data/public/search/aggs/utils/index.ts b/src/plugins/data/common/search/aggs/utils/index.ts similarity index 93% rename from src/plugins/data/public/search/aggs/utils/index.ts rename to src/plugins/data/common/search/aggs/utils/index.ts index 5a889ee9ead9d..99ce44207d80d 100644 --- a/src/plugins/data/public/search/aggs/utils/index.ts +++ b/src/plugins/data/common/search/aggs/utils/index.ts @@ -18,6 +18,8 @@ */ export * from './calculate_auto_time_expression'; +export * from './date_interval_utils'; export * from './get_format_with_aggs'; +export * from './ipv4_address'; export * from './prop_filter'; export * from './to_angular_json'; diff --git a/src/plugins/data/common/search/aggs/ipv4_address.test.ts b/src/plugins/data/common/search/aggs/utils/ipv4_address.test.ts similarity index 100% rename from src/plugins/data/common/search/aggs/ipv4_address.test.ts rename to src/plugins/data/common/search/aggs/utils/ipv4_address.test.ts diff --git a/src/plugins/data/common/search/aggs/ipv4_address.ts b/src/plugins/data/common/search/aggs/utils/ipv4_address.ts similarity index 100% rename from src/plugins/data/common/search/aggs/ipv4_address.ts rename to src/plugins/data/common/search/aggs/utils/ipv4_address.ts diff --git a/src/plugins/data/public/search/aggs/utils/prop_filter.test.ts b/src/plugins/data/common/search/aggs/utils/prop_filter.test.ts similarity index 100% rename from src/plugins/data/public/search/aggs/utils/prop_filter.test.ts rename to src/plugins/data/common/search/aggs/utils/prop_filter.test.ts diff --git a/src/plugins/data/public/search/aggs/utils/prop_filter.ts b/src/plugins/data/common/search/aggs/utils/prop_filter.ts similarity index 100% rename from src/plugins/data/public/search/aggs/utils/prop_filter.ts rename to src/plugins/data/common/search/aggs/utils/prop_filter.ts diff --git a/src/plugins/data/public/search/aggs/utils/to_angular_json.ts b/src/plugins/data/common/search/aggs/utils/to_angular_json.ts similarity index 100% rename from src/plugins/data/public/search/aggs/utils/to_angular_json.ts rename to src/plugins/data/common/search/aggs/utils/to_angular_json.ts diff --git a/src/plugins/data/common/search/expressions/index.ts b/src/plugins/data/common/search/expressions/index.ts index f1a39a8383629..25839a805d8c5 100644 --- a/src/plugins/data/common/search/expressions/index.ts +++ b/src/plugins/data/common/search/expressions/index.ts @@ -18,3 +18,4 @@ */ export * from './esaggs'; +export * from './utils'; diff --git a/src/plugins/data/public/search/expressions/utils/courier_inspector_stats.ts b/src/plugins/data/common/search/expressions/utils/courier_inspector_stats.ts similarity index 98% rename from src/plugins/data/public/search/expressions/utils/courier_inspector_stats.ts rename to src/plugins/data/common/search/expressions/utils/courier_inspector_stats.ts index c933e8cd3e961..d41f02d2728d5 100644 --- a/src/plugins/data/public/search/expressions/utils/courier_inspector_stats.ts +++ b/src/plugins/data/common/search/expressions/utils/courier_inspector_stats.ts @@ -26,8 +26,8 @@ import { i18n } from '@kbn/i18n'; import { SearchResponse } from 'elasticsearch'; +import { ISearchSource } from 'src/plugins/data/public'; import { RequestStatistics } from 'src/plugins/inspector/common'; -import { ISearchSource } from '../../search_source'; /** @public */ export function getRequestInspectorStats(searchSource: ISearchSource) { diff --git a/src/plugins/data/common/search/expressions/utils/index.ts b/src/plugins/data/common/search/expressions/utils/index.ts new file mode 100644 index 0000000000000..75c1809770c78 --- /dev/null +++ b/src/plugins/data/common/search/expressions/utils/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from './courier_inspector_stats'; diff --git a/src/plugins/data/common/search/index.ts b/src/plugins/data/common/search/index.ts index 45daf16d10c6d..557ab64079d16 100644 --- a/src/plugins/data/common/search/index.ts +++ b/src/plugins/data/common/search/index.ts @@ -17,10 +17,13 @@ * under the License. */ -import { ES_SEARCH_STRATEGY } from './es_search'; - -export { IKibanaSearchResponse, IKibanaSearchRequest } from './types'; +export * from './aggs'; +export * from './es_search'; +export * from './expressions'; +export * from './tabify'; +export * from './types'; +import { ES_SEARCH_STRATEGY } from './es_search'; export const DEFAULT_SEARCH_STRATEGY = ES_SEARCH_STRATEGY; export { diff --git a/src/plugins/data/public/search/tabify/buckets.test.ts b/src/plugins/data/common/search/tabify/buckets.test.ts similarity index 100% rename from src/plugins/data/public/search/tabify/buckets.test.ts rename to src/plugins/data/common/search/tabify/buckets.test.ts diff --git a/src/plugins/data/public/search/tabify/buckets.ts b/src/plugins/data/common/search/tabify/buckets.ts similarity index 100% rename from src/plugins/data/public/search/tabify/buckets.ts rename to src/plugins/data/common/search/tabify/buckets.ts diff --git a/src/plugins/data/public/search/tabify/get_columns.test.ts b/src/plugins/data/common/search/tabify/get_columns.test.ts similarity index 100% rename from src/plugins/data/public/search/tabify/get_columns.test.ts rename to src/plugins/data/common/search/tabify/get_columns.test.ts diff --git a/src/plugins/data/public/search/tabify/get_columns.ts b/src/plugins/data/common/search/tabify/get_columns.ts similarity index 100% rename from src/plugins/data/public/search/tabify/get_columns.ts rename to src/plugins/data/common/search/tabify/get_columns.ts diff --git a/src/plugins/data/public/search/tabify/index.ts b/src/plugins/data/common/search/tabify/index.ts similarity index 100% rename from src/plugins/data/public/search/tabify/index.ts rename to src/plugins/data/common/search/tabify/index.ts diff --git a/src/plugins/data/public/search/tabify/response_writer.test.ts b/src/plugins/data/common/search/tabify/response_writer.test.ts similarity index 100% rename from src/plugins/data/public/search/tabify/response_writer.test.ts rename to src/plugins/data/common/search/tabify/response_writer.test.ts diff --git a/src/plugins/data/public/search/tabify/response_writer.ts b/src/plugins/data/common/search/tabify/response_writer.ts similarity index 100% rename from src/plugins/data/public/search/tabify/response_writer.ts rename to src/plugins/data/common/search/tabify/response_writer.ts diff --git a/src/plugins/data/public/search/tabify/tabify.test.ts b/src/plugins/data/common/search/tabify/tabify.test.ts similarity index 98% rename from src/plugins/data/public/search/tabify/tabify.test.ts rename to src/plugins/data/common/search/tabify/tabify.test.ts index 0a1e99c8bb200..6b9d520b11436 100644 --- a/src/plugins/data/public/search/tabify/tabify.test.ts +++ b/src/plugins/data/common/search/tabify/tabify.test.ts @@ -18,7 +18,7 @@ */ import { tabifyAggResponse } from './tabify'; -import { IndexPattern } from '../../index_patterns'; +import { IndexPattern } from '../../index_patterns/index_patterns/index_pattern'; import { AggConfigs, IAggConfig, IAggConfigs } from '../aggs'; import { mockAggTypesRegistry } from '../aggs/test_helpers'; import { metricOnly, threeTermBuckets } from 'fixtures/fake_hierarchical_data'; diff --git a/src/plugins/data/public/search/tabify/tabify.ts b/src/plugins/data/common/search/tabify/tabify.ts similarity index 100% rename from src/plugins/data/public/search/tabify/tabify.ts rename to src/plugins/data/common/search/tabify/tabify.ts diff --git a/src/plugins/data/public/search/tabify/types.ts b/src/plugins/data/common/search/tabify/types.ts similarity index 100% rename from src/plugins/data/public/search/tabify/types.ts rename to src/plugins/data/common/search/tabify/types.ts diff --git a/src/plugins/data/public/field_formats/utils/deserialize.ts b/src/plugins/data/public/field_formats/utils/deserialize.ts index 26baa5fdeb1e4..7595a443bf8f0 100644 --- a/src/plugins/data/public/field_formats/utils/deserialize.ts +++ b/src/plugins/data/public/field_formats/utils/deserialize.ts @@ -23,9 +23,9 @@ import { SerializedFieldFormat } from '../../../../expressions/common/types'; import { FieldFormat } from '../../../common'; import { FormatFactory } from '../../../common/field_formats/utils'; +import { getFormatWithAggs } from '../../../common/search/aggs'; import { DataPublicPluginStart, IFieldFormat } from '../../../public'; import { getUiSettings } from '../../../public/services'; -import { getFormatWithAggs } from '../../search/aggs/utils'; const getConfig = (key: string, defaultOverride?: any): any => getUiSettings().get(key, defaultOverride); diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index f036d5f30a0e2..d35069207ee84 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -294,15 +294,6 @@ import { propFilter, siblingPipelineType, termsAggFilter, - // expressions utils - getRequestInspectorStats, - getResponseInspectorStats, - // tabify - tabifyAggResponse, - tabifyGetColumns, -} from './search'; - -import { dateHistogramInterval, InvalidEsCalendarIntervalError, InvalidEsIntervalFormatError, @@ -312,10 +303,14 @@ import { parseEsInterval, parseInterval, toAbsoluteDates, + // expressions utils + getRequestInspectorStats, + getResponseInspectorStats, + // tabify + tabifyAggResponse, + tabifyGetColumns, } from '../common'; -export { EsaggsExpressionFunctionDefinition, ParsedInterval } from '../common'; - export { // aggs AggGroupLabels, @@ -326,6 +321,7 @@ export { AggParamType, AggConfigOptions, BUCKET_TYPES, + EsaggsExpressionFunctionDefinition, IAggConfig, IAggConfigs, IAggType, @@ -334,35 +330,39 @@ export { METRIC_TYPES, OptionedParamType, OptionedValueProp, + ParsedInterval, + // tabify + TabbedAggColumn, + TabbedAggRow, + TabbedTable, +} from '../common'; + +export { // search ES_SEARCH_STRATEGY, + EsQuerySortValue, + extractSearchSourceReferences, + FetchOptions, getEsPreference, - ISearch, - ISearchOptions, - ISearchGeneric, - IEsSearchResponse, + getSearchParamsFromRequest, IEsSearchRequest, - IKibanaSearchResponse, + IEsSearchResponse, IKibanaSearchRequest, - SearchRequest, - SearchResponse, - SearchError, + IKibanaSearchResponse, + injectSearchSourceReferences, + ISearch, + ISearchGeneric, + ISearchOptions, ISearchSource, parseSearchSourceJSON, - injectSearchSourceReferences, - getSearchParamsFromRequest, - extractSearchSourceReferences, - SearchSourceFields, - EsQuerySortValue, - SortDirection, - FetchOptions, - // tabify - TabbedAggColumn, - TabbedAggRow, - TabbedTable, + RequestTimeoutError, + SearchError, SearchInterceptor, SearchInterceptorDeps, - RequestTimeoutError, + SearchRequest, + SearchResponse, + SearchSourceFields, + SortDirection, } from './search'; // Search namespace diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 3fc1e6454829d..78e40cfedd906 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -79,7 +79,7 @@ const createStartContract = (): Start => { }; export { createSearchSourceMock } from './search/mocks'; -export { getCalculateAutoTimeExpression } from './search/aggs'; +export { getCalculateAutoTimeExpression } from '../common/search/aggs'; export const dataPluginMock = { createSetupContract, diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index e950434b287a7..e6a48794d8b0f 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -33,7 +33,6 @@ import { DataPublicPluginStart, DataSetupDependencies, DataStartDependencies, - InternalStartServices, DataPublicPluginEnhancements, } from './types'; import { AutocompleteService } from './autocomplete'; @@ -120,17 +119,6 @@ export class DataPublicPlugin ): DataPublicPluginSetup { const startServices = createStartServicesGetter(core.getStartServices); - const getInternalStartServices = (): InternalStartServices => { - const { core: coreStart, self } = startServices(); - return { - fieldFormats: self.fieldFormats, - notifications: coreStart.notifications, - uiSettings: coreStart.uiSettings, - searchService: self.search, - injectedMetadata: coreStart.injectedMetadata, - }; - }; - expressions.registerFunction(esaggs); expressions.registerFunction(indexPatternLoad); @@ -158,10 +146,9 @@ export class DataPublicPlugin ); const searchService = this.searchService.setup(core, { - expressions, usageCollection, - getInternalStartServices, packageInfo: this.packageInfo, + registerFunction: expressions.registerFunction, }); return { @@ -210,7 +197,7 @@ export class DataPublicPlugin }); setQueryService(query); - const search = this.searchService.start(core, { indexPatterns }); + const search = this.searchService.start(core, { fieldFormats, indexPatterns }); setSearchService(search); uiActions.addTriggerAction( @@ -247,5 +234,7 @@ export class DataPublicPlugin public stop() { this.autocomplete.clearProviders(); + this.queryService.stop(); + this.searchService.stop(); } } diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index a61334905e9f5..744376403e1a1 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -26,10 +26,12 @@ import { EuiGlobalToastListToast } from '@elastic/eui'; import { ExclusiveUnion } from '@elastic/eui'; import { ExpressionAstFunction } from 'src/plugins/expressions/common'; import { ExpressionsSetup } from 'src/plugins/expressions/public'; +import { FetchOptions as FetchOptions_2 } from 'src/plugins/data/public'; import { History } from 'history'; import { Href } from 'history'; import { IconType } from '@elastic/eui'; import { InjectedIntl } from '@kbn/i18n/react'; +import { ISearchSource as ISearchSource_2 } from 'src/plugins/data/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { IUiSettingsClient } from 'src/core/public'; import { IUiSettingsClient as IUiSettingsClient_3 } from 'kibana/public'; @@ -153,12 +155,12 @@ export interface ApplyGlobalFilterActionContext { timeFieldName?: string; } -// Warning: (ae-forgotten-export) The symbol "DateNanosFormat" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "DateFormat" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "DateNanosFormat" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "baseFormattersPublic" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const baseFormattersPublic: (import("../../common").FieldFormatInstanceType | typeof DateNanosFormat | typeof DateFormat)[]; +export const baseFormattersPublic: (import("../../common").FieldFormatInstanceType | typeof DateFormat | typeof DateNanosFormat)[]; // Warning: (ae-missing-release-tag) "BUCKET_TYPES" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1653,7 +1655,7 @@ export const search: { intervalOptions: ({ display: string; val: string; - enabled(agg: import("./search/aggs/buckets/bucket_agg_type").IBucketAggConfig): boolean | "" | undefined; + enabled(agg: import("../common").IBucketAggConfig): boolean | "" | undefined; } | { display: string; val: string; @@ -1662,9 +1664,9 @@ export const search: { InvalidEsIntervalFormatError: typeof InvalidEsIntervalFormatError; Ipv4Address: typeof Ipv4Address; isDateHistogramBucketAggConfig: typeof isDateHistogramBucketAggConfig; - isNumberType: (agg: import("./search").AggConfig) => boolean; - isStringType: (agg: import("./search").AggConfig) => boolean; - isType: (...types: string[]) => (agg: import("./search").AggConfig) => boolean; + isNumberType: (agg: import("../common").AggConfig) => boolean; + isStringType: (agg: import("../common").AggConfig) => boolean; + isType: (...types: string[]) => (agg: import("../common").AggConfig) => boolean; isValidEsInterval: typeof isValidEsInterval; isValidInterval: typeof isValidInterval; parentPipelineType: string; diff --git a/src/plugins/data/public/search/aggs/aggs_service.test.ts b/src/plugins/data/public/search/aggs/aggs_service.test.ts new file mode 100644 index 0000000000000..db25dfb300d11 --- /dev/null +++ b/src/plugins/data/public/search/aggs/aggs_service.test.ts @@ -0,0 +1,182 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { BehaviorSubject, Subscription } from 'rxjs'; + +import { coreMock } from '../../../../../core/public/mocks'; +import { expressionsPluginMock } from '../../../../../plugins/expressions/public/mocks'; +import { BucketAggType, getAggTypes, MetricAggType } from '../../../common'; +import { fieldFormatsServiceMock } from '../../field_formats/mocks'; + +import { + AggsService, + AggsSetupDependencies, + AggsStartDependencies, + createGetConfig, +} from './aggs_service'; + +const { uiSettings } = coreMock.createSetup(); + +describe('AggsService - public', () => { + let service: AggsService; + let setupDeps: AggsSetupDependencies; + let startDeps: AggsStartDependencies; + + beforeEach(() => { + service = new AggsService(); + setupDeps = { + registerFunction: expressionsPluginMock.createSetupContract().registerFunction, + uiSettings, + }; + startDeps = { + fieldFormats: fieldFormatsServiceMock.createStartContract(), + uiSettings, + }; + }); + + describe('setup()', () => { + test('exposes proper contract', () => { + const setup = service.setup(setupDeps); + expect(Object.keys(setup).length).toBe(1); + expect(setup).toHaveProperty('types'); + }); + + test('registers default agg types', () => { + service.setup(setupDeps); + const start = service.start(startDeps); + expect(start.types.getAll().buckets.length).toBe(11); + expect(start.types.getAll().metrics.length).toBe(21); + }); + + test('registers custom agg types', () => { + const setup = service.setup(setupDeps); + setup.types.registerBucket( + 'foo', + () => ({ name: 'foo', type: 'buckets' } as BucketAggType) + ); + setup.types.registerMetric( + 'bar', + () => ({ name: 'bar', type: 'metrics' } as MetricAggType) + ); + + const start = service.start(startDeps); + expect(start.types.getAll().buckets.length).toBe(12); + expect(start.types.getAll().buckets.some(({ name }) => name === 'foo')).toBe(true); + expect(start.types.getAll().metrics.length).toBe(22); + expect(start.types.getAll().metrics.some(({ name }) => name === 'bar')).toBe(true); + }); + }); + + describe('start()', () => { + test('exposes proper contract', () => { + const start = service.start(startDeps); + expect(Object.keys(start).length).toBe(3); + expect(start).toHaveProperty('calculateAutoTimeExpression'); + expect(start).toHaveProperty('createAggConfigs'); + expect(start).toHaveProperty('types'); + }); + + test('types registry returns initialized agg types', () => { + service.setup(setupDeps); + const start = service.start(startDeps); + + expect(start.types.get('terms').name).toBe('terms'); + }); + + test('registers default agg types', () => { + service.setup(setupDeps); + const start = service.start(startDeps); + + const aggTypes = getAggTypes(); + expect(start.types.getAll().buckets.length).toBe(aggTypes.buckets.length); + expect(start.types.getAll().metrics.length).toBe(aggTypes.metrics.length); + }); + + test('merges default agg types with types registered during setup', () => { + const setup = service.setup(setupDeps); + setup.types.registerBucket( + 'foo', + () => ({ name: 'foo', type: 'buckets' } as BucketAggType) + ); + setup.types.registerMetric( + 'bar', + () => ({ name: 'bar', type: 'metrics' } as MetricAggType) + ); + + const start = service.start(startDeps); + + const aggTypes = getAggTypes(); + expect(start.types.getAll().buckets.length).toBe(aggTypes.buckets.length + 1); + expect(start.types.getAll().buckets.some(({ name }) => name === 'foo')).toBe(true); + expect(start.types.getAll().metrics.length).toBe(aggTypes.metrics.length + 1); + expect(start.types.getAll().metrics.some(({ name }) => name === 'bar')).toBe(true); + }); + }); + + describe('createGetConfig()', () => { + let fooSubject$: BehaviorSubject; + let barSubject$: BehaviorSubject; + + beforeEach(() => { + jest.clearAllMocks(); + + fooSubject$ = new BehaviorSubject('fooVal'); + barSubject$ = new BehaviorSubject('barVal'); + + uiSettings.get$.mockImplementation((key: string) => { + const mockSettings: Record = { + foo: () => fooSubject$, + bar: () => barSubject$, + }; + return mockSettings[key] ? mockSettings[key]() : undefined; + }); + }); + + test('returns a function to get the value of the provided setting', () => { + const requiredSettings = ['foo', 'bar']; + const subscriptions: Subscription[] = []; + const getConfig = createGetConfig(uiSettings, requiredSettings, subscriptions); + + expect(getConfig('foo')).toBe('fooVal'); + expect(getConfig('bar')).toBe('barVal'); + }); + + test('does not return values for settings that are not explicitly declared', () => { + const requiredSettings = ['foo', 'bar']; + const subscriptions: Subscription[] = []; + const getConfig = createGetConfig(uiSettings, requiredSettings, subscriptions); + + expect(subscriptions.length).toBe(2); + expect(getConfig('baz')).toBe(undefined); + }); + + test('provides latest value for each setting', () => { + const requiredSettings = ['foo', 'bar']; + const subscriptions: Subscription[] = []; + const getConfig = createGetConfig(uiSettings, requiredSettings, subscriptions); + + expect(getConfig('foo')).toBe('fooVal'); + fooSubject$.next('fooVal2'); + expect(getConfig('foo')).toBe('fooVal2'); + expect(getConfig('foo')).toBe('fooVal2'); + fooSubject$.next('fooVal3'); + expect(getConfig('foo')).toBe('fooVal3'); + }); + }); +}); diff --git a/src/plugins/data/public/search/aggs/aggs_service.ts b/src/plugins/data/public/search/aggs/aggs_service.ts new file mode 100644 index 0000000000000..d535f97fefdf8 --- /dev/null +++ b/src/plugins/data/public/search/aggs/aggs_service.ts @@ -0,0 +1,152 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Subscription } from 'rxjs'; + +import { IUiSettingsClient } from 'src/core/public'; +import { ExpressionsServiceSetup } from 'src/plugins/expressions/common'; +import { + aggsRequiredUiSettings, + AggsCommonStartDependencies, + AggsCommonService, + AggConfigs, + AggTypesDependencies, + calculateBounds, + TimeRange, +} from '../../../common'; +import { FieldFormatsStart } from '../../field_formats'; +import { getForceNow } from '../../query/timefilter/lib/get_force_now'; +import { AggsSetup, AggsStart } from './types'; + +/** + * Aggs needs synchronous access to specific uiSettings. Since settings can change + * without a page refresh, we create a cache that subscribes to changes from + * uiSettings.get$ and keeps everything up-to-date. + * + * @internal + */ +export function createGetConfig( + uiSettings: IUiSettingsClient, + requiredSettings: string[], + subscriptions: Subscription[] +): AggsCommonStartDependencies['getConfig'] { + const settingsCache: Record = {}; + + requiredSettings.forEach((setting) => { + subscriptions.push( + uiSettings.get$(setting).subscribe((value) => { + settingsCache[setting] = value; + }) + ); + }); + + return (key) => settingsCache[key]; +} + +/** @internal */ +export interface AggsSetupDependencies { + registerFunction: ExpressionsServiceSetup['registerFunction']; + uiSettings: IUiSettingsClient; +} + +/** @internal */ +export interface AggsStartDependencies { + fieldFormats: FieldFormatsStart; + uiSettings: IUiSettingsClient; +} + +/** + * The aggs service provides a means of modeling and manipulating the various + * Elasticsearch aggregations supported by Kibana, providing the ability to + * output the correct DSL when you are ready to send your request to ES. + */ +export class AggsService { + private readonly aggsCommonService = new AggsCommonService(); + private readonly initializedAggTypes = new Map(); + private getConfig?: AggsCommonStartDependencies['getConfig']; + private subscriptions: Subscription[] = []; + + /** + * getForceNow uses window.location, so we must have a separate implementation + * of calculateBounds on the client and the server. + */ + private calculateBounds = (timeRange: TimeRange) => + calculateBounds(timeRange, { forceNow: getForceNow() }); + + public setup({ registerFunction, uiSettings }: AggsSetupDependencies): AggsSetup { + this.getConfig = createGetConfig(uiSettings, aggsRequiredUiSettings, this.subscriptions); + + return this.aggsCommonService.setup({ registerFunction }); + } + + public start({ fieldFormats, uiSettings }: AggsStartDependencies): AggsStart { + const { calculateAutoTimeExpression, types } = this.aggsCommonService.start({ + getConfig: this.getConfig!, + }); + + const aggTypesDependencies: AggTypesDependencies = { + calculateBounds: this.calculateBounds, + getConfig: this.getConfig!, + getFieldFormatsStart: () => ({ + deserialize: fieldFormats.deserialize, + getDefaultInstance: fieldFormats.getDefaultInstance, + }), + isDefaultTimezone: () => uiSettings.isDefault('dateFormat:tz'), + }; + + // initialize each agg type and store in memory + types.getAll().buckets.forEach((type) => { + const agg = type(aggTypesDependencies); + this.initializedAggTypes.set(agg.name, agg); + }); + types.getAll().metrics.forEach((type) => { + const agg = type(aggTypesDependencies); + this.initializedAggTypes.set(agg.name, agg); + }); + + const typesRegistry = { + get: (name: string) => { + return this.initializedAggTypes.get(name); + }, + getAll: () => { + return { + buckets: Array.from(this.initializedAggTypes.values()).filter( + (agg) => agg.type === 'buckets' + ), + metrics: Array.from(this.initializedAggTypes.values()).filter( + (agg) => agg.type === 'metrics' + ), + }; + }, + }; + + return { + calculateAutoTimeExpression, + createAggConfigs: (indexPattern, configStates = [], schemas) => { + return new AggConfigs(indexPattern, configStates, { typesRegistry }); + }, + types: typesRegistry, + }; + } + + public stop() { + this.subscriptions.forEach((s) => s.unsubscribe()); + this.subscriptions = []; + } +} diff --git a/src/plugins/data/public/search/aggs/index.ts b/src/plugins/data/public/search/aggs/index.ts index 1139d9c7ff722..77d97c426260c 100644 --- a/src/plugins/data/public/search/aggs/index.ts +++ b/src/plugins/data/public/search/aggs/index.ts @@ -17,14 +17,5 @@ * under the License. */ -export * from './agg_config'; -export * from './agg_configs'; -export * from './agg_groups'; -export * from './agg_type'; -export * from './agg_types'; -export * from './agg_types_registry'; -export * from './buckets'; -export * from './metrics'; -export * from './param_types'; +export * from './aggs_service'; export * from './types'; -export * from './utils'; diff --git a/src/plugins/data/public/search/aggs/mocks.ts b/src/plugins/data/public/search/aggs/mocks.ts index 2cad646067292..ca13343777e63 100644 --- a/src/plugins/data/public/search/aggs/mocks.ts +++ b/src/plugins/data/public/search/aggs/mocks.ts @@ -17,15 +17,17 @@ * under the License. */ -import { coreMock } from '../../../../../../src/core/public/mocks'; import { AggConfigs, AggTypesRegistrySetup, AggTypesRegistryStart, getCalculateAutoTimeExpression, -} from './'; -import { SearchAggsSetup, SearchAggsStart } from './types'; -import { mockAggTypesRegistry } from './test_helpers'; +} from '../../../common'; +import { AggsSetup, AggsStart } from './types'; + +import { mockAggTypesRegistry } from '../../../common/search/aggs/test_helpers'; + +const getConfig = jest.fn(); const aggTypeBaseParamMock = () => ({ name: 'some_param', @@ -53,21 +55,18 @@ export const aggTypesRegistrySetupMock = (): AggTypesRegistrySetup => ({ export const aggTypesRegistryStartMock = (): AggTypesRegistryStart => ({ get: jest.fn().mockImplementation(aggTypeConfigMock), - getBuckets: jest.fn().mockImplementation(() => [aggTypeConfigMock()]), - getMetrics: jest.fn().mockImplementation(() => [aggTypeConfigMock()]), getAll: jest.fn().mockImplementation(() => ({ buckets: [aggTypeConfigMock()], metrics: [aggTypeConfigMock()], })), }); -export const searchAggsSetupMock = (): SearchAggsSetup => ({ - calculateAutoTimeExpression: getCalculateAutoTimeExpression(coreMock.createSetup().uiSettings), +export const searchAggsSetupMock = (): AggsSetup => ({ types: aggTypesRegistrySetupMock(), }); -export const searchAggsStartMock = (): SearchAggsStart => ({ - calculateAutoTimeExpression: getCalculateAutoTimeExpression(coreMock.createStart().uiSettings), +export const searchAggsStartMock = (): AggsStart => ({ + calculateAutoTimeExpression: getCalculateAutoTimeExpression(getConfig), createAggConfigs: jest.fn().mockImplementation((indexPattern, configStates = [], schemas) => { return new AggConfigs(indexPattern, configStates, { typesRegistry: mockAggTypesRegistry(), diff --git a/src/plugins/data/public/search/aggs/types.ts b/src/plugins/data/public/search/aggs/types.ts index a784bfaada4c7..38be541973ce9 100644 --- a/src/plugins/data/public/search/aggs/types.ts +++ b/src/plugins/data/public/search/aggs/types.ts @@ -17,131 +17,7 @@ * under the License. */ -import { IndexPattern } from '../../index_patterns'; -import { - AggConfigSerialized, - AggConfigs, - AggParamsRange, - AggParamsIpRange, - AggParamsDateRange, - AggParamsFilter, - AggParamsFilters, - AggParamsSignificantTerms, - AggParamsGeoTile, - AggParamsGeoHash, - AggParamsTerms, - AggParamsAvg, - AggParamsCardinality, - AggParamsGeoBounds, - AggParamsGeoCentroid, - AggParamsMax, - AggParamsMedian, - AggParamsMin, - AggParamsStdDeviation, - AggParamsSum, - AggParamsBucketAvg, - AggParamsBucketMax, - AggParamsBucketMin, - AggParamsBucketSum, - AggParamsCumulativeSum, - AggParamsDerivative, - AggParamsMovingAvg, - AggParamsPercentileRanks, - AggParamsPercentiles, - AggParamsSerialDiff, - AggParamsTopHit, - AggParamsHistogram, - AggParamsDateHistogram, - AggTypesRegistrySetup, - AggTypesRegistryStart, - CreateAggConfigParams, - getCalculateAutoTimeExpression, - METRIC_TYPES, - BUCKET_TYPES, -} from './'; +import { AggsCommonSetup } from '../../../common'; -export { IAggConfig, AggConfigSerialized } from './agg_config'; -export { CreateAggConfigParams, IAggConfigs } from './agg_configs'; -export { IAggType } from './agg_type'; -export { AggParam, AggParamOption } from './agg_params'; -export { IFieldParamType } from './param_types'; -export { IMetricAggType } from './metrics/metric_agg_type'; -export { DateRangeKey } from './buckets/lib/date_range'; -export { IpRangeKey } from './buckets/lib/ip_range'; -export { OptionedValueProp } from './param_types/optioned'; - -/** @internal */ -export interface SearchAggsSetup { - calculateAutoTimeExpression: ReturnType; - types: AggTypesRegistrySetup; -} - -/** @internal */ -export interface SearchAggsStart { - calculateAutoTimeExpression: ReturnType; - createAggConfigs: ( - indexPattern: IndexPattern, - configStates?: CreateAggConfigParams[], - schemas?: Record - ) => InstanceType; - types: AggTypesRegistryStart; -} - -/** @internal */ -export interface BaseAggParams { - json?: string; - customLabel?: string; -} - -/** @internal */ -export interface AggExpressionType { - type: 'agg_type'; - value: AggConfigSerialized; -} - -/** @internal */ -export type AggExpressionFunctionArgs< - Name extends keyof AggParamsMapping -> = AggParamsMapping[Name] & Pick; - -/** - * A global list of the param interfaces for each agg type. - * For now this is internal, but eventually we will probably - * want to make it public. - * - * @internal - */ -export interface AggParamsMapping { - [BUCKET_TYPES.RANGE]: AggParamsRange; - [BUCKET_TYPES.IP_RANGE]: AggParamsIpRange; - [BUCKET_TYPES.DATE_RANGE]: AggParamsDateRange; - [BUCKET_TYPES.FILTER]: AggParamsFilter; - [BUCKET_TYPES.FILTERS]: AggParamsFilters; - [BUCKET_TYPES.SIGNIFICANT_TERMS]: AggParamsSignificantTerms; - [BUCKET_TYPES.GEOTILE_GRID]: AggParamsGeoTile; - [BUCKET_TYPES.GEOHASH_GRID]: AggParamsGeoHash; - [BUCKET_TYPES.HISTOGRAM]: AggParamsHistogram; - [BUCKET_TYPES.DATE_HISTOGRAM]: AggParamsDateHistogram; - [BUCKET_TYPES.TERMS]: AggParamsTerms; - [METRIC_TYPES.AVG]: AggParamsAvg; - [METRIC_TYPES.CARDINALITY]: AggParamsCardinality; - [METRIC_TYPES.COUNT]: BaseAggParams; - [METRIC_TYPES.GEO_BOUNDS]: AggParamsGeoBounds; - [METRIC_TYPES.GEO_CENTROID]: AggParamsGeoCentroid; - [METRIC_TYPES.MAX]: AggParamsMax; - [METRIC_TYPES.MEDIAN]: AggParamsMedian; - [METRIC_TYPES.MIN]: AggParamsMin; - [METRIC_TYPES.STD_DEV]: AggParamsStdDeviation; - [METRIC_TYPES.SUM]: AggParamsSum; - [METRIC_TYPES.AVG_BUCKET]: AggParamsBucketAvg; - [METRIC_TYPES.MAX_BUCKET]: AggParamsBucketMax; - [METRIC_TYPES.MIN_BUCKET]: AggParamsBucketMin; - [METRIC_TYPES.SUM_BUCKET]: AggParamsBucketSum; - [METRIC_TYPES.CUMULATIVE_SUM]: AggParamsCumulativeSum; - [METRIC_TYPES.DERIVATIVE]: AggParamsDerivative; - [METRIC_TYPES.MOVING_FN]: AggParamsMovingAvg; - [METRIC_TYPES.PERCENTILE_RANKS]: AggParamsPercentileRanks; - [METRIC_TYPES.PERCENTILES]: AggParamsPercentiles; - [METRIC_TYPES.SERIAL_DIFF]: AggParamsSerialDiff; - [METRIC_TYPES.TOP_HITS]: AggParamsTopHit; -} +export type AggsSetup = AggsCommonSetup; +export { AggsStart } from '../../../common'; diff --git a/src/plugins/data/public/search/expressions/build_tabular_inspector_data.ts b/src/plugins/data/public/search/expressions/build_tabular_inspector_data.ts index 75a4464a8e61e..7eff6f25fd828 100644 --- a/src/plugins/data/public/search/expressions/build_tabular_inspector_data.ts +++ b/src/plugins/data/public/search/expressions/build_tabular_inspector_data.ts @@ -19,8 +19,8 @@ import { set } from '@elastic/safer-lodash-set'; import { FormattedData } from '../../../../../plugins/inspector/public'; +import { TabbedTable } from '../../../common'; import { FormatFactory } from '../../../common/field_formats/utils'; -import { TabbedTable } from '../tabify'; import { createFilter } from './create_filter'; /** diff --git a/src/plugins/data/public/search/expressions/create_filter.test.ts b/src/plugins/data/public/search/expressions/create_filter.test.ts index a7fd67983cb92..7968c80628531 100644 --- a/src/plugins/data/public/search/expressions/create_filter.test.ts +++ b/src/plugins/data/public/search/expressions/create_filter.test.ts @@ -17,11 +17,17 @@ * under the License. */ +import { + AggConfigs, + IAggConfig, + TabbedTable, + isRangeFilter, + BytesFormat, + FieldFormatsGetConfigFn, +} from '../../../common'; +import { mockAggTypesRegistry } from '../../../common/search/aggs/test_helpers'; + import { createFilter } from './create_filter'; -import { AggConfigs, IAggConfig } from '../aggs'; -import { TabbedTable } from '../tabify'; -import { isRangeFilter, BytesFormat, FieldFormatsGetConfigFn } from '../../../common'; -import { mockAggTypesRegistry } from '../aggs/test_helpers'; describe('createFilter', () => { let table: TabbedTable; diff --git a/src/plugins/data/public/search/expressions/create_filter.ts b/src/plugins/data/public/search/expressions/create_filter.ts index 94d84380e03df..09200c2e17b31 100644 --- a/src/plugins/data/public/search/expressions/create_filter.ts +++ b/src/plugins/data/public/search/expressions/create_filter.ts @@ -17,9 +17,7 @@ * under the License. */ -import { IAggConfig } from '../aggs'; -import { TabbedTable } from '../tabify'; -import { Filter } from '../../../common'; +import { Filter, IAggConfig, TabbedTable } from '../../../common'; const getOtherBucketFilterTerms = (table: TabbedTable, columnIndex: number, rowIndex: number) => { if (rowIndex === -1) { diff --git a/src/plugins/data/public/search/expressions/esaggs.ts b/src/plugins/data/public/search/expressions/esaggs.ts index 690f6b1df11c3..50fbb114b39fd 100644 --- a/src/plugins/data/public/search/expressions/esaggs.ts +++ b/src/plugins/data/public/search/expressions/esaggs.ts @@ -19,15 +19,11 @@ import { get, hasIn } from 'lodash'; import { i18n } from '@kbn/i18n'; - import { KibanaDatatable, KibanaDatatableColumn } from 'src/plugins/expressions/public'; import { calculateObjectHash } from '../../../../../plugins/kibana_utils/public'; import { PersistedState } from '../../../../../plugins/visualizations/public'; import { Adapters } from '../../../../../plugins/inspector/public'; -import { IAggConfigs } from '../aggs'; -import { ISearchSource } from '../search_source'; -import { tabifyAggResponse } from '../tabify'; import { calculateBounds, EsaggsExpressionFunctionDefinition, @@ -38,6 +34,13 @@ import { Query, TimeRange, } from '../../../common'; +import { + getRequestInspectorStats, + getResponseInspectorStats, + IAggConfigs, + tabifyAggResponse, +} from '../../../common/search'; + import { FilterManager } from '../../query'; import { getFieldFormats, @@ -45,8 +48,9 @@ import { getQueryService, getSearchService, } from '../../services'; +import { ISearchSource } from '../search_source'; import { buildTabularInspectorData } from './build_tabular_inspector_data'; -import { getRequestInspectorStats, getResponseInspectorStats, serializeAggConfig } from './utils'; +import { serializeAggConfig } from './utils'; export interface RequestHandlerParams { searchSource: ISearchSource; diff --git a/src/plugins/data/public/search/expressions/utils/index.ts b/src/plugins/data/public/search/expressions/utils/index.ts index 0fd51f3e158a6..094536fc18437 100644 --- a/src/plugins/data/public/search/expressions/utils/index.ts +++ b/src/plugins/data/public/search/expressions/utils/index.ts @@ -17,5 +17,4 @@ * under the License. */ -export * from './courier_inspector_stats'; export * from './serialize_agg_config'; diff --git a/src/plugins/data/public/search/expressions/utils/serialize_agg_config.ts b/src/plugins/data/public/search/expressions/utils/serialize_agg_config.ts index 78b4935077d10..6ba323b65783f 100644 --- a/src/plugins/data/public/search/expressions/utils/serialize_agg_config.ts +++ b/src/plugins/data/public/search/expressions/utils/serialize_agg_config.ts @@ -18,7 +18,7 @@ */ import { KibanaDatatableColumnMeta } from '../../../../../../plugins/expressions/public'; -import { IAggConfig } from '../../aggs'; +import { IAggConfig } from '../../../../common'; import { IndexPattern } from '../../../index_patterns'; import { getSearchService } from '../../../../public/services'; diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts index ae028df31e401..32bcd8a279036 100644 --- a/src/plugins/data/public/search/index.ts +++ b/src/plugins/data/public/search/index.ts @@ -17,9 +17,7 @@ * under the License. */ -export * from './aggs'; export * from './expressions'; -export * from './tabify'; export { ISearch, diff --git a/src/plugins/data/public/search/search_service.test.ts b/src/plugins/data/public/search/search_service.test.ts index f0a017847e06a..e6897a16a353a 100644 --- a/src/plugins/data/public/search/search_service.test.ts +++ b/src/plugins/data/public/search/search_service.test.ts @@ -19,9 +19,8 @@ import { coreMock } from '../../../../core/public/mocks'; import { CoreSetup, CoreStart } from '../../../../core/public'; -import { expressionsPluginMock } from '../../../../plugins/expressions/public/mocks'; -import { SearchService } from './search_service'; +import { SearchService, SearchServiceSetupDependencies } from './search_service'; describe('Search service', () => { let searchService: SearchService; @@ -36,11 +35,12 @@ describe('Search service', () => { describe('setup()', () => { it('exposes proper contract', async () => { - const setup = searchService.setup(mockCoreSetup, { + const setup = searchService.setup(mockCoreSetup, ({ packageInfo: { version: '8' }, - expressions: expressionsPluginMock.createSetupContract(), - } as any); + registerFunction: jest.fn(), + } as unknown) as SearchServiceSetupDependencies); expect(setup).toHaveProperty('aggs'); + expect(setup).toHaveProperty('usageCollector'); expect(setup).toHaveProperty('__enhance'); }); }); @@ -50,6 +50,7 @@ describe('Search service', () => { const start = searchService.start(mockCoreStart, { indexPatterns: {}, } as any); + expect(start).toHaveProperty('aggs'); expect(start).toHaveProperty('search'); }); }); diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index 4c94925b66d6e..bd9c1b1253fe2 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -17,80 +17,43 @@ * under the License. */ -import { Plugin, CoreSetup, CoreStart, PackageInfo } from '../../../../core/public'; +import { Plugin, CoreSetup, CoreStart, PackageInfo } from 'src/core/public'; import { ISearchSetup, ISearchStart, SearchEnhancements } from './types'; -import { ExpressionsSetup } from '../../../../plugins/expressions/public'; import { createSearchSource, SearchSource, SearchSourceDependencies } from './search_source'; import { getEsClient, LegacyApiCaller } from './legacy'; -import { getForceNow } from '../query/timefilter/lib/get_force_now'; -import { calculateBounds, TimeRange } from '../../common/query'; - +import { AggsService, AggsSetupDependencies, AggsStartDependencies } from './aggs'; import { IndexPatternsContract } from '../index_patterns/index_patterns'; -import { GetInternalStartServicesFn } from '../types'; import { ISearchInterceptor, SearchInterceptor } from './search_interceptor'; -import { - getAggTypes, - getAggTypesFunctions, - AggTypesRegistry, - AggConfigs, - getCalculateAutoTimeExpression, -} from './aggs'; import { ISearchGeneric } from './types'; import { SearchUsageCollector, createUsageCollector } from './collectors'; import { UsageCollectionSetup } from '../../../usage_collection/public'; -interface SearchServiceSetupDependencies { - expressions: ExpressionsSetup; - usageCollection?: UsageCollectionSetup; - getInternalStartServices: GetInternalStartServicesFn; +/** @internal */ +export interface SearchServiceSetupDependencies { packageInfo: PackageInfo; + registerFunction: AggsSetupDependencies['registerFunction']; + usageCollection?: UsageCollectionSetup; } -interface SearchServiceStartDependencies { +/** @internal */ +export interface SearchServiceStartDependencies { + fieldFormats: AggsStartDependencies['fieldFormats']; indexPatterns: IndexPatternsContract; } export class SearchService implements Plugin { private esClient?: LegacyApiCaller; - private readonly aggTypesRegistry = new AggTypesRegistry(); + private readonly aggsService = new AggsService(); private searchInterceptor!: ISearchInterceptor; private usageCollector?: SearchUsageCollector; - /** - * getForceNow uses window.location, so we must have a separate implementation - * of calculateBounds on the client and the server. - */ - private calculateBounds = (timeRange: TimeRange) => - calculateBounds(timeRange, { forceNow: getForceNow() }); - public setup( core: CoreSetup, - { - expressions, - usageCollection, - packageInfo, - getInternalStartServices, - }: SearchServiceSetupDependencies + { packageInfo, registerFunction, usageCollection }: SearchServiceSetupDependencies ): ISearchSetup { this.usageCollector = createUsageCollector(core, usageCollection); this.esClient = getEsClient(core.injectedMetadata, core.http, packageInfo); - - const aggTypesSetup = this.aggTypesRegistry.setup(); - - // register each agg type - const aggTypes = getAggTypes({ - calculateBounds: this.calculateBounds, - getInternalStartServices, - uiSettings: core.uiSettings, - }); - aggTypes.buckets.forEach((b) => aggTypesSetup.registerBucket(b)); - aggTypes.metrics.forEach((m) => aggTypesSetup.registerMetric(m)); - - // register expression functions for each agg type - const aggFunctions = getAggTypesFunctions(); - aggFunctions.forEach((fn) => expressions.registerFunction(fn)); - /** * A global object that intercepts all searches and provides convenience methods for cancelling * all pending search requests, as well as getting the number of pending search requests. @@ -109,20 +72,21 @@ export class SearchService implements Plugin { ); return { + aggs: this.aggsService.setup({ + registerFunction, + uiSettings: core.uiSettings, + }), usageCollector: this.usageCollector!, __enhance: (enhancements: SearchEnhancements) => { this.searchInterceptor = enhancements.searchInterceptor; }, - aggs: { - calculateAutoTimeExpression: getCalculateAutoTimeExpression(core.uiSettings), - types: aggTypesSetup, - }, }; } - public start(core: CoreStart, dependencies: SearchServiceStartDependencies): ISearchStart { - const aggTypesStart = this.aggTypesRegistry.start(); - + public start( + { application, http, injectedMetadata, notifications, uiSettings }: CoreStart, + { fieldFormats, indexPatterns }: SearchServiceStartDependencies + ): ISearchStart { const search: ISearchGeneric = (request, options) => { return this.searchInterceptor.search(request, options); }; @@ -132,25 +96,17 @@ export class SearchService implements Plugin { }; const searchSourceDependencies: SearchSourceDependencies = { - uiSettings: core.uiSettings, - injectedMetadata: core.injectedMetadata, + uiSettings, + injectedMetadata, search, legacySearch, }; return { - aggs: { - calculateAutoTimeExpression: getCalculateAutoTimeExpression(core.uiSettings), - createAggConfigs: (indexPattern, configStates = [], schemas) => { - return new AggConfigs(indexPattern, configStates, { - typesRegistry: aggTypesStart, - }); - }, - types: aggTypesStart, - }, + aggs: this.aggsService.start({ fieldFormats, uiSettings }), search, searchSource: { - create: createSearchSource(dependencies.indexPatterns, searchSourceDependencies), + create: createSearchSource(indexPatterns, searchSourceDependencies), createEmpty: () => { return new SearchSource({}, searchSourceDependencies); }, @@ -159,5 +115,7 @@ export class SearchService implements Plugin { }; } - public stop() {} + public stop() { + this.aggsService.stop(); + } } diff --git a/src/plugins/data/public/search/types.ts b/src/plugins/data/public/search/types.ts index d85d4c4e5c935..d1a4437943402 100644 --- a/src/plugins/data/public/search/types.ts +++ b/src/plugins/data/public/search/types.ts @@ -19,11 +19,11 @@ import { Observable } from 'rxjs'; import { PackageInfo } from 'kibana/server'; -import { SearchAggsSetup, SearchAggsStart } from './aggs'; import { LegacyApiCaller } from './legacy/es_client'; import { ISearchInterceptor } from './search_interceptor'; import { ISearchSource, SearchSourceFields } from './search_source'; import { SearchUsageCollector } from './collectors'; +import { AggsSetup, AggsSetupDependencies, AggsStartDependencies, AggsStart } from './aggs'; import { IKibanaSearchRequest, IKibanaSearchResponse, @@ -31,9 +31,7 @@ import { IEsSearchResponse, } from '../../common/search'; import { IndexPatternsContract } from '../../common/index_patterns/index_patterns'; -import { ExpressionsSetup } from '../../../expressions/public'; import { UsageCollectionSetup } from '../../../usage_collection/public'; -import { GetInternalStartServicesFn } from '../types'; export interface ISearchOptions { signal?: AbortSignal; @@ -62,7 +60,7 @@ export interface SearchEnhancements { * point. */ export interface ISearchSetup { - aggs: SearchAggsSetup; + aggs: AggsSetup; usageCollector?: SearchUsageCollector; /** * @internal @@ -71,7 +69,7 @@ export interface ISearchSetup { } export interface ISearchStart { - aggs: SearchAggsStart; + aggs: AggsStart; search: ISearchGeneric; searchSource: { create: (fields?: SearchSourceFields) => Promise; @@ -86,13 +84,15 @@ export interface ISearchStart { export { SEARCH_EVENT_TYPE } from './collectors'; +/** @internal */ export interface SearchServiceSetupDependencies { - expressions: ExpressionsSetup; - usageCollection?: UsageCollectionSetup; - getInternalStartServices: GetInternalStartServicesFn; packageInfo: PackageInfo; + registerFunction: AggsSetupDependencies['registerFunction']; + usageCollection?: UsageCollectionSetup; } +/** @internal */ export interface SearchServiceStartDependencies { + fieldFormats: AggsStartDependencies['fieldFormats']; indexPatterns: IndexPatternsContract; } diff --git a/src/plugins/data/public/types.ts b/src/plugins/data/public/types.ts index c39b7d355d495..bffc10642eb47 100644 --- a/src/plugins/data/public/types.ts +++ b/src/plugins/data/public/types.ts @@ -82,15 +82,3 @@ export interface IDataPluginServices extends Partial { storage: IStorageWrapper; data: DataPublicPluginStart; } - -/** @internal **/ -export interface InternalStartServices { - readonly fieldFormats: FieldFormatsStart; - readonly notifications: CoreStart['notifications']; - readonly uiSettings: CoreStart['uiSettings']; - readonly searchService: DataPublicPluginStart['search']; - readonly injectedMetadata: CoreStart['injectedMetadata']; -} - -/** @internal **/ -export type GetInternalStartServicesFn = () => InternalStartServices; diff --git a/src/plugins/data/server/index.ts b/src/plugins/data/server/index.ts index 73ed88850d787..c3b06992dba0e 100644 --- a/src/plugins/data/server/index.ts +++ b/src/plugins/data/server/index.ts @@ -150,6 +150,16 @@ export { */ import { + // aggs + CidrMask, + intervalOptions, + isNumberType, + isStringType, + isType, + parentPipelineType, + propFilter, + siblingPipelineType, + termsAggFilter, dateHistogramInterval, InvalidEsCalendarIntervalError, InvalidEsIntervalFormatError, @@ -159,13 +169,41 @@ import { parseEsInterval, parseInterval, toAbsoluteDates, + // expressions utils + getRequestInspectorStats, + getResponseInspectorStats, + // tabify + tabifyAggResponse, + tabifyGetColumns, } from '../common'; export { + // aggs + AggGroupLabels, + AggGroupName, + AggGroupNames, + AggParam, + AggParamOption, + AggParamType, + AggConfigOptions, + BUCKET_TYPES, EsaggsExpressionFunctionDefinition, + IAggConfig, + IAggConfigs, + IAggType, + IFieldParamType, + IMetricAggType, + METRIC_TYPES, + OptionedParamType, + OptionedValueProp, ParsedInterval, + // search IEsSearchRequest, IEsSearchResponse, + // tabify + TabbedAggColumn, + TabbedAggRow, + TabbedTable, } from '../common'; export { @@ -182,16 +220,29 @@ export { // Search namespace export const search = { aggs: { + CidrMask, dateHistogramInterval, + intervalOptions, InvalidEsCalendarIntervalError, InvalidEsIntervalFormatError, Ipv4Address, + isNumberType, + isStringType, + isType, isValidEsInterval, isValidInterval, + parentPipelineType, parseEsInterval, parseInterval, + propFilter, + siblingPipelineType, + termsAggFilter, toAbsoluteDates, }, + getRequestInspectorStats, + getResponseInspectorStats, + tabifyAggResponse, + tabifyGetColumns, }; /** diff --git a/src/plugins/data/server/plugin.ts b/src/plugins/data/server/plugin.ts index 61d8e566d2d2b..5163bfcb17d40 100644 --- a/src/plugins/data/server/plugin.ts +++ b/src/plugins/data/server/plugin.ts @@ -17,13 +17,8 @@ * under the License. */ -import { - PluginInitializerContext, - CoreSetup, - CoreStart, - Plugin, - Logger, -} from '../../../core/server'; +import { PluginInitializerContext, CoreSetup, CoreStart, Plugin, Logger } from 'src/core/server'; +import { ExpressionsServerSetup } from 'src/plugins/expressions/server'; import { ConfigSchema } from '../config'; import { IndexPatternsService, IndexPatternsServiceStart } from './index_patterns'; import { ISearchSetup, ISearchStart } from './search'; @@ -48,10 +43,21 @@ export interface DataPluginStart { } export interface DataPluginSetupDependencies { + expressions: ExpressionsServerSetup; usageCollection?: UsageCollectionSetup; } -export class DataServerPlugin implements Plugin { +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DataPluginStartDependencies {} + +export class DataServerPlugin + implements + Plugin< + DataPluginSetup, + DataPluginStart, + DataPluginSetupDependencies, + DataPluginStartDependencies + > { private readonly searchService: SearchService; private readonly scriptsService: ScriptsService; private readonly kqlTelemetryService: KqlTelemetryService; @@ -70,8 +76,8 @@ export class DataServerPlugin implements Plugin, - { usageCollection }: DataPluginSetupDependencies + core: CoreSetup, + { expressions, usageCollection }: DataPluginSetupDependencies ) { this.indexPatterns.setup(core); this.scriptsService.setup(core); @@ -82,7 +88,10 @@ export class DataServerPlugin implements Plugin { + let service: AggsService; + let setupDeps: AggsSetupDependencies; + let startDeps: AggsStartDependencies; + + beforeEach(() => { + service = new AggsService(); + setupDeps = { + registerFunction: expressionsPluginMock.createSetupContract().registerFunction, + }; + startDeps = { + fieldFormats: createFieldFormatsStartMock(), + uiSettings, + }; + }); + + describe('setup()', () => { + test('exposes proper contract', () => { + const setup = service.setup(setupDeps); + expect(Object.keys(setup).length).toBe(1); + expect(setup).toHaveProperty('types'); + }); + }); + + describe('start()', () => { + test('exposes proper contract', async () => { + service.setup(setupDeps); + const start = service.start(startDeps); + + expect(Object.keys(start).length).toBe(1); + expect(start).toHaveProperty('asScopedToClient'); + + const contract = await start.asScopedToClient( + savedObjects.getScopedClient({} as KibanaRequest) + ); + expect(contract).toHaveProperty('calculateAutoTimeExpression'); + expect(contract).toHaveProperty('createAggConfigs'); + expect(contract).toHaveProperty('types'); + }); + + test('types registry returns initialized agg types', async () => { + service.setup(setupDeps); + const start = await service + .start(startDeps) + .asScopedToClient(savedObjects.getScopedClient({} as KibanaRequest)); + + expect(start.types.get('terms').name).toBe('terms'); + }); + + test('registers default agg types', async () => { + service.setup(setupDeps); + const start = await service + .start(startDeps) + .asScopedToClient(savedObjects.getScopedClient({} as KibanaRequest)); + + const aggTypes = getAggTypes(); + expect(start.types.getAll().buckets.length).toBe(aggTypes.buckets.length); + expect(start.types.getAll().metrics.length).toBe(aggTypes.metrics.length); + }); + + test('merges default agg types with types registered during setup', async () => { + const setup = service.setup(setupDeps); + setup.types.registerBucket( + 'foo', + () => ({ name: 'foo', type: 'buckets' } as BucketAggType) + ); + setup.types.registerMetric( + 'bar', + () => ({ name: 'bar', type: 'metrics' } as MetricAggType) + ); + + const start = await service + .start(startDeps) + .asScopedToClient(savedObjects.getScopedClient({} as KibanaRequest)); + + const aggTypes = getAggTypes(); + expect(start.types.getAll().buckets.length).toBe(aggTypes.buckets.length + 1); + expect(start.types.getAll().buckets.some(({ name }) => name === 'foo')).toBe(true); + expect(start.types.getAll().metrics.length).toBe(aggTypes.metrics.length + 1); + expect(start.types.getAll().metrics.some(({ name }) => name === 'bar')).toBe(true); + }); + }); +}); diff --git a/src/plugins/data/server/search/aggs/aggs_service.ts b/src/plugins/data/server/search/aggs/aggs_service.ts new file mode 100644 index 0000000000000..3e5cd8adb44a6 --- /dev/null +++ b/src/plugins/data/server/search/aggs/aggs_service.ts @@ -0,0 +1,122 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { pick } from 'lodash'; + +import { UiSettingsServiceStart, SavedObjectsClientContract } from 'src/core/server'; +import { ExpressionsServiceSetup } from 'src/plugins/expressions/common'; +import { + AggsCommonService, + AggConfigs, + AggTypesDependencies, + aggsRequiredUiSettings, + calculateBounds, + TimeRange, +} from '../../../common'; +import { FieldFormatsStart } from '../../field_formats'; +import { AggsSetup, AggsStart } from './types'; + +/** @internal */ +export interface AggsSetupDependencies { + registerFunction: ExpressionsServiceSetup['registerFunction']; +} + +/** @internal */ +export interface AggsStartDependencies { + fieldFormats: FieldFormatsStart; + uiSettings: UiSettingsServiceStart; +} + +/** + * The aggs service provides a means of modeling and manipulating the various + * Elasticsearch aggregations supported by Kibana, providing the ability to + * output the correct DSL when you are ready to send your request to ES. + */ +export class AggsService { + private readonly aggsCommonService = new AggsCommonService(); + + /** + * getForceNow uses window.location on the client, so we must have a + * separate implementation of calculateBounds on the server. + */ + private calculateBounds = (timeRange: TimeRange) => calculateBounds(timeRange, {}); + + public setup({ registerFunction }: AggsSetupDependencies): AggsSetup { + return this.aggsCommonService.setup({ registerFunction }); + } + + public start({ fieldFormats, uiSettings }: AggsStartDependencies): AggsStart { + return { + asScopedToClient: async (savedObjectsClient: SavedObjectsClientContract) => { + const uiSettingsClient = uiSettings.asScopedToClient(savedObjectsClient); + const formats = await fieldFormats.fieldFormatServiceFactory(uiSettingsClient); + + // cache ui settings, only including items which are explicitly needed by aggs + const uiSettingsCache = pick(await uiSettingsClient.getAll(), aggsRequiredUiSettings); + const getConfig = (key: string): T => { + return uiSettingsCache[key]; + }; + + const { calculateAutoTimeExpression, types } = this.aggsCommonService.start({ getConfig }); + + const aggTypesDependencies: AggTypesDependencies = { + calculateBounds: this.calculateBounds, + getConfig, + getFieldFormatsStart: () => ({ + deserialize: formats.deserialize, + getDefaultInstance: formats.getDefaultInstance, + }), + /** + * Date histogram and date range need to know whether we are using the + * default timezone, but `isDefault` is not currently offered on the + * server, so we need to manually check for the default value. + */ + isDefaultTimezone: () => getConfig('dateFormat:tz') === 'Browser', + }; + + const typesRegistry = { + get: (name: string) => { + const type = types.get(name); + if (!type) { + return; + } + return type(aggTypesDependencies); + }, + getAll: () => { + return { + // initialize each agg type on the fly + buckets: types.getAll().buckets.map((type) => type(aggTypesDependencies)), + metrics: types.getAll().metrics.map((type) => type(aggTypesDependencies)), + }; + }, + }; + + return { + calculateAutoTimeExpression, + createAggConfigs: (indexPattern, configStates = [], schemas) => { + return new AggConfigs(indexPattern, configStates, { typesRegistry }); + }, + types: typesRegistry, + }; + }, + }; + } + + public stop() {} +} diff --git a/src/plugins/data/server/search/aggs/index.ts b/src/plugins/data/server/search/aggs/index.ts new file mode 100644 index 0000000000000..77d97c426260c --- /dev/null +++ b/src/plugins/data/server/search/aggs/index.ts @@ -0,0 +1,21 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from './aggs_service'; +export * from './types'; diff --git a/src/plugins/data/server/search/aggs/mocks.ts b/src/plugins/data/server/search/aggs/mocks.ts new file mode 100644 index 0000000000000..b50e22fe87b7c --- /dev/null +++ b/src/plugins/data/server/search/aggs/mocks.ts @@ -0,0 +1,81 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + AggConfigs, + AggTypesRegistrySetup, + AggTypesRegistryStart, + AggsCommonStart, + getCalculateAutoTimeExpression, +} from '../../../common'; +import { AggsSetup, AggsStart } from './types'; + +import { mockAggTypesRegistry } from '../../../common/search/aggs/test_helpers'; + +const getConfig = jest.fn(); + +const aggTypeBaseParamMock = () => ({ + name: 'some_param', + type: 'some_param_type', + displayName: 'some_agg_type_param', + required: false, + advanced: false, + default: {}, + write: jest.fn(), + serialize: jest.fn().mockImplementation(() => {}), + deserialize: jest.fn().mockImplementation(() => {}), + options: [], +}); + +const aggTypeConfigMock = () => ({ + name: 'some_name', + title: 'some_title', + params: [aggTypeBaseParamMock()], +}); + +export const aggTypesRegistrySetupMock = (): AggTypesRegistrySetup => ({ + registerBucket: jest.fn(), + registerMetric: jest.fn(), +}); + +export const aggTypesRegistryStartMock = (): AggTypesRegistryStart => ({ + get: jest.fn().mockImplementation(aggTypeConfigMock), + getAll: jest.fn().mockImplementation(() => ({ + buckets: [aggTypeConfigMock()], + metrics: [aggTypeConfigMock()], + })), +}); + +export const searchAggsSetupMock = (): AggsSetup => ({ + types: aggTypesRegistrySetupMock(), +}); + +const commonStartMock = (): AggsCommonStart => ({ + calculateAutoTimeExpression: getCalculateAutoTimeExpression(getConfig), + createAggConfigs: jest.fn().mockImplementation((indexPattern, configStates = [], schemas) => { + return new AggConfigs(indexPattern, configStates, { + typesRegistry: mockAggTypesRegistry(), + }); + }), + types: mockAggTypesRegistry(), +}); + +export const searchAggsStartMock = (): AggsStart => ({ + asScopedToClient: jest.fn().mockResolvedValue(commonStartMock()), +}); diff --git a/src/plugins/data/server/search/aggs/types.ts b/src/plugins/data/server/search/aggs/types.ts new file mode 100644 index 0000000000000..1b21d948b25d9 --- /dev/null +++ b/src/plugins/data/server/search/aggs/types.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObjectsClientContract } from 'src/core/server'; +import { AggsCommonSetup, AggsStart as Start } from '../../../common'; + +export type AggsSetup = AggsCommonSetup; + +export interface AggsStart { + asScopedToClient: (savedObjectsClient: SavedObjectsClientContract) => Promise; +} diff --git a/src/plugins/data/server/search/index.ts b/src/plugins/data/server/search/index.ts index cea2714671f0b..4a3990621ca39 100644 --- a/src/plugins/data/server/search/index.ts +++ b/src/plugins/data/server/search/index.ts @@ -22,3 +22,5 @@ export { ISearchStrategy, ISearchOptions, ISearchSetup, ISearchStart } from './t export { getDefaultSearchParams, getTotalLoaded } from './es_search'; export { usageProvider, SearchUsage } from './collectors'; + +export * from './aggs'; diff --git a/src/plugins/data/server/search/mocks.ts b/src/plugins/data/server/search/mocks.ts index b210df3c55db9..578a170f468bf 100644 --- a/src/plugins/data/server/search/mocks.ts +++ b/src/plugins/data/server/search/mocks.ts @@ -17,14 +17,19 @@ * under the License. */ -export function createSearchSetupMock() { +import { ISearchSetup, ISearchStart } from './types'; +import { searchAggsSetupMock, searchAggsStartMock } from './aggs/mocks'; + +export function createSearchSetupMock(): jest.Mocked { return { + aggs: searchAggsSetupMock(), registerSearchStrategy: jest.fn(), }; } -export function createSearchStartMock() { +export function createSearchStartMock(): jest.Mocked { return { + aggs: searchAggsStartMock(), getSearchStrategy: jest.fn(), search: jest.fn(), }; diff --git a/src/plugins/data/server/search/search_service.test.ts b/src/plugins/data/server/search/search_service.test.ts index be00b7409fe4a..030f37d0f7c46 100644 --- a/src/plugins/data/server/search/search_service.test.ts +++ b/src/plugins/data/server/search/search_service.test.ts @@ -17,15 +17,18 @@ * under the License. */ +import { CoreSetup, CoreStart } from '../../../../core/server'; import { coreMock } from '../../../../core/server/mocks'; -import { SearchService } from './search_service'; -import { CoreSetup } from '../../../../core/server'; import { DataPluginStart } from '../plugin'; +import { createFieldFormatsStartMock } from '../field_formats/mocks'; + +import { SearchService, SearchServiceSetupDependencies } from './search_service'; describe('Search service', () => { let plugin: SearchService; let mockCoreSetup: MockedKeys>; + let mockCoreStart: MockedKeys; beforeEach(() => { const mockLogger: any = { @@ -33,19 +36,27 @@ describe('Search service', () => { }; plugin = new SearchService(coreMock.createPluginInitializerContext({}), mockLogger); mockCoreSetup = coreMock.createSetup(); + mockCoreStart = coreMock.createStart(); }); describe('setup()', () => { it('exposes proper contract', async () => { - const setup = plugin.setup(mockCoreSetup, {}); + const setup = plugin.setup(mockCoreSetup, ({ + packageInfo: { version: '8' }, + registerFunction: jest.fn(), + } as unknown) as SearchServiceSetupDependencies); + expect(setup).toHaveProperty('aggs'); expect(setup).toHaveProperty('registerSearchStrategy'); }); }); describe('start()', () => { it('exposes proper contract', async () => { - const setup = plugin.start(); - expect(setup).toHaveProperty('getSearchStrategy'); + const start = plugin.start(mockCoreStart, { + fieldFormats: createFieldFormatsStartMock(), + }); + expect(start).toHaveProperty('aggs'); + expect(start).toHaveProperty('getSearchStrategy'); }); }); }); diff --git a/src/plugins/data/server/search/search_service.ts b/src/plugins/data/server/search/search_service.ts index 9dc47369567af..a8b1cdd608a84 100644 --- a/src/plugins/data/server/search/search_service.ts +++ b/src/plugins/data/server/search/search_service.ts @@ -18,13 +18,18 @@ */ import { + CoreSetup, + CoreStart, + Logger, Plugin, PluginInitializerContext, - CoreSetup, RequestHandlerContext, - Logger, } from '../../../../core/server'; import { ISearchSetup, ISearchStart, ISearchStrategy } from './types'; + +import { AggsService, AggsSetupDependencies } from './aggs'; + +import { FieldFormatsStart } from '../field_formats'; import { registerSearchRoute } from './routes'; import { ES_SEARCH_STRATEGY, esSearchStrategyProvider } from './es_search'; import { DataPluginStart } from '../plugin'; @@ -38,7 +43,19 @@ interface StrategyMap { [name: string]: ISearchStrategy; } +/** @internal */ +export interface SearchServiceSetupDependencies { + registerFunction: AggsSetupDependencies['registerFunction']; + usageCollection?: UsageCollectionSetup; +} + +/** @internal */ +export interface SearchServiceStartDependencies { + fieldFormats: FieldFormatsStart; +} + export class SearchService implements Plugin { + private readonly aggsService = new AggsService(); private searchStrategies: StrategyMap = {}; constructor( @@ -48,7 +65,7 @@ export class SearchService implements Plugin { public setup( core: CoreSetup, - { usageCollection }: { usageCollection?: UsageCollectionSetup } + { registerFunction, usageCollection }: SearchServiceSetupDependencies ): ISearchSetup { const usage = usageCollection ? usageProvider(core) : undefined; @@ -68,7 +85,11 @@ export class SearchService implements Plugin { registerSearchRoute(core); - return { registerSearchStrategy: this.registerSearchStrategy, usage }; + return { + aggs: this.aggsService.setup({ registerFunction }), + registerSearchStrategy: this.registerSearchStrategy, + usage, + }; } private search( @@ -83,8 +104,12 @@ export class SearchService implements Plugin { ); } - public start(): ISearchStart { + public start( + { uiSettings }: CoreStart, + { fieldFormats }: SearchServiceStartDependencies + ): ISearchStart { return { + aggs: this.aggsService.start({ fieldFormats, uiSettings }), getSearchStrategy: this.getSearchStrategy, search: ( context: RequestHandlerContext, @@ -96,7 +121,9 @@ export class SearchService implements Plugin { }; } - public stop() {} + public stop() { + this.aggsService.stop(); + } private registerSearchStrategy = (name: string, strategy: ISearchStrategy) => { this.logger.info(`Register strategy ${name}`); diff --git a/src/plugins/data/server/search/types.ts b/src/plugins/data/server/search/types.ts index 76afd7e8c951c..fe54975d76624 100644 --- a/src/plugins/data/server/search/types.ts +++ b/src/plugins/data/server/search/types.ts @@ -19,6 +19,7 @@ import { RequestHandlerContext } from '../../../../core/server'; import { IKibanaSearchResponse, IKibanaSearchRequest } from '../../common/search'; +import { AggsSetup, AggsStart } from './aggs'; import { SearchUsage } from './collectors/usage'; import { IEsSearchRequest, IEsSearchResponse } from './es_search'; @@ -31,6 +32,7 @@ export interface ISearchOptions { } export interface ISearchSetup { + aggs: AggsSetup; /** * Extension point exposed for other plugins to register their own search * strategies. @@ -44,6 +46,7 @@ export interface ISearchSetup { } export interface ISearchStart { + aggs: AggsStart; /** * Get other registered search strategies. For example, if a new strategy needs to use the * already-registered ES search strategy, it can use this function to accomplish that. diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index 37d569a4bf9fe..9c8a79f27a9db 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -4,7 +4,9 @@ ```ts +import { $Values } from '@kbn/utility-types'; import { ApiResponse } from '@elastic/elasticsearch/lib/Transport'; +import { Assign } from '@kbn/utility-types'; import Boom from 'boom'; import { BulkIndexDocumentsParams } from 'elasticsearch'; import { CatAliasesParams } from 'elasticsearch'; @@ -22,7 +24,6 @@ import { CatTasksParams } from 'elasticsearch'; import { CatThreadPoolParams } from 'elasticsearch'; import { ClearScrollParams } from 'elasticsearch'; import { Client } from 'elasticsearch'; -import { ClientOptions } from '@elastic/elasticsearch'; import { ClusterAllocationExplainParams } from 'elasticsearch'; import { ClusterGetSettingsParams } from 'elasticsearch'; import { ClusterHealthParams } from 'elasticsearch'; @@ -31,19 +32,23 @@ import { ClusterPutSettingsParams } from 'elasticsearch'; import { ClusterRerouteParams } from 'elasticsearch'; import { ClusterStateParams } from 'elasticsearch'; import { ClusterStatsParams } from 'elasticsearch'; -import { ConfigOptions } from 'elasticsearch'; +import { CoreSetup } from 'src/core/server'; import { CoreSetup as CoreSetup_2 } from 'kibana/server'; +import { CoreStart } from 'src/core/server'; import { CountParams } from 'elasticsearch'; import { CreateDocumentParams } from 'elasticsearch'; import { DeleteDocumentByQueryParams } from 'elasticsearch'; import { DeleteDocumentParams } from 'elasticsearch'; import { DeleteScriptParams } from 'elasticsearch'; import { DeleteTemplateParams } from 'elasticsearch'; -import { DetailedPeerCertificate } from 'tls'; import { Duration } from 'moment'; +import { Ensure } from '@kbn/utility-types'; import { ErrorToastOptions } from 'src/core/public/notifications'; import { ExistsParams } from 'elasticsearch'; import { ExplainParams } from 'elasticsearch'; +import { ExpressionAstFunction } from 'src/plugins/expressions/common'; +import { ExpressionsServerSetup } from 'src/plugins/expressions/server'; +import { FetchOptions } from 'src/plugins/data/public'; import { FieldStatsParams } from 'elasticsearch'; import { GenericParams } from 'elasticsearch'; import { GetParams } from 'elasticsearch'; @@ -94,13 +99,15 @@ import { IngestDeletePipelineParams } from 'elasticsearch'; import { IngestGetPipelineParams } from 'elasticsearch'; import { IngestPutPipelineParams } from 'elasticsearch'; import { IngestSimulateParams } from 'elasticsearch'; +import { ISearchSource } from 'src/plugins/data/public'; import { KibanaClient } from '@elastic/elasticsearch/api/kibana'; import { KibanaConfigType as KibanaConfigType_2 } from 'src/core/server/kibana_config'; -import { KibanaRequest as KibanaRequest_2 } from 'kibana/server'; +import { KibanaRequest } from 'kibana/server'; import { LegacyAPICaller as LegacyAPICaller_2 } from 'kibana/server'; import { Logger as Logger_2 } from 'kibana/server'; import { MGetParams } from 'elasticsearch'; import { MGetResponse } from 'elasticsearch'; +import { Moment } from 'moment'; import moment from 'moment'; import { MSearchParams } from 'elasticsearch'; import { MSearchResponse } from 'elasticsearch'; @@ -109,27 +116,26 @@ import { MTermVectorsParams } from 'elasticsearch'; import { NodesHotThreadsParams } from 'elasticsearch'; import { NodesInfoParams } from 'elasticsearch'; import { NodesStatsParams } from 'elasticsearch'; -import { ObjectType } from '@kbn/config-schema'; import { Observable } from 'rxjs'; -import { PeerCertificate } from 'tls'; import { PingParams } from 'elasticsearch'; +import { Plugin as Plugin_2 } from 'src/core/server'; +import { PluginInitializerContext as PluginInitializerContext_2 } from 'src/core/server'; import { PutScriptParams } from 'elasticsearch'; import { PutTemplateParams } from 'elasticsearch'; import { RecursiveReadonly } from '@kbn/utility-types'; import { ReindexParams } from 'elasticsearch'; import { ReindexRethrottleParams } from 'elasticsearch'; import { RenderSearchTemplateParams } from 'elasticsearch'; -import { Request } from 'hapi'; -import { ResponseObject } from 'hapi'; -import { ResponseToolkit } from 'hapi'; -import { SavedObject as SavedObject_2 } from 'src/core/server'; -import { SchemaTypeError } from '@kbn/config-schema'; +import { RequestAdapter } from 'src/plugins/inspector/common'; +import { RequestStatistics } from 'src/plugins/inspector/common'; +import { SavedObject } from 'src/core/server'; +import { SavedObjectsClientContract as SavedObjectsClientContract_2 } from 'src/core/server'; import { ScrollParams } from 'elasticsearch'; import { SearchParams } from 'elasticsearch'; import { SearchResponse } from 'elasticsearch'; import { SearchShardsParams } from 'elasticsearch'; import { SearchTemplateParams } from 'elasticsearch'; -import { ShallowPromise } from '@kbn/utility-types'; +import { SerializedFieldFormat as SerializedFieldFormat_2 } from 'src/plugins/expressions/common'; import { ShardsResponse } from 'elasticsearch'; import { SnapshotCreateParams } from 'elasticsearch'; import { SnapshotCreateRepositoryParams } from 'elasticsearch'; @@ -140,7 +146,6 @@ import { SnapshotGetRepositoryParams } from 'elasticsearch'; import { SnapshotRestoreParams } from 'elasticsearch'; import { SnapshotStatusParams } from 'elasticsearch'; import { SnapshotVerifyRepositoryParams } from 'elasticsearch'; -import { Stream } from 'stream'; import { SuggestParams } from 'elasticsearch'; import { TasksCancelParams } from 'elasticsearch'; import { TasksGetParams } from 'elasticsearch'; @@ -156,7 +161,96 @@ import { Unit } from '@elastic/datemath'; import { UnwrapPromiseOrReturn } from '@kbn/utility-types'; import { UpdateDocumentByQueryParams } from 'elasticsearch'; import { UpdateDocumentParams } from 'elasticsearch'; -import { Url } from 'url'; + +// Warning: (ae-forgotten-export) The symbol "AggConfigSerialized" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "AggConfigOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type AggConfigOptions = Assign; + +// Warning: (ae-missing-release-tag) "AggGroupLabels" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const AggGroupLabels: { + buckets: string; + metrics: string; + none: string; +}; + +// Warning: (ae-missing-release-tag) "AggGroupName" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type AggGroupName = $Values; + +// Warning: (ae-missing-release-tag) "AggGroupNames" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const AggGroupNames: Readonly<{ + Buckets: "buckets"; + Metrics: "metrics"; + None: "none"; +}>; + +// Warning: (ae-forgotten-export) The symbol "BaseParamType" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "AggParam" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type AggParam = BaseParamType; + +// Warning: (ae-missing-release-tag) "AggParamOption" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface AggParamOption { + // (undocumented) + display: string; + // Warning: (ae-forgotten-export) The symbol "AggConfig" needs to be exported by the entry point index.d.ts + // + // (undocumented) + enabled?(agg: AggConfig): boolean; + // (undocumented) + val: string; +} + +// Warning: (ae-missing-release-tag) "AggParamType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export class AggParamType extends BaseParamType { + constructor(config: Record); + // (undocumented) + allowedAggs: string[]; + // (undocumented) + makeAgg: (agg: TAggConfig, state?: AggConfigSerialized) => TAggConfig; +} + +// Warning: (ae-missing-release-tag) "BUCKET_TYPES" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export enum BUCKET_TYPES { + // (undocumented) + DATE_HISTOGRAM = "date_histogram", + // (undocumented) + DATE_RANGE = "date_range", + // (undocumented) + FILTER = "filter", + // (undocumented) + FILTERS = "filters", + // (undocumented) + GEOHASH_GRID = "geohash_grid", + // (undocumented) + GEOTILE_GRID = "geotile_grid", + // (undocumented) + HISTOGRAM = "histogram", + // (undocumented) + IP_RANGE = "ip_range", + // (undocumented) + RANGE = "range", + // (undocumented) + SIGNIFICANT_TERMS = "significant_terms", + // (undocumented) + TERMS = "terms" +} // Warning: (ae-missing-release-tag) "castEsToKbnFieldTypeName" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -369,6 +463,22 @@ export function getTotalLoaded({ total, failed, successful }: ShardsResponse): { loaded: number; }; +// Warning: (ae-missing-release-tag) "IAggConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export type IAggConfig = AggConfig; + +// Warning: (ae-forgotten-export) The symbol "AggConfigs" needs to be exported by the entry point index.d.ts +// +// @internal +export type IAggConfigs = AggConfigs; + +// Warning: (ae-forgotten-export) The symbol "AggType" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "IAggType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type IAggType = AggType; + // Warning: (ae-forgotten-export) The symbol "IKibanaSearchRequest" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "IEsSearchRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -398,6 +508,12 @@ export interface IEsSearchResponse extends IKibanaSearchResponse { // @public (undocumented) export type IFieldFormatsRegistry = PublicMethodsOf; +// Warning: (ae-forgotten-export) The symbol "FieldParamType" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "IFieldParamType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type IFieldParamType = FieldParamType; + // Warning: (ae-missing-release-tag) "IFieldSubType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -479,6 +595,12 @@ export interface IIndexPattern { type?: string; } +// Warning: (ae-forgotten-export) The symbol "MetricAggType" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "IMetricAggType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type IMetricAggType = MetricAggType; + // Warning: (ae-missing-release-tag) "IndexPatternAttributes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public @deprecated @@ -561,6 +683,10 @@ export interface ISearchOptions { // // @public (undocumented) export interface ISearchSetup { + // Warning: (ae-forgotten-export) The symbol "AggsSetup" needs to be exported by the entry point index.d.ts + // + // (undocumented) + aggs: AggsSetup; registerSearchStrategy: (name: string, strategy: ISearchStrategy) => void; usage?: SearchUsage; } @@ -569,6 +695,10 @@ export interface ISearchSetup { // // @public (undocumented) export interface ISearchStart { + // Warning: (ae-forgotten-export) The symbol "AggsStart" needs to be exported by the entry point index.d.ts + // + // (undocumented) + aggs: AggsStart; getSearchStrategy: (name: string) => ISearchStrategy; // Warning: (ae-forgotten-export) The symbol "RequestHandlerContext" needs to be exported by the entry point index.d.ts // @@ -632,6 +762,77 @@ export interface KueryNode { type: keyof NodeTypes; } +// Warning: (ae-missing-release-tag) "METRIC_TYPES" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export enum METRIC_TYPES { + // (undocumented) + AVG = "avg", + // (undocumented) + AVG_BUCKET = "avg_bucket", + // (undocumented) + CARDINALITY = "cardinality", + // (undocumented) + COUNT = "count", + // (undocumented) + CUMULATIVE_SUM = "cumulative_sum", + // (undocumented) + DERIVATIVE = "derivative", + // (undocumented) + GEO_BOUNDS = "geo_bounds", + // (undocumented) + GEO_CENTROID = "geo_centroid", + // (undocumented) + MAX = "max", + // (undocumented) + MAX_BUCKET = "max_bucket", + // (undocumented) + MEDIAN = "median", + // (undocumented) + MIN = "min", + // (undocumented) + MIN_BUCKET = "min_bucket", + // (undocumented) + MOVING_FN = "moving_avg", + // (undocumented) + PERCENTILE_RANKS = "percentile_ranks", + // (undocumented) + PERCENTILES = "percentiles", + // (undocumented) + SERIAL_DIFF = "serial_diff", + // (undocumented) + STD_DEV = "std_dev", + // (undocumented) + SUM = "sum", + // (undocumented) + SUM_BUCKET = "sum_bucket", + // (undocumented) + TOP_HITS = "top_hits" +} + +// Warning: (ae-missing-release-tag) "OptionedParamType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export class OptionedParamType extends BaseParamType { + constructor(config: Record); + // (undocumented) + options: OptionedValueProp[]; +} + +// Warning: (ae-missing-release-tag) "OptionedValueProp" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface OptionedValueProp { + // (undocumented) + disabled?: boolean; + // (undocumented) + isCompatible: (agg: IAggConfig) => boolean; + // (undocumented) + text: string; + // (undocumented) + value: string; +} + // Warning: (ae-forgotten-export) The symbol "parseEsInterval" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "ParsedInterval" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -643,25 +844,20 @@ export type ParsedInterval = ReturnType; // @public (undocumented) export function parseInterval(interval: string): moment.Duration | null; -// Warning: (ae-forgotten-export) The symbol "Plugin" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "DataPluginSetupDependencies" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "DataPluginStartDependencies" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "DataServerPlugin" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export class Plugin implements Plugin_2 { - // Warning: (ae-forgotten-export) The symbol "PluginInitializerContext" needs to be exported by the entry point index.d.ts - constructor(initializerContext: PluginInitializerContext); - // Warning: (ae-forgotten-export) The symbol "CoreSetup" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "DataPluginSetupDependencies" needs to be exported by the entry point index.d.ts - // +export class Plugin implements Plugin_2 { + constructor(initializerContext: PluginInitializerContext_2); // (undocumented) - setup(core: CoreSetup, { usageCollection }: DataPluginSetupDependencies): { + setup(core: CoreSetup, { expressions, usageCollection }: DataPluginSetupDependencies): { search: ISearchSetup; fieldFormats: { - register: (customFieldFormat: import("../common").FieldFormatInstanceType) => number; + register: (customFieldFormat: import("../public").FieldFormatInstanceType) => number; }; }; - // Warning: (ae-forgotten-export) The symbol "CoreStart" needs to be exported by the entry point index.d.ts - // // (undocumented) start(core: CoreStart): { search: ISearchStart; @@ -676,6 +872,8 @@ export class Plugin implements Plugin_2 { stop(): void; } +// Warning: (ae-forgotten-export) The symbol "PluginInitializerContext" needs to be exported by the entry point index.d.ts +// // @public export function plugin(initializerContext: PluginInitializerContext): Plugin; @@ -734,16 +932,36 @@ export interface RefreshInterval { // @public (undocumented) export const search: { aggs: { + CidrMask: typeof CidrMask; dateHistogramInterval: typeof dateHistogramInterval; + intervalOptions: ({ + display: string; + val: string; + enabled(agg: import("../common").IBucketAggConfig): boolean | "" | undefined; + } | { + display: string; + val: string; + })[]; InvalidEsCalendarIntervalError: typeof InvalidEsCalendarIntervalError; InvalidEsIntervalFormatError: typeof InvalidEsIntervalFormatError; Ipv4Address: typeof Ipv4Address; + isNumberType: (agg: import("../common").AggConfig) => boolean; + isStringType: (agg: import("../common").AggConfig) => boolean; + isType: (...types: string[]) => (agg: import("../common").AggConfig) => boolean; isValidEsInterval: typeof isValidEsInterval; isValidInterval: typeof isValidInterval; + parentPipelineType: string; parseEsInterval: typeof parseEsInterval; parseInterval: typeof parseInterval; + propFilter: typeof propFilter; + siblingPipelineType: string; + termsAggFilter: string[]; toAbsoluteDates: typeof toAbsoluteDates; }; + getRequestInspectorStats: typeof getRequestInspectorStats; + getResponseInspectorStats: typeof getResponseInspectorStats; + tabifyAggResponse: typeof tabifyAggResponse; + tabifyGetColumns: typeof tabifyGetColumns; }; // Warning: (ae-missing-release-tag) "SearchUsage" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -761,6 +979,27 @@ export interface SearchUsage { // @public (undocumented) export function shouldReadFieldFromDocValues(aggregatable: boolean, esType: string): boolean; +// @public (undocumented) +export interface TabbedAggColumn { + // (undocumented) + aggConfig: IAggConfig; + // (undocumented) + id: string; + // (undocumented) + name: string; +} + +// @public (undocumented) +export type TabbedAggRow = Record; + +// @public (undocumented) +export interface TabbedTable { + // (undocumented) + columns: TabbedAggColumn[]; + // (undocumented) + rows: TabbedAggRow[]; +} + // Warning: (ae-missing-release-tag) "TimeRange" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -836,13 +1075,19 @@ export function usageProvider(core: CoreSetup_2): SearchUsage; // src/plugins/data/server/index.ts:101:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:127:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:127:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:185:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:186:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:187:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:188:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:189:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:190:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:193:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:221:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:221:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:221:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:221:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:223:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:224:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:233:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:234:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:235:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:239:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:240:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:244:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:247:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx index 1a094a36f68e3..ebf8e09e86396 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx @@ -10,7 +10,6 @@ import { dateHistogramOperation } from './index'; import { shallow } from 'enzyme'; import { EuiSwitch, EuiSwitchEvent } from '@elastic/eui'; import { IUiSettingsClient, SavedObjectsClientContract, HttpSetup } from 'kibana/public'; -import { coreMock } from 'src/core/public/mocks'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { UI_SETTINGS } from '../../../../../../../src/plugins/data/public'; import { @@ -21,14 +20,13 @@ import { createMockedIndexPattern } from '../../mocks'; import { IndexPatternPrivateState } from '../../types'; const dataStart = dataPluginMock.createStartContract(); -dataStart.search.aggs.calculateAutoTimeExpression = getCalculateAutoTimeExpression({ - ...coreMock.createStart().uiSettings, - get: (path: string) => { +dataStart.search.aggs.calculateAutoTimeExpression = getCalculateAutoTimeExpression( + (path: string) => { if (path === UI_SETTINGS.HISTOGRAM_MAX_BARS) { return 10; } - }, -} as IUiSettingsClient); + } +); const defaultOptions = { storage: {} as IStorageWrapper, From ee9a8d29b1588e271486c428e423880f41fa8ee9 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Thu, 13 Aug 2020 23:44:17 +0300 Subject: [PATCH 109/113] [I18n] verify select icu-message options are in english (#74963) Co-authored-by: Elastic Machine --- src/dev/i18n/index.ts | 1 - src/dev/i18n/integrate_locale_files.test.ts | 1 - src/dev/i18n/integrate_locale_files.ts | 3 +- .../__snapshots__/utils.test.js.snap | 2 +- src/dev/i18n/utils/index.ts | 48 ++++++++++ src/dev/i18n/utils/intl_types.ts | 41 +++++++++ src/dev/i18n/{ => utils}/utils.js | 22 ----- src/dev/i18n/{ => utils}/utils.test.js | 0 src/dev/i18n/utils/verify_icu_message.test.ts | 91 +++++++++++++++++++ src/dev/i18n/utils/verify_icu_message.ts | 74 +++++++++++++++ src/dev/run_i18n_check.ts | 16 ++-- .../translations/translations/ja-JP.json | 1 - 12 files changed, 266 insertions(+), 34 deletions(-) rename src/dev/i18n/{ => utils}/__snapshots__/utils.test.js.snap (95%) create mode 100644 src/dev/i18n/utils/index.ts create mode 100644 src/dev/i18n/utils/intl_types.ts rename src/dev/i18n/{ => utils}/utils.js (95%) rename src/dev/i18n/{ => utils}/utils.test.js (100%) create mode 100644 src/dev/i18n/utils/verify_icu_message.test.ts create mode 100644 src/dev/i18n/utils/verify_icu_message.ts diff --git a/src/dev/i18n/index.ts b/src/dev/i18n/index.ts index cfc03f1c08b3c..68e6ab1646092 100644 --- a/src/dev/i18n/index.ts +++ b/src/dev/i18n/index.ts @@ -21,7 +21,6 @@ export { extractMessagesFromPathToMap } from './extract_default_translations'; // @ts-ignore export { matchEntriesWithExctractors } from './extract_default_translations'; -// @ts-ignore export { arrayify, writeFileAsync, readFileAsync, normalizePath, ErrorReporter } from './utils'; export { serializeToJson, serializeToJson5 } from './serializers'; export { diff --git a/src/dev/i18n/integrate_locale_files.test.ts b/src/dev/i18n/integrate_locale_files.test.ts index 3bd3dc61c044f..24c24682b2874 100644 --- a/src/dev/i18n/integrate_locale_files.test.ts +++ b/src/dev/i18n/integrate_locale_files.test.ts @@ -21,7 +21,6 @@ import { mockMakeDirAsync, mockWriteFileAsync } from './integrate_locale_files.t import path from 'path'; import { integrateLocaleFiles, verifyMessages } from './integrate_locale_files'; -// @ts-expect-error import { normalizePath } from './utils'; const localePath = path.resolve(__dirname, '__fixtures__', 'integrate_locale_files', 'fr.json'); diff --git a/src/dev/i18n/integrate_locale_files.ts b/src/dev/i18n/integrate_locale_files.ts index f9cd6dd1971c7..ed4f7db4376bb 100644 --- a/src/dev/i18n/integrate_locale_files.ts +++ b/src/dev/i18n/integrate_locale_files.ts @@ -32,7 +32,6 @@ import { readFileAsync, writeFileAsync, verifyICUMessage, - // @ts-expect-error } from './utils'; import { I18nConfig } from './config'; @@ -112,7 +111,7 @@ export function verifyMessages( if (defaultMessage) { try { const message = localizedMessagesMap.get(messageId)!; - verifyICUMessage(message); + verifyICUMessage(typeof message === 'string' ? message : message?.text); } catch (err) { if (options.ignoreMalformed) { localizedMessagesMap.delete(messageId); diff --git a/src/dev/i18n/__snapshots__/utils.test.js.snap b/src/dev/i18n/utils/__snapshots__/utils.test.js.snap similarity index 95% rename from src/dev/i18n/__snapshots__/utils.test.js.snap rename to src/dev/i18n/utils/__snapshots__/utils.test.js.snap index b4e15304cca96..147ef5987c1dc 100644 --- a/src/dev/i18n/__snapshots__/utils.test.js.snap +++ b/src/dev/i18n/utils/__snapshots__/utils.test.js.snap @@ -9,7 +9,7 @@ exports[`i18n utils should create verbose parser error message 1`] = ` " `; -exports[`i18n utils should normalizePath 1`] = `"src/dev/i18n"`; +exports[`i18n utils should normalizePath 1`] = `"src/dev/i18n/utils"`; exports[`i18n utils should not escape linebreaks 1`] = ` "Text diff --git a/src/dev/i18n/utils/index.ts b/src/dev/i18n/utils/index.ts new file mode 100644 index 0000000000000..3f81ab2ca66c3 --- /dev/null +++ b/src/dev/i18n/utils/index.ts @@ -0,0 +1,48 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { + // constants + readFileAsync, + writeFileAsync, + makeDirAsync, + accessAsync, + globAsync, + // functions + normalizePath, + difference, + isPropertyWithKey, + isI18nTranslateFunction, + node, + formatJSString, + formatHTMLString, + traverseNodes, + createParserErrorMessage, + checkValuesProperty, + extractValueReferencesFromMessage, + extractMessageIdFromNode, + extractMessageValueFromNode, + extractDescriptionValueFromNode, + extractValuesKeysFromNode, + arrayify, + // classes + ErrorReporter, // @ts-ignore +} from './utils'; + +export { verifyICUMessage } from './verify_icu_message'; diff --git a/src/dev/i18n/utils/intl_types.ts b/src/dev/i18n/utils/intl_types.ts new file mode 100644 index 0000000000000..adbceaea66540 --- /dev/null +++ b/src/dev/i18n/utils/intl_types.ts @@ -0,0 +1,41 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface OptionalFormatPatternNode { + type: 'optionalFormatPattern'; + selector: string; + value: any; +} + +export interface LinePosition { + offset: number; + line: number; + column: number; +} + +export interface LocationNode { + start: LinePosition; + end: LinePosition; +} + +export interface SelectFormatNode { + type: 'selectFormat'; + options: OptionalFormatPatternNode[]; + location: LocationNode; +} diff --git a/src/dev/i18n/utils.js b/src/dev/i18n/utils/utils.js similarity index 95% rename from src/dev/i18n/utils.js rename to src/dev/i18n/utils/utils.js index 11a002fdbf4a8..1d1c3118e0852 100644 --- a/src/dev/i18n/utils.js +++ b/src/dev/i18n/utils/utils.js @@ -208,28 +208,6 @@ export function checkValuesProperty(prefixedValuesKeys, defaultMessage, messageI } } -/** - * Verifies valid ICU message. - * @param message ICU message. - * @param messageId ICU message id - * @returns {undefined} - */ -export function verifyICUMessage(message) { - try { - parser.parse(message); - } catch (error) { - if (error.name === 'SyntaxError') { - const errorWithContext = createParserErrorMessage(message, { - loc: { - line: error.location.start.line, - column: error.location.start.column - 1, - }, - message: error.message, - }); - throw errorWithContext; - } - } -} /** * Extracts value references from the ICU message. * @param message ICU message. diff --git a/src/dev/i18n/utils.test.js b/src/dev/i18n/utils/utils.test.js similarity index 100% rename from src/dev/i18n/utils.test.js rename to src/dev/i18n/utils/utils.test.js diff --git a/src/dev/i18n/utils/verify_icu_message.test.ts b/src/dev/i18n/utils/verify_icu_message.test.ts new file mode 100644 index 0000000000000..0a4510352c429 --- /dev/null +++ b/src/dev/i18n/utils/verify_icu_message.test.ts @@ -0,0 +1,91 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { verifyICUMessage, checkEnglishOnly } from './verify_icu_message'; + +describe('verifyICUMessage', () => { + it('passes on plain text', () => { + const message = 'plain text here'; + expect(() => verifyICUMessage(message)).not.toThrowError(); + }); + + it('passes on empty string', () => { + const message = ''; + expect(() => verifyICUMessage(message)).not.toThrowError(); + }); + + it('passes on variable icu-syntax', () => { + const message = 'Your regular {foobar}'; + expect(() => verifyICUMessage(message)).not.toThrowError(); + }); + + it('passes on correct plural icu-syntax', () => { + const message = `You have {itemCount, plural, + =0 {no items} + one {1 item} + other {{itemCount} items} + }.`; + + expect(() => verifyICUMessage(message)).not.toThrowError(); + }); + + it('throws on malformed string', () => { + const message = + 'CDATA[extended_bounds設定を使用すると、強制的にヒストグラムアグリゲーションを実行し、特定の最小値に対してバケットの作成を開始し、最大値までバケットを作成し続けます。 ]]>\n\t\t\tKibana-SW - String "data.search.aggs.buckets.dateHistogram.extendedBounds.help" in Json.Root "messages\\strings" '; + + expect(() => verifyICUMessage(message)).toThrowError(); + }); + + it('throws on missing curly brackets', () => { + const message = `A missing {curly`; + + expect(() => verifyICUMessage(message)).toThrowError(); + }); + + it('throws on incorrect plural icu-syntax', () => { + // Notice that small/Medium/Large constants are swapped with the translation strings. + const message = + '{textScale, select, small {小さい} 中くらい {Medium} 大きい {Large} その他の {{textScale}} }'; + + expect(() => verifyICUMessage(message)).toThrowError(); + }); +}); + +describe('checkEnglishOnly', () => { + it('returns true on english only message', () => { + const result = checkEnglishOnly('english'); + + expect(result).toEqual(true); + }); + it('returns true on empty message', () => { + const result = checkEnglishOnly(''); + + expect(result).toEqual(true); + }); + it('returns false on message containing numbers', () => { + const result = checkEnglishOnly('english 123'); + + expect(result).toEqual(false); + }); + it('returns false on message containing non-english alphabets', () => { + const result = checkEnglishOnly('i am 大きい'); + + expect(result).toEqual(false); + }); +}); diff --git a/src/dev/i18n/utils/verify_icu_message.ts b/src/dev/i18n/utils/verify_icu_message.ts new file mode 100644 index 0000000000000..683d91c5c4939 --- /dev/null +++ b/src/dev/i18n/utils/verify_icu_message.ts @@ -0,0 +1,74 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// @ts-ignore +import parser from 'intl-messageformat-parser'; +// @ts-ignore +import { createParserErrorMessage, traverseNodes } from './utils'; +import { SelectFormatNode } from './intl_types'; + +export function checkEnglishOnly(message: string) { + return /^[a-z]*$/i.test(message); +} + +export function verifySelectFormatNode(node: SelectFormatNode) { + if (node.type !== 'selectFormat') { + throw new parser.SyntaxError( + 'Unable to verify select format icu-syntax', + 'selectFormat', + node.type, + node.location + ); + } + + for (const option of node.options) { + if (option.type === 'optionalFormatPattern') { + if (!checkEnglishOnly(option.selector)) { + throw new parser.SyntaxError( + 'selectFormat Selector must be in english', + 'English only selector', + option.selector, + node.location + ); + } + } + } +} + +export function verifyICUMessage(message: string) { + try { + const results = parser.parse(message); + for (const node of results.elements) { + if (node.type === 'argumentElement' && node.format?.type === 'selectFormat') { + verifySelectFormatNode(node.format); + } + } + } catch (error) { + if (error.name === 'SyntaxError') { + const errorWithContext = createParserErrorMessage(message, { + loc: { + line: error.location.start.line, + column: error.location.start.column - 1, + }, + message: error.message, + }); + throw errorWithContext; + } + } +} diff --git a/src/dev/run_i18n_check.ts b/src/dev/run_i18n_check.ts index 70eeedac2b8b6..17f3fd5d1c734 100644 --- a/src/dev/run_i18n_check.ts +++ b/src/dev/run_i18n_check.ts @@ -30,7 +30,8 @@ import { mergeConfigs, } from './i18n/tasks'; -const skipNoTranslations = ({ config }: { config: I18nConfig }) => !config.translations.length; +const skipOnNoTranslations = ({ config }: { config: I18nConfig }) => + !config.translations.length && 'No translations found.'; run( async ({ @@ -40,6 +41,7 @@ run( 'ignore-missing': ignoreMissing, 'ignore-unused': ignoreUnused, 'include-config': includeConfig, + 'ignore-untracked': ignoreUntracked, fix = false, path, }, @@ -50,12 +52,13 @@ run( (ignoreIncompatible !== undefined || ignoreUnused !== undefined || ignoreMalformed !== undefined || - ignoreMissing !== undefined) + ignoreMissing !== undefined || + ignoreUntracked !== undefined) ) { throw createFailError( `${chalk.white.bgRed( ' I18N ERROR ' - )} none of the --ignore-incompatible, --ignore-malformed, --ignore-unused or --ignore-missing is allowed when --fix is set.` + )} none of the --ignore-incompatible, --ignore-malformed, --ignore-unused or --ignore-missing, --ignore-untracked is allowed when --fix is set.` ); } @@ -83,19 +86,20 @@ run( }, { title: 'Checking For Untracked Messages based on .i18nrc.json', - skip: skipNoTranslations, + enabled: (_) => !ignoreUntracked, + skip: skipOnNoTranslations, task: ({ config }) => new Listr(extractUntrackedMessages(srcPaths), { exitOnError: true }), }, { title: 'Validating Default Messages', - skip: skipNoTranslations, + skip: skipOnNoTranslations, task: ({ config }) => new Listr(extractDefaultMessages(config, srcPaths), { exitOnError: true }), }, { title: 'Compatibility Checks', - skip: skipNoTranslations, + skip: skipOnNoTranslations, task: ({ config }) => new Listr( checkCompatibility( diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 81c06cf5c381f..526f2d88574d3 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -4852,7 +4852,6 @@ "xpack.apm.jvmsTable.nonHeapMemoryColumnLabel": "非ヒープ領域の平均", "xpack.apm.jvmsTable.threadCountColumnLabel": "最大スレッド数", "xpack.apm.kueryBar.disabledPlaceholder": "ここでは検索は利用できません", - "xpack.apm.kueryBar.placeholder": "検索 {event, select,\n トランザクション {transactions}\n メトリック: {metric}\n エラー {errors}\n その他 {transactions, errors and metrics}\n } (E.g. {queryExample})", "xpack.apm.license.betaBadge": "ベータ", "xpack.apm.license.betaTooltipMessage": "現在、この機能はベータです。不具合を見つけた場合やご意見がある場合、サポートに問い合わせるか、またはディスカッションフォーラムにご報告ください。", "xpack.apm.license.button": "トライアルを開始", From a8ed1f4b16a0be6879f4b212df0eae6890acba75 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Thu, 13 Aug 2020 14:33:27 -0700 Subject: [PATCH 110/113] [Reporting] Update more Server Types for TaskManager (#74915) * [Reporting] Update more Server Types for TaskManager * remove some task manager references * more strict * more strict 2 * simplify * fix test * fix test * routing validation unused types cleanup * remove more casting in route handlers * feedback changes * original comment was fine Co-authored-by: Elastic Machine --- x-pack/plugins/reporting/server/core.ts | 8 +- .../server/export_types/csv/create_job.ts | 4 +- .../export_types/csv/execute_job.test.ts | 112 +++---- .../server/export_types/csv/execute_job.ts | 4 +- .../export_types/csv/generate_csv/index.ts | 4 + .../server/export_types/csv/index.ts | 8 +- .../server/export_types/csv/types.d.ts | 6 +- .../csv_from_savedobject/execute_job.ts | 2 +- .../export_types/png/create_job/index.ts | 4 +- .../export_types/png/execute_job/index.ts | 4 +- .../server/export_types/png/index.ts | 8 +- .../server/export_types/png/types.d.ts | 7 +- .../printable_pdf/create_job/index.ts | 6 +- .../printable_pdf/execute_job/index.ts | 4 +- .../export_types/printable_pdf/index.ts | 8 +- .../export_types/printable_pdf/types.d.ts | 6 +- .../reporting/server/lib/create_worker.ts | 6 +- .../reporting/server/lib/enqueue_job.ts | 38 ++- .../server/lib/esqueue/constants/index.js | 4 +- .../reporting/server/lib/esqueue/worker.js | 48 +-- x-pack/plugins/reporting/server/lib/index.ts | 3 +- .../lib/{esqueue/constants => }/statuses.ts | 0 .../reporting/server/lib/store/mapping.ts | 2 +- .../reporting/server/lib/store/report.test.ts | 113 +++++-- .../reporting/server/lib/store/report.ts | 144 +++++++-- .../reporting/server/lib/store/store.test.ts | 304 ++++++++++++++---- .../reporting/server/lib/store/store.ts | 194 +++++++---- x-pack/plugins/reporting/server/plugin.ts | 10 +- .../server/routes/generate_from_jobparams.ts | 15 +- .../generate_from_savedobject_immediate.ts | 10 +- .../server/routes/generation.test.ts | 3 +- .../reporting/server/routes/generation.ts | 10 +- .../server/routes/lib/get_document_payload.ts | 7 +- .../routes/lib/get_job_params_from_request.ts | 16 +- .../reporting/server/routes/types.d.ts | 4 +- .../create_mock_reportingplugin.ts | 19 +- x-pack/plugins/reporting/server/types.ts | 44 +-- 37 files changed, 774 insertions(+), 415 deletions(-) rename x-pack/plugins/reporting/server/lib/{esqueue/constants => }/statuses.ts (100%) diff --git a/x-pack/plugins/reporting/server/core.ts b/x-pack/plugins/reporting/server/core.ts index 95dc7586ad4a6..25594e1c0140b 100644 --- a/x-pack/plugins/reporting/server/core.ts +++ b/x-pack/plugins/reporting/server/core.ts @@ -23,7 +23,6 @@ import { HeadlessChromiumDriverFactory } from './browsers/chromium/driver_factor import { screenshotsObservableFactory } from './lib/screenshots'; import { checkLicense, getExportTypesRegistry } from './lib'; import { ESQueueInstance } from './lib/create_queue'; -import { EnqueueJobFn } from './lib/enqueue_job'; import { ReportingStore } from './lib/store'; export interface ReportingInternalSetup { @@ -36,7 +35,6 @@ export interface ReportingInternalSetup { export interface ReportingInternalStart { browserDriverFactory: HeadlessChromiumDriverFactory; - enqueueJob: EnqueueJobFn; esqueue: ESQueueInstance; store: ReportingStore; savedObjects: SavedObjectsServiceStart; @@ -115,7 +113,7 @@ export class ReportingCore { /* * Gives async access to the startDeps */ - private async getPluginStartDeps() { + public async getPluginStartDeps() { if (this.pluginStartDeps) { return this.pluginStartDeps; } @@ -131,10 +129,6 @@ export class ReportingCore { return (await this.getPluginStartDeps()).esqueue; } - public async getEnqueueJob() { - return (await this.getPluginStartDeps()).enqueueJob; - } - public async getLicenseInfo() { const { licensing } = this.getPluginSetupDeps(); return await licensing.license$ diff --git a/x-pack/plugins/reporting/server/export_types/csv/create_job.ts b/x-pack/plugins/reporting/server/export_types/csv/create_job.ts index 5e8ce923a79e0..252968e386b53 100644 --- a/x-pack/plugins/reporting/server/export_types/csv/create_job.ts +++ b/x-pack/plugins/reporting/server/export_types/csv/create_job.ts @@ -5,10 +5,10 @@ */ import { cryptoFactory } from '../../lib'; -import { ESQueueCreateJobFn, ScheduleTaskFnFactory } from '../../types'; +import { CreateJobFn, ScheduleTaskFnFactory } from '../../types'; import { JobParamsDiscoverCsv } from './types'; -export const scheduleTaskFnFactory: ScheduleTaskFnFactory> = function createJobFactoryFn(reporting) { const config = reporting.getConfig(); diff --git a/x-pack/plugins/reporting/server/export_types/csv/execute_job.test.ts b/x-pack/plugins/reporting/server/export_types/csv/execute_job.test.ts index 75070c06824e2..5eeef0f9906dd 100644 --- a/x-pack/plugins/reporting/server/export_types/csv/execute_job.test.ts +++ b/x-pack/plugins/reporting/server/export_types/csv/execute_job.test.ts @@ -5,7 +5,7 @@ */ import nodeCrypto from '@elastic/node-crypto'; -import { IUiSettingsClient, ElasticsearchServiceSetup } from 'kibana/server'; +import { ElasticsearchServiceSetup, IUiSettingsClient } from 'kibana/server'; // @ts-ignore import Puid from 'puid'; import sinon from 'sinon'; @@ -20,8 +20,8 @@ import { CSV_BOM_CHARS } from '../../../common/constants'; import { LevelLogger } from '../../lib'; import { setFieldFormats } from '../../services'; import { createMockReportingCore } from '../../test_helpers'; -import { ScheduledTaskParamsCSV } from './types'; import { runTaskFnFactory } from './execute_job'; +import { ScheduledTaskParamsCSV } from './types'; const delay = (ms: number) => new Promise((resolve) => setTimeout(() => resolve(), ms)); @@ -125,7 +125,7 @@ describe('CSV Execute Job', function () { describe('basic Elasticsearch call behavior', function () { it('should decrypt encrypted headers and pass to callAsCurrentUser', async function () { - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); await runTask( 'job456', getScheduledTaskParams({ @@ -145,7 +145,7 @@ describe('CSV Execute Job', function () { testBody: true, }; - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const job = getScheduledTaskParams({ headers: encryptedHeaders, fields: [], @@ -172,7 +172,7 @@ describe('CSV Execute Job', function () { _scroll_id: scrollId, }); callAsCurrentUserStub.onSecondCall().resolves(defaultElasticsearchResponse); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); await runTask( 'job456', getScheduledTaskParams({ @@ -190,7 +190,7 @@ describe('CSV Execute Job', function () { }); it('should not execute scroll if there are no hits from the search', async function () { - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); await runTask( 'job456', getScheduledTaskParams({ @@ -224,7 +224,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); await runTask( 'job456', getScheduledTaskParams({ @@ -263,7 +263,7 @@ describe('CSV Execute Job', function () { _scroll_id: lastScrollId, }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); await runTask( 'job456', getScheduledTaskParams({ @@ -295,7 +295,7 @@ describe('CSV Execute Job', function () { _scroll_id: lastScrollId, }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -322,7 +322,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -347,7 +347,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['=SUM(A1:A2)', 'two'], @@ -373,7 +373,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -399,7 +399,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['=SUM(A1:A2)', 'two'], @@ -425,7 +425,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -452,7 +452,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -473,7 +473,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -496,7 +496,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -517,7 +517,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -533,7 +533,7 @@ describe('CSV Execute Job', function () { describe('Elasticsearch call errors', function () { it('should reject Promise if search call errors out', async function () { callAsCurrentUserStub.rejects(new Error()); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: [], @@ -552,7 +552,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); callAsCurrentUserStub.onSecondCall().rejects(new Error()); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: [], @@ -573,7 +573,7 @@ describe('CSV Execute Job', function () { _scroll_id: undefined, }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: [], @@ -592,7 +592,7 @@ describe('CSV Execute Job', function () { _scroll_id: undefined, }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: [], @@ -618,7 +618,7 @@ describe('CSV Execute Job', function () { _scroll_id: undefined, }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: [], @@ -644,7 +644,7 @@ describe('CSV Execute Job', function () { _scroll_id: undefined, }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: [], @@ -678,7 +678,7 @@ describe('CSV Execute Job', function () { }); it('should stop calling Elasticsearch when cancellationToken.cancel is called', async function () { - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); runTask( 'job345', getScheduledTaskParams({ @@ -697,7 +697,7 @@ describe('CSV Execute Job', function () { }); it(`shouldn't call clearScroll if it never got a scrollId`, async function () { - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); runTask( 'job345', getScheduledTaskParams({ @@ -715,7 +715,7 @@ describe('CSV Execute Job', function () { }); it('should call clearScroll if it got a scrollId', async function () { - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); runTask( 'job345', getScheduledTaskParams({ @@ -737,7 +737,7 @@ describe('CSV Execute Job', function () { describe('csv content', function () { it('should write column headers to output, even if there are no results', async function () { - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -749,7 +749,7 @@ describe('CSV Execute Job', function () { it('should use custom uiSettings csv:separator for header', async function () { mockUiSettingsClient.get.withArgs(CSV_SEPARATOR_SETTING).returns(';'); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -761,7 +761,7 @@ describe('CSV Execute Job', function () { it('should escape column headers if uiSettings csv:quoteValues is true', async function () { mockUiSettingsClient.get.withArgs(CSV_QUOTE_VALUES_SETTING).returns(true); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one and a half', 'two', 'three-and-four', 'five & six'], @@ -773,7 +773,7 @@ describe('CSV Execute Job', function () { it(`shouldn't escape column headers if uiSettings csv:quoteValues is false`, async function () { mockUiSettingsClient.get.withArgs(CSV_QUOTE_VALUES_SETTING).returns(false); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one and a half', 'two', 'three-and-four', 'five & six'], @@ -784,7 +784,7 @@ describe('CSV Execute Job', function () { }); it('should write column headers to output, when there are results', async function () { - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); callAsCurrentUserStub.onFirstCall().resolves({ hits: { hits: [{ one: '1', two: '2' }], @@ -798,13 +798,14 @@ describe('CSV Execute Job', function () { searchRequest: { index: null, body: null }, }); const { content } = await runTask('job123', jobParams, cancellationToken); - const lines = content.split('\n'); + expect(content).not.toBe(null); + const lines = content!.split('\n'); const headerLine = lines[0]; expect(headerLine).toBe('one,two'); }); it('should use comma separated values of non-nested fields from _source', async function () { - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); callAsCurrentUserStub.onFirstCall().resolves({ hits: { hits: [{ _source: { one: 'foo', two: 'bar' } }], @@ -819,13 +820,14 @@ describe('CSV Execute Job', function () { searchRequest: { index: null, body: null }, }); const { content } = await runTask('job123', jobParams, cancellationToken); - const lines = content.split('\n'); + expect(content).not.toBe(null); + const lines = content!.split('\n'); const valuesLine = lines[1]; expect(valuesLine).toBe('foo,bar'); }); it('should concatenate the hits from multiple responses', async function () { - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); callAsCurrentUserStub.onFirstCall().resolves({ hits: { hits: [{ _source: { one: 'foo', two: 'bar' } }], @@ -846,14 +848,15 @@ describe('CSV Execute Job', function () { searchRequest: { index: null, body: null }, }); const { content } = await runTask('job123', jobParams, cancellationToken); - const lines = content.split('\n'); + expect(content).not.toBe(null); + const lines = content!.split('\n'); expect(lines[1]).toBe('foo,bar'); expect(lines[2]).toBe('baz,qux'); }); it('should use field formatters to format fields', async function () { - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); callAsCurrentUserStub.onFirstCall().resolves({ hits: { hits: [{ _source: { one: 'foo', two: 'bar' } }], @@ -877,7 +880,8 @@ describe('CSV Execute Job', function () { }, }); const { content } = await runTask('job123', jobParams, cancellationToken); - const lines = content.split('\n'); + expect(content).not.toBe(null); + const lines = content!.split('\n'); expect(lines[1]).toBe('FOO,bar'); }); @@ -889,13 +893,13 @@ describe('CSV Execute Job', function () { // tests use these 'simple' characters to make the math easier describe('when only the headers exceed the maxSizeBytes', function () { - let content: string; - let maxSizeReached: boolean; + let content: string | null; + let maxSizeReached: boolean | undefined; beforeEach(async function () { configGetStub.withArgs('csv', 'maxSizeBytes').returns(1); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -919,13 +923,13 @@ describe('CSV Execute Job', function () { }); describe('when headers are equal to maxSizeBytes', function () { - let content: string; - let maxSizeReached: boolean; + let content: string | null; + let maxSizeReached: boolean | undefined; beforeEach(async function () { configGetStub.withArgs('csv', 'maxSizeBytes').returns(9); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -949,8 +953,8 @@ describe('CSV Execute Job', function () { }); describe('when the data exceeds the maxSizeBytes', function () { - let content: string; - let maxSizeReached: boolean; + let content: string | null; + let maxSizeReached: boolean | undefined; beforeEach(async function () { configGetStub.withArgs('csv', 'maxSizeBytes').returns(9); @@ -962,7 +966,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -987,8 +991,8 @@ describe('CSV Execute Job', function () { }); describe('when headers and data equal the maxSizeBytes', function () { - let content: string; - let maxSizeReached: boolean; + let content: string | null; + let maxSizeReached: boolean | undefined; beforeEach(async function () { mockReportingCore.getUiSettingsServiceFactory = () => @@ -1002,7 +1006,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -1039,7 +1043,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -1065,7 +1069,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], @@ -1091,7 +1095,7 @@ describe('CSV Execute Job', function () { _scroll_id: 'scrollId', }); - const runTask = await runTaskFnFactory(mockReportingCore, mockLogger); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getScheduledTaskParams({ headers: encryptedHeaders, fields: ['one', 'two'], diff --git a/x-pack/plugins/reporting/server/export_types/csv/execute_job.ts b/x-pack/plugins/reporting/server/export_types/csv/execute_job.ts index f0c41a6a49703..802f4a81777c5 100644 --- a/x-pack/plugins/reporting/server/export_types/csv/execute_job.ts +++ b/x-pack/plugins/reporting/server/export_types/csv/execute_job.ts @@ -10,7 +10,7 @@ import Hapi from 'hapi'; import { KibanaRequest } from '../../../../../../src/core/server'; import { CONTENT_TYPE_CSV, CSV_JOB_TYPE } from '../../../common/constants'; import { cryptoFactory, LevelLogger } from '../../lib'; -import { ESQueueWorkerExecuteFn, RunTaskFnFactory } from '../../types'; +import { WorkerExecuteFn, RunTaskFnFactory } from '../../types'; import { ScheduledTaskParamsCSV } from './types'; import { createGenerateCsv } from './generate_csv'; @@ -54,7 +54,7 @@ const getRequest = async (headers: string | undefined, crypto: Crypto, logger: L } as Hapi.Request); }; -export const runTaskFnFactory: RunTaskFnFactory> = function executeJobFactoryFn(reporting, parentLogger) { const config = reporting.getConfig(); diff --git a/x-pack/plugins/reporting/server/export_types/csv/generate_csv/index.ts b/x-pack/plugins/reporting/server/export_types/csv/generate_csv/index.ts index 8da27100ac31c..06aa2434afc3f 100644 --- a/x-pack/plugins/reporting/server/export_types/csv/generate_csv/index.ts +++ b/x-pack/plugins/reporting/server/export_types/csv/generate_csv/index.ts @@ -113,6 +113,10 @@ export function createGenerateCsv(logger: LevelLogger) { break; } + if (cancellationToken.isCancelled()) { + break; + } + const flattened = flattenHit(hit); const rows = formatCsvValues(flattened); const rowsHaveFormulas = diff --git a/x-pack/plugins/reporting/server/export_types/csv/index.ts b/x-pack/plugins/reporting/server/export_types/csv/index.ts index dffc874831dc2..4bca42e0661e5 100644 --- a/x-pack/plugins/reporting/server/export_types/csv/index.ts +++ b/x-pack/plugins/reporting/server/export_types/csv/index.ts @@ -13,17 +13,17 @@ import { LICENSE_TYPE_TRIAL, } from '../../../common/constants'; import { CSV_JOB_TYPE as jobType } from '../../../constants'; -import { ESQueueCreateJobFn, ESQueueWorkerExecuteFn, ExportTypeDefinition } from '../../types'; -import { metadata } from './metadata'; +import { CreateJobFn, WorkerExecuteFn, ExportTypeDefinition } from '../../types'; import { scheduleTaskFnFactory } from './create_job'; import { runTaskFnFactory } from './execute_job'; +import { metadata } from './metadata'; import { JobParamsDiscoverCsv, ScheduledTaskParamsCSV } from './types'; export const getExportType = (): ExportTypeDefinition< JobParamsDiscoverCsv, - ESQueueCreateJobFn, + CreateJobFn, ScheduledTaskParamsCSV, - ESQueueWorkerExecuteFn + WorkerExecuteFn > => ({ ...metadata, jobType, diff --git a/x-pack/plugins/reporting/server/export_types/csv/types.d.ts b/x-pack/plugins/reporting/server/export_types/csv/types.d.ts index 9e86a5bb254a3..e0d09d04a3d3a 100644 --- a/x-pack/plugins/reporting/server/export_types/csv/types.d.ts +++ b/x-pack/plugins/reporting/server/export_types/csv/types.d.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ScheduledTaskParams } from '../../types'; +import { CreateJobBaseParams, ScheduledTaskParams } from '../../types'; export type RawValue = string | object | null | undefined; @@ -28,10 +28,8 @@ export interface IndexPatternSavedObject { }; } -export interface JobParamsDiscoverCsv { - browserTimezone: string; +export interface JobParamsDiscoverCsv extends CreateJobBaseParams { indexPatternId: string; - objectType: string; title: string; searchRequest: SearchRequest; fields: string[]; diff --git a/x-pack/plugins/reporting/server/export_types/csv_from_savedobject/execute_job.ts b/x-pack/plugins/reporting/server/export_types/csv_from_savedobject/execute_job.ts index 0cc9ec16ed71b..ec7e0a21f0498 100644 --- a/x-pack/plugins/reporting/server/export_types/csv_from_savedobject/execute_job.ts +++ b/x-pack/plugins/reporting/server/export_types/csv_from_savedobject/execute_job.ts @@ -41,7 +41,7 @@ export const runTaskFnFactory: RunTaskFnFactory = function e // jobID is only for "queued" jobs // Use the jobID as a logging tag or "immediate" const { jobParams } = jobPayload; - const jobLogger = logger.clone([jobId === null ? 'immediate' : jobId]); + const jobLogger = logger.clone(['immediate']); const generateCsv = createGenerateCsv(jobLogger); const { panel, visType } = jobParams as JobParamsPanelCsv & { panel: SearchPanel }; diff --git a/x-pack/plugins/reporting/server/export_types/png/create_job/index.ts b/x-pack/plugins/reporting/server/export_types/png/create_job/index.ts index 9227354520b6e..2252177e98085 100644 --- a/x-pack/plugins/reporting/server/export_types/png/create_job/index.ts +++ b/x-pack/plugins/reporting/server/export_types/png/create_job/index.ts @@ -5,11 +5,11 @@ */ import { cryptoFactory } from '../../../lib'; -import { ESQueueCreateJobFn, ScheduleTaskFnFactory } from '../../../types'; +import { CreateJobFn, ScheduleTaskFnFactory } from '../../../types'; import { validateUrls } from '../../common'; import { JobParamsPNG } from '../types'; -export const scheduleTaskFnFactory: ScheduleTaskFnFactory> = function createJobFactoryFn(reporting) { const config = reporting.getConfig(); diff --git a/x-pack/plugins/reporting/server/export_types/png/execute_job/index.ts b/x-pack/plugins/reporting/server/export_types/png/execute_job/index.ts index 9c7134736f4f6..35cd4139df413 100644 --- a/x-pack/plugins/reporting/server/export_types/png/execute_job/index.ts +++ b/x-pack/plugins/reporting/server/export_types/png/execute_job/index.ts @@ -8,7 +8,7 @@ import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; import { catchError, map, mergeMap, takeUntil } from 'rxjs/operators'; import { PNG_JOB_TYPE } from '../../../../common/constants'; -import { ESQueueWorkerExecuteFn, RunTaskFnFactory, TaskRunResult } from '../../..//types'; +import { WorkerExecuteFn, RunTaskFnFactory, TaskRunResult } from '../../..//types'; import { decryptJobHeaders, getConditionalHeaders, @@ -18,7 +18,7 @@ import { import { generatePngObservableFactory } from '../lib/generate_png'; import { ScheduledTaskParamsPNG } from '../types'; -type QueuedPngExecutorFactory = RunTaskFnFactory>; +type QueuedPngExecutorFactory = RunTaskFnFactory>; export const runTaskFnFactory: QueuedPngExecutorFactory = function executeJobFactoryFn( reporting, diff --git a/x-pack/plugins/reporting/server/export_types/png/index.ts b/x-pack/plugins/reporting/server/export_types/png/index.ts index 25b4dbd60535b..c966dedb6b076 100644 --- a/x-pack/plugins/reporting/server/export_types/png/index.ts +++ b/x-pack/plugins/reporting/server/export_types/png/index.ts @@ -12,17 +12,17 @@ import { LICENSE_TYPE_TRIAL, PNG_JOB_TYPE as jobType, } from '../../../common/constants'; -import { ESQueueCreateJobFn, ESQueueWorkerExecuteFn, ExportTypeDefinition } from '../../types'; -import { metadata } from './metadata'; +import { CreateJobFn, WorkerExecuteFn, ExportTypeDefinition } from '../../types'; import { scheduleTaskFnFactory } from './create_job'; import { runTaskFnFactory } from './execute_job'; +import { metadata } from './metadata'; import { JobParamsPNG, ScheduledTaskParamsPNG } from './types'; export const getExportType = (): ExportTypeDefinition< JobParamsPNG, - ESQueueCreateJobFn, + CreateJobFn, ScheduledTaskParamsPNG, - ESQueueWorkerExecuteFn + WorkerExecuteFn > => ({ ...metadata, jobType, diff --git a/x-pack/plugins/reporting/server/export_types/png/types.d.ts b/x-pack/plugins/reporting/server/export_types/png/types.d.ts index 4c40f55f0f0d6..1ddee8419df30 100644 --- a/x-pack/plugins/reporting/server/export_types/png/types.d.ts +++ b/x-pack/plugins/reporting/server/export_types/png/types.d.ts @@ -4,16 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ScheduledTaskParams } from '../../../server/types'; +import { CreateJobBaseParams, ScheduledTaskParams } from '../../../server/types'; import { LayoutInstance, LayoutParams } from '../../lib/layouts'; // Job params: structure of incoming user request data -export interface JobParamsPNG { - objectType: string; +export interface JobParamsPNG extends CreateJobBaseParams { title: string; relativeUrl: string; - browserTimezone: string; - layout: LayoutInstance; } // Job payload: structure of stored job data provided by create_job diff --git a/x-pack/plugins/reporting/server/export_types/printable_pdf/create_job/index.ts b/x-pack/plugins/reporting/server/export_types/printable_pdf/create_job/index.ts index 4540983129ebc..5de089a13bfa4 100644 --- a/x-pack/plugins/reporting/server/export_types/printable_pdf/create_job/index.ts +++ b/x-pack/plugins/reporting/server/export_types/printable_pdf/create_job/index.ts @@ -4,12 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { validateUrls } from '../../common'; import { cryptoFactory } from '../../../lib'; -import { ESQueueCreateJobFn, ScheduleTaskFnFactory } from '../../../types'; +import { CreateJobFn, ScheduleTaskFnFactory } from '../../../types'; +import { validateUrls } from '../../common'; import { JobParamsPDF } from '../types'; -export const scheduleTaskFnFactory: ScheduleTaskFnFactory> = function createJobFactoryFn(reporting) { const config = reporting.getConfig(); diff --git a/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.ts b/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.ts index eb15c0a71ca3f..5ace1c987adb5 100644 --- a/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.ts +++ b/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.ts @@ -8,7 +8,7 @@ import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; import { catchError, map, mergeMap, takeUntil } from 'rxjs/operators'; import { PDF_JOB_TYPE } from '../../../../common/constants'; -import { ESQueueWorkerExecuteFn, RunTaskFnFactory, TaskRunResult } from '../../../types'; +import { WorkerExecuteFn, RunTaskFnFactory, TaskRunResult } from '../../../types'; import { decryptJobHeaders, getConditionalHeaders, @@ -19,7 +19,7 @@ import { import { generatePdfObservableFactory } from '../lib/generate_pdf'; import { ScheduledTaskParamsPDF } from '../types'; -type QueuedPdfExecutorFactory = RunTaskFnFactory>; +type QueuedPdfExecutorFactory = RunTaskFnFactory>; export const runTaskFnFactory: QueuedPdfExecutorFactory = function executeJobFactoryFn( reporting, diff --git a/x-pack/plugins/reporting/server/export_types/printable_pdf/index.ts b/x-pack/plugins/reporting/server/export_types/printable_pdf/index.ts index e5115c243c697..7f21d36c4b72c 100644 --- a/x-pack/plugins/reporting/server/export_types/printable_pdf/index.ts +++ b/x-pack/plugins/reporting/server/export_types/printable_pdf/index.ts @@ -12,17 +12,17 @@ import { LICENSE_TYPE_TRIAL, PDF_JOB_TYPE as jobType, } from '../../../common/constants'; -import { ESQueueCreateJobFn, ESQueueWorkerExecuteFn, ExportTypeDefinition } from '../../types'; -import { metadata } from './metadata'; +import { CreateJobFn, WorkerExecuteFn, ExportTypeDefinition } from '../../types'; import { scheduleTaskFnFactory } from './create_job'; import { runTaskFnFactory } from './execute_job'; +import { metadata } from './metadata'; import { JobParamsPDF, ScheduledTaskParamsPDF } from './types'; export const getExportType = (): ExportTypeDefinition< JobParamsPDF, - ESQueueCreateJobFn, + CreateJobFn, ScheduledTaskParamsPDF, - ESQueueWorkerExecuteFn + WorkerExecuteFn > => ({ ...metadata, jobType, diff --git a/x-pack/plugins/reporting/server/export_types/printable_pdf/types.d.ts b/x-pack/plugins/reporting/server/export_types/printable_pdf/types.d.ts index cba0f41f07536..7830f87780c2e 100644 --- a/x-pack/plugins/reporting/server/export_types/printable_pdf/types.d.ts +++ b/x-pack/plugins/reporting/server/export_types/printable_pdf/types.d.ts @@ -4,15 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ScheduledTaskParams } from '../../../server/types'; +import { CreateJobBaseParams, ScheduledTaskParams } from '../../../server/types'; import { LayoutInstance, LayoutParams } from '../../lib/layouts'; // Job params: structure of incoming user request data, after being parsed from RISON -export interface JobParamsPDF { - objectType: string; // visualization, dashboard, etc. Used for job info & telemetry +export interface JobParamsPDF extends CreateJobBaseParams { title: string; relativeUrls: string[]; - browserTimezone: string; layout: LayoutInstance; } diff --git a/x-pack/plugins/reporting/server/lib/create_worker.ts b/x-pack/plugins/reporting/server/lib/create_worker.ts index 837be1f44a093..5b0f1ddb2f157 100644 --- a/x-pack/plugins/reporting/server/lib/create_worker.ts +++ b/x-pack/plugins/reporting/server/lib/create_worker.ts @@ -8,7 +8,7 @@ import { CancellationToken } from '../../common'; import { PLUGIN_ID } from '../../common/constants'; import { ReportingCore } from '../../server'; import { LevelLogger } from '../../server/lib'; -import { ESQueueWorkerExecuteFn, ExportTypeDefinition, JobSource } from '../../server/types'; +import { ExportTypeDefinition, JobSource, WorkerExecuteFn } from '../../server/types'; import { ESQueueInstance } from './create_queue'; // @ts-ignore untyped dependency import { events as esqueueEvents } from './esqueue'; @@ -22,10 +22,10 @@ export function createWorkerFactory(reporting: ReportingCore, log // Once more document types are added, this will need to be passed in return async function createWorker(queue: ESQueueInstance) { // export type / execute job map - const jobExecutors: Map> = new Map(); + const jobExecutors: Map> = new Map(); for (const exportType of reporting.getExportTypesRegistry().getAll() as Array< - ExportTypeDefinition> + ExportTypeDefinition> >) { const jobExecutor = exportType.runTaskFnFactory(reporting, logger); jobExecutors.set(exportType.jobType, jobExecutor); diff --git a/x-pack/plugins/reporting/server/lib/enqueue_job.ts b/x-pack/plugins/reporting/server/lib/enqueue_job.ts index d1554a03b9389..31960c782b7b9 100644 --- a/x-pack/plugins/reporting/server/lib/enqueue_job.ts +++ b/x-pack/plugins/reporting/server/lib/enqueue_job.ts @@ -5,15 +5,15 @@ */ import { KibanaRequest, RequestHandlerContext } from 'src/core/server'; +import { ReportingCore } from '../'; import { AuthenticatedUser } from '../../../security/server'; -import { ESQueueCreateJobFn } from '../../server/types'; -import { ReportingCore } from '../core'; +import { CreateJobBaseParams, CreateJobFn } from '../types'; import { LevelLogger } from './'; -import { ReportingStore, Report } from './store'; +import { Report } from './store'; export type EnqueueJobFn = ( exportTypeId: string, - jobParams: unknown, + jobParams: CreateJobBaseParams, user: AuthenticatedUser | null, context: RequestHandlerContext, request: KibanaRequest @@ -21,41 +21,39 @@ export type EnqueueJobFn = ( export function enqueueJobFactory( reporting: ReportingCore, - store: ReportingStore, parentLogger: LevelLogger ): EnqueueJobFn { - const config = reporting.getConfig(); - const queueTimeout = config.get('queue', 'timeout'); - const browserType = config.get('capture', 'browser', 'type'); - const maxAttempts = config.get('capture', 'maxAttempts'); const logger = parentLogger.clone(['queue-job']); return async function enqueueJob( exportTypeId: string, - jobParams: unknown, + jobParams: CreateJobBaseParams, user: AuthenticatedUser | null, context: RequestHandlerContext, request: KibanaRequest ) { - type ScheduleTaskFnType = ESQueueCreateJobFn; + type ScheduleTaskFnType = CreateJobFn; - const username = user ? user.username : false; + const username: string | null = user ? user.username : null; const exportType = reporting.getExportTypesRegistry().getById(exportTypeId); if (exportType == null) { throw new Error(`Export type ${exportTypeId} does not exist in the registry!`); } - const scheduleTask = exportType.scheduleTaskFnFactory(reporting, logger) as ScheduleTaskFnType; + const [scheduleTask, { store }] = await Promise.all([ + exportType.scheduleTaskFnFactory(reporting, logger) as ScheduleTaskFnType, + reporting.getPluginStartDeps(), + ]); + + // add encrytped headers const payload = await scheduleTask(jobParams, context, request); - const options = { - timeout: queueTimeout, - created_by: username, - browser_type: browserType, - max_attempts: maxAttempts, - }; + // store the pending report, puts it in the Reporting Management UI table + const report = await store.addReport(exportType.jobType, username, payload); + + logger.info(`Scheduled ${exportType.name} report: ${report._id}`); - return await store.addReport(exportType.jobType, payload, options); + return report; }; } diff --git a/x-pack/plugins/reporting/server/lib/esqueue/constants/index.js b/x-pack/plugins/reporting/server/lib/esqueue/constants/index.js index 5fcff3531851a..7f7383bb8611d 100644 --- a/x-pack/plugins/reporting/server/lib/esqueue/constants/index.js +++ b/x-pack/plugins/reporting/server/lib/esqueue/constants/index.js @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { events } from './events'; -import { statuses } from './statuses'; +import { statuses } from '../../statuses'; import { defaultSettings } from './default_settings'; +import { events } from './events'; export const constants = { ...events, diff --git a/x-pack/plugins/reporting/server/lib/esqueue/worker.js b/x-pack/plugins/reporting/server/lib/esqueue/worker.js index 469bafd694612..0c3a6384f6b9a 100644 --- a/x-pack/plugins/reporting/server/lib/esqueue/worker.js +++ b/x-pack/plugins/reporting/server/lib/esqueue/worker.js @@ -158,26 +158,18 @@ export class Worker extends events.EventEmitter { kibana_name: this.kibanaName, }; - return this.queue.store - .updateReport({ - index: job._index, - id: job._id, - if_seq_no: job._seq_no, - if_primary_term: job._primary_term, - body: { doc }, - }) - .then((response) => { - this.info(`Job marked as claimed: ${getUpdatedDocPath(response)}`); - const updatedJob = { - ...job, - ...response, - }; - updatedJob._source = { - ...job._source, - ...doc, - }; - return updatedJob; - }); + return this.queue.store.setReportClaimed(job, doc).then((response) => { + this.info(`Job marked as claimed: ${getUpdatedDocPath(response)}`); + const updatedJob = { + ...job, + ...response, + }; + updatedJob._source = { + ...job._source, + ...doc, + }; + return updatedJob; + }); } _failJob(job, output = false) { @@ -198,13 +190,7 @@ export class Worker extends events.EventEmitter { }); return this.queue.store - .updateReport({ - index: job._index, - id: job._id, - if_seq_no: job._seq_no, - if_primary_term: job._primary_term, - body: { doc }, - }) + .setReportFailed(job, doc) .then((response) => { this.info(`Job marked as failed: ${getUpdatedDocPath(response)}`); }) @@ -295,13 +281,7 @@ export class Worker extends events.EventEmitter { }; return this.queue.store - .updateReport({ - index: job._index, - id: job._id, - if_seq_no: job._seq_no, - if_primary_term: job._primary_term, - body: { doc }, - }) + .setReportCompleted(job, doc) .then((response) => { const eventOutput = { job: formatJobObject(job), diff --git a/x-pack/plugins/reporting/server/lib/index.ts b/x-pack/plugins/reporting/server/lib/index.ts index e4adb1188e3fc..f3a09cffbb104 100644 --- a/x-pack/plugins/reporting/server/lib/index.ts +++ b/x-pack/plugins/reporting/server/lib/index.ts @@ -8,8 +8,9 @@ export { checkLicense } from './check_license'; export { createQueueFactory } from './create_queue'; export { cryptoFactory } from './crypto'; export { enqueueJobFactory } from './enqueue_job'; -export { getExportTypesRegistry } from './export_types_registry'; +export { ExportTypesRegistry, getExportTypesRegistry } from './export_types_registry'; export { LevelLogger } from './level_logger'; +export { statuses } from './statuses'; export { ReportingStore } from './store'; export { startTrace } from './trace'; export { runValidations } from './validate'; diff --git a/x-pack/plugins/reporting/server/lib/esqueue/constants/statuses.ts b/x-pack/plugins/reporting/server/lib/statuses.ts similarity index 100% rename from x-pack/plugins/reporting/server/lib/esqueue/constants/statuses.ts rename to x-pack/plugins/reporting/server/lib/statuses.ts diff --git a/x-pack/plugins/reporting/server/lib/store/mapping.ts b/x-pack/plugins/reporting/server/lib/store/mapping.ts index a819923e2f105..d08b928cdca4b 100644 --- a/x-pack/plugins/reporting/server/lib/store/mapping.ts +++ b/x-pack/plugins/reporting/server/lib/store/mapping.ts @@ -45,7 +45,7 @@ export const mapping = { priority: { type: 'byte' }, timeout: { type: 'long' }, process_expiration: { type: 'date' }, - created_by: { type: 'keyword' }, + created_by: { type: 'keyword' }, // `null` if security is disabled created_at: { type: 'date' }, started_at: { type: 'date' }, completed_at: { type: 'date' }, diff --git a/x-pack/plugins/reporting/server/lib/store/report.test.ts b/x-pack/plugins/reporting/server/lib/store/report.test.ts index 83444494e61d3..9ac5d1f87c387 100644 --- a/x-pack/plugins/reporting/server/lib/store/report.test.ts +++ b/x-pack/plugins/reporting/server/lib/store/report.test.ts @@ -8,46 +8,59 @@ import { Report } from './report'; describe('Class Report', () => { it('constructs Report instance', () => { - const opts = { - index: '.reporting-test-index-12345', + const report = new Report({ + _index: '.reporting-test-index-12345', jobtype: 'test-report', created_by: 'created_by_test_string', browser_type: 'browser_type_test_string', max_attempts: 50, - payload: { payload_test_field: 1 }, + payload: { headers: 'payload_test_field', objectType: 'testOt' }, timeout: 30000, priority: 1, - }; - const report = new Report(opts); - expect(report.toJSON()).toMatchObject({ - _primary_term: undefined, - _seq_no: undefined, + }); + + expect(report.toEsDocsJSON()).toMatchObject({ + _index: '.reporting-test-index-12345', + _source: { + attempts: 0, + browser_type: 'browser_type_test_string', + completed_at: undefined, + created_at: undefined, + created_by: 'created_by_test_string', + jobtype: 'test-report', + max_attempts: 50, + meta: undefined, + payload: { headers: 'payload_test_field', objectType: 'testOt' }, + priority: 1, + started_at: undefined, + status: 'pending', + timeout: 30000, + }, + }); + expect(report.toApiJSON()).toMatchObject({ browser_type: 'browser_type_test_string', created_by: 'created_by_test_string', jobtype: 'test-report', max_attempts: 50, - payload: { - payload_test_field: 1, - }, + payload: { headers: 'payload_test_field', objectType: 'testOt' }, priority: 1, timeout: 30000, }); - expect(report.id).toBeDefined(); + expect(report._id).toBeDefined(); }); - it('updateWithDoc method syncs takes fields to sync ES metadata', () => { - const opts = { - index: '.reporting-test-index-12345', + it('updateWithEsDoc method syncs fields to sync ES metadata', () => { + const report = new Report({ + _index: '.reporting-test-index-12345', jobtype: 'test-report', created_by: 'created_by_test_string', browser_type: 'browser_type_test_string', max_attempts: 50, - payload: { payload_test_field: 1 }, + payload: { headers: 'payload_test_field', objectType: 'testOt' }, timeout: 30000, priority: 1, - }; - const report = new Report(opts); + }); const metadata = { _index: '.reporting-test-update', @@ -55,23 +68,53 @@ describe('Class Report', () => { _primary_term: 77, _seq_no: 99, }; - report.updateWithDoc(metadata); - - expect(report.toJSON()).toMatchObject({ - index: '.reporting-test-update', - _primary_term: 77, - _seq_no: 99, - browser_type: 'browser_type_test_string', - created_by: 'created_by_test_string', - jobtype: 'test-report', - max_attempts: 50, - payload: { - payload_test_field: 1, - }, - priority: 1, - timeout: 30000, - }); + report.updateWithEsDoc(metadata); - expect(report._id).toBe('12342p9o387549o2345'); + expect(report.toEsDocsJSON()).toMatchInlineSnapshot(` + Object { + "_id": "12342p9o387549o2345", + "_index": ".reporting-test-update", + "_source": Object { + "attempts": 0, + "browser_type": "browser_type_test_string", + "completed_at": undefined, + "created_at": undefined, + "created_by": "created_by_test_string", + "jobtype": "test-report", + "max_attempts": 50, + "meta": undefined, + "payload": Object { + "headers": "payload_test_field", + "objectType": "testOt", + }, + "priority": 1, + "started_at": undefined, + "status": "pending", + "timeout": 30000, + }, + } + `); + expect(report.toApiJSON()).toMatchInlineSnapshot(` + Object { + "attempts": 0, + "browser_type": "browser_type_test_string", + "completed_at": undefined, + "created_at": undefined, + "created_by": "created_by_test_string", + "id": "12342p9o387549o2345", + "index": ".reporting-test-update", + "jobtype": "test-report", + "max_attempts": 50, + "meta": undefined, + "payload": Object { + "headers": "payload_test_field", + "objectType": "testOt", + }, + "priority": 1, + "started_at": undefined, + "status": "pending", + "timeout": 30000, + } + `); }); }); diff --git a/x-pack/plugins/reporting/server/lib/store/report.ts b/x-pack/plugins/reporting/server/lib/store/report.ts index cc9967e64b6eb..5ff71ae7a7182 100644 --- a/x-pack/plugins/reporting/server/lib/store/report.ts +++ b/x-pack/plugins/reporting/server/lib/store/report.ts @@ -6,80 +6,158 @@ // @ts-ignore no module definition import Puid from 'puid'; +import { JobStatuses } from '../../../constants'; +import { LayoutInstance } from '../layouts'; -interface Payload { - id?: string; - index: string; +/* + * The document created by Reporting to store in the .reporting index + */ +interface ReportingDocument { + _id: string; + _index: string; + _seq_no: unknown; + _primary_term: unknown; jobtype: string; - created_by: string | boolean; - payload: unknown; + created_by: string | null; + payload: { + headers: string; // encrypted headers + objectType: string; + layout?: LayoutInstance; + }; + meta: unknown; browser_type: string; - priority: number; max_attempts: number; timeout: number; + + status: string; + attempts: number; + output?: unknown; + started_at?: string; + completed_at?: string; + created_at?: string; + priority?: number; + process_expiration?: string; } +/* + * The document created by Reporting to store as task parameters for Task + * Manager to reference the report in .reporting + */ const puid = new Puid(); -export class Report { - public readonly jobtype: string; - public readonly created_by: string | boolean; - public readonly payload: unknown; - public readonly browser_type: string; - public readonly id: string; +export class Report implements Partial { + public _index?: string; + public _id: string; + public _primary_term?: unknown; // set by ES + public _seq_no: unknown; // set by ES - public readonly priority: number; - // queue stuff, to be removed with Task Manager integration + public readonly jobtype: string; + public readonly created_at?: string; + public readonly created_by?: string | null; + public readonly payload: { + headers: string; // encrypted headers + objectType: string; + layout?: LayoutInstance; + }; + public readonly meta: unknown; public readonly max_attempts: number; - public readonly timeout: number; + public readonly browser_type?: string; - public _index: string; - public _id?: string; // set by ES - public _primary_term?: unknown; // set by ES - public _seq_no: unknown; // set by ES + public readonly status: string; + public readonly attempts: number; + public readonly output?: unknown; + public readonly started_at?: string; + public readonly completed_at?: string; + public readonly process_expiration?: string; + public readonly priority?: number; + public readonly timeout?: number; /* * Create an unsaved report */ - constructor(opts: Payload) { - this.jobtype = opts.jobtype; + constructor(opts: Partial) { + this._id = opts._id != null ? opts._id : puid.generate(); + this._index = opts._index; + this._primary_term = opts._primary_term; + this._seq_no = opts._seq_no; + + this.payload = opts.payload!; + this.jobtype = opts.jobtype!; + this.max_attempts = opts.max_attempts!; + this.attempts = opts.attempts || 0; + + this.process_expiration = opts.process_expiration; + this.timeout = opts.timeout; + + this.created_at = opts.created_at; this.created_by = opts.created_by; - this.payload = opts.payload; + this.meta = opts.meta; this.browser_type = opts.browser_type; this.priority = opts.priority; - this.max_attempts = opts.max_attempts; - this.timeout = opts.timeout; - this.id = puid.generate(); - this._index = opts.index; + this.status = opts.status || JobStatuses.PENDING; + this.output = opts.output || null; } /* * Update the report with "live" storage metadata */ - updateWithDoc(doc: Partial) { - if (doc._index) { - this._index = doc._index; // can not be undefined + updateWithEsDoc(doc: Partial) { + if (doc._index == null || doc._id == null) { + throw new Error(`Report object from ES has missing fields!`); } this._id = doc._id; + this._index = doc._index; this._primary_term = doc._primary_term; this._seq_no = doc._seq_no; } - toJSON() { + /* + * Data structure for writing to Elasticsearch index + */ + toEsDocsJSON() { + return { + _id: this._id, + _index: this._index, + _source: { + jobtype: this.jobtype, + created_at: this.created_at, + created_by: this.created_by, + payload: this.payload, + meta: this.meta, + timeout: this.timeout, + max_attempts: this.max_attempts, + priority: this.priority, + browser_type: this.browser_type, + status: this.status, + attempts: this.attempts, + started_at: this.started_at, + completed_at: this.completed_at, + }, + }; + } + + /* + * Data structure for API responses + */ + toApiJSON() { return { - id: this.id, + id: this._id, index: this._index, - _seq_no: this._seq_no, - _primary_term: this._primary_term, jobtype: this.jobtype, + created_at: this.created_at, created_by: this.created_by, payload: this.payload, + meta: this.meta, timeout: this.timeout, max_attempts: this.max_attempts, priority: this.priority, browser_type: this.browser_type, + status: this.status, + attempts: this.attempts, + started_at: this.started_at, + completed_at: this.completed_at, }; } } diff --git a/x-pack/plugins/reporting/server/lib/store/store.test.ts b/x-pack/plugins/reporting/server/lib/store/store.test.ts index 4868a1dfdd8f3..c66e2dd7742c4 100644 --- a/x-pack/plugins/reporting/server/lib/store/store.test.ts +++ b/x-pack/plugins/reporting/server/lib/store/store.test.ts @@ -5,11 +5,12 @@ */ import sinon from 'sinon'; +import { ElasticsearchServiceSetup } from 'src/core/server'; import { ReportingConfig, ReportingCore } from '../..'; import { createMockReportingCore } from '../../test_helpers'; import { createMockLevelLogger } from '../../test_helpers/create_mock_levellogger'; +import { Report } from './report'; import { ReportingStore } from './store'; -import { ElasticsearchServiceSetup } from 'src/core/server'; const getMockConfig = (mockConfigGet: sinon.SinonStub) => ({ get: mockConfigGet, @@ -31,11 +32,13 @@ describe('ReportingStore', () => { mockConfig = getMockConfig(mockConfigGet); mockCore = await createMockReportingCore(mockConfig); + callClusterStub.reset(); callClusterStub.withArgs('indices.exists').resolves({}); callClusterStub.withArgs('indices.create').resolves({}); - callClusterStub.withArgs('index').resolves({}); + callClusterStub.withArgs('index').resolves({ _id: 'stub-id', _index: 'stub-index' }); callClusterStub.withArgs('indices.refresh').resolves({}); callClusterStub.withArgs('update').resolves({}); + callClusterStub.withArgs('get').resolves({}); mockCore.getElasticsearchService = () => (mockElasticsearch as unknown) as ElasticsearchServiceSetup; @@ -45,25 +48,25 @@ describe('ReportingStore', () => { it('returns Report object', async () => { const store = new ReportingStore(mockCore, mockLogger); const reportType = 'unknowntype'; - const reportPayload = {}; - const reportOptions = { - timeout: 10000, - created_by: 'created_by_string', - browser_type: 'browser_type_string', - max_attempts: 1, + const reportPayload = { + browserTimezone: 'UTC', + headers: 'rp_headers_1', + objectType: 'testOt', }; - await expect( - store.addReport(reportType, reportPayload, reportOptions) - ).resolves.toMatchObject({ + await expect(store.addReport(reportType, 'username1', reportPayload)).resolves.toMatchObject({ _primary_term: undefined, _seq_no: undefined, - browser_type: 'browser_type_string', - created_by: 'created_by_string', + attempts: 0, + browser_type: undefined, + completed_at: undefined, + created_by: 'username1', jobtype: 'unknowntype', - max_attempts: 1, + max_attempts: undefined, payload: {}, priority: 10, - timeout: 10000, + started_at: undefined, + status: 'pending', + timeout: undefined, }); }); @@ -76,35 +79,31 @@ describe('ReportingStore', () => { const store = new ReportingStore(mockCore, mockLogger); const reportType = 'unknowntype'; - const reportPayload = {}; - const reportOptions = { - timeout: 10000, - created_by: 'created_by_string', - browser_type: 'browser_type_string', - max_attempts: 1, + const reportPayload = { + browserTimezone: 'UTC', + headers: 'rp_headers_2', + objectType: 'testOt', }; - expect( - store.addReport(reportType, reportPayload, reportOptions) - ).rejects.toMatchInlineSnapshot(`[Error: Invalid index interval: centurially]`); + expect(store.addReport(reportType, 'user1', reportPayload)).rejects.toMatchInlineSnapshot( + `[Error: Invalid index interval: centurially]` + ); }); it('handles error creating the index', async () => { // setup callClusterStub.withArgs('indices.exists').resolves(false); - callClusterStub.withArgs('indices.create').rejects(new Error('error')); + callClusterStub.withArgs('indices.create').rejects(new Error('horrible error')); const store = new ReportingStore(mockCore, mockLogger); const reportType = 'unknowntype'; - const reportPayload = {}; - const reportOptions = { - timeout: 10000, - created_by: 'created_by_string', - browser_type: 'browser_type_string', - max_attempts: 1, + const reportPayload = { + browserTimezone: 'UTC', + headers: 'rp_headers_3', + objectType: 'testOt', }; await expect( - store.addReport(reportType, reportPayload, reportOptions) - ).rejects.toMatchInlineSnapshot(`[Error: error]`); + store.addReport(reportType, 'user1', reportPayload) + ).rejects.toMatchInlineSnapshot(`[Error: horrible error]`); }); /* Creating the index will fail, if there were multiple jobs staged in @@ -116,20 +115,18 @@ describe('ReportingStore', () => { it('ignores index creation error if the index already exists and continues adding the report', async () => { // setup callClusterStub.withArgs('indices.exists').resolves(false); - callClusterStub.withArgs('indices.create').rejects(new Error('error')); + callClusterStub.withArgs('indices.create').rejects(new Error('devastating error')); const store = new ReportingStore(mockCore, mockLogger); const reportType = 'unknowntype'; - const reportPayload = {}; - const reportOptions = { - timeout: 10000, - created_by: 'created_by_string', - browser_type: 'browser_type_string', - max_attempts: 1, + const reportPayload = { + browserTimezone: 'UTC', + headers: 'rp_headers_4', + objectType: 'testOt', }; await expect( - store.addReport(reportType, reportPayload, reportOptions) - ).rejects.toMatchInlineSnapshot(`[Error: error]`); + store.addReport(reportType, 'user1', reportPayload) + ).rejects.toMatchInlineSnapshot(`[Error: devastating error]`); }); it('skips creating the index if already exists', async () => { @@ -141,26 +138,223 @@ describe('ReportingStore', () => { const store = new ReportingStore(mockCore, mockLogger); const reportType = 'unknowntype'; - const reportPayload = {}; - const reportOptions = { - timeout: 10000, - created_by: 'created_by_string', - browser_type: 'browser_type_string', - max_attempts: 1, + const reportPayload = { + browserTimezone: 'UTC', + headers: 'rp_headers_5', + objectType: 'testOt', }; - await expect( - store.addReport(reportType, reportPayload, reportOptions) - ).resolves.toMatchObject({ + await expect(store.addReport(reportType, 'user1', reportPayload)).resolves.toMatchObject({ + _primary_term: undefined, + _seq_no: undefined, + attempts: 0, + browser_type: undefined, + completed_at: undefined, + created_by: 'user1', + jobtype: 'unknowntype', + max_attempts: undefined, + payload: {}, + priority: 10, + started_at: undefined, + status: 'pending', + timeout: undefined, + }); + }); + + it('allows username string to be `null`', async () => { + // setup + callClusterStub.withArgs('indices.exists').resolves(false); + callClusterStub + .withArgs('indices.create') + .rejects(new Error('resource_already_exists_exception')); // will be triggered but ignored + + const store = new ReportingStore(mockCore, mockLogger); + const reportType = 'unknowntype'; + const reportPayload = { + browserTimezone: 'UTC', + headers: 'rp_test_headers', + objectType: 'testOt', + }; + await expect(store.addReport(reportType, null, reportPayload)).resolves.toMatchObject({ _primary_term: undefined, _seq_no: undefined, - browser_type: 'browser_type_string', - created_by: 'created_by_string', + attempts: 0, + browser_type: undefined, + completed_at: undefined, + created_by: null, jobtype: 'unknowntype', - max_attempts: 1, + max_attempts: undefined, payload: {}, priority: 10, - timeout: 10000, + started_at: undefined, + status: 'pending', + timeout: undefined, }); }); }); + + it('setReportClaimed sets the status of a record to processing', async () => { + const store = new ReportingStore(mockCore, mockLogger); + const report = new Report({ + _id: 'id-of-processing', + _index: '.reporting-test-index-12345', + jobtype: 'test-report', + created_by: 'created_by_test_string', + browser_type: 'browser_type_test_string', + max_attempts: 50, + payload: { + headers: 'rp_test_headers', + objectType: 'testOt', + }, + timeout: 30000, + priority: 1, + }); + + await store.setReportClaimed(report, { testDoc: 'test' } as any); + + const updateCall = callClusterStub.getCalls().find((call) => call.args[0] === 'update'); + expect(updateCall && updateCall.args).toMatchInlineSnapshot(` + Array [ + "update", + Object { + "body": Object { + "doc": Object { + "status": "processing", + "testDoc": "test", + }, + }, + "id": "id-of-processing", + "if_primary_term": undefined, + "if_seq_no": undefined, + "index": ".reporting-test-index-12345", + }, + ] + `); + }); + + it('setReportFailed sets the status of a record to failed', async () => { + const store = new ReportingStore(mockCore, mockLogger); + const report = new Report({ + _id: 'id-of-failure', + _index: '.reporting-test-index-12345', + jobtype: 'test-report', + created_by: 'created_by_test_string', + browser_type: 'browser_type_test_string', + max_attempts: 50, + payload: { + headers: 'rp_test_headers', + objectType: 'testOt', + }, + timeout: 30000, + priority: 1, + }); + + await store.setReportFailed(report, { errors: 'yes' } as any); + + const updateCall = callClusterStub.getCalls().find((call) => call.args[0] === 'update'); + expect(updateCall && updateCall.args).toMatchInlineSnapshot(` + Array [ + "update", + Object { + "body": Object { + "doc": Object { + "errors": "yes", + "status": "failed", + }, + }, + "id": "id-of-failure", + "if_primary_term": undefined, + "if_seq_no": undefined, + "index": ".reporting-test-index-12345", + }, + ] + `); + }); + + it('setReportCompleted sets the status of a record to completed', async () => { + const store = new ReportingStore(mockCore, mockLogger); + const report = new Report({ + _id: 'vastly-great-report-id', + _index: '.reporting-test-index-12345', + jobtype: 'test-report', + created_by: 'created_by_test_string', + browser_type: 'browser_type_test_string', + max_attempts: 50, + payload: { + headers: 'rp_test_headers', + objectType: 'testOt', + }, + timeout: 30000, + priority: 1, + }); + + await store.setReportCompleted(report, { certainly_completed: 'yes' } as any); + + const updateCall = callClusterStub.getCalls().find((call) => call.args[0] === 'update'); + expect(updateCall && updateCall.args).toMatchInlineSnapshot(` + Array [ + "update", + Object { + "body": Object { + "doc": Object { + "certainly_completed": "yes", + "status": "completed", + }, + }, + "id": "vastly-great-report-id", + "if_primary_term": undefined, + "if_seq_no": undefined, + "index": ".reporting-test-index-12345", + }, + ] + `); + }); + + it('setReportCompleted sets the status of a record to completed_with_warnings', async () => { + const store = new ReportingStore(mockCore, mockLogger); + const report = new Report({ + _id: 'vastly-great-report-id', + _index: '.reporting-test-index-12345', + jobtype: 'test-report', + created_by: 'created_by_test_string', + browser_type: 'browser_type_test_string', + max_attempts: 50, + payload: { + headers: 'rp_test_headers', + objectType: 'testOt', + }, + timeout: 30000, + priority: 1, + }); + + await store.setReportCompleted(report, { + certainly_completed: 'pretty_much', + output: { + warnings: [`those pants don't go with that shirt`], + }, + } as any); + + const updateCall = callClusterStub.getCalls().find((call) => call.args[0] === 'update'); + expect(updateCall && updateCall.args).toMatchInlineSnapshot(` + Array [ + "update", + Object { + "body": Object { + "doc": Object { + "certainly_completed": "pretty_much", + "output": Object { + "warnings": Array [ + "those pants don't go with that shirt", + ], + }, + "status": "completed_with_warnings", + }, + }, + "id": "vastly-great-report-id", + "if_primary_term": undefined, + "if_seq_no": undefined, + "index": ".reporting-test-index-12345", + }, + ] + `); + }); }); diff --git a/x-pack/plugins/reporting/server/lib/store/store.ts b/x-pack/plugins/reporting/server/lib/store/store.ts index 0f1ed83b71767..12cff0e973ed6 100644 --- a/x-pack/plugins/reporting/server/lib/store/store.ts +++ b/x-pack/plugins/reporting/server/lib/store/store.ts @@ -5,36 +5,24 @@ */ import { ElasticsearchServiceSetup } from 'src/core/server'; -import { LevelLogger } from '../'; +import { LevelLogger, statuses } from '../'; import { ReportingCore } from '../../'; +import { CreateJobBaseParams, CreateJobBaseParamsEncryptedFields } from '../../types'; import { indexTimestamp } from './index_timestamp'; -import { LayoutInstance } from '../layouts'; import { mapping } from './mapping'; import { Report } from './report'; - -export const statuses = { - JOB_STATUS_PENDING: 'pending', - JOB_STATUS_PROCESSING: 'processing', - JOB_STATUS_COMPLETED: 'completed', - JOB_STATUS_WARNINGS: 'completed_with_warnings', - JOB_STATUS_FAILED: 'failed', - JOB_STATUS_CANCELLED: 'cancelled', -}; - -interface AddReportOpts { +interface JobSettings { timeout: number; - created_by: string | boolean; browser_type: string; max_attempts: number; + priority: number; } -interface UpdateQuery { - index: string; - id: string; - if_seq_no: unknown; - if_primary_term: unknown; - body: { doc: Partial }; -} +const checkReportIsEditable = (report: Report) => { + if (!report._id || !report._index) { + throw new Error(`Report object is not synced with ES!`); + } +}; /* * A class to give an interface to historical reports in the reporting.index @@ -43,9 +31,9 @@ interface UpdateQuery { * - interface for downloading the report */ export class ReportingStore { - public readonly indexPrefix: string; - public readonly indexInterval: string; - + private readonly indexPrefix: string; + private readonly indexInterval: string; + private readonly jobSettings: JobSettings; private client: ElasticsearchServiceSetup['legacy']['client']; private logger: LevelLogger; @@ -56,12 +44,18 @@ export class ReportingStore { this.client = elasticsearch.legacy.client; this.indexPrefix = config.get('index'); this.indexInterval = config.get('queue', 'indexInterval'); + this.jobSettings = { + timeout: config.get('queue', 'timeout'), + browser_type: config.get('capture', 'browser', 'type'), + max_attempts: config.get('capture', 'maxAttempts'), + priority: 10, // unused + }; this.logger = logger; } private async createIndex(indexName: string) { - return this.client + return await this.client .callAsInternalUser('indices.exists', { index: indexName, }) @@ -95,75 +89,157 @@ export class ReportingStore { return; } + this.logger.error(err); throw err; }); }); } - private async saveReport(report: Report) { - const payload = report.payload as { objectType: string; layout: LayoutInstance }; + /* + * Called from addReport, which handles any errors + */ + private async indexReport(report: Report) { + const params = report.payload; + + // Queing is handled by TM. These queueing-based fields for reference in Report Info panel + const infoFields = { + timeout: report.timeout, + process_expiration: new Date(0), // use epoch so the job query works + created_at: new Date(), + attempts: 0, + max_attempts: report.max_attempts, + status: statuses.JOB_STATUS_PENDING, + browser_type: report.browser_type, + }; const indexParams = { index: report._index, - id: report.id, + id: report._id, body: { + ...infoFields, jobtype: report.jobtype, meta: { // We are copying these values out of payload because these fields are indexed and can be aggregated on // for tracking stats, while payload contents are not. - objectType: payload.objectType, - layout: payload.layout ? payload.layout.id : 'none', + objectType: params.objectType, + layout: params.layout ? params.layout.id : 'none', }, payload: report.payload, created_by: report.created_by, - timeout: report.timeout, - process_expiration: new Date(0), // use epoch so the job query works - created_at: new Date(), - attempts: 0, - max_attempts: report.max_attempts, - status: statuses.JOB_STATUS_PENDING, - browser_type: report.browser_type, }, }; - return this.client.callAsInternalUser('index', indexParams); + return await this.client.callAsInternalUser('index', indexParams); } + /* + * Called from addReport, which handles any errors + */ private async refreshIndex(index: string) { - return this.client.callAsInternalUser('indices.refresh', { index }); + return await this.client.callAsInternalUser('indices.refresh', { index }); } - public async addReport(type: string, payload: unknown, options: AddReportOpts): Promise { + public async addReport( + type: string, + username: string | null, + payload: CreateJobBaseParams & CreateJobBaseParamsEncryptedFields + ): Promise { const timestamp = indexTimestamp(this.indexInterval); const index = `${this.indexPrefix}-${timestamp}`; await this.createIndex(index); const report = new Report({ - index, + _index: index, payload, jobtype: type, - created_by: options.created_by, - browser_type: options.browser_type, - max_attempts: options.max_attempts, - timeout: options.timeout, - priority: 10, // unused + created_by: username, + ...this.jobSettings, }); - const doc = await this.saveReport(report); - report.updateWithDoc(doc); + try { + const doc = await this.indexReport(report); + report.updateWithEsDoc(doc); - await this.refreshIndex(index); - this.logger.info(`Successfully queued pending job: ${report._index}/${report.id}`); + await this.refreshIndex(index); + this.logger.debug(`Successfully stored pending job: ${report._index}/${report._id}`); - return report; + return report; + } catch (err) { + this.logger.error(`Error in addReport!`); + this.logger.error(err); + throw err; + } } - public async updateReport(query: UpdateQuery): Promise { - return this.client.callAsInternalUser('update', { - index: query.index, - id: query.id, - if_seq_no: query.if_seq_no, - if_primary_term: query.if_primary_term, - body: { doc: query.body.doc }, - }); + public async setReportClaimed(report: Report, stats: Partial): Promise { + const doc = { + ...stats, + status: statuses.JOB_STATUS_PROCESSING, + }; + + try { + checkReportIsEditable(report); + + return await this.client.callAsInternalUser('update', { + id: report._id, + index: report._index, + if_seq_no: report._seq_no, + if_primary_term: report._primary_term, + body: { doc }, + }); + } catch (err) { + this.logger.error('Error in setting report processing status!'); + this.logger.error(err); + throw err; + } + } + + public async setReportFailed(report: Report, stats: Partial): Promise { + const doc = { + ...stats, + status: statuses.JOB_STATUS_FAILED, + }; + + try { + checkReportIsEditable(report); + + return await this.client.callAsInternalUser('update', { + id: report._id, + index: report._index, + if_seq_no: report._seq_no, + if_primary_term: report._primary_term, + body: { doc }, + }); + } catch (err) { + this.logger.error('Error in setting report failed status!'); + this.logger.error(err); + throw err; + } + } + + public async setReportCompleted(report: Report, stats: Partial): Promise { + try { + const { output } = stats as { output: any }; + const status = + output && output.warnings && output.warnings.length > 0 + ? statuses.JOB_STATUS_WARNINGS + : statuses.JOB_STATUS_COMPLETED; + const doc = { + ...stats, + status, + }; + checkReportIsEditable(report); + + return await this.client.callAsInternalUser('update', { + id: report._id, + index: report._index, + if_seq_no: report._seq_no, + if_primary_term: report._primary_term, + body: { doc }, + }); + } catch (err) { + this.logger.error('Error in setting report complete status!'); + this.logger.error(err); + throw err; + } } } diff --git a/x-pack/plugins/reporting/server/plugin.ts b/x-pack/plugins/reporting/server/plugin.ts index cedc9dc14a237..20e22c2db00e3 100644 --- a/x-pack/plugins/reporting/server/plugin.ts +++ b/x-pack/plugins/reporting/server/plugin.ts @@ -8,13 +8,7 @@ import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core import { ReportingCore } from './'; import { initializeBrowserDriverFactory } from './browsers'; import { buildConfig, ReportingConfigType } from './config'; -import { - createQueueFactory, - enqueueJobFactory, - LevelLogger, - runValidations, - ReportingStore, -} from './lib'; +import { createQueueFactory, LevelLogger, runValidations, ReportingStore } from './lib'; import { registerRoutes } from './routes'; import { setFieldFormats } from './services'; import { ReportingSetup, ReportingSetupDeps, ReportingStart, ReportingStartDeps } from './types'; @@ -94,14 +88,12 @@ export class ReportingPlugin const browserDriverFactory = await initializeBrowserDriverFactory(config, logger); const store = new ReportingStore(reportingCore, logger); const esqueue = await createQueueFactory(reportingCore, store, logger); // starts polling for pending jobs - const enqueueJob = enqueueJobFactory(reportingCore, store, logger); // called from generation routes reportingCore.pluginStart({ browserDriverFactory, savedObjects: core.savedObjects, uiSettings: core.uiSettings, esqueue, - enqueueJob, store, }); diff --git a/x-pack/plugins/reporting/server/routes/generate_from_jobparams.ts b/x-pack/plugins/reporting/server/routes/generate_from_jobparams.ts index 2a12a64d67a35..f4959b56dfea1 100644 --- a/x-pack/plugins/reporting/server/routes/generate_from_jobparams.ts +++ b/x-pack/plugins/reporting/server/routes/generate_from_jobparams.ts @@ -10,6 +10,7 @@ import { authorizedUserPreRoutingFactory } from './lib/authorized_user_pre_routi import { HandlerErrorFunction, HandlerFunction } from './types'; import { ReportingCore } from '../'; import { API_BASE_URL } from '../../common/constants'; +import { CreateJobBaseParams } from '../types'; const BASE_GENERATE = `${API_BASE_URL}/generate`; @@ -44,13 +45,13 @@ export function registerGenerateFromJobParams( }, }, userHandler(async (user, context, req, res) => { - let jobParamsRison: string | null; + let jobParamsRison: null | string = null; if (req.body) { - const { jobParams: jobParamsPayload } = req.body as { jobParams: string }; - jobParamsRison = jobParamsPayload; - } else { - const { jobParams: queryJobParams } = req.query as { jobParams: string }; + const { jobParams: jobParamsPayload } = req.body; + jobParamsRison = jobParamsPayload ? jobParamsPayload : null; + } else if (req.query?.jobParams) { + const { jobParams: queryJobParams } = req.query; if (queryJobParams) { jobParamsRison = queryJobParams; } else { @@ -65,11 +66,11 @@ export function registerGenerateFromJobParams( }); } - const { exportType } = req.params as { exportType: string }; + const { exportType } = req.params; let jobParams; try { - jobParams = rison.decode(jobParamsRison) as object | null; + jobParams = rison.decode(jobParamsRison) as CreateJobBaseParams | null; if (!jobParams) { return res.customError({ statusCode: 400, diff --git a/x-pack/plugins/reporting/server/routes/generate_from_savedobject_immediate.ts b/x-pack/plugins/reporting/server/routes/generate_from_savedobject_immediate.ts index 8250ca462049b..a0a8f25de7fc4 100644 --- a/x-pack/plugins/reporting/server/routes/generate_from_savedobject_immediate.ts +++ b/x-pack/plugins/reporting/server/routes/generate_from_savedobject_immediate.ts @@ -5,16 +5,24 @@ */ import { schema } from '@kbn/config-schema'; +import { KibanaRequest } from 'src/core/server'; import { ReportingCore } from '../'; import { API_BASE_GENERATE_V1 } from '../../common/constants'; import { scheduleTaskFnFactory } from '../export_types/csv_from_savedobject/create_job'; import { runTaskFnFactory } from '../export_types/csv_from_savedobject/execute_job'; +import { JobParamsPostPayloadPanelCsv } from '../export_types/csv_from_savedobject/types'; import { LevelLogger as Logger } from '../lib'; import { TaskRunResult } from '../types'; import { authorizedUserPreRoutingFactory } from './lib/authorized_user_pre_routing'; import { getJobParamsFromRequest } from './lib/get_job_params_from_request'; import { HandlerErrorFunction } from './types'; +export type CsvFromSavedObjectRequest = KibanaRequest< + { savedObjectType: string; savedObjectId: string }, + unknown, + JobParamsPostPayloadPanelCsv +>; + /* * This function registers API Endpoints for immediate Reporting jobs. The API inputs are: * - saved object type and ID @@ -56,7 +64,7 @@ export function registerGenerateCsvFromSavedObjectImmediate( }), }, }, - userHandler(async (user, context, req, res) => { + userHandler(async (user, context, req: CsvFromSavedObjectRequest, res) => { const logger = parentLogger.clone(['savedobject-csv']); const jobParams = getJobParamsFromRequest(req, { isImmediate: true }); const scheduleTaskFn = scheduleTaskFnFactory(reporting, logger); diff --git a/x-pack/plugins/reporting/server/routes/generation.test.ts b/x-pack/plugins/reporting/server/routes/generation.test.ts index 87a696948ad84..cef4da9aabbd4 100644 --- a/x-pack/plugins/reporting/server/routes/generation.test.ts +++ b/x-pack/plugins/reporting/server/routes/generation.test.ts @@ -138,8 +138,7 @@ describe('POST /api/reporting/generate', () => { }); it('returns 500 if job handler throws an error', async () => { - // throw an error from enqueueJob - core.getEnqueueJob = jest.fn().mockRejectedValue('Sorry, this tests says no'); + callClusterStub.withArgs('index').rejects('silly'); registerJobGenerationRoutes(core, mockLogger); diff --git a/x-pack/plugins/reporting/server/routes/generation.ts b/x-pack/plugins/reporting/server/routes/generation.ts index 017e875931ae2..b2115076aada4 100644 --- a/x-pack/plugins/reporting/server/routes/generation.ts +++ b/x-pack/plugins/reporting/server/routes/generation.ts @@ -10,6 +10,7 @@ import { kibanaResponseFactory } from 'src/core/server'; import { ReportingCore } from '../'; import { API_BASE_URL } from '../../common/constants'; import { LevelLogger as Logger } from '../lib'; +import { enqueueJobFactory } from '../lib/enqueue_job'; import { registerGenerateFromJobParams } from './generate_from_jobparams'; import { registerGenerateCsvFromSavedObjectImmediate } from './generate_from_savedobject_immediate'; import { HandlerFunction } from './types'; @@ -43,11 +44,10 @@ export function registerJobGenerationRoutes(reporting: ReportingCore, logger: Lo } try { - const enqueueJob = await reporting.getEnqueueJob(); - const job = await enqueueJob(exportTypeId, jobParams, user, context, req); + const enqueueJob = enqueueJobFactory(reporting, logger); + const report = await enqueueJob(exportTypeId, jobParams, user, context, req); // return the queue's job information - const jobJson = job.toJSON(); const downloadBaseUrl = getDownloadBaseUrl(reporting); return res.ok({ @@ -55,8 +55,8 @@ export function registerJobGenerationRoutes(reporting: ReportingCore, logger: Lo 'content-type': 'application/json', }, body: { - path: `${downloadBaseUrl}/${jobJson.id}`, - job: jobJson, + path: `${downloadBaseUrl}/${report._id}`, + job: report.toApiJSON(), }, }); } catch (err) { diff --git a/x-pack/plugins/reporting/server/routes/lib/get_document_payload.ts b/x-pack/plugins/reporting/server/routes/lib/get_document_payload.ts index d384cbb878a0e..84a98d6d1f1d7 100644 --- a/x-pack/plugins/reporting/server/routes/lib/get_document_payload.ts +++ b/x-pack/plugins/reporting/server/routes/lib/get_document_payload.ts @@ -8,8 +8,7 @@ import contentDisposition from 'content-disposition'; import { get } from 'lodash'; import { CSV_JOB_TYPE } from '../../../common/constants'; -import { statuses } from '../../lib/esqueue/constants/statuses'; -import { ExportTypesRegistry } from '../../lib/export_types_registry'; +import { ExportTypesRegistry, statuses } from '../../lib'; import { ExportTypeDefinition, JobSource, TaskRunResult } from '../../types'; type ExportTypeType = ExportTypeDefinition; @@ -18,11 +17,11 @@ interface ErrorFromPayload { message: string; } -// A camelCase version of TaskRunResult +// interface of the API result interface Payload { statusCode: number; content: string | Buffer | ErrorFromPayload; - contentType: string; + contentType: string | null; headers: Record; } diff --git a/x-pack/plugins/reporting/server/routes/lib/get_job_params_from_request.ts b/x-pack/plugins/reporting/server/routes/lib/get_job_params_from_request.ts index e5c1f38241349..bfa15a4022a4d 100644 --- a/x-pack/plugins/reporting/server/routes/lib/get_job_params_from_request.ts +++ b/x-pack/plugins/reporting/server/routes/lib/get_job_params_from_request.ts @@ -4,21 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KibanaRequest } from 'src/core/server'; -import { - JobParamsPanelCsv, - JobParamsPostPayloadPanelCsv, -} from '../../export_types/csv_from_savedobject/types'; +import { JobParamsPanelCsv } from '../../export_types/csv_from_savedobject/types'; +import { CsvFromSavedObjectRequest } from '../generate_from_savedobject_immediate'; export function getJobParamsFromRequest( - request: KibanaRequest, + request: CsvFromSavedObjectRequest, opts: { isImmediate: boolean } ): JobParamsPanelCsv { - const { savedObjectType, savedObjectId } = request.params as { - savedObjectType: string; - savedObjectId: string; - }; - const { timerange, state } = request.body as JobParamsPostPayloadPanelCsv; + const { savedObjectType, savedObjectId } = request.params; + const { timerange, state } = request.body; const post = timerange || state ? { timerange, state } : undefined; diff --git a/x-pack/plugins/reporting/server/routes/types.d.ts b/x-pack/plugins/reporting/server/routes/types.d.ts index 607ce34ab9465..c92c9fb7eef74 100644 --- a/x-pack/plugins/reporting/server/routes/types.d.ts +++ b/x-pack/plugins/reporting/server/routes/types.d.ts @@ -6,12 +6,12 @@ import { KibanaRequest, KibanaResponseFactory, RequestHandlerContext } from 'src/core/server'; import { AuthenticatedUser } from '../../../security/server'; -import { ScheduledTaskParams } from '../types'; +import { CreateJobBaseParams, ScheduledTaskParams } from '../types'; export type HandlerFunction = ( user: AuthenticatedUser | null, exportType: string, - jobParams: object, + jobParams: CreateJobBaseParams, context: RequestHandlerContext, req: KibanaRequest, res: KibanaResponseFactory diff --git a/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts b/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts index 95b06aa39f07e..c508ee6974ca0 100644 --- a/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts +++ b/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts @@ -8,7 +8,6 @@ jest.mock('../routes'); jest.mock('../usage'); jest.mock('../browsers'); jest.mock('../lib/create_queue'); -jest.mock('../lib/enqueue_job'); jest.mock('../lib/validate'); import * as Rx from 'rxjs'; @@ -19,10 +18,9 @@ import { initializeBrowserDriverFactory, } from '../browsers'; import { ReportingInternalSetup, ReportingInternalStart } from '../core'; -import { ReportingStartDeps } from '../types'; import { ReportingStore } from '../lib'; +import { ReportingStartDeps } from '../types'; import { createMockLevelLogger } from './create_mock_levellogger'; -import { Report } from '../lib/store'; (initializeBrowserDriverFactory as jest.Mock< Promise @@ -30,10 +28,13 @@ import { Report } from '../lib/store'; (chromium as any).createDriverFactory.mockImplementation(() => ({})); -const createMockPluginSetup = (setupMock?: any): ReportingInternalSetup => { +const createMockPluginSetup = ( + mockReportingCore: ReportingCore, + setupMock?: any +): ReportingInternalSetup => { return { elasticsearch: setupMock.elasticsearch || { legacy: { client: {} } }, - basePath: setupMock.basePath, + basePath: setupMock.basePath || '/all-about-that-basepath', router: setupMock.router, security: setupMock.security, licensing: { license$: Rx.of({ isAvailable: true, isActive: true, type: 'basic' }) } as any, @@ -48,7 +49,6 @@ const createMockPluginStart = ( const store = new ReportingStore(mockReportingCore, logger); return { browserDriverFactory: startMock.browserDriverFactory, - enqueueJob: startMock.enqueueJob || jest.fn().mockResolvedValue(new Report({} as any)), esqueue: startMock.esqueue, savedObjects: startMock.savedObjects || { getScopedClient: jest.fn() }, uiSettings: startMock.uiSettings || { asScopedToClient: () => ({ get: jest.fn() }) }, @@ -72,15 +72,14 @@ export const createMockReportingCore = async ( setupDepsMock: ReportingInternalSetup | undefined = undefined, startDepsMock: ReportingInternalStart | undefined = undefined ) => { - if (!setupDepsMock) { - setupDepsMock = createMockPluginSetup({}); - } - const mockReportingCore = { getConfig: () => config, getElasticsearchService: () => setupDepsMock?.elasticsearch, } as ReportingCore; + if (!setupDepsMock) { + setupDepsMock = createMockPluginSetup(mockReportingCore, {}); + } if (!startDepsMock) { startDepsMock = createMockPluginStart(mockReportingCore, {}); } diff --git a/x-pack/plugins/reporting/server/types.ts b/x-pack/plugins/reporting/server/types.ts index ff597b53ea0b0..c9649cb6e558b 100644 --- a/x-pack/plugins/reporting/server/types.ts +++ b/x-pack/plugins/reporting/server/types.ts @@ -19,24 +19,12 @@ import { LevelLogger } from './lib'; import { LayoutInstance } from './lib/layouts'; /* - * Routing / API types + * Routing types */ -interface ListQuery { - page: string; - size: string; - ids?: string; // optional field forbids us from extending RequestQuery -} - -interface GenerateQuery { - jobParams: string; -} - -export type ReportingRequestQuery = ListQuery | GenerateQuery; - export interface ReportingRequestPre { management: { - jobTypes: any; + jobTypes: string[]; }; user: string; } @@ -54,12 +42,14 @@ export interface TimeRangeParams { max?: Date | string | number | null; } +// the "raw" data coming from the client, unencrypted export interface JobParamPostPayload { timerange?: TimeRangeParams; } +// the pre-processed, encrypted data ready for storage export interface ScheduledTaskParams { - headers?: string; // serialized encrypted headers + headers: string; // serialized encrypted headers jobParams: JobParamsType; title: string; type: string; @@ -77,10 +67,10 @@ export interface JobSource { } export interface TaskRunResult { - content_type: string; + content_type: string | null; content: string | null; - size: number; csv_contains_formulas?: boolean; + size: number; max_size_reached?: boolean; warnings?: string[]; } @@ -177,17 +167,29 @@ export type ReportingSetup = object; export type CaptureConfig = ReportingConfigType['capture']; export type ScrollConfig = ReportingConfigType['csv']['scroll']; -export type ESQueueCreateJobFn = ( +export interface CreateJobBaseParams { + browserTimezone: string; + layout?: LayoutInstance; // for screenshot type reports + objectType: string; +} + +export interface CreateJobBaseParamsEncryptedFields extends CreateJobBaseParams { + basePath?: string; // for screenshot type reports + headers: string; // encrypted headers +} + +export type CreateJobFn = ( jobParams: JobParamsType, context: RequestHandlerContext, request: KibanaRequest -) => Promise; +) => Promise; -export type ESQueueWorkerExecuteFn = ( +// rename me +export type WorkerExecuteFn = ( jobId: string, job: ScheduledTaskParamsType, cancellationToken: CancellationToken -) => Promise; +) => Promise; export type ScheduleTaskFnFactory = ( reporting: ReportingCore, From 875f7701c37b0737208fd51e70a9c60f74fea8a3 Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Thu, 13 Aug 2020 16:45:16 -0500 Subject: [PATCH 111/113] Add public url to Workplace Search plugin (#74991) --- x-pack/plugins/enterprise_search/public/plugin.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x-pack/plugins/enterprise_search/public/plugin.ts b/x-pack/plugins/enterprise_search/public/plugin.ts index 74263fb36a958..42ad7de93b00e 100644 --- a/x-pack/plugins/enterprise_search/public/plugin.ts +++ b/x-pack/plugins/enterprise_search/public/plugin.ts @@ -73,6 +73,8 @@ export class EnterpriseSearchPlugin implements Plugin { const { chrome } = coreStart; chrome.docTitle.change(WORKPLACE_SEARCH_PLUGIN.NAME); + await this.setPublicUrl(config, coreStart.http); + const { renderApp } = await import('./applications'); const { WorkplaceSearch } = await import('./applications/workplace_search'); From 1729091ddfa466ddf447c55ef90ddd8c0a87d9a4 Mon Sep 17 00:00:00 2001 From: Robert Austin Date: Thu, 13 Aug 2020 17:50:10 -0400 Subject: [PATCH 112/113] [Resolver] Stale query string values are removed when resolver's component instance ID changes. (#74979) The app can show more than 1 Resolver at a time. Each instance has a unique ID called the `resolverComponentInstanceID`. When the user interacts with Resolver it will add values to the query string. The query string values will contain the `resolverComponentInstanceID`. This allows each Resolver to keep its state separate. When resolver unmounts it will remove any query string values related to it. If Resolver's `resolverComponentInstanceID` changes it should remove query string values related to the old instance ID. It does not. This PR fixes that. Note: I don't know if it was possible for this bug to actually happen. I can't make it happen, but depending on how Resolver is mounted by its consumers it *could* --- .../test_utilities/simulator/index.tsx | 38 +++++--- .../resolver/view/clickthrough.test.tsx | 10 +-- .../public/resolver/view/panel.test.tsx | 8 +- .../public/resolver/view/query_params.test.ts | 89 +++++++++++++++++++ .../view/resolver_without_providers.tsx | 9 +- .../resolver/view/use_query_string_keys.ts | 21 +++++ .../view/use_resolver_query_params.ts | 64 ++++--------- .../view/use_resolver_query_params_cleaner.ts | 53 +++++++++++ 8 files changed, 220 insertions(+), 72 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/resolver/view/query_params.test.ts create mode 100644 x-pack/plugins/security_solution/public/resolver/view/use_query_string_keys.ts create mode 100644 x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params_cleaner.ts diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx index 355b53e374092..14cdc26c80f53 100644 --- a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx @@ -22,10 +22,6 @@ import { sideEffectSimulatorFactory } from '../../view/side_effect_simulator_fac * Test a Resolver instance using jest, enzyme, and a mock data layer. */ export class Simulator { - /** - * A string that uniquely identifies this Resolver instance among others mounted in the DOM. - */ - private readonly resolverComponentInstanceID: string; /** * The redux store, creating in the constructor using the `dataAccessLayer`. * This code subscribes to state transitions. @@ -69,7 +65,6 @@ export class Simulator { databaseDocumentID?: string; history?: HistoryPackageHistoryInterface; }) { - this.resolverComponentInstanceID = resolverComponentInstanceID; // create the spy middleware (for debugging tests) this.spyMiddleware = spyMiddlewareFactory(); @@ -98,7 +93,7 @@ export class Simulator { // Render Resolver via the `MockResolver` component, using `enzyme`. this.wrapper = mount( ({ // the query string has a key showing that the second child is selected - queryStringSelectedNode: simulator.queryStringValues().selectedNode, + search: simulator.historyLocationSearch, // the second child is rendered in the DOM, and shows up as selected selectedSecondChildNodeCount: simulator.selectedProcessNode(entityIDs.secondChild) .length, @@ -102,7 +103,9 @@ describe('Resolver, when analyzing a tree that has no ancestors and 2 children', })) ).toYieldEqualTo({ // Just the second child should be marked as selected in the query string - queryStringSelectedNode: [entityIDs.secondChild], + search: urlSearch(resolverComponentInstanceID, { + selectedEntityID: entityIDs.secondChild, + }), // The second child is rendered and has `[aria-selected]` selectedSecondChildNodeCount: 1, // The origin child is rendered and doesn't have `[aria-selected]` @@ -175,9 +178,6 @@ describe('Resolver, when analyzing a tree that has two related events for the or simulator.testSubject('resolver:map:node-submenu-item').map((node) => node.text()) ) ).toYieldEqualTo(['2 registry']); - await expect( - simulator.map(() => simulator.testSubject('resolver:map:node-submenu-item').length) - ).toYieldEqualTo(1); }); }); describe('and when the related events button is clicked again', () => { diff --git a/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx index 21b5a30ee9890..037337fb2f868 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx @@ -152,9 +152,11 @@ describe(`Resolver: when analyzing a tree with no ancestors and two children, an ]); }); it("should have the first node's ID in the query string", async () => { - await expect(simulator().map(() => simulator().queryStringValues())).toYieldEqualTo({ - selectedNode: [entityIDs.origin], - }); + await expect(simulator().map(() => simulator().historyLocationSearch)).toYieldEqualTo( + urlSearch(resolverComponentInstanceID, { + selectedEntityID: entityIDs.origin, + }) + ); }); describe('and when the node list link has been clicked', () => { beforeEach(async () => { diff --git a/x-pack/plugins/security_solution/public/resolver/view/query_params.test.ts b/x-pack/plugins/security_solution/public/resolver/view/query_params.test.ts new file mode 100644 index 0000000000000..26c25cfab2c21 --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/view/query_params.test.ts @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { noAncestorsTwoChildren } from '../data_access_layer/mocks/no_ancestors_two_children'; +import { Simulator } from '../test_utilities/simulator'; +// Extend jest with a custom matcher +import '../test_utilities/extend_jest'; +import { urlSearch } from '../test_utilities/url_search'; + +let simulator: Simulator; +let databaseDocumentID: string; +let entityIDs: { origin: string; firstChild: string; secondChild: string }; + +// the resolver component instance ID, used by the react code to distinguish piece of global state from those used by other resolver instances +const resolverComponentInstanceID = 'oldID'; + +describe('Resolver, when analyzing a tree that has no ancestors and 2 children', () => { + beforeEach(async () => { + // create a mock data access layer + const { metadata: dataAccessLayerMetadata, dataAccessLayer } = noAncestorsTwoChildren(); + + // save a reference to the entity IDs exposed by the mock data layer + entityIDs = dataAccessLayerMetadata.entityIDs; + + // save a reference to the `_id` supported by the mock data layer + databaseDocumentID = dataAccessLayerMetadata.databaseDocumentID; + + // create a resolver simulator, using the data access layer and an arbitrary component instance ID + simulator = new Simulator({ databaseDocumentID, dataAccessLayer, resolverComponentInstanceID }); + }); + + describe("when the second child node's first button has been clicked", () => { + beforeEach(async () => { + const node = await simulator.resolveWrapper(() => + simulator.processNodeElements({ entityID: entityIDs.secondChild }).find('button') + ); + if (node) { + // Click the first button under the second child element. + node.first().simulate('click'); + } + }); + const expectedSearch = urlSearch(resolverComponentInstanceID, { + selectedEntityID: 'secondChild', + }); + it(`should have a url search of ${expectedSearch}`, async () => { + await expect(simulator.map(() => simulator.historyLocationSearch)).toYieldEqualTo( + urlSearch(resolverComponentInstanceID, { selectedEntityID: 'secondChild' }) + ); + }); + describe('when the resolver component gets unmounted', () => { + beforeEach(() => { + simulator.unmount(); + }); + it('should have a history location search of `""`', async () => { + await expect(simulator.map(() => simulator.historyLocationSearch)).toYieldEqualTo(''); + }); + }); + describe('when the resolver component has its component instance ID changed', () => { + const newInstanceID = 'newID'; + beforeEach(() => { + simulator.resolverComponentInstanceID = newInstanceID; + }); + it('should have a history location search of `""`', async () => { + await expect(simulator.map(() => simulator.historyLocationSearch)).toYieldEqualTo(''); + }); + describe("when the user clicks the second child node's button again", () => { + beforeEach(async () => { + const node = await simulator.resolveWrapper(() => + simulator.processNodeElements({ entityID: entityIDs.secondChild }).find('button') + ); + if (node) { + // Click the first button under the second child element. + node.first().simulate('click'); + } + }); + it(`should have a url search of ${urlSearch(newInstanceID, { + selectedEntityID: 'secondChild', + })}`, async () => { + await expect(simulator.map(() => simulator.historyLocationSearch)).toYieldEqualTo( + urlSearch(newInstanceID, { selectedEntityID: 'secondChild' }) + ); + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx b/x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx index 5f1e5f18e575d..32faeec043f2d 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx @@ -8,9 +8,9 @@ import React, { useContext, useCallback } from 'react'; import { useSelector } from 'react-redux'; -import { useEffectOnce } from 'react-use'; import { EuiLoadingSpinner } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; +import { useResolverQueryParamCleaner } from './use_resolver_query_params_cleaner'; import * as selectors from '../store/selectors'; import { EdgeLine } from './edge_line'; import { GraphControls } from './graph_controls'; @@ -18,7 +18,6 @@ import { ProcessEventDot } from './process_event_dot'; import { useCamera } from './use_camera'; import { SymbolDefinitions, useResolverTheme } from './assets'; import { useStateSyncingActions } from './use_state_syncing_actions'; -import { useResolverQueryParams } from './use_resolver_query_params'; import { StyledMapContainer, StyledPanel, GraphContainer } from './styles'; import { entityIDSafeVersion } from '../../../common/endpoint/models/event'; import { SideEffectContext } from './side_effect_context'; @@ -35,6 +34,7 @@ export const ResolverWithoutProviders = React.memo( { className, databaseDocumentID, resolverComponentInstanceID }: ResolverProps, refToForward ) { + useResolverQueryParamCleaner(); /** * This is responsible for dispatching actions that include any external data. * `databaseDocumentID` @@ -70,11 +70,6 @@ export const ResolverWithoutProviders = React.memo( const hasError = useSelector(selectors.hasError); const activeDescendantId = useSelector(selectors.ariaActiveDescendant); const { colorMap } = useResolverTheme(); - const { cleanUpQueryParams } = useResolverQueryParams(); - - useEffectOnce(() => { - return () => cleanUpQueryParams(); - }); return ( diff --git a/x-pack/plugins/security_solution/public/resolver/view/use_query_string_keys.ts b/x-pack/plugins/security_solution/public/resolver/view/use_query_string_keys.ts new file mode 100644 index 0000000000000..11f1a30db72fc --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/view/use_query_string_keys.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useSelector } from 'react-redux'; +import * as selectors from '../store/selectors'; + +/** + * Get the query string keys used by this Resolver instance. + */ +export function useQueryStringKeys(): { idKey: string; eventKey: string } { + const resolverComponentInstanceID = useSelector(selectors.resolverComponentInstanceID); + const idKey: string = `resolver-${resolverComponentInstanceID}-id`; + const eventKey: string = `resolver-${resolverComponentInstanceID}-event`; + return { + idKey, + eventKey, + }; +} diff --git a/x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params.ts b/x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params.ts index ed514a61d4e06..aa0851916a7b4 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params.ts +++ b/x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params.ts @@ -5,11 +5,8 @@ */ import { useCallback, useMemo } from 'react'; -// eslint-disable-next-line import/no-nodejs-modules -import querystring from 'querystring'; -import { useSelector } from 'react-redux'; import { useHistory, useLocation } from 'react-router-dom'; -import * as selectors from '../store/selectors'; +import { useQueryStringKeys } from './use_query_string_keys'; import { CrumbInfo } from './panels/panel_content_utilities'; export function useResolverQueryParams() { @@ -19,63 +16,40 @@ export function useResolverQueryParams() { */ const history = useHistory(); const urlSearch = useLocation().search; - const resolverComponentInstanceID = useSelector(selectors.resolverComponentInstanceID); - const uniqueCrumbIdKey: string = `resolver-${resolverComponentInstanceID}-id`; - const uniqueCrumbEventKey: string = `resolver-${resolverComponentInstanceID}-event`; + const { idKey, eventKey } = useQueryStringKeys(); const pushToQueryParams = useCallback( - (newCrumbs: CrumbInfo) => { - // Construct a new set of parameters from the current set (minus empty parameters) - // by assigning the new set of parameters provided in `newCrumbs` - const crumbsToPass = { - ...querystring.parse(urlSearch.slice(1)), - [uniqueCrumbIdKey]: newCrumbs.crumbId, - [uniqueCrumbEventKey]: newCrumbs.crumbEvent, - }; + (queryStringState: CrumbInfo) => { + const urlSearchParams = new URLSearchParams(urlSearch); - // If either was passed in as empty, remove it from the record - if (newCrumbs.crumbId === '') { - delete crumbsToPass[uniqueCrumbIdKey]; + urlSearchParams.set(idKey, queryStringState.crumbId); + urlSearchParams.set(eventKey, queryStringState.crumbEvent); + + // If either was passed in as empty, remove it + if (queryStringState.crumbId === '') { + urlSearchParams.delete(idKey); } - if (newCrumbs.crumbEvent === '') { - delete crumbsToPass[uniqueCrumbEventKey]; + if (queryStringState.crumbEvent === '') { + urlSearchParams.delete(eventKey); } - const relativeURL = { search: querystring.stringify(crumbsToPass) }; + const relativeURL = { search: urlSearchParams.toString() }; // We probably don't want to nuke the user's history with a huge // trail of these, thus `.replace` instead of `.push` return history.replace(relativeURL); }, - [history, urlSearch, uniqueCrumbIdKey, uniqueCrumbEventKey] + [history, urlSearch, idKey, eventKey] ); const queryParams: CrumbInfo = useMemo(() => { - const parsed = querystring.parse(urlSearch.slice(1)); - const crumbEvent = parsed[uniqueCrumbEventKey]; - const crumbId = parsed[uniqueCrumbIdKey]; - function valueForParam(param: string | string[]): string { - if (Array.isArray(param)) { - return param[0] || ''; - } - return param || ''; - } + const urlSearchParams = new URLSearchParams(urlSearch); return { - crumbEvent: valueForParam(crumbEvent), - crumbId: valueForParam(crumbId), + // Use `''` for backwards compatibility with deprecated code. + crumbEvent: urlSearchParams.get(eventKey) ?? '', + crumbId: urlSearchParams.get(idKey) ?? '', }; - }, [urlSearch, uniqueCrumbIdKey, uniqueCrumbEventKey]); - - const cleanUpQueryParams = () => { - const crumbsToPass = { - ...querystring.parse(urlSearch.slice(1)), - }; - delete crumbsToPass[uniqueCrumbIdKey]; - delete crumbsToPass[uniqueCrumbEventKey]; - const relativeURL = { search: querystring.stringify(crumbsToPass) }; - history.replace(relativeURL); - }; + }, [urlSearch, idKey, eventKey]); return { pushToQueryParams, queryParams, - cleanUpQueryParams, }; } diff --git a/x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params_cleaner.ts b/x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params_cleaner.ts new file mode 100644 index 0000000000000..a84eb0490aae2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params_cleaner.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useRef, useEffect } from 'react'; +import { useLocation, useHistory } from 'react-router-dom'; + +import { useQueryStringKeys } from './use_query_string_keys'; +/** + * Cleanup any query string keys that were added by this Resolver instance. + * This works by having a React effect that just has behavior in the 'cleanup' function. + */ +export function useResolverQueryParamCleaner() { + /** + * Keep a reference to the current search value. This is used in the cleanup function. + * This value of useLocation().search isn't used directly since that would change and + * we only want the cleanup to run on unmount or when the resolverComponentInstanceID + * changes. + */ + const searchRef = useRef(); + searchRef.current = useLocation().search; + + const history = useHistory(); + + const { idKey, eventKey } = useQueryStringKeys(); + + useEffect(() => { + /** + * Keep track of the old query string keys so we can remove them. + */ + const oldIdKey = idKey; + const oldEventKey = eventKey; + /** + * When `idKey` or `eventKey` changes (such as when the `resolverComponentInstanceID` has changed) or when the component unmounts, remove any state from the query string. + */ + return () => { + /** + * This effect must not be invalidated when `search` changes. + */ + const urlSearchParams = new URLSearchParams(searchRef.current); + + /** + * Remove old keys from the url + */ + urlSearchParams.delete(oldIdKey); + urlSearchParams.delete(oldEventKey); + const relativeURL = { search: urlSearchParams.toString() }; + history.replace(relativeURL); + }; + }, [idKey, eventKey, history]); +} From 447854d992883f6dafc27743372701452ce7e8c4 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Thu, 13 Aug 2020 15:06:59 -0700 Subject: [PATCH 113/113] [Reporting/Functional] unskip pagination test (#74973) * [Reporting/Functional] unskip pagination test * change to js file for flaky test runner * fix ts --- .../__snapshots__/report_listing.test.tsx.snap | 3 --- .../reporting/public/components/report_listing.tsx | 1 - .../reporting_management/{index.ts => index.js} | 4 +--- .../apps/reporting_management/report_listing.ts | 14 ++++++++++---- 4 files changed, 11 insertions(+), 11 deletions(-) rename x-pack/test/functional/apps/reporting_management/{index.ts => index.js} (75%) diff --git a/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap b/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap index 66c3aea8acc13..ddba7842f1199 100644 --- a/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap +++ b/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap @@ -30,7 +30,6 @@ Array [ }, ] } - data-test-page={0} data-test-subj="reportJobListing" isSelectable={true} itemId="id" @@ -57,7 +56,6 @@ Array [ >
    @@ -368,7 +366,6 @@ Array [ ,
    diff --git a/x-pack/plugins/reporting/public/components/report_listing.tsx b/x-pack/plugins/reporting/public/components/report_listing.tsx index 80ef9311fd0e5..afcae93a8db16 100644 --- a/x-pack/plugins/reporting/public/components/report_listing.tsx +++ b/x-pack/plugins/reporting/public/components/report_listing.tsx @@ -513,7 +513,6 @@ class ReportListingUi extends Component { isSelectable={true} onChange={this.onTableChange} data-test-subj="reportJobListing" - data-test-page={this.state.page} /> {this.state.selectedJobs.length > 0 ? this.renderDeleteButton() : null} diff --git a/x-pack/test/functional/apps/reporting_management/index.ts b/x-pack/test/functional/apps/reporting_management/index.js similarity index 75% rename from x-pack/test/functional/apps/reporting_management/index.ts rename to x-pack/test/functional/apps/reporting_management/index.js index 8606c46053ab0..ef92e7d04ef0c 100644 --- a/x-pack/test/functional/apps/reporting_management/index.ts +++ b/x-pack/test/functional/apps/reporting_management/index.js @@ -4,9 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default ({ loadTestFile }: FtrProviderContext) => { +export default ({ loadTestFile }) => { describe('reporting management app', function () { this.tags('ciGroup7'); loadTestFile(require.resolve('./report_listing')); diff --git a/x-pack/test/functional/apps/reporting_management/report_listing.ts b/x-pack/test/functional/apps/reporting_management/report_listing.ts index 476f3e73d0923..ca5fb888e67e1 100644 --- a/x-pack/test/functional/apps/reporting_management/report_listing.ts +++ b/x-pack/test/functional/apps/reporting_management/report_listing.ts @@ -26,7 +26,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const security = getService('security'); const testSubjects = getService('testSubjects'); - const findInstance = getService('find'); const esArchiver = getService('esArchiver'); describe('Listing of Reports', function () { @@ -68,7 +67,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); - it.skip('Paginates content', async () => { + it('Paginates historical reports', async () => { + // wait for first row of page 1 + await testSubjects.find('checkboxSelectRow-k9a9xlwl0gpe1457b10rraq3'); + const previousButton = await testSubjects.find('pagination-button-previous'); // previous CAN NOT be clicked @@ -90,7 +92,9 @@ pdf\ndashboard\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:0 // click page 2 await testSubjects.click('pagination-button-1'); - await findInstance.byCssSelector('[data-test-page="1"]'); + + // wait for first row of page 2 + await testSubjects.find('checkboxSelectRow-k9a9uc4x0gpe1457b16wthc8'); // previous CAN be clicked expect(await previousButton.getAttribute('disabled')).to.be(null); @@ -110,7 +114,9 @@ test_user\nCompleted at 2020-04-21 @ 06:55 PM - Max size reached\nreport2csv\n20 // click page 3 await testSubjects.click('pagination-button-2'); - await findInstance.byCssSelector('[data-test-page="2"]'); + + // wait for first row of page 3 + await testSubjects.find('checkboxSelectRow-k9a9p1840gpe1457b1ghfxw5'); // scan page 3 tableText = await getTableTextFromElement(await testSubjects.find('reportJobListing'));