@depup/aws-cdk 2.1117.0-depup.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +25 -0
- package/THIRD_PARTY_LICENSES +24866 -0
- package/bin/cdk +6 -0
- package/build-info.json +4 -0
- package/changes.json +5 -0
- package/db.json.gz +0 -0
- package/docs/deploy-architecture.md +194 -0
- package/lib/api/aws-auth.d.ts +3 -0
- package/lib/api/aws-auth.js +21 -0
- package/lib/api/bootstrap/bootstrap-template.yaml +855 -0
- package/lib/api/bootstrap.d.ts +1 -0
- package/lib/api/bootstrap.js +19 -0
- package/lib/api/cloud-assembly.d.ts +5 -0
- package/lib/api/cloud-assembly.js +23 -0
- package/lib/api/cloudformation.d.ts +1 -0
- package/lib/api/cloudformation.js +19 -0
- package/lib/api/context.d.ts +1 -0
- package/lib/api/context.js +19 -0
- package/lib/api/deployments.d.ts +1 -0
- package/lib/api/deployments.js +19 -0
- package/lib/api/hotswap.d.ts +1 -0
- package/lib/api/hotswap.js +19 -0
- package/lib/api/index.d.ts +16 -0
- package/lib/api/index.js +38 -0
- package/lib/api/network-detector.d.ts +1 -0
- package/lib/api/network-detector.js +19 -0
- package/lib/api/notices.d.ts +1 -0
- package/lib/api/notices.js +19 -0
- package/lib/api/plugin.d.ts +1 -0
- package/lib/api/plugin.js +19 -0
- package/lib/api/refactor.d.ts +1 -0
- package/lib/api/refactor.js +8 -0
- package/lib/api/settings.d.ts +1 -0
- package/lib/api/settings.js +19 -0
- package/lib/api/tags.d.ts +1 -0
- package/lib/api/tags.js +19 -0
- package/lib/api-private.d.ts +9 -0
- package/lib/api-private.js +29 -0
- package/lib/cli/cdk-toolkit.d.ts +699 -0
- package/lib/cli/cdk-toolkit.js +1260 -0
- package/lib/cli/ci-systems.d.ts +29 -0
- package/lib/cli/ci-systems.js +61 -0
- package/lib/cli/cli-config.d.ts +10 -0
- package/lib/cli/cli-config.js +556 -0
- package/lib/cli/cli-type-registry.json +1147 -0
- package/lib/cli/cli.d.ts +3 -0
- package/lib/cli/cli.js +746 -0
- package/lib/cli/convert-to-user-input.d.ts +3 -0
- package/lib/cli/convert-to-user-input.js +560 -0
- package/lib/cli/display-version.d.ts +11 -0
- package/lib/cli/display-version.js +101 -0
- package/lib/cli/io-host/cli-io-host.d.ts +191 -0
- package/lib/cli/io-host/cli-io-host.js +477 -0
- package/lib/cli/io-host/index.d.ts +1 -0
- package/lib/cli/io-host/index.js +18 -0
- package/lib/cli/parse-command-line-arguments.d.ts +1 -0
- package/lib/cli/parse-command-line-arguments.js +1067 -0
- package/lib/cli/platform-warnings.d.ts +3 -0
- package/lib/cli/platform-warnings.js +44 -0
- package/lib/cli/pretty-print-error.d.ts +1 -0
- package/lib/cli/pretty-print-error.js +37 -0
- package/lib/cli/proxy-agent.d.ts +30 -0
- package/lib/cli/proxy-agent.js +52 -0
- package/lib/cli/root-dir.d.ts +10 -0
- package/lib/cli/root-dir.js +23 -0
- package/lib/cli/singleton-plugin-host.d.ts +7 -0
- package/lib/cli/singleton-plugin-host.js +11 -0
- package/lib/cli/tables.d.ts +1 -0
- package/lib/cli/tables.js +10 -0
- package/lib/cli/telemetry/collect-telemetry.d.ts +5 -0
- package/lib/cli/telemetry/collect-telemetry.js +16 -0
- package/lib/cli/telemetry/error.d.ts +15 -0
- package/lib/cli/telemetry/error.js +68 -0
- package/lib/cli/telemetry/feature-flags.d.ts +96 -0
- package/lib/cli/telemetry/feature-flags.js +103 -0
- package/lib/cli/telemetry/installation-id.d.ts +5 -0
- package/lib/cli/telemetry/installation-id.js +47 -0
- package/lib/cli/telemetry/library-version.d.ts +2 -0
- package/lib/cli/telemetry/library-version.js +30 -0
- package/lib/cli/telemetry/messages.d.ts +43 -0
- package/lib/cli/telemetry/messages.js +60 -0
- package/lib/cli/telemetry/sanitation.d.ts +100 -0
- package/lib/cli/telemetry/sanitation.js +79 -0
- package/lib/cli/telemetry/schema.d.ts +85 -0
- package/lib/cli/telemetry/schema.js +3 -0
- package/lib/cli/telemetry/session.d.ts +67 -0
- package/lib/cli/telemetry/session.js +174 -0
- package/lib/cli/telemetry/sink/endpoint-sink.d.ts +44 -0
- package/lib/cli/telemetry/sink/endpoint-sink.js +105 -0
- package/lib/cli/telemetry/sink/file-sink.d.ts +32 -0
- package/lib/cli/telemetry/sink/file-sink.js +43 -0
- package/lib/cli/telemetry/sink/funnel.d.ts +16 -0
- package/lib/cli/telemetry/sink/funnel.js +29 -0
- package/lib/cli/telemetry/sink/io-host-sink.d.ts +27 -0
- package/lib/cli/telemetry/sink/io-host-sink.js +35 -0
- package/lib/cli/telemetry/sink/sink-interface.d.ts +18 -0
- package/lib/cli/telemetry/sink/sink-interface.js +3 -0
- package/lib/cli/user-configuration.d.ts +104 -0
- package/lib/cli/user-configuration.js +334 -0
- package/lib/cli/user-input.d.ts +1505 -0
- package/lib/cli/user-input.js +3 -0
- package/lib/cli/util/ci.d.ts +5 -0
- package/lib/cli/util/ci.js +11 -0
- package/lib/cli/util/console-formatters.d.ts +18 -0
- package/lib/cli/util/console-formatters.js +42 -0
- package/lib/cli/util/guess-agent.d.ts +7 -0
- package/lib/cli/util/guess-agent.js +32 -0
- package/lib/cli/util/npm.d.ts +4 -0
- package/lib/cli/util/npm.js +34 -0
- package/lib/cli/util/trap-errors.d.ts +6 -0
- package/lib/cli/util/trap-errors.js +17 -0
- package/lib/cli/util/yargs-helpers.d.ts +22 -0
- package/lib/cli/util/yargs-helpers.js +49 -0
- package/lib/cli/version.d.ts +3 -0
- package/lib/cli/version.js +22 -0
- package/lib/commands/context.d.ts +40 -0
- package/lib/commands/context.js +158 -0
- package/lib/commands/deploy.d.ts +13 -0
- package/lib/commands/deploy.js +18 -0
- package/lib/commands/docs.d.ts +18 -0
- package/lib/commands/docs.js +33 -0
- package/lib/commands/doctor.d.ts +4 -0
- package/lib/commands/doctor.js +69 -0
- package/lib/commands/flags/flags.d.ts +13 -0
- package/lib/commands/flags/flags.js +30 -0
- package/lib/commands/flags/interactive-handler.d.ts +16 -0
- package/lib/commands/flags/interactive-handler.js +71 -0
- package/lib/commands/flags/obsolete-flags.d.ts +1 -0
- package/lib/commands/flags/obsolete-flags.js +9 -0
- package/lib/commands/flags/operations.d.ts +80 -0
- package/lib/commands/flags/operations.js +467 -0
- package/lib/commands/flags/router.d.ts +18 -0
- package/lib/commands/flags/router.js +60 -0
- package/lib/commands/flags/types.d.ts +12 -0
- package/lib/commands/flags/types.js +12 -0
- package/lib/commands/flags/validator.d.ts +22 -0
- package/lib/commands/flags/validator.js +95 -0
- package/lib/commands/init/index.d.ts +1 -0
- package/lib/commands/init/index.js +18 -0
- package/lib/commands/init/init-hooks.d.ts +41 -0
- package/lib/commands/init/init-hooks.js +85 -0
- package/lib/commands/init/init.d.ts +139 -0
- package/lib/commands/init/init.js +788 -0
- package/lib/commands/init/os.d.ts +8 -0
- package/lib/commands/init/os.js +91 -0
- package/lib/commands/init/package-manager.d.ts +15 -0
- package/lib/commands/init/package-manager.js +14 -0
- package/lib/commands/language.d.ts +30 -0
- package/lib/commands/language.js +46 -0
- package/lib/commands/list-stacks.d.ts +21 -0
- package/lib/commands/list-stacks.js +28 -0
- package/lib/commands/migrate.d.ts +316 -0
- package/lib/commands/migrate.js +801 -0
- package/lib/context-providers.d.ts +1 -0
- package/lib/context-providers.js +19 -0
- package/lib/cxapp/cloud-assembly.d.ts +79 -0
- package/lib/cxapp/cloud-assembly.js +109 -0
- package/lib/cxapp/cloud-executable.d.ts +51 -0
- package/lib/cxapp/cloud-executable.js +123 -0
- package/lib/cxapp/environments.d.ts +8 -0
- package/lib/cxapp/environments.js +66 -0
- package/lib/cxapp/exec.d.ts +14 -0
- package/lib/cxapp/exec.js +133 -0
- package/lib/cxapp/index.d.ts +4 -0
- package/lib/cxapp/index.js +21 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +364043 -0
- package/lib/index_bg.wasm +0 -0
- package/lib/init-templates/.init-version.json +1 -0
- package/lib/init-templates/.no-packagejson-validator +0 -0
- package/lib/init-templates/.recommended-feature-flags.json +86 -0
- package/lib/init-templates/LICENSE +16 -0
- package/lib/init-templates/app/csharp/.template.gitignore +342 -0
- package/lib/init-templates/app/csharp/README.md +14 -0
- package/lib/init-templates/app/csharp/cdk.template.json +15 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +20 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.cs +13 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/GlobalSuppressions.cs +1 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/Program.template.cs +44 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/app/fsharp/.template.gitignore +342 -0
- package/lib/init-templates/app/fsharp/README.md +18 -0
- package/lib/init-templates/app/fsharp/cdk.template.json +14 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +25 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.fs +8 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/Program.template.fs +11 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/app/go/%name%.template.go +70 -0
- package/lib/init-templates/app/go/%name%_test.template.go +26 -0
- package/lib/init-templates/app/go/.template.gitignore +19 -0
- package/lib/init-templates/app/go/README.md +12 -0
- package/lib/init-templates/app/go/cdk.template.json +13 -0
- package/lib/init-templates/app/go/go.template.mod +9 -0
- package/lib/init-templates/app/info.json +4 -0
- package/lib/init-templates/app/java/.template.gitignore +13 -0
- package/lib/init-templates/app/java/README.md +18 -0
- package/lib/init-templates/app/java/cdk.json +13 -0
- package/lib/init-templates/app/java/pom.xml +60 -0
- package/lib/init-templates/app/java/src/main/java/com/myorg/%name.PascalCased%App.template.java +42 -0
- package/lib/init-templates/app/java/src/main/java/com/myorg/%name.PascalCased%Stack.template.java +24 -0
- package/lib/init-templates/app/java/src/test/java/com/myorg/%name.PascalCased%Test.template.java +26 -0
- package/lib/init-templates/app/javascript/.template.gitignore +5 -0
- package/lib/init-templates/app/javascript/.template.npmignore +3 -0
- package/lib/init-templates/app/javascript/README.md +12 -0
- package/lib/init-templates/app/javascript/bin/%name%.template.js +21 -0
- package/lib/init-templates/app/javascript/cdk.template.json +15 -0
- package/lib/init-templates/app/javascript/jest.config.js +4 -0
- package/lib/init-templates/app/javascript/lib/%name%-stack.template.js +23 -0
- package/lib/init-templates/app/javascript/package.json +20 -0
- package/lib/init-templates/app/javascript/test/%name%.test.template.js +17 -0
- package/lib/init-templates/app/python/%name.PythonModule%/%name.PythonModule%_stack.template.py +19 -0
- package/lib/init-templates/app/python/%name.PythonModule%/__init__.py +0 -0
- package/lib/init-templates/app/python/.template.gitignore +10 -0
- package/lib/init-templates/app/python/README.template.md +58 -0
- package/lib/init-templates/app/python/app.template.py +28 -0
- package/lib/init-templates/app/python/cdk.template.json +15 -0
- package/lib/init-templates/app/python/requirements-dev.txt +1 -0
- package/lib/init-templates/app/python/requirements.txt +2 -0
- package/lib/init-templates/app/python/source.bat +13 -0
- package/lib/init-templates/app/python/tests/__init__.py +0 -0
- package/lib/init-templates/app/python/tests/unit/__init__.py +0 -0
- package/lib/init-templates/app/python/tests/unit/test_%name.PythonModule%_stack.template.py +15 -0
- package/lib/init-templates/app/typescript/.template.gitignore +8 -0
- package/lib/init-templates/app/typescript/.template.npmignore +6 -0
- package/lib/init-templates/app/typescript/README.md +14 -0
- package/lib/init-templates/app/typescript/bin/%name%.template.ts +20 -0
- package/lib/init-templates/app/typescript/cdk.template.json +17 -0
- package/lib/init-templates/app/typescript/jest.config.js +9 -0
- package/lib/init-templates/app/typescript/lib/%name%-stack.template.ts +16 -0
- package/lib/init-templates/app/typescript/package.json +26 -0
- package/lib/init-templates/app/typescript/test/%name%.test.template.ts +17 -0
- package/lib/init-templates/app/typescript/tsconfig.json +32 -0
- package/lib/init-templates/lib/info.json +4 -0
- package/lib/init-templates/lib/typescript/.template.gitignore +8 -0
- package/lib/init-templates/lib/typescript/.template.npmignore +6 -0
- package/lib/init-templates/lib/typescript/README.template.md +12 -0
- package/lib/init-templates/lib/typescript/jest.config.js +9 -0
- package/lib/init-templates/lib/typescript/lib/index.template.ts +21 -0
- package/lib/init-templates/lib/typescript/package.json +24 -0
- package/lib/init-templates/lib/typescript/test/%name%.test.template.ts +18 -0
- package/lib/init-templates/lib/typescript/tsconfig.json +32 -0
- package/lib/init-templates/sample-app/csharp/.template.gitignore +342 -0
- package/lib/init-templates/sample-app/csharp/README.template.md +19 -0
- package/lib/init-templates/sample-app/csharp/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +20 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.cs +24 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/GlobalSuppressions.cs +1 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/Program.template.cs +15 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/sample-app/fsharp/.template.gitignore +342 -0
- package/lib/init-templates/sample-app/fsharp/README.template.md +20 -0
- package/lib/init-templates/sample-app/fsharp/cdk.template.json +14 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +25 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.fs +14 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/Program.template.fs +11 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/sample-app/go/%name%.template.go +73 -0
- package/lib/init-templates/sample-app/go/%name%_test.template.go +25 -0
- package/lib/init-templates/sample-app/go/.template.gitignore +19 -0
- package/lib/init-templates/sample-app/go/README.md +12 -0
- package/lib/init-templates/sample-app/go/cdk.template.json +13 -0
- package/lib/init-templates/sample-app/go/go.template.mod +9 -0
- package/lib/init-templates/sample-app/info.json +4 -0
- package/lib/init-templates/sample-app/java/.template.gitignore +13 -0
- package/lib/init-templates/sample-app/java/README.template.md +19 -0
- package/lib/init-templates/sample-app/java/cdk.json +13 -0
- package/lib/init-templates/sample-app/java/pom.xml +55 -0
- package/lib/init-templates/sample-app/java/src/main/java/com/myorg/%name.PascalCased%App.template.java +13 -0
- package/lib/init-templates/sample-app/java/src/main/java/com/myorg/%name.PascalCased%Stack.template.java +29 -0
- package/lib/init-templates/sample-app/java/src/test/java/com/myorg/%name.PascalCased%StackTest.template.java +27 -0
- package/lib/init-templates/sample-app/javascript/.template.gitignore +5 -0
- package/lib/init-templates/sample-app/javascript/.template.npmignore +3 -0
- package/lib/init-templates/sample-app/javascript/README.template.md +13 -0
- package/lib/init-templates/sample-app/javascript/bin/%name%.template.js +6 -0
- package/lib/init-templates/sample-app/javascript/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/javascript/jest.config.js +4 -0
- package/lib/init-templates/sample-app/javascript/lib/%name%-stack.template.js +25 -0
- package/lib/init-templates/sample-app/javascript/package.json +20 -0
- package/lib/init-templates/sample-app/javascript/test/%name%.test.template.js +16 -0
- package/lib/init-templates/sample-app/javascript/tsconfig.json +34 -0
- package/lib/init-templates/sample-app/python/%name.PythonModule%/%name.PythonModule%_stack.template.py +26 -0
- package/lib/init-templates/sample-app/python/%name.PythonModule%/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/.template.gitignore +22 -0
- package/lib/init-templates/sample-app/python/README.template.md +65 -0
- package/lib/init-templates/sample-app/python/app.template.py +11 -0
- package/lib/init-templates/sample-app/python/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/python/requirements-dev.txt +1 -0
- package/lib/init-templates/sample-app/python/requirements.txt +2 -0
- package/lib/init-templates/sample-app/python/source.bat +13 -0
- package/lib/init-templates/sample-app/python/tests/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/tests/unit/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/tests/unit/test_%name.PythonModule%_stack.template.py +21 -0
- package/lib/init-templates/sample-app/typescript/.template.gitignore +8 -0
- package/lib/init-templates/sample-app/typescript/.template.npmignore +6 -0
- package/lib/init-templates/sample-app/typescript/README.template.md +15 -0
- package/lib/init-templates/sample-app/typescript/bin/%name%.template.ts +6 -0
- package/lib/init-templates/sample-app/typescript/cdk.template.json +17 -0
- package/lib/init-templates/sample-app/typescript/jest.config.js +9 -0
- package/lib/init-templates/sample-app/typescript/lib/%name%-stack.template.ts +19 -0
- package/lib/init-templates/sample-app/typescript/package.json +26 -0
- package/lib/init-templates/sample-app/typescript/test/%name%.test.template.ts +17 -0
- package/lib/init-templates/sample-app/typescript/tsconfig.json +32 -0
- package/lib/util.d.ts +1 -0
- package/lib/util.js +19 -0
- package/package.json +170 -0
- package/release.txt +2 -0
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FlagOperations = void 0;
|
|
4
|
+
exports.isEffectiveValueEqualToRecommended = isEffectiveValueEqualToRecommended;
|
|
5
|
+
const os = require("os");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const cloudformation_diff_1 = require("@aws-cdk/cloudformation-diff");
|
|
8
|
+
const toolkit_lib_1 = require("@aws-cdk/toolkit-lib");
|
|
9
|
+
const chalk = require("chalk");
|
|
10
|
+
const fs = require("fs-extra");
|
|
11
|
+
const p_queue_1 = require("p-queue");
|
|
12
|
+
const obsolete_flags_1 = require("./obsolete-flags");
|
|
13
|
+
const api_1 = require("../../api");
|
|
14
|
+
class FlagOperations {
|
|
15
|
+
/**
|
|
16
|
+
* Returns only those feature flags that need configuration
|
|
17
|
+
*
|
|
18
|
+
* That is those flags:
|
|
19
|
+
* - That are unconfigured
|
|
20
|
+
* - That are not obsolete
|
|
21
|
+
* - Whose default value is different from the recommended value
|
|
22
|
+
*
|
|
23
|
+
* The default value being equal to the recommended value sounds odd, but
|
|
24
|
+
* crops up in a number of situtations:
|
|
25
|
+
*
|
|
26
|
+
* - Security-related fixes that we want to force on people, but want to
|
|
27
|
+
* give them a flag to back out of the changes if they really need to.
|
|
28
|
+
* - Flags that changed their default value in the most recent major
|
|
29
|
+
* version.
|
|
30
|
+
* - Flags that we've introduced at some point in the past, but have gone
|
|
31
|
+
* back on.
|
|
32
|
+
*/
|
|
33
|
+
static filterNeedsAttention(flags) {
|
|
34
|
+
return flags
|
|
35
|
+
.filter(flag => !obsolete_flags_1.OBSOLETE_FLAGS.includes(flag.name))
|
|
36
|
+
.filter(flag => flag.userValue === undefined)
|
|
37
|
+
.filter(flag => defaultValue(flag) !== flag.recommendedValue);
|
|
38
|
+
}
|
|
39
|
+
constructor(flags, toolkit, ioHelper, cliContextValues = {}) {
|
|
40
|
+
this.flags = flags;
|
|
41
|
+
this.toolkit = toolkit;
|
|
42
|
+
this.ioHelper = ioHelper;
|
|
43
|
+
this.cliContextValues = cliContextValues;
|
|
44
|
+
this.app = '';
|
|
45
|
+
this.baseContextValues = {};
|
|
46
|
+
this.allStacks = [];
|
|
47
|
+
this.queue = new p_queue_1.default({ concurrency: 4 });
|
|
48
|
+
}
|
|
49
|
+
/** Main entry point that routes to either flag setting or display operations */
|
|
50
|
+
async execute(params) {
|
|
51
|
+
if (params.set) {
|
|
52
|
+
if (params.FLAGNAME && params.value) {
|
|
53
|
+
await this.setFlag(params);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
await this.setMultipleFlags(params);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
await this.displayFlags(params);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Sets a single specific flag with validation and user confirmation */
|
|
64
|
+
async setFlag(params) {
|
|
65
|
+
const flagName = params.FLAGNAME[0];
|
|
66
|
+
const flag = this.flags.find(f => f.name === flagName);
|
|
67
|
+
if (!flag) {
|
|
68
|
+
await this.ioHelper.defaults.error('Flag not found.');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (!this.isBooleanFlag(flag)) {
|
|
72
|
+
await this.ioHelper.defaults.error(`Flag '${flagName}' is not a boolean flag. Only boolean flags are currently supported.`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const prototypeSuccess = await this.prototypeChanges([flagName], params);
|
|
76
|
+
if (prototypeSuccess) {
|
|
77
|
+
await this.handleUserResponse([flagName], params);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** Sets multiple flags (all or unconfigured) with validation and user confirmation */
|
|
81
|
+
async setMultipleFlags(params) {
|
|
82
|
+
if (params.default && !this.flags.some(f => f.unconfiguredBehavesLike)) {
|
|
83
|
+
await this.ioHelper.defaults.error('The --default options are not compatible with the AWS CDK library used by your application. Please upgrade to 2.212.0 or above.');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const flagsToSet = this.getFlagsToSet(params);
|
|
87
|
+
const prototypeSuccess = await this.prototypeChanges(flagsToSet, params);
|
|
88
|
+
if (prototypeSuccess) {
|
|
89
|
+
await this.handleUserResponse(flagsToSet, params);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Determines which flags should be set based on the provided parameters */
|
|
93
|
+
getFlagsToSet(params) {
|
|
94
|
+
if (params.all && params.default) {
|
|
95
|
+
return this.flags
|
|
96
|
+
.filter(flag => this.isBooleanFlag(flag))
|
|
97
|
+
.map(flag => flag.name);
|
|
98
|
+
}
|
|
99
|
+
else if (params.all) {
|
|
100
|
+
return this.flags
|
|
101
|
+
.filter(flag => flag.userValue === undefined || !isEffectiveValueEqualToRecommended(flag))
|
|
102
|
+
.filter(flag => this.isBooleanFlag(flag))
|
|
103
|
+
.map(flag => flag.name);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
return this.flags
|
|
107
|
+
.filter(flag => flag.userValue === undefined)
|
|
108
|
+
.filter(flag => this.isBooleanFlag(flag))
|
|
109
|
+
.map(flag => flag.name);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Sets flags that don't cause template changes */
|
|
113
|
+
async setSafeFlags(params) {
|
|
114
|
+
const cdkJson = await JSON.parse(await fs.readFile(path.join(process.cwd(), 'cdk.json'), 'utf-8'));
|
|
115
|
+
this.app = params.app || cdkJson.app;
|
|
116
|
+
const isUsingTsNode = this.app.includes('ts-node');
|
|
117
|
+
if (isUsingTsNode && !this.app.includes('-T') && !this.app.includes('--transpileOnly')) {
|
|
118
|
+
await this.ioHelper.defaults.info('Repeated synths with ts-node will type-check the application on every synth. Add --transpileOnly to cdk.json\'s "app" command to make this operation faster.');
|
|
119
|
+
}
|
|
120
|
+
const unconfiguredFlags = this.flags.filter(flag => flag.userValue === undefined && this.isBooleanFlag(flag));
|
|
121
|
+
if (unconfiguredFlags.length === 0) {
|
|
122
|
+
await this.ioHelper.defaults.info('All feature flags are configured.');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
await this.initializeSafetyCheck();
|
|
126
|
+
const safeFlags = await this.batchTestFlags(unconfiguredFlags);
|
|
127
|
+
await this.cleanupSafetyCheck();
|
|
128
|
+
if (safeFlags.length > 0) {
|
|
129
|
+
await this.ioHelper.defaults.info('Flags that can be set without template changes:');
|
|
130
|
+
for (const flag of safeFlags) {
|
|
131
|
+
await this.ioHelper.defaults.info(`- ${flag.name} -> ${flag.recommendedValue}`);
|
|
132
|
+
}
|
|
133
|
+
await this.handleUserResponse(safeFlags.map(flag => flag.name), { ...params, recommended: true });
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
await this.ioHelper.defaults.info('No more flags can be set without causing template changes.');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Initializes the safety check by reading context and synthesizing baseline templates */
|
|
140
|
+
async initializeSafetyCheck() {
|
|
141
|
+
const baseContext = new toolkit_lib_1.CdkAppMultiContext(process.cwd());
|
|
142
|
+
this.baseContextValues = { ...await baseContext.read(), ...this.cliContextValues };
|
|
143
|
+
this.baselineTempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cdk-baseline-'));
|
|
144
|
+
const mergedContext = new toolkit_lib_1.MemoryContext(this.baseContextValues);
|
|
145
|
+
const baseSource = await this.toolkit.fromCdkApp(this.app, {
|
|
146
|
+
contextStore: mergedContext,
|
|
147
|
+
outdir: this.baselineTempDir,
|
|
148
|
+
});
|
|
149
|
+
const baseCx = await this.toolkit.synth(baseSource);
|
|
150
|
+
const baseAssembly = baseCx.cloudAssembly;
|
|
151
|
+
this.allStacks = baseAssembly.stacksRecursively;
|
|
152
|
+
this.queue = new p_queue_1.default({ concurrency: 4 });
|
|
153
|
+
}
|
|
154
|
+
/** Cleans up temporary directories created during safety checks */
|
|
155
|
+
async cleanupSafetyCheck() {
|
|
156
|
+
if (this.baselineTempDir) {
|
|
157
|
+
await fs.remove(this.baselineTempDir);
|
|
158
|
+
this.baselineTempDir = undefined;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** Tests multiple flags together and isolates unsafe ones using binary search */
|
|
162
|
+
async batchTestFlags(flags) {
|
|
163
|
+
if (flags.length === 0)
|
|
164
|
+
return [];
|
|
165
|
+
const allFlagsContext = { ...this.baseContextValues };
|
|
166
|
+
flags.forEach(flag => {
|
|
167
|
+
allFlagsContext[flag.name] = flag.recommendedValue;
|
|
168
|
+
});
|
|
169
|
+
const allSafe = await this.testBatch(allFlagsContext);
|
|
170
|
+
if (allSafe)
|
|
171
|
+
return flags;
|
|
172
|
+
return this.isolateUnsafeFlags(flags);
|
|
173
|
+
}
|
|
174
|
+
/** Tests if a set of context values causes template changes by synthesizing and diffing */
|
|
175
|
+
async testBatch(contextValues) {
|
|
176
|
+
const testContext = new toolkit_lib_1.MemoryContext(contextValues);
|
|
177
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cdk-test-'));
|
|
178
|
+
const testSource = await this.toolkit.fromCdkApp(this.app, {
|
|
179
|
+
contextStore: testContext,
|
|
180
|
+
outdir: tempDir,
|
|
181
|
+
});
|
|
182
|
+
const testCx = await this.toolkit.synth(testSource);
|
|
183
|
+
try {
|
|
184
|
+
for (const stack of this.allStacks) {
|
|
185
|
+
const templatePath = stack.templateFullPath;
|
|
186
|
+
const diff = await this.toolkit.diff(testCx, {
|
|
187
|
+
method: toolkit_lib_1.DiffMethod.LocalFile(templatePath),
|
|
188
|
+
stacks: {
|
|
189
|
+
strategy: api_1.StackSelectionStrategy.PATTERN_MUST_MATCH_SINGLE,
|
|
190
|
+
patterns: [stack.hierarchicalId],
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
for (const stackDiff of Object.values(diff)) {
|
|
194
|
+
if (stackDiff.differenceCount > 0) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
await fs.remove(tempDir);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/** Uses binary search to isolate which flags are safe to set without template changes */
|
|
206
|
+
async isolateUnsafeFlags(flags) {
|
|
207
|
+
const safeFlags = [];
|
|
208
|
+
const processBatch = async (batch, contextValues) => {
|
|
209
|
+
if (batch.length === 1) {
|
|
210
|
+
const isSafe = await this.testBatch({ ...contextValues, [batch[0].name]: batch[0].recommendedValue });
|
|
211
|
+
if (isSafe)
|
|
212
|
+
safeFlags.push(batch[0]);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const batchContext = { ...contextValues };
|
|
216
|
+
batch.forEach(flag => {
|
|
217
|
+
batchContext[flag.name] = flag.recommendedValue;
|
|
218
|
+
});
|
|
219
|
+
const isSafeBatch = await this.testBatch(batchContext);
|
|
220
|
+
if (isSafeBatch) {
|
|
221
|
+
safeFlags.push(...batch);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const mid = Math.floor(batch.length / 2);
|
|
225
|
+
const left = batch.slice(0, mid);
|
|
226
|
+
const right = batch.slice(mid);
|
|
227
|
+
void this.queue.add(() => processBatch(left, contextValues));
|
|
228
|
+
void this.queue.add(() => processBatch(right, contextValues));
|
|
229
|
+
};
|
|
230
|
+
void this.queue.add(() => processBatch(flags, this.baseContextValues));
|
|
231
|
+
await this.queue.onIdle();
|
|
232
|
+
return safeFlags;
|
|
233
|
+
}
|
|
234
|
+
/** Prototypes flag changes by synthesizing templates and showing diffs to the user */
|
|
235
|
+
async prototypeChanges(flagNames, params) {
|
|
236
|
+
const baseContext = new toolkit_lib_1.CdkAppMultiContext(process.cwd());
|
|
237
|
+
const baseContextValues = { ...await baseContext.read(), ...this.cliContextValues };
|
|
238
|
+
const memoryContext = new toolkit_lib_1.MemoryContext(baseContextValues);
|
|
239
|
+
const cdkJson = await JSON.parse(await fs.readFile(path.join(process.cwd(), 'cdk.json'), 'utf-8'));
|
|
240
|
+
const app = cdkJson.app;
|
|
241
|
+
const source = await this.toolkit.fromCdkApp(app, {
|
|
242
|
+
contextStore: memoryContext,
|
|
243
|
+
outdir: fs.mkdtempSync(path.join(os.tmpdir(), 'cdk-original-')),
|
|
244
|
+
});
|
|
245
|
+
const updateObj = await this.buildUpdateObject(flagNames, params, baseContextValues);
|
|
246
|
+
if (!updateObj)
|
|
247
|
+
return false;
|
|
248
|
+
await memoryContext.update(updateObj);
|
|
249
|
+
const cx = await this.toolkit.synth(source);
|
|
250
|
+
const assembly = cx.cloudAssembly;
|
|
251
|
+
const modifiedSource = await this.toolkit.fromCdkApp(app, {
|
|
252
|
+
contextStore: memoryContext,
|
|
253
|
+
outdir: fs.mkdtempSync(path.join(os.tmpdir(), 'cdk-temp-')),
|
|
254
|
+
});
|
|
255
|
+
const modifiedCx = await this.toolkit.synth(modifiedSource);
|
|
256
|
+
const allStacks = assembly.stacksRecursively;
|
|
257
|
+
for (const stack of allStacks) {
|
|
258
|
+
const templatePath = stack.templateFullPath;
|
|
259
|
+
await this.toolkit.diff(modifiedCx, {
|
|
260
|
+
method: toolkit_lib_1.DiffMethod.LocalFile(templatePath),
|
|
261
|
+
stacks: {
|
|
262
|
+
strategy: api_1.StackSelectionStrategy.PATTERN_MUST_MATCH_SINGLE,
|
|
263
|
+
patterns: [stack.hierarchicalId],
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
await this.displayFlagChanges(updateObj, baseContextValues);
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
/** Displays a summary of flag changes showing old and new values */
|
|
271
|
+
async displayFlagChanges(updateObj, baseContextValues) {
|
|
272
|
+
await this.ioHelper.defaults.info('\nFlag changes:');
|
|
273
|
+
for (const [flagName, newValue] of Object.entries(updateObj)) {
|
|
274
|
+
const currentValue = baseContextValues[flagName];
|
|
275
|
+
const currentDisplay = currentValue === undefined ? '<unset>' : String(currentValue);
|
|
276
|
+
await this.ioHelper.defaults.info(` ${flagName}: ${currentDisplay} → ${newValue}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/** Builds the update object with new flag values based on parameters and current context */
|
|
280
|
+
async buildUpdateObject(flagNames, params, baseContextValues) {
|
|
281
|
+
const updateObj = {};
|
|
282
|
+
if (flagNames.length === 1 && params.value !== undefined) {
|
|
283
|
+
const flagName = flagNames[0];
|
|
284
|
+
const boolValue = params.value === 'true';
|
|
285
|
+
if (baseContextValues[flagName] === boolValue) {
|
|
286
|
+
await this.ioHelper.defaults.info('Flag is already set to the specified value. No changes needed.');
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
updateObj[flagName] = boolValue;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
for (const flagName of flagNames) {
|
|
293
|
+
const flag = this.flags.find(f => f.name === flagName);
|
|
294
|
+
if (!flag) {
|
|
295
|
+
await this.ioHelper.defaults.error(`Flag ${flagName} not found.`);
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
const newValue = params.recommended
|
|
299
|
+
? flag.recommendedValue
|
|
300
|
+
: String(defaultValue(flag)) === 'true';
|
|
301
|
+
updateObj[flagName] = newValue;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return updateObj;
|
|
305
|
+
}
|
|
306
|
+
/** Prompts user for confirmation and applies changes if accepted */
|
|
307
|
+
async handleUserResponse(flagNames, params) {
|
|
308
|
+
const userAccepted = await this.ioHelper.requestResponse({
|
|
309
|
+
time: new Date(),
|
|
310
|
+
level: 'info',
|
|
311
|
+
code: 'CDK_TOOLKIT_I9300',
|
|
312
|
+
message: 'Do you want to accept these changes?',
|
|
313
|
+
data: {
|
|
314
|
+
flagNames,
|
|
315
|
+
responseDescription: 'Enter "y" to apply changes or "n" to cancel',
|
|
316
|
+
},
|
|
317
|
+
defaultResponse: false,
|
|
318
|
+
});
|
|
319
|
+
if (userAccepted) {
|
|
320
|
+
await this.modifyValues(flagNames, params);
|
|
321
|
+
await this.ioHelper.defaults.info('Flag value(s) updated successfully.');
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
await this.ioHelper.defaults.info('Operation cancelled');
|
|
325
|
+
}
|
|
326
|
+
await this.cleanupTempDirectories();
|
|
327
|
+
}
|
|
328
|
+
/** Removes temporary directories created during flag operations */
|
|
329
|
+
async cleanupTempDirectories() {
|
|
330
|
+
const originalDir = path.join(process.cwd(), 'original');
|
|
331
|
+
const tempDir = path.join(process.cwd(), 'temp');
|
|
332
|
+
await fs.remove(originalDir);
|
|
333
|
+
await fs.remove(tempDir);
|
|
334
|
+
}
|
|
335
|
+
/** Actually modifies the cdk.json file with the new flag values */
|
|
336
|
+
async modifyValues(flagNames, params) {
|
|
337
|
+
const cdkJsonPath = path.join(process.cwd(), 'cdk.json');
|
|
338
|
+
const cdkJsonContent = await fs.readFile(cdkJsonPath, 'utf-8');
|
|
339
|
+
const cdkJson = JSON.parse(cdkJsonContent);
|
|
340
|
+
if (flagNames.length === 1 && !params.safe && !params.all) {
|
|
341
|
+
const boolValue = params.value === 'true';
|
|
342
|
+
cdkJson.context[String(flagNames[0])] = boolValue;
|
|
343
|
+
await this.ioHelper.defaults.info(`Setting flag '${flagNames}' to: ${boolValue}`);
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
for (const flagName of flagNames) {
|
|
347
|
+
const flag = this.flags.find(f => f.name === flagName);
|
|
348
|
+
const newValue = params.recommended || params.safe
|
|
349
|
+
? flag.recommendedValue
|
|
350
|
+
: String(defaultValue(flag)) === 'true';
|
|
351
|
+
cdkJson.context[flagName] = newValue;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
await fs.writeFile(cdkJsonPath, JSON.stringify(cdkJson, null, 2), 'utf-8');
|
|
355
|
+
}
|
|
356
|
+
/** Displays flags in a table format, either specific flags or filtered by criteria */
|
|
357
|
+
async displayFlags(params) {
|
|
358
|
+
const { FLAGNAME, all } = params;
|
|
359
|
+
if (FLAGNAME && FLAGNAME.length > 0) {
|
|
360
|
+
await this.displaySpecificFlags(FLAGNAME);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
const [flagsToDisplay, header] = all
|
|
364
|
+
? [this.flags, 'All feature flags']
|
|
365
|
+
: [FlagOperations.filterNeedsAttention(this.flags), 'Unconfigured feature flags'];
|
|
366
|
+
await this.ioHelper.defaults.info(header);
|
|
367
|
+
await this.displayFlagTable(flagsToDisplay);
|
|
368
|
+
// Add helpful message after empty table when not using --all
|
|
369
|
+
if (!all && flagsToDisplay.length === 0) {
|
|
370
|
+
await this.ioHelper.defaults.info('');
|
|
371
|
+
await this.ioHelper.defaults.info('✅ All feature flags are already set to their recommended values.');
|
|
372
|
+
await this.ioHelper.defaults.info('Use \'cdk flags --all --unstable=flags\' to see all flags and their current values.');
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
/** Displays detailed information for specific flags matching the given names */
|
|
376
|
+
async displaySpecificFlags(flagNames) {
|
|
377
|
+
const matchingFlags = this.flags.filter(f => flagNames.some(searchTerm => f.name.toLowerCase().includes(searchTerm.toLowerCase())));
|
|
378
|
+
if (matchingFlags.length === 0) {
|
|
379
|
+
await this.ioHelper.defaults.error(`Flag matching "${flagNames.join(', ')}" not found.`);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
if (matchingFlags.length === 1) {
|
|
383
|
+
const flag = matchingFlags[0];
|
|
384
|
+
await this.ioHelper.defaults.info(`Flag name: ${flag.name}`);
|
|
385
|
+
await this.ioHelper.defaults.info(`Description: ${flag.explanation}`);
|
|
386
|
+
await this.ioHelper.defaults.info(`Recommended value: ${flag.recommendedValue}`);
|
|
387
|
+
await this.ioHelper.defaults.info(`Default value: ${defaultValue(flag)}`);
|
|
388
|
+
await this.ioHelper.defaults.info(`User value: ${flag.userValue}`);
|
|
389
|
+
await this.ioHelper.defaults.info(`Effective value: ${effectiveValue(flag)}`);
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
await this.ioHelper.defaults.info(`Found ${matchingFlags.length} flags matching "${flagNames.join(', ')}"`);
|
|
393
|
+
await this.displayFlagTable(matchingFlags);
|
|
394
|
+
}
|
|
395
|
+
/** Returns sort order for flags */
|
|
396
|
+
getFlagSortOrder(flag) {
|
|
397
|
+
if (flag.userValue === undefined)
|
|
398
|
+
return 3;
|
|
399
|
+
if (isEffectiveValueEqualToRecommended(flag))
|
|
400
|
+
return 1;
|
|
401
|
+
return 2;
|
|
402
|
+
}
|
|
403
|
+
/** Displays flags in a formatted table grouped by module and sorted */
|
|
404
|
+
async displayFlagTable(flags) {
|
|
405
|
+
const sortedFlags = [...flags].sort((a, b) => {
|
|
406
|
+
const orderA = this.getFlagSortOrder(a);
|
|
407
|
+
const orderB = this.getFlagSortOrder(b);
|
|
408
|
+
if (orderA !== orderB)
|
|
409
|
+
return orderA - orderB;
|
|
410
|
+
if (a.module !== b.module)
|
|
411
|
+
return a.module.localeCompare(b.module);
|
|
412
|
+
return a.name.localeCompare(b.name);
|
|
413
|
+
});
|
|
414
|
+
const rows = [['Feature Flag', 'Recommended', 'User', 'Effective']];
|
|
415
|
+
let currentModule = '';
|
|
416
|
+
sortedFlags.forEach((flag) => {
|
|
417
|
+
if (flag.module !== currentModule) {
|
|
418
|
+
rows.push([chalk.bold(`Module: ${flag.module}`), '', '', '']);
|
|
419
|
+
currentModule = flag.module;
|
|
420
|
+
}
|
|
421
|
+
rows.push([
|
|
422
|
+
` ${flag.name}`,
|
|
423
|
+
String(flag.recommendedValue),
|
|
424
|
+
flag.userValue === undefined ? '<unset>' : String(flag.userValue),
|
|
425
|
+
String(effectiveValue(flag)),
|
|
426
|
+
]);
|
|
427
|
+
});
|
|
428
|
+
const formattedTable = (0, cloudformation_diff_1.formatTable)(rows, undefined, true);
|
|
429
|
+
await this.ioHelper.defaults.info(formattedTable);
|
|
430
|
+
}
|
|
431
|
+
/** Checks if a flag has a boolean recommended value */
|
|
432
|
+
isBooleanFlag(flag) {
|
|
433
|
+
const recommended = flag.recommendedValue;
|
|
434
|
+
return typeof recommended === 'boolean' ||
|
|
435
|
+
recommended === 'true' ||
|
|
436
|
+
recommended === 'false';
|
|
437
|
+
}
|
|
438
|
+
/** Shows helpful usage examples and available command options */
|
|
439
|
+
async displayHelpMessage() {
|
|
440
|
+
await this.ioHelper.defaults.info('\n' + chalk.bold('Available options:'));
|
|
441
|
+
await this.ioHelper.defaults.info(' cdk flags --interactive # Interactive menu to manage flags');
|
|
442
|
+
await this.ioHelper.defaults.info(' cdk flags --all # Show all flags (including configured ones)');
|
|
443
|
+
await this.ioHelper.defaults.info(' cdk flags --set --all --recommended # Set all flags to recommended values');
|
|
444
|
+
await this.ioHelper.defaults.info(' cdk flags --set --all --default # Set all flags to default values');
|
|
445
|
+
await this.ioHelper.defaults.info(' cdk flags --set --unconfigured --recommended # Set unconfigured flags to recommended');
|
|
446
|
+
await this.ioHelper.defaults.info(' cdk flags --set <flag-name> --value <true|false> # Set specific flag');
|
|
447
|
+
await this.ioHelper.defaults.info(' cdk flags --safe # Safely set flags that don\'t change templates');
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
exports.FlagOperations = FlagOperations;
|
|
451
|
+
/** Checks if the flags current effective value matches the recommended value */
|
|
452
|
+
function isEffectiveValueEqualToRecommended(flag) {
|
|
453
|
+
return String(effectiveValue(flag)) === String(flag.recommendedValue);
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Return the effective value of a flag (user value or default)
|
|
457
|
+
*/
|
|
458
|
+
function effectiveValue(flag) {
|
|
459
|
+
return flag.userValue ?? defaultValue(flag);
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Return the default value for a flag, assume it's `false` if not given
|
|
463
|
+
*/
|
|
464
|
+
function defaultValue(flag) {
|
|
465
|
+
return flag.unconfiguredBehavesLike?.v2 ?? false;
|
|
466
|
+
}
|
|
467
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm9wZXJhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBcWdCQSxnRkFFQztBQXZnQkQseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUU3QixzRUFBMkQ7QUFFM0Qsc0RBQXFGO0FBQ3JGLCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IscUNBQTZCO0FBQzdCLHFEQUFrRDtBQUVsRCxtQ0FBbUQ7QUFHbkQsTUFBYSxjQUFjO0lBQ3pCOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNJLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFvQjtRQUNyRCxPQUFPLEtBQUs7YUFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLCtCQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQzthQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbEUsQ0FBQztJQVFELFlBQ21CLEtBQW9CLEVBQ3BCLE9BQWdCLEVBQ2hCLFFBQWtCLEVBQ2xCLG1CQUF3QyxFQUFFO1FBSDFDLFVBQUssR0FBTCxLQUFLLENBQWU7UUFDcEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBMEI7UUFFM0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxpQkFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGdGQUFnRjtJQUNoRixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQTRCO1FBQ3hDLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2YsSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUE0QjtRQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3RELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLFFBQVEsc0VBQXNFLENBQUMsQ0FBQztZQUM1SCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUVELHNGQUFzRjtJQUN0RixLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBNEI7UUFDakQsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGlJQUFpSSxDQUFDLENBQUM7WUFDdEssT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXpFLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFRCw0RUFBNEU7SUFDcEUsYUFBYSxDQUFDLE1BQTRCO1FBQ2hELElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUMsS0FBSztpQkFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN4QyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUs7aUJBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDekYsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDeEMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUMsS0FBSztpQkFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQztpQkFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDeEMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBNEI7UUFDN0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ25HLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBRXJDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELElBQUksYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7WUFDdkYsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsOEpBQThKLENBQUMsQ0FBQztRQUNwTSxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNqRCxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFNUQsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUN2RSxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDbkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0QsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUVoQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQztZQUNyRixLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUNsRixDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUNsRyxDQUFDO0lBQ0gsQ0FBQztJQUVELDBGQUEwRjtJQUNsRixLQUFLLENBQUMscUJBQXFCO1FBQ2pDLE1BQU0sV0FBVyxHQUFHLElBQUksZ0NBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRW5GLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQy9FLE1BQU0sYUFBYSxHQUFHLElBQUksMkJBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNoRSxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDekQsWUFBWSxFQUFFLGFBQWE7WUFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQzdCLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztRQUNoRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksaUJBQU0sQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxtRUFBbUU7SUFDM0QsS0FBSyxDQUFDLGtCQUFrQjtRQUM5QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsaUZBQWlGO0lBQ3pFLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBb0I7UUFDL0MsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVsQyxNQUFNLGVBQWUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuQixlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RCxJQUFJLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUxQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsMkZBQTJGO0lBQ25GLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBa0M7UUFDeEQsTUFBTSxXQUFXLEdBQUcsSUFBSSwyQkFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDekQsWUFBWSxFQUFFLFdBQVc7WUFDekIsTUFBTSxFQUFFLE9BQU87U0FDaEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVwRCxJQUFJLENBQUM7WUFDSCxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO2dCQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDM0MsTUFBTSxFQUFFLHdCQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztvQkFDMUMsTUFBTSxFQUFFO3dCQUNOLFFBQVEsRUFBRSw0QkFBc0IsQ0FBQyx5QkFBeUI7d0JBQzFELFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7cUJBQ2pDO2lCQUNGLENBQUMsQ0FBQztnQkFFSCxLQUFLLE1BQU0sU0FBUyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxTQUFTLENBQUMsZUFBZSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUNsQyxPQUFPLEtBQUssQ0FBQztvQkFDZixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCx5RkFBeUY7SUFDakYsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQW9CO1FBQ25ELE1BQU0sU0FBUyxHQUFrQixFQUFFLENBQUM7UUFFcEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLEtBQW9CLEVBQUUsYUFBa0MsRUFBaUIsRUFBRTtZQUNyRyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FDakMsRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FDakUsQ0FBQztnQkFDRixJQUFJLE1BQU07b0JBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDMUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkIsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDbEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkQsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO2dCQUN6QixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNqQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRS9CLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQzdELEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQztRQUVGLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsc0ZBQXNGO0lBQzlFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFtQixFQUFFLE1BQTRCO1FBQzlFLE1BQU0sV0FBVyxHQUFHLElBQUksZ0NBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDMUQsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLEdBQUcsTUFBTSxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwRixNQUFNLGFBQWEsR0FBRyxJQUFJLDJCQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUzRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbkcsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUV4QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNoRCxZQUFZLEVBQUUsYUFBYTtZQUMzQixNQUFNLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztTQUNoRSxDQUFDLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUU3QixNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO1FBRWxDLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3hELFlBQVksRUFBRSxhQUFhO1lBQzNCLE1BQU0sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQzVELENBQUMsQ0FBQztRQUVILE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1FBRTdDLEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxFQUFFLENBQUM7WUFDOUIsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1lBQzVDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNsQyxNQUFNLEVBQUUsd0JBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO2dCQUMxQyxNQUFNLEVBQUU7b0JBQ04sUUFBUSxFQUFFLDRCQUFzQixDQUFDLHlCQUF5QjtvQkFDMUQsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztpQkFDakM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDNUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0VBQW9FO0lBQzVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxTQUFrQyxFQUFFLGlCQUFzQztRQUN6RyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JELEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDN0QsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsTUFBTSxjQUFjLEdBQUcsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckYsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxRQUFRLEtBQUssY0FBYyxNQUFNLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdEYsQ0FBQztJQUNILENBQUM7SUFFRCw0RkFBNEY7SUFDcEYsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFNBQW1CLEVBQUUsTUFBNEIsRUFBRSxpQkFBc0M7UUFFdkgsTUFBTSxTQUFTLEdBQTRCLEVBQUUsQ0FBQztRQUU5QyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDO1lBQzFDLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxDQUFDLENBQUM7Z0JBQ3BHLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDbEMsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDVixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLFFBQVEsYUFBYSxDQUFDLENBQUM7b0JBQ2xFLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVc7b0JBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQTJCO29CQUNsQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQztnQkFDMUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxvRUFBb0U7SUFDNUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFNBQW1CLEVBQUUsTUFBNEI7UUFDaEYsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztZQUN2RCxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDaEIsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsbUJBQW1CO1lBQ3pCLE9BQU8sRUFBRSxzQ0FBc0M7WUFDL0MsSUFBSSxFQUFFO2dCQUNKLFNBQVM7Z0JBQ1QsbUJBQW1CLEVBQUUsNkNBQTZDO2FBQ25FO1lBQ0QsZUFBZSxFQUFFLEtBQUs7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDM0UsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxtRUFBbUU7SUFDM0QsS0FBSyxDQUFDLHNCQUFzQjtRQUNsQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxtRUFBbUU7SUFDM0QsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFtQixFQUFFLE1BQTRCO1FBQzFFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sY0FBYyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUUzQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMxRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQztZQUMxQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUNsRCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsU0FBUyxTQUFTLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDcEYsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFFLENBQUM7Z0JBQ3hELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLElBQUk7b0JBQ2hELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQTJCO29CQUNsQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQztnQkFDMUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsc0ZBQXNGO0lBQ3RGLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBNEI7UUFDN0MsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFFakMsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQyxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRztZQUNsQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztRQUVwRixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUU1Qyw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxDQUFDLENBQUM7WUFDdEcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMscUZBQXFGLENBQUMsQ0FBQztRQUMzSCxDQUFDO0lBQ0gsQ0FBQztJQUVELGdGQUFnRjtJQUN4RSxLQUFLLENBQUMsb0JBQW9CLENBQUMsU0FBbUI7UUFDcEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDMUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6RixJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3pGLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUN0RSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUNqRixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG9CQUFvQixjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlFLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxhQUFhLENBQUMsTUFBTSxvQkFBb0IsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELG1DQUFtQztJQUMzQixnQkFBZ0IsQ0FBQyxJQUFpQjtRQUN4QyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLElBQUksa0NBQWtDLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkQsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFvQjtRQUN6QyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFeEMsSUFBSSxNQUFNLEtBQUssTUFBTTtnQkFBRSxPQUFPLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDOUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO2dCQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLEdBQWUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDaEYsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBRXZCLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUM5QixDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDUixLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNqRSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzdCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxjQUFjLEdBQUcsSUFBQSxpQ0FBVyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELHVEQUF1RDtJQUN2RCxhQUFhLENBQUMsSUFBaUI7UUFDN0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzFDLE9BQU8sT0FBTyxXQUFXLEtBQUssU0FBUztZQUNyQyxXQUFXLEtBQUssTUFBTTtZQUN0QixXQUFXLEtBQUssT0FBTyxDQUFDO0lBQzVCLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsS0FBSyxDQUFDLGtCQUFrQjtRQUN0QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0VBQWtFLENBQUMsQ0FBQztRQUN0RyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO1FBQ2hILE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdGQUFnRixDQUFDLENBQUM7UUFDcEgsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsMkVBQTJFLENBQUMsQ0FBQztRQUMvRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyx5RkFBeUYsQ0FBQyxDQUFDO1FBQzdILE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHlFQUF5RSxDQUFDLENBQUM7UUFDN0csTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsK0VBQStFLENBQUMsQ0FBQztJQUNySCxDQUFDO0NBQ0Y7QUFwZkQsd0NBb2ZDO0FBRUQsZ0ZBQWdGO0FBQ2hGLFNBQWdCLGtDQUFrQyxDQUFDLElBQWlCO0lBQ2xFLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxJQUFpQjtJQUN2QyxPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsWUFBWSxDQUFDLElBQWlCO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxLQUFLLENBQUM7QUFDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgeyBmb3JtYXRUYWJsZSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRmxhZywgVG9vbGtpdCB9IGZyb20gJ0Bhd3MtY2RrL3Rvb2xraXQtbGliJztcbmltcG9ydCB7IENka0FwcE11bHRpQ29udGV4dCwgTWVtb3J5Q29udGV4dCwgRGlmZk1ldGhvZCB9IGZyb20gJ0Bhd3MtY2RrL3Rvb2xraXQtbGliJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBQUXVldWUgZnJvbSAncC1xdWV1ZSc7XG5pbXBvcnQgeyBPQlNPTEVURV9GTEFHUyB9IGZyb20gJy4vb2Jzb2xldGUtZmxhZ3MnO1xuaW1wb3J0IHR5cGUgeyBGbGFnT3BlcmF0aW9uc1BhcmFtcyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgU3RhY2tTZWxlY3Rpb25TdHJhdGVneSB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vLi4vYXBpLXByaXZhdGUnO1xuXG5leHBvcnQgY2xhc3MgRmxhZ09wZXJhdGlvbnMge1xuICAvKipcbiAgICogUmV0dXJucyBvbmx5IHRob3NlIGZlYXR1cmUgZmxhZ3MgdGhhdCBuZWVkIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogVGhhdCBpcyB0aG9zZSBmbGFnczpcbiAgICogLSBUaGF0IGFyZSB1bmNvbmZpZ3VyZWRcbiAgICogLSBUaGF0IGFyZSBub3Qgb2Jzb2xldGVcbiAgICogLSBXaG9zZSBkZWZhdWx0IHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZWNvbW1lbmRlZCB2YWx1ZVxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBiZWluZyBlcXVhbCB0byB0aGUgcmVjb21tZW5kZWQgdmFsdWUgc291bmRzIG9kZCwgYnV0XG4gICAqIGNyb3BzIHVwIGluIGEgbnVtYmVyIG9mIHNpdHV0YXRpb25zOlxuICAgKlxuICAgKiAtIFNlY3VyaXR5LXJlbGF0ZWQgZml4ZXMgdGhhdCB3ZSB3YW50IHRvIGZvcmNlIG9uIHBlb3BsZSwgYnV0IHdhbnQgdG9cbiAgICogICBnaXZlIHRoZW0gYSBmbGFnIHRvIGJhY2sgb3V0IG9mIHRoZSBjaGFuZ2VzIGlmIHRoZXkgcmVhbGx5IG5lZWQgdG8uXG4gICAqIC0gRmxhZ3MgdGhhdCBjaGFuZ2VkIHRoZWlyIGRlZmF1bHQgdmFsdWUgaW4gdGhlIG1vc3QgcmVjZW50IG1ham9yXG4gICAqICAgdmVyc2lvbi5cbiAgICogLSBGbGFncyB0aGF0IHdlJ3ZlIGludHJvZHVjZWQgYXQgc29tZSBwb2ludCBpbiB0aGUgcGFzdCwgYnV0IGhhdmUgZ29uZVxuICAgKiAgIGJhY2sgb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZpbHRlck5lZWRzQXR0ZW50aW9uKGZsYWdzOiBGZWF0dXJlRmxhZ1tdKTogRmVhdHVyZUZsYWdbXSB7XG4gICAgcmV0dXJuIGZsYWdzXG4gICAgICAuZmlsdGVyKGZsYWcgPT4gIU9CU09MRVRFX0ZMQUdTLmluY2x1ZGVzKGZsYWcubmFtZSkpXG4gICAgICAuZmlsdGVyKGZsYWcgPT4gZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgIC5maWx0ZXIoZmxhZyA9PiBkZWZhdWx0VmFsdWUoZmxhZykgIT09IGZsYWcucmVjb21tZW5kZWRWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFwcDogc3RyaW5nO1xuICBwcml2YXRlIGJhc2VDb250ZXh0VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIGFsbFN0YWNrczogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0W107XG4gIHByaXZhdGUgcXVldWU6IFBRdWV1ZTtcbiAgcHJpdmF0ZSBiYXNlbGluZVRlbXBEaXI/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBmbGFnczogRmVhdHVyZUZsYWdbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRvb2xraXQ6IFRvb2xraXQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGlDb250ZXh0VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICkge1xuICAgIHRoaXMuYXBwID0gJyc7XG4gICAgdGhpcy5iYXNlQ29udGV4dFZhbHVlcyA9IHt9O1xuICAgIHRoaXMuYWxsU3RhY2tzID0gW107XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBQUXVldWUoeyBjb25jdXJyZW5jeTogNCB9KTtcbiAgfVxuXG4gIC8qKiBNYWluIGVudHJ5IHBvaW50IHRoYXQgcm91dGVzIHRvIGVpdGhlciBmbGFnIHNldHRpbmcgb3IgZGlzcGxheSBvcGVyYXRpb25zICovXG4gIGFzeW5jIGV4ZWN1dGUocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwYXJhbXMuc2V0KSB7XG4gICAgICBpZiAocGFyYW1zLkZMQUdOQU1FICYmIHBhcmFtcy52YWx1ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNldEZsYWcocGFyYW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0TXVsdGlwbGVGbGFncyhwYXJhbXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmRpc3BsYXlGbGFncyhwYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIGEgc2luZ2xlIHNwZWNpZmljIGZsYWcgd2l0aCB2YWxpZGF0aW9uIGFuZCB1c2VyIGNvbmZpcm1hdGlvbiAqL1xuICBhc3luYyBzZXRGbGFnKHBhcmFtczogRmxhZ09wZXJhdGlvbnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmbGFnTmFtZSA9IHBhcmFtcy5GTEFHTkFNRSFbMF07XG4gICAgY29uc3QgZmxhZyA9IHRoaXMuZmxhZ3MuZmluZChmID0+IGYubmFtZSA9PT0gZmxhZ05hbWUpO1xuXG4gICAgaWYgKCFmbGFnKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdGbGFnIG5vdCBmb3VuZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNCb29sZWFuRmxhZyhmbGFnKSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5lcnJvcihgRmxhZyAnJHtmbGFnTmFtZX0nIGlzIG5vdCBhIGJvb2xlYW4gZmxhZy4gT25seSBib29sZWFuIGZsYWdzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvdHlwZVN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnByb3RvdHlwZUNoYW5nZXMoW2ZsYWdOYW1lXSwgcGFyYW1zKTtcbiAgICBpZiAocHJvdG90eXBlU3VjY2Vzcykge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVVc2VyUmVzcG9uc2UoW2ZsYWdOYW1lXSwgcGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0cyBtdWx0aXBsZSBmbGFncyAoYWxsIG9yIHVuY29uZmlndXJlZCkgd2l0aCB2YWxpZGF0aW9uIGFuZCB1c2VyIGNvbmZpcm1hdGlvbiAqL1xuICBhc3luYyBzZXRNdWx0aXBsZUZsYWdzKHBhcmFtczogRmxhZ09wZXJhdGlvbnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocGFyYW1zLmRlZmF1bHQgJiYgIXRoaXMuZmxhZ3Muc29tZShmID0+IGYudW5jb25maWd1cmVkQmVoYXZlc0xpa2UpKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdUaGUgLS1kZWZhdWx0IG9wdGlvbnMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIEFXUyBDREsgbGlicmFyeSB1c2VkIGJ5IHlvdXIgYXBwbGljYXRpb24uIFBsZWFzZSB1cGdyYWRlIHRvIDIuMjEyLjAgb3IgYWJvdmUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmxhZ3NUb1NldCA9IHRoaXMuZ2V0RmxhZ3NUb1NldChwYXJhbXMpO1xuICAgIGNvbnN0IHByb3RvdHlwZVN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnByb3RvdHlwZUNoYW5nZXMoZmxhZ3NUb1NldCwgcGFyYW1zKTtcblxuICAgIGlmIChwcm90b3R5cGVTdWNjZXNzKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVVzZXJSZXNwb25zZShmbGFnc1RvU2V0LCBwYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEZXRlcm1pbmVzIHdoaWNoIGZsYWdzIHNob3VsZCBiZSBzZXQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgKi9cbiAgcHJpdmF0ZSBnZXRGbGFnc1RvU2V0KHBhcmFtczogRmxhZ09wZXJhdGlvbnNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHBhcmFtcy5hbGwgJiYgcGFyYW1zLmRlZmF1bHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmZsYWdzXG4gICAgICAgIC5maWx0ZXIoZmxhZyA9PiB0aGlzLmlzQm9vbGVhbkZsYWcoZmxhZykpXG4gICAgICAgIC5tYXAoZmxhZyA9PiBmbGFnLm5hbWUpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLmFsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NcbiAgICAgICAgLmZpbHRlcihmbGFnID0+IGZsYWcudXNlclZhbHVlID09PSB1bmRlZmluZWQgfHwgIWlzRWZmZWN0aXZlVmFsdWVFcXVhbFRvUmVjb21tZW5kZWQoZmxhZykpXG4gICAgICAgIC5maWx0ZXIoZmxhZyA9PiB0aGlzLmlzQm9vbGVhbkZsYWcoZmxhZykpXG4gICAgICAgIC5tYXAoZmxhZyA9PiBmbGFnLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5mbGFnc1xuICAgICAgICAuZmlsdGVyKGZsYWcgPT4gZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgLmZpbHRlcihmbGFnID0+IHRoaXMuaXNCb29sZWFuRmxhZyhmbGFnKSlcbiAgICAgICAgLm1hcChmbGFnID0+IGZsYWcubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgZmxhZ3MgdGhhdCBkb24ndCBjYXVzZSB0ZW1wbGF0ZSBjaGFuZ2VzICovXG4gIGFzeW5jIHNldFNhZmVGbGFncyhwYXJhbXM6IEZsYWdPcGVyYXRpb25zUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2RrSnNvbiA9IGF3YWl0IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpLCAndXRmLTgnKSk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwIHx8IGNka0pzb24uYXBwO1xuXG4gICAgY29uc3QgaXNVc2luZ1RzTm9kZSA9IHRoaXMuYXBwLmluY2x1ZGVzKCd0cy1ub2RlJyk7XG4gICAgaWYgKGlzVXNpbmdUc05vZGUgJiYgIXRoaXMuYXBwLmluY2x1ZGVzKCctVCcpICYmICF0aGlzLmFwcC5pbmNsdWRlcygnLS10cmFuc3BpbGVPbmx5JykpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnUmVwZWF0ZWQgc3ludGhzIHdpdGggdHMtbm9kZSB3aWxsIHR5cGUtY2hlY2sgdGhlIGFwcGxpY2F0aW9uIG9uIGV2ZXJ5IHN5bnRoLiBBZGQgLS10cmFuc3BpbGVPbmx5IHRvIGNkay5qc29uXFwncyBcImFwcFwiIGNvbW1hbmQgdG8gbWFrZSB0aGlzIG9wZXJhdGlvbiBmYXN0ZXIuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5jb25maWd1cmVkRmxhZ3MgPSB0aGlzLmZsYWdzLmZpbHRlcihmbGFnID0+XG4gICAgICBmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuaXNCb29sZWFuRmxhZyhmbGFnKSk7XG5cbiAgICBpZiAodW5jb25maWd1cmVkRmxhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ0FsbCBmZWF0dXJlIGZsYWdzIGFyZSBjb25maWd1cmVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVNhZmV0eUNoZWNrKCk7XG4gICAgY29uc3Qgc2FmZUZsYWdzID0gYXdhaXQgdGhpcy5iYXRjaFRlc3RGbGFncyh1bmNvbmZpZ3VyZWRGbGFncyk7XG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwU2FmZXR5Q2hlY2soKTtcblxuICAgIGlmIChzYWZlRmxhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdGbGFncyB0aGF0IGNhbiBiZSBzZXQgd2l0aG91dCB0ZW1wbGF0ZSBjaGFuZ2VzOicpO1xuICAgICAgZm9yIChjb25zdCBmbGFnIG9mIHNhZmVGbGFncykge1xuICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYC0gJHtmbGFnLm5hbWV9IC0+ICR7ZmxhZy5yZWNvbW1lbmRlZFZhbHVlfWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVVc2VyUmVzcG9uc2Uoc2FmZUZsYWdzLm1hcChmbGFnID0+IGZsYWcubmFtZSksIHsgLi4ucGFyYW1zLCByZWNvbW1lbmRlZDogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdObyBtb3JlIGZsYWdzIGNhbiBiZSBzZXQgd2l0aG91dCBjYXVzaW5nIHRlbXBsYXRlIGNoYW5nZXMuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEluaXRpYWxpemVzIHRoZSBzYWZldHkgY2hlY2sgYnkgcmVhZGluZyBjb250ZXh0IGFuZCBzeW50aGVzaXppbmcgYmFzZWxpbmUgdGVtcGxhdGVzICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVNhZmV0eUNoZWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJhc2VDb250ZXh0ID0gbmV3IENka0FwcE11bHRpQ29udGV4dChwcm9jZXNzLmN3ZCgpKTtcbiAgICB0aGlzLmJhc2VDb250ZXh0VmFsdWVzID0geyAuLi5hd2FpdCBiYXNlQ29udGV4dC5yZWFkKCksIC4uLnRoaXMuY2xpQ29udGV4dFZhbHVlcyB9O1xuXG4gICAgdGhpcy5iYXNlbGluZVRlbXBEaXIgPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICdjZGstYmFzZWxpbmUtJykpO1xuICAgIGNvbnN0IG1lcmdlZENvbnRleHQgPSBuZXcgTWVtb3J5Q29udGV4dCh0aGlzLmJhc2VDb250ZXh0VmFsdWVzKTtcbiAgICBjb25zdCBiYXNlU291cmNlID0gYXdhaXQgdGhpcy50b29sa2l0LmZyb21DZGtBcHAodGhpcy5hcHAsIHtcbiAgICAgIGNvbnRleHRTdG9yZTogbWVyZ2VkQ29udGV4dCxcbiAgICAgIG91dGRpcjogdGhpcy5iYXNlbGluZVRlbXBEaXIsXG4gICAgfSk7XG5cbiAgICBjb25zdCBiYXNlQ3ggPSBhd2FpdCB0aGlzLnRvb2xraXQuc3ludGgoYmFzZVNvdXJjZSk7XG4gICAgY29uc3QgYmFzZUFzc2VtYmx5ID0gYmFzZUN4LmNsb3VkQXNzZW1ibHk7XG4gICAgdGhpcy5hbGxTdGFja3MgPSBiYXNlQXNzZW1ibHkuc3RhY2tzUmVjdXJzaXZlbHk7XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBQUXVldWUoeyBjb25jdXJyZW5jeTogNCB9KTtcbiAgfVxuXG4gIC8qKiBDbGVhbnMgdXAgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGNyZWF0ZWQgZHVyaW5nIHNhZmV0eSBjaGVja3MgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU2FmZXR5Q2hlY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuYmFzZWxpbmVUZW1wRGlyKSB7XG4gICAgICBhd2FpdCBmcy5yZW1vdmUodGhpcy5iYXNlbGluZVRlbXBEaXIpO1xuICAgICAgdGhpcy5iYXNlbGluZVRlbXBEaXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRlc3RzIG11bHRpcGxlIGZsYWdzIHRvZ2V0aGVyIGFuZCBpc29sYXRlcyB1bnNhZmUgb25lcyB1c2luZyBiaW5hcnkgc2VhcmNoICovXG4gIHByaXZhdGUgYXN5bmMgYmF0Y2hUZXN0RmxhZ3MoZmxhZ3M6IEZlYXR1cmVGbGFnW10pOiBQcm9taXNlPEZlYXR1cmVGbGFnW10+IHtcbiAgICBpZiAoZmxhZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBhbGxGbGFnc0NvbnRleHQgPSB7IC4uLnRoaXMuYmFzZUNvbnRleHRWYWx1ZXMgfTtcbiAgICBmbGFncy5mb3JFYWNoKGZsYWcgPT4ge1xuICAgICAgYWxsRmxhZ3NDb250ZXh0W2ZsYWcubmFtZV0gPSBmbGFnLnJlY29tbWVuZGVkVmFsdWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGxTYWZlID0gYXdhaXQgdGhpcy50ZXN0QmF0Y2goYWxsRmxhZ3NDb250ZXh0KTtcbiAgICBpZiAoYWxsU2FmZSkgcmV0dXJuIGZsYWdzO1xuXG4gICAgcmV0dXJuIHRoaXMuaXNvbGF0ZVVuc2FmZUZsYWdzKGZsYWdzKTtcbiAgfVxuXG4gIC8qKiBUZXN0cyBpZiBhIHNldCBvZiBjb250ZXh0IHZhbHVlcyBjYXVzZXMgdGVtcGxhdGUgY2hhbmdlcyBieSBzeW50aGVzaXppbmcgYW5kIGRpZmZpbmcgKi9cbiAgcHJpdmF0ZSBhc3luYyB0ZXN0QmF0Y2goY29udGV4dFZhbHVlczogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHRlc3RDb250ZXh0ID0gbmV3IE1lbW9yeUNvbnRleHQoY29udGV4dFZhbHVlcyk7XG4gICAgY29uc3QgdGVtcERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2Nkay10ZXN0LScpKTtcbiAgICBjb25zdCB0ZXN0U291cmNlID0gYXdhaXQgdGhpcy50b29sa2l0LmZyb21DZGtBcHAodGhpcy5hcHAsIHtcbiAgICAgIGNvbnRleHRTdG9yZTogdGVzdENvbnRleHQsXG4gICAgICBvdXRkaXI6IHRlbXBEaXIsXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZXN0Q3ggPSBhd2FpdCB0aGlzLnRvb2xraXQuc3ludGgodGVzdFNvdXJjZSk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzdGFjayBvZiB0aGlzLmFsbFN0YWNrcykge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBzdGFjay50ZW1wbGF0ZUZ1bGxQYXRoO1xuICAgICAgICBjb25zdCBkaWZmID0gYXdhaXQgdGhpcy50b29sa2l0LmRpZmYodGVzdEN4LCB7XG4gICAgICAgICAgbWV0aG9kOiBEaWZmTWV0aG9kLkxvY2FsRmlsZSh0ZW1wbGF0ZVBhdGgpLFxuICAgICAgICAgIHN0YWNrczoge1xuICAgICAgICAgICAgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSxcbiAgICAgICAgICAgIHBhdHRlcm5zOiBbc3RhY2suaGllcmFyY2hpY2FsSWRdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RhY2tEaWZmIG9mIE9iamVjdC52YWx1ZXMoZGlmZikpIHtcbiAgICAgICAgICBpZiAoc3RhY2tEaWZmLmRpZmZlcmVuY2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yZW1vdmUodGVtcERpcik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFVzZXMgYmluYXJ5IHNlYXJjaCB0byBpc29sYXRlIHdoaWNoIGZsYWdzIGFyZSBzYWZlIHRvIHNldCB3aXRob3V0IHRlbXBsYXRlIGNoYW5nZXMgKi9cbiAgcHJpdmF0ZSBhc3luYyBpc29sYXRlVW5zYWZlRmxhZ3MoZmxhZ3M6IEZlYXR1cmVGbGFnW10pOiBQcm9taXNlPEZlYXR1cmVGbGFnW10+IHtcbiAgICBjb25zdCBzYWZlRmxhZ3M6IEZlYXR1cmVGbGFnW10gPSBbXTtcblxuICAgIGNvbnN0IHByb2Nlc3NCYXRjaCA9IGFzeW5jIChiYXRjaDogRmVhdHVyZUZsYWdbXSwgY29udGV4dFZhbHVlczogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgaWYgKGJhdGNoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBpc1NhZmUgPSBhd2FpdCB0aGlzLnRlc3RCYXRjaChcbiAgICAgICAgICB7IC4uLmNvbnRleHRWYWx1ZXMsIFtiYXRjaFswXS5uYW1lXTogYmF0Y2hbMF0ucmVjb21tZW5kZWRWYWx1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNTYWZlKSBzYWZlRmxhZ3MucHVzaChiYXRjaFswXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmF0Y2hDb250ZXh0ID0geyAuLi5jb250ZXh0VmFsdWVzIH07XG4gICAgICBiYXRjaC5mb3JFYWNoKGZsYWcgPT4ge1xuICAgICAgICBiYXRjaENvbnRleHRbZmxhZy5uYW1lXSA9IGZsYWcucmVjb21tZW5kZWRWYWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpc1NhZmVCYXRjaCA9IGF3YWl0IHRoaXMudGVzdEJhdGNoKGJhdGNoQ29udGV4dCk7XG4gICAgICBpZiAoaXNTYWZlQmF0Y2gpIHtcbiAgICAgICAgc2FmZUZsYWdzLnB1c2goLi4uYmF0Y2gpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoYmF0Y2gubGVuZ3RoIC8gMik7XG4gICAgICBjb25zdCBsZWZ0ID0gYmF0Y2guc2xpY2UoMCwgbWlkKTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gYmF0Y2guc2xpY2UobWlkKTtcblxuICAgICAgdm9pZCB0aGlzLnF1ZXVlLmFkZCgoKSA9PiBwcm9jZXNzQmF0Y2gobGVmdCwgY29udGV4dFZhbHVlcykpO1xuICAgICAgdm9pZCB0aGlzLnF1ZXVlLmFkZCgoKSA9PiBwcm9jZXNzQmF0Y2gocmlnaHQsIGNvbnRleHRWYWx1ZXMpKTtcbiAgICB9O1xuXG4gICAgdm9pZCB0aGlzLnF1ZXVlLmFkZCgoKSA9PiBwcm9jZXNzQmF0Y2goZmxhZ3MsIHRoaXMuYmFzZUNvbnRleHRWYWx1ZXMpKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXVlLm9uSWRsZSgpO1xuICAgIHJldHVybiBzYWZlRmxhZ3M7XG4gIH1cblxuICAvKiogUHJvdG90eXBlcyBmbGFnIGNoYW5nZXMgYnkgc3ludGhlc2l6aW5nIHRlbXBsYXRlcyBhbmQgc2hvd2luZyBkaWZmcyB0byB0aGUgdXNlciAqL1xuICBwcml2YXRlIGFzeW5jIHByb3RvdHlwZUNoYW5nZXMoZmxhZ05hbWVzOiBzdHJpbmdbXSwgcGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGJhc2VDb250ZXh0ID0gbmV3IENka0FwcE11bHRpQ29udGV4dChwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBiYXNlQ29udGV4dFZhbHVlcyA9IHsgLi4uYXdhaXQgYmFzZUNvbnRleHQucmVhZCgpLCAuLi50aGlzLmNsaUNvbnRleHRWYWx1ZXMgfTtcbiAgICBjb25zdCBtZW1vcnlDb250ZXh0ID0gbmV3IE1lbW9yeUNvbnRleHQoYmFzZUNvbnRleHRWYWx1ZXMpO1xuXG4gICAgY29uc3QgY2RrSnNvbiA9IGF3YWl0IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpLCAndXRmLTgnKSk7XG4gICAgY29uc3QgYXBwID0gY2RrSnNvbi5hcHA7XG5cbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCB0aGlzLnRvb2xraXQuZnJvbUNka0FwcChhcHAsIHtcbiAgICAgIGNvbnRleHRTdG9yZTogbWVtb3J5Q29udGV4dCxcbiAgICAgIG91dGRpcjogZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnY2RrLW9yaWdpbmFsLScpKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVwZGF0ZU9iaiA9IGF3YWl0IHRoaXMuYnVpbGRVcGRhdGVPYmplY3QoZmxhZ05hbWVzLCBwYXJhbXMsIGJhc2VDb250ZXh0VmFsdWVzKTtcbiAgICBpZiAoIXVwZGF0ZU9iaikgcmV0dXJuIGZhbHNlO1xuXG4gICAgYXdhaXQgbWVtb3J5Q29udGV4dC51cGRhdGUodXBkYXRlT2JqKTtcbiAgICBjb25zdCBjeCA9IGF3YWl0IHRoaXMudG9vbGtpdC5zeW50aChzb3VyY2UpO1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gY3guY2xvdWRBc3NlbWJseTtcblxuICAgIGNvbnN0IG1vZGlmaWVkU291cmNlID0gYXdhaXQgdGhpcy50b29sa2l0LmZyb21DZGtBcHAoYXBwLCB7XG4gICAgICBjb250ZXh0U3RvcmU6IG1lbW9yeUNvbnRleHQsXG4gICAgICBvdXRkaXI6IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2Nkay10ZW1wLScpKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1vZGlmaWVkQ3ggPSBhd2FpdCB0aGlzLnRvb2xraXQuc3ludGgobW9kaWZpZWRTb3VyY2UpO1xuICAgIGNvbnN0IGFsbFN0YWNrcyA9IGFzc2VtYmx5LnN0YWNrc1JlY3Vyc2l2ZWx5O1xuXG4gICAgZm9yIChjb25zdCBzdGFjayBvZiBhbGxTdGFja3MpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHN0YWNrLnRlbXBsYXRlRnVsbFBhdGg7XG4gICAgICBhd2FpdCB0aGlzLnRvb2xraXQuZGlmZihtb2RpZmllZEN4LCB7XG4gICAgICAgIG1ldGhvZDogRGlmZk1ldGhvZC5Mb2NhbEZpbGUodGVtcGxhdGVQYXRoKSxcbiAgICAgICAgc3RhY2tzOiB7XG4gICAgICAgICAgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSxcbiAgICAgICAgICBwYXR0ZXJuczogW3N0YWNrLmhpZXJhcmNoaWNhbElkXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZGlzcGxheUZsYWdDaGFuZ2VzKHVwZGF0ZU9iaiwgYmFzZUNvbnRleHRWYWx1ZXMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIERpc3BsYXlzIGEgc3VtbWFyeSBvZiBmbGFnIGNoYW5nZXMgc2hvd2luZyBvbGQgYW5kIG5ldyB2YWx1ZXMgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwbGF5RmxhZ0NoYW5nZXModXBkYXRlT2JqOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiwgYmFzZUNvbnRleHRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ1xcbkZsYWcgY2hhbmdlczonKTtcbiAgICBmb3IgKGNvbnN0IFtmbGFnTmFtZSwgbmV3VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHVwZGF0ZU9iaikpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGJhc2VDb250ZXh0VmFsdWVzW2ZsYWdOYW1lXTtcbiAgICAgIGNvbnN0IGN1cnJlbnREaXNwbGF5ID0gY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgPyAnPHVuc2V0PicgOiBTdHJpbmcoY3VycmVudFZhbHVlKTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgICAke2ZsYWdOYW1lfTogJHtjdXJyZW50RGlzcGxheX0g4oaSICR7bmV3VmFsdWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkcyB0aGUgdXBkYXRlIG9iamVjdCB3aXRoIG5ldyBmbGFnIHZhbHVlcyBiYXNlZCBvbiBwYXJhbWV0ZXJzIGFuZCBjdXJyZW50IGNvbnRleHQgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFVwZGF0ZU9iamVjdChmbGFnTmFtZXM6IHN0cmluZ1tdLCBwYXJhbXM6IEZsYWdPcGVyYXRpb25zUGFyYW1zLCBiYXNlQ29udGV4dFZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PilcbiAgICA6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4gfCBudWxsPiB7XG4gICAgY29uc3QgdXBkYXRlT2JqOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXG4gICAgaWYgKGZsYWdOYW1lcy5sZW5ndGggPT09IDEgJiYgcGFyYW1zLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZsYWdOYW1lID0gZmxhZ05hbWVzWzBdO1xuICAgICAgY29uc3QgYm9vbFZhbHVlID0gcGFyYW1zLnZhbHVlID09PSAndHJ1ZSc7XG4gICAgICBpZiAoYmFzZUNvbnRleHRWYWx1ZXNbZmxhZ05hbWVdID09PSBib29sVmFsdWUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdGbGFnIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIE5vIGNoYW5nZXMgbmVlZGVkLicpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZU9ialtmbGFnTmFtZV0gPSBib29sVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZmxhZ05hbWUgb2YgZmxhZ05hbWVzKSB7XG4gICAgICAgIGNvbnN0IGZsYWcgPSB0aGlzLmZsYWdzLmZpbmQoZiA9PiBmLm5hbWUgPT09IGZsYWdOYW1lKTtcbiAgICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5lcnJvcihgRmxhZyAke2ZsYWdOYW1lfSBub3QgZm91bmQuYCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBwYXJhbXMucmVjb21tZW5kZWRcbiAgICAgICAgICA/IGZsYWcucmVjb21tZW5kZWRWYWx1ZSBhcyBib29sZWFuXG4gICAgICAgICAgOiBTdHJpbmcoZGVmYXVsdFZhbHVlKGZsYWcpKSA9PT0gJ3RydWUnO1xuICAgICAgICB1cGRhdGVPYmpbZmxhZ05hbWVdID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1cGRhdGVPYmo7XG4gIH1cblxuICAvKiogUHJvbXB0cyB1c2VyIGZvciBjb25maXJtYXRpb24gYW5kIGFwcGxpZXMgY2hhbmdlcyBpZiBhY2NlcHRlZCAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZVVzZXJSZXNwb25zZShmbGFnTmFtZXM6IHN0cmluZ1tdLCBwYXJhbXM6IEZsYWdPcGVyYXRpb25zUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXNlckFjY2VwdGVkID0gYXdhaXQgdGhpcy5pb0hlbHBlci5yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTkzMDAnLFxuICAgICAgbWVzc2FnZTogJ0RvIHlvdSB3YW50IHRvIGFjY2VwdCB0aGVzZSBjaGFuZ2VzPycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZsYWdOYW1lcyxcbiAgICAgICAgcmVzcG9uc2VEZXNjcmlwdGlvbjogJ0VudGVyIFwieVwiIHRvIGFwcGx5IGNoYW5nZXMgb3IgXCJuXCIgdG8gY2FuY2VsJyxcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0UmVzcG9uc2U6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZXJBY2NlcHRlZCkge1xuICAgICAgYXdhaXQgdGhpcy5tb2RpZnlWYWx1ZXMoZmxhZ05hbWVzLCBwYXJhbXMpO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdGbGFnIHZhbHVlKHMpIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ09wZXJhdGlvbiBjYW5jZWxsZWQnKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmNsZWFudXBUZW1wRGlyZWN0b3JpZXMoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmVzIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBjcmVhdGVkIGR1cmluZyBmbGFnIG9wZXJhdGlvbnMgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwVGVtcERpcmVjdG9yaWVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9yaWdpbmFsRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdvcmlnaW5hbCcpO1xuICAgIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3RlbXAnKTtcbiAgICBhd2FpdCBmcy5yZW1vdmUob3JpZ2luYWxEaXIpO1xuICAgIGF3YWl0IGZzLnJlbW92ZSh0ZW1wRGlyKTtcbiAgfVxuXG4gIC8qKiBBY3R1YWxseSBtb2RpZmllcyB0aGUgY2RrLmpzb24gZmlsZSB3aXRoIHRoZSBuZXcgZmxhZyB2YWx1ZXMgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb2RpZnlWYWx1ZXMoZmxhZ05hbWVzOiBzdHJpbmdbXSwgcGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNka0pzb25QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpO1xuICAgIGNvbnN0IGNka0pzb25Db250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoY2RrSnNvblBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IGNka0pzb24gPSBKU09OLnBhcnNlKGNka0pzb25Db250ZW50KTtcblxuICAgIGlmIChmbGFnTmFtZXMubGVuZ3RoID09PSAxICYmICFwYXJhbXMuc2FmZSAmJiAhcGFyYW1zLmFsbCkge1xuICAgICAgY29uc3QgYm9vbFZhbHVlID0gcGFyYW1zLnZhbHVlID09PSAndHJ1ZSc7XG4gICAgICBjZGtKc29uLmNvbnRleHRbU3RyaW5nKGZsYWdOYW1lc1swXSldID0gYm9vbFZhbHVlO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKGBTZXR0aW5nIGZsYWcgJyR7ZmxhZ05hbWVzfScgdG86ICR7Ym9vbFZhbHVlfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGZsYWdOYW1lIG9mIGZsYWdOYW1lcykge1xuICAgICAgICBjb25zdCBmbGFnID0gdGhpcy5mbGFncy5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSkhO1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHBhcmFtcy5yZWNvbW1lbmRlZCB8fCBwYXJhbXMuc2FmZVxuICAgICAgICAgID8gZmxhZy5yZWNvbW1lbmRlZFZhbHVlIGFzIGJvb2xlYW5cbiAgICAgICAgICA6IFN0cmluZyhkZWZhdWx0VmFsdWUoZmxhZykpID09PSAndHJ1ZSc7XG4gICAgICAgIGNka0pzb24uY29udGV4dFtmbGFnTmFtZV0gPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGNka0pzb25QYXRoLCBKU09OLnN0cmluZ2lmeShjZGtKc29uLCBudWxsLCAyKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvKiogRGlzcGxheXMgZmxhZ3MgaW4gYSB0YWJsZSBmb3JtYXQsIGVpdGhlciBzcGVjaWZpYyBmbGFncyBvciBmaWx0ZXJlZCBieSBjcml0ZXJpYSAqL1xuICBhc3luYyBkaXNwbGF5RmxhZ3MocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgRkxBR05BTUUsIGFsbCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKEZMQUdOQU1FICYmIEZMQUdOQU1FLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcGxheVNwZWNpZmljRmxhZ3MoRkxBR05BTUUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IFtmbGFnc1RvRGlzcGxheSwgaGVhZGVyXSA9IGFsbFxuICAgICAgPyBbdGhpcy5mbGFncywgJ0FsbCBmZWF0dXJlIGZsYWdzJ11cbiAgICAgIDogW0ZsYWdPcGVyYXRpb25zLmZpbHRlck5lZWRzQXR0ZW50aW9uKHRoaXMuZmxhZ3MpLCAnVW5jb25maWd1cmVkIGZlYXR1cmUgZmxhZ3MnXTtcblxuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhoZWFkZXIpO1xuICAgIGF3YWl0IHRoaXMuZGlzcGxheUZsYWdUYWJsZShmbGFnc1RvRGlzcGxheSk7XG5cbiAgICAvLyBBZGQgaGVscGZ1bCBtZXNzYWdlIGFmdGVyIGVtcHR5IHRhYmxlIHdoZW4gbm90IHVzaW5nIC0tYWxsXG4gICAgaWYgKCFhbGwgJiYgZmxhZ3NUb0Rpc3BsYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJycpO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCfinIUgQWxsIGZlYXR1cmUgZmxhZ3MgYXJlIGFscmVhZHkgc2V0IHRvIHRoZWlyIHJlY29tbWVuZGVkIHZhbHVlcy4nKTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnVXNlIFxcJ2NkayBmbGFncyAtLWFsbCAtLXVuc3RhYmxlPWZsYWdzXFwnIHRvIHNlZSBhbGwgZmxhZ3MgYW5kIHRoZWlyIGN1cnJlbnQgdmFsdWVzLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEaXNwbGF5cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBmb3Igc3BlY2lmaWMgZmxhZ3MgbWF0Y2hpbmcgdGhlIGdpdmVuIG5hbWVzICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGxheVNwZWNpZmljRmxhZ3MoZmxhZ05hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1hdGNoaW5nRmxhZ3MgPSB0aGlzLmZsYWdzLmZpbHRlcihmID0+XG4gICAgICBmbGFnTmFtZXMuc29tZShzZWFyY2hUZXJtID0+IGYubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKSkpKTtcblxuICAgIGlmIChtYXRjaGluZ0ZsYWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5lcnJvcihgRmxhZyBtYXRjaGluZyBcIiR7ZmxhZ05hbWVzLmpvaW4oJywgJyl9XCIgbm90IGZvdW5kLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYXRjaGluZ0ZsYWdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZmxhZyA9IG1hdGNoaW5nRmxhZ3NbMF07XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYEZsYWcgbmFtZTogJHtmbGFnLm5hbWV9YCk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYERlc2NyaXB0aW9uOiAke2ZsYWcuZXhwbGFuYXRpb259YCk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFJlY29tbWVuZGVkIHZhbHVlOiAke2ZsYWcucmVjb21tZW5kZWRWYWx1ZX1gKTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRGVmYXVsdCB2YWx1ZTogJHtkZWZhdWx0VmFsdWUoZmxhZyl9YCk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFVzZXIgdmFsdWU6ICR7ZmxhZy51c2VyVmFsdWV9YCk7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYEVmZmVjdGl2ZSB2YWx1ZTogJHtlZmZlY3RpdmVWYWx1ZShmbGFnKX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oYEZvdW5kICR7bWF0Y2hpbmdGbGFncy5sZW5ndGh9IGZsYWdzIG1hdGNoaW5nIFwiJHtmbGFnTmFtZXMuam9pbignLCAnKX1cImApO1xuICAgIGF3YWl0IHRoaXMuZGlzcGxheUZsYWdUYWJsZShtYXRjaGluZ0ZsYWdzKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHNvcnQgb3JkZXIgZm9yIGZsYWdzICovXG4gIHByaXZhdGUgZ2V0RmxhZ1NvcnRPcmRlcihmbGFnOiBGZWF0dXJlRmxhZyk6IG51bWJlciB7XG4gICAgaWYgKGZsYWcudXNlclZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAzO1xuICAgIGlmIChpc0VmZmVjdGl2ZVZhbHVlRXF1YWxUb1JlY29tbWVuZGVkKGZsYWcpKSByZXR1cm4gMTtcbiAgICByZXR1cm4gMjtcbiAgfVxuXG4gIC8qKiBEaXNwbGF5cyBmbGFncyBpbiBhIGZvcm1hdHRlZCB0YWJsZSBncm91cGVkIGJ5IG1vZHVsZSBhbmQgc29ydGVkICovXG4gIGFzeW5jIGRpc3BsYXlGbGFnVGFibGUoZmxhZ3M6IEZlYXR1cmVGbGFnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzb3J0ZWRGbGFncyA9IFsuLi5mbGFnc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3Qgb3JkZXJBID0gdGhpcy5nZXRGbGFnU29ydE9yZGVyKGEpO1xuICAgICAgY29uc3Qgb3JkZXJCID0gdGhpcy5nZXRGbGFnU29ydE9yZGVyKGIpO1xuXG4gICAgICBpZiAob3JkZXJBICE9PSBvcmRlckIpIHJldHVybiBvcmRlckEgLSBvcmRlckI7XG4gICAgICBpZiAoYS5tb2R1bGUgIT09IGIubW9kdWxlKSByZXR1cm4gYS5tb2R1bGUubG9jYWxlQ29tcGFyZShiLm1vZHVsZSk7XG4gICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvd3M6IHN0cmluZ1tdW10gPSBbWydGZWF0dXJlIEZsYWcnLCAnUmVjb21tZW5kZWQnLCAnVXNlcicsICdFZmZlY3RpdmUnXV07XG4gICAgbGV0IGN1cnJlbnRNb2R1bGUgPSAnJztcblxuICAgIHNvcnRlZEZsYWdzLmZvckVhY2goKGZsYWcpID0+IHtcbiAgICAgIGlmIChmbGFnLm1vZHVsZSAhPT0gY3VycmVudE1vZHVsZSkge1xuICAgICAgICByb3dzLnB1c2goW2NoYWxrLmJvbGQoYE1vZHVsZTogJHtmbGFnLm1vZHVsZX1gKSwgJycsICcnLCAnJ10pO1xuICAgICAgICBjdXJyZW50TW9kdWxlID0gZmxhZy5tb2R1bGU7XG4gICAgICB9XG4gICAgICByb3dzLnB1c2goW1xuICAgICAgICBgICAke2ZsYWcubmFtZX1gLFxuICAgICAgICBTdHJpbmcoZmxhZy5yZWNvbW1lbmRlZFZhbHVlKSxcbiAgICAgICAgZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZCA/ICc8dW5zZXQ+JyA6IFN0cmluZyhmbGFnLnVzZXJWYWx1ZSksXG4gICAgICAgIFN0cmluZyhlZmZlY3RpdmVWYWx1ZShmbGFnKSksXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZvcm1hdHRlZFRhYmxlID0gZm9ybWF0VGFibGUocm93cywgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oZm9ybWF0dGVkVGFibGUpO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiBhIGZsYWcgaGFzIGEgYm9vbGVhbiByZWNvbW1lbmRlZCB2YWx1ZSAqL1xuICBpc0Jvb2xlYW5GbGFnKGZsYWc6IEZlYXR1cmVGbGFnKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjb21tZW5kZWQgPSBmbGFnLnJlY29tbWVuZGVkVmFsdWU7XG4gICAgcmV0dXJuIHR5cGVvZiByZWNvbW1lbmRlZCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICByZWNvbW1lbmRlZCA9PT0gJ3RydWUnIHx8XG4gICAgICByZWNvbW1lbmRlZCA9PT0gJ2ZhbHNlJztcbiAgfVxuXG4gIC8qKiBTaG93cyBoZWxwZnVsIHVzYWdlIGV4YW1wbGVzIGFuZCBhdmFpbGFibGUgY29tbWFuZCBvcHRpb25zICovXG4gIGFzeW5jIGRpc3BsYXlIZWxwTWVzc2FnZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ1xcbicgKyBjaGFsay5ib2xkKCdBdmFpbGFibGUgb3B0aW9uczonKSk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgIGNkayBmbGFncyAtLWludGVyYWN0aXZlICAgICAjIEludGVyYWN0aXZlIG1lbnUgdG8gbWFuYWdlIGZsYWdzJyk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgIGNkayBmbGFncyAtLWFsbCAgICAgICAgICAgICAjIFNob3cgYWxsIGZsYWdzIChpbmNsdWRpbmcgY29uZmlndXJlZCBvbmVzKScpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnICBjZGsgZmxhZ3MgLS1zZXQgLS1hbGwgLS1yZWNvbW1lbmRlZCAgICAjIFNldCBhbGwgZmxhZ3MgdG8gcmVjb21tZW5kZWQgdmFsdWVzJyk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgIGNkayBmbGFncyAtLXNldCAtLWFsbCAtLWRlZmF1bHQgICAgICAgIyBTZXQgYWxsIGZsYWdzIHRvIGRlZmF1bHQgdmFsdWVzJyk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgIGNkayBmbGFncyAtLXNldCAtLXVuY29uZmlndXJlZCAtLXJlY29tbWVuZGVkICAjIFNldCB1bmNvbmZpZ3VyZWQgZmxhZ3MgdG8gcmVjb21tZW5kZWQnKTtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmluZm8oJyAgY2RrIGZsYWdzIC0tc2V0IDxmbGFnLW5hbWU+IC0tdmFsdWUgPHRydWV8ZmFsc2U+ICAjIFNldCBzcGVjaWZpYyBmbGFnJyk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5pbmZvKCcgIGNkayBmbGFncyAtLXNhZmUgICAgICAgICAgICAjIFNhZmVseSBzZXQgZmxhZ3MgdGhhdCBkb25cXCd0IGNoYW5nZSB0ZW1wbGF0ZXMnKTtcbiAgfVxufVxuXG4vKiogQ2hlY2tzIGlmIHRoZSBmbGFncyBjdXJyZW50IGVmZmVjdGl2ZSB2YWx1ZSBtYXRjaGVzIHRoZSByZWNvbW1lbmRlZCB2YWx1ZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWZmZWN0aXZlVmFsdWVFcXVhbFRvUmVjb21tZW5kZWQoZmxhZzogRmVhdHVyZUZsYWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFN0cmluZyhlZmZlY3RpdmVWYWx1ZShmbGFnKSkgPT09IFN0cmluZyhmbGFnLnJlY29tbWVuZGVkVmFsdWUpO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgZWZmZWN0aXZlIHZhbHVlIG9mIGEgZmxhZyAodXNlciB2YWx1ZSBvciBkZWZhdWx0KVxuICovXG5mdW5jdGlvbiBlZmZlY3RpdmVWYWx1ZShmbGFnOiBGZWF0dXJlRmxhZykge1xuICByZXR1cm4gZmxhZy51c2VyVmFsdWUgPz8gZGVmYXVsdFZhbHVlKGZsYWcpO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmbGFnLCBhc3N1bWUgaXQncyBgZmFsc2VgIGlmIG5vdCBnaXZlblxuICovXG5mdW5jdGlvbiBkZWZhdWx0VmFsdWUoZmxhZzogRmVhdHVyZUZsYWcpIHtcbiAgcmV0dXJuIGZsYWcudW5jb25maWd1cmVkQmVoYXZlc0xpa2U/LnYyID8/IGZhbHNlO1xufVxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { InteractiveHandler } from './interactive-handler';
|
|
2
|
+
import type { FlagOperations } from './operations.ts';
|
|
3
|
+
import type { FlagOperationsParams } from './types';
|
|
4
|
+
import type { FlagValidator } from './validator';
|
|
5
|
+
export declare class FlagOperationRouter {
|
|
6
|
+
private readonly validator;
|
|
7
|
+
private readonly interactiveHandler;
|
|
8
|
+
private readonly flagOperations;
|
|
9
|
+
constructor(validator: FlagValidator, interactiveHandler: InteractiveHandler, flagOperations: FlagOperations);
|
|
10
|
+
/** Routes flag operations to appropriate handlers based on parameters */
|
|
11
|
+
route(params: FlagOperationsParams): Promise<void>;
|
|
12
|
+
/** Handles flag setting operations, routing to single or multiple flag methods */
|
|
13
|
+
private handleSetOperations;
|
|
14
|
+
/** Manages interactive mode */
|
|
15
|
+
private handleInteractiveMode;
|
|
16
|
+
/** Shows help message when no specific options are provided */
|
|
17
|
+
private showHelpMessage;
|
|
18
|
+
}
|