aws-cdk 2.8.0 → 2.12.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/CONTRIBUTING.md +1 -1
- package/README.md +1 -1
- package/build-info.json +2 -2
- package/lib/api/cloudformation-deployments.d.ts +8 -5
- package/lib/api/cloudformation-deployments.js +100 -42
- package/lib/api/hotswap/lambda-functions.js +115 -14
- package/lib/api/hotswap-deployments.js +1 -1
- package/lib/api/logs/logs-monitor.js +5 -4
- package/lib/api/toolkit-info.js +5 -5
- package/lib/api/util/placeholders.d.ts +6 -0
- package/lib/api/util/placeholders.js +25 -0
- package/lib/assets.js +2 -1
- package/lib/cdk-toolkit.js +3 -3
- package/lib/context-providers/ami.d.ts +1 -1
- package/lib/context-providers/ami.js +3 -3
- package/lib/context-providers/availability-zones.d.ts +1 -1
- package/lib/context-providers/availability-zones.js +3 -3
- package/lib/context-providers/endpoint-service-availability-zones.d.ts +1 -1
- package/lib/context-providers/endpoint-service-availability-zones.js +3 -3
- package/lib/context-providers/hosted-zones.d.ts +1 -1
- package/lib/context-providers/hosted-zones.js +3 -3
- package/lib/context-providers/index.d.ts +6 -0
- package/lib/context-providers/index.js +18 -5
- package/lib/context-providers/keys.d.ts +1 -1
- package/lib/context-providers/keys.js +3 -3
- package/lib/context-providers/load-balancers.d.ts +1 -1
- package/lib/context-providers/load-balancers.js +4 -4
- package/lib/context-providers/security-groups.d.ts +1 -1
- package/lib/context-providers/security-groups.js +3 -3
- package/lib/context-providers/ssm-parameters.d.ts +1 -1
- package/lib/context-providers/ssm-parameters.js +3 -3
- package/lib/context-providers/vpcs.d.ts +1 -1
- package/lib/context-providers/vpcs.js +6 -3
- package/lib/init-templates/v1/app/csharp/cdk.template.json +1 -1
- package/lib/init-templates/v1/app/fsharp/cdk.template.json +1 -1
- package/lib/init-templates/v1/sample-app/csharp/cdk.template.json +1 -1
- package/lib/init-templates/v1/sample-app/fsharp/cdk.template.json +1 -1
- package/lib/init-templates/v2/app/csharp/cdk.template.json +1 -1
- package/lib/init-templates/v2/app/fsharp/cdk.template.json +1 -1
- package/lib/init-templates/v2/sample-app/csharp/cdk.template.json +1 -1
- package/lib/init-templates/v2/sample-app/fsharp/cdk.template.json +1 -1
- package/lib/plugin.d.ts +15 -1
- package/lib/plugin.js +17 -3
- package/lib/util/asset-publishing.d.ts +1 -1
- package/lib/util/asset-publishing.js +4 -4
- package/npm-shrinkwrap.json +41 -41
- package/package.json +16 -15
- package/test/api/cloudformation-deployments.test.js +643 -1
- package/test/api/hotswap/hotswap-deployments.test.js +2 -2
- package/test/api/hotswap/hotswap-test-setup.d.ts +6 -1
- package/test/api/hotswap/hotswap-test-setup.js +19 -3
- package/test/api/hotswap/lambda-functions-docker-hotswap-deployments.test.d.ts +1 -0
- package/test/api/hotswap/lambda-functions-docker-hotswap-deployments.test.js +121 -0
- package/test/api/hotswap/lambda-functions-hotswap-deployments.test.js +175 -2
- package/test/api/hotswap/lambda-functions-inline-hotswap-deployments.test.d.ts +1 -0
- package/test/api/hotswap/lambda-functions-inline-hotswap-deployments.test.js +139 -0
- package/test/api/hotswap/lambda-versions-aliases-hotswap-deployments.test.js +2 -2
- package/test/api/logs/logs-monitor.test.js +9 -13
- package/test/cdk-toolkit.test.js +42 -1
- package/test/context-providers/generic.test.js +7 -6
- package/test/context-providers/vpcs.test.js +132 -1
- package/test/diff-nested-stacks-templates/one-output-one-param-stack.nested.template.json +20 -0
- package/test/diff-nested-stacks-templates/one-resource-one-stack-stack.nested.template.json +19 -0
- package/test/diff-nested-stacks-templates/one-resource-stack.nested.template.json +10 -0
- package/test/diff-nested-stacks-templates/one-resource-two-stacks-stack.nested.template.json +28 -0
- package/test/diff.test.js +215 -96
- package/test/util/mock-sdk.d.ts +3 -1
- package/test/util/mock-sdk.js +3 -3
- package/test/util.js +18 -1
package/CONTRIBUTING.md
CHANGED
|
@@ -131,7 +131,7 @@ Its value can either be that of `CANDIDATE_VERSION` (for testing against the lat
|
|
|
131
131
|
|
|
132
132
|
Following are the steps involved in running these tests:
|
|
133
133
|
|
|
134
|
-
1. Run [`./bump-candidate.sh`](../../bump-candidate.sh) to differentiate between the local version and the published version. For example, if the version in `lerna.json` is `1.67.0`, this script will result in a version `1.67.0-rc.0`. This is needed so that we can launch a verdaccio instance serving local tarballs without worrying about conflicts with the public npm uplink. This will help us avoid version quirks that might happen during the *post-release-pre-merge-back* time window.
|
|
134
|
+
1. Run [`./bump-candidate.sh`](../../scripts/bump-candidate.sh) to differentiate between the local version and the published version. For example, if the version in `lerna.json` is `1.67.0`, this script will result in a version `1.67.0-rc.0`. This is needed so that we can launch a verdaccio instance serving local tarballs without worrying about conflicts with the public npm uplink. This will help us avoid version quirks that might happen during the *post-release-pre-merge-back* time window.
|
|
135
135
|
|
|
136
136
|
2. Run [`./align-version.sh`](../../scripts/align-version.sh) to configure the above version in all our packages.
|
|
137
137
|
|
package/README.md
CHANGED
|
@@ -362,7 +362,7 @@ and that you have the necessary IAM permissions to update the resources that are
|
|
|
362
362
|
Hotswapping is currently supported for the following changes
|
|
363
363
|
(additional changes will be supported in the future):
|
|
364
364
|
|
|
365
|
-
- Code asset and tag changes of AWS Lambda functions.
|
|
365
|
+
- Code asset (including Docker image and inline code) and tag changes of AWS Lambda functions.
|
|
366
366
|
- AWS Lambda Versions and Aliases changes.
|
|
367
367
|
- Definition changes of AWS Step Functions State Machines.
|
|
368
368
|
- Container asset changes of AWS ECS Services.
|
package/build-info.json
CHANGED
|
@@ -4,10 +4,6 @@ import { SdkProvider, ISDK } from './aws-auth';
|
|
|
4
4
|
import { DeployStackResult } from './deploy-stack';
|
|
5
5
|
import { Template } from './util/cloudformation';
|
|
6
6
|
import { StackActivityProgress } from './util/cloudformation/stack-activity-monitor';
|
|
7
|
-
/**
|
|
8
|
-
* Replace the {ACCOUNT} and {REGION} placeholders in all strings found in a complex object.
|
|
9
|
-
*/
|
|
10
|
-
export declare function replaceEnvPlaceholders<A extends {}>(object: A, env: cxapi.Environment, sdkProvider: SdkProvider): Promise<A>;
|
|
11
7
|
/**
|
|
12
8
|
* SDK obtained by assuming the lookup role
|
|
13
9
|
* for a given environment
|
|
@@ -196,10 +192,17 @@ export interface PreparedSdkForEnvironment {
|
|
|
196
192
|
export declare class CloudFormationDeployments {
|
|
197
193
|
private readonly sdkProvider;
|
|
198
194
|
constructor(props: ProvisionerProps);
|
|
199
|
-
|
|
195
|
+
readCurrentTemplateWithNestedStacks(rootStackArtifact: cxapi.CloudFormationStackArtifact): Promise<Template>;
|
|
196
|
+
readCurrentTemplate(stackArtifact: cxapi.CloudFormationStackArtifact, sdk?: ISDK): Promise<Template>;
|
|
200
197
|
deployStack(options: DeployStackOptions): Promise<DeployStackResult>;
|
|
201
198
|
destroyStack(options: DestroyStackOptions): Promise<void>;
|
|
202
199
|
stackExists(options: StackExistsOptions): Promise<boolean>;
|
|
200
|
+
private prepareSdkWithLookupOrDeployRole;
|
|
201
|
+
private readCurrentStackTemplate;
|
|
202
|
+
private addNestedTemplatesToGeneratedAndDeployedStacks;
|
|
203
|
+
private getNestedStackTemplates;
|
|
204
|
+
private getNestedStackArn;
|
|
205
|
+
private isCdkManagedNestedStack;
|
|
203
206
|
/**
|
|
204
207
|
* Get the environment necessary for touching the given stack
|
|
205
208
|
*
|
|
@@ -1,33 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CloudFormationDeployments = exports.prepareSdkWithLookupRoleFor =
|
|
3
|
+
exports.CloudFormationDeployments = exports.prepareSdkWithLookupRoleFor = void 0;
|
|
4
|
+
const path = require("path");
|
|
4
5
|
const cxapi = require("@aws-cdk/cx-api");
|
|
5
6
|
const cdk_assets_1 = require("cdk-assets");
|
|
7
|
+
const fs = require("fs-extra");
|
|
6
8
|
const logging_1 = require("../logging");
|
|
7
9
|
const asset_publishing_1 = require("../util/asset-publishing");
|
|
8
10
|
const aws_auth_1 = require("./aws-auth");
|
|
9
11
|
const deploy_stack_1 = require("./deploy-stack");
|
|
12
|
+
const evaluate_cloudformation_template_1 = require("./evaluate-cloudformation-template");
|
|
10
13
|
const toolkit_info_1 = require("./toolkit-info");
|
|
11
14
|
const cloudformation_1 = require("./util/cloudformation");
|
|
12
|
-
|
|
13
|
-
* Replace the {ACCOUNT} and {REGION} placeholders in all strings found in a complex object.
|
|
14
|
-
*/
|
|
15
|
-
async function replaceEnvPlaceholders(object, env, sdkProvider) {
|
|
16
|
-
return cxapi.EnvironmentPlaceholders.replaceAsync(object, {
|
|
17
|
-
accountId: () => Promise.resolve(env.account),
|
|
18
|
-
region: () => Promise.resolve(env.region),
|
|
19
|
-
partition: async () => {
|
|
20
|
-
var _a;
|
|
21
|
-
// There's no good way to get the partition!
|
|
22
|
-
// We should have had it already, except we don't.
|
|
23
|
-
//
|
|
24
|
-
// Best we can do is ask the "base credentials" for this environment for their partition. Cross-partition
|
|
25
|
-
// AssumeRole'ing will never work anyway, so this answer won't be wrong (it will just be slow!)
|
|
26
|
-
return (_a = (await sdkProvider.baseCredentialsPartition(env, aws_auth_1.Mode.ForReading))) !== null && _a !== void 0 ? _a : 'aws';
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
exports.replaceEnvPlaceholders = replaceEnvPlaceholders;
|
|
15
|
+
const placeholders_1 = require("./util/placeholders");
|
|
31
16
|
/**
|
|
32
17
|
* Try to use the bootstrap lookupRole. There are two scenarios that are handled here
|
|
33
18
|
* 1. The lookup role may not exist (it was added in bootstrap stack version 7)
|
|
@@ -47,10 +32,10 @@ exports.replaceEnvPlaceholders = replaceEnvPlaceholders;
|
|
|
47
32
|
* function can then decide to use them or fallback to another role.
|
|
48
33
|
*/
|
|
49
34
|
async function prepareSdkWithLookupRoleFor(sdkProvider, stack) {
|
|
50
|
-
var _a, _b, _c, _d;
|
|
35
|
+
var _a, _b, _c, _d, _e;
|
|
51
36
|
const resolvedEnvironment = await sdkProvider.resolveEnvironment(stack.environment);
|
|
52
37
|
// Substitute any placeholders with information about the current environment
|
|
53
|
-
const arns = await replaceEnvPlaceholders({
|
|
38
|
+
const arns = await placeholders_1.replaceEnvPlaceholders({
|
|
54
39
|
lookupRoleArn: (_a = stack.lookupRole) === null || _a === void 0 ? void 0 : _a.arn,
|
|
55
40
|
}, resolvedEnvironment, sdkProvider);
|
|
56
41
|
// try to assume the lookup role
|
|
@@ -67,16 +52,22 @@ async function prepareSdkWithLookupRoleFor(sdkProvider, stack) {
|
|
|
67
52
|
if (version < stack.lookupRole.requiresBootstrapStackVersion) {
|
|
68
53
|
throw new Error(`Bootstrap stack version '${stack.lookupRole.requiresBootstrapStackVersion}' is required, found version '${version}'.`);
|
|
69
54
|
}
|
|
55
|
+
// we may not have assumed the lookup role because one was not provided
|
|
56
|
+
// if that is the case then don't print the upgrade warning
|
|
70
57
|
}
|
|
71
|
-
else if (!stackSdk.didAssumeRole) {
|
|
58
|
+
else if (!stackSdk.didAssumeRole && ((_e = stack.lookupRole) === null || _e === void 0 ? void 0 : _e.requiresBootstrapStackVersion)) {
|
|
72
59
|
logging_1.warning(upgradeMessage);
|
|
73
60
|
}
|
|
74
61
|
return { ...stackSdk, resolvedEnvironment };
|
|
75
62
|
}
|
|
76
63
|
catch (e) {
|
|
77
64
|
logging_1.debug(e);
|
|
78
|
-
|
|
79
|
-
|
|
65
|
+
// only print out the warnings if the lookupRole exists AND there is a required
|
|
66
|
+
// bootstrap version, otherwise the warnings will print `undefined`
|
|
67
|
+
if (stack.lookupRole && stack.lookupRole.requiresBootstrapStackVersion) {
|
|
68
|
+
logging_1.warning(warningMessage);
|
|
69
|
+
logging_1.warning(upgradeMessage);
|
|
70
|
+
}
|
|
80
71
|
throw (e);
|
|
81
72
|
}
|
|
82
73
|
}
|
|
@@ -91,23 +82,22 @@ class CloudFormationDeployments {
|
|
|
91
82
|
constructor(props) {
|
|
92
83
|
this.sdkProvider = props.sdkProvider;
|
|
93
84
|
}
|
|
94
|
-
async
|
|
85
|
+
async readCurrentTemplateWithNestedStacks(rootStackArtifact) {
|
|
86
|
+
const sdk = await this.prepareSdkWithLookupOrDeployRole(rootStackArtifact);
|
|
87
|
+
const deployedTemplate = await this.readCurrentTemplate(rootStackArtifact, sdk);
|
|
88
|
+
await this.addNestedTemplatesToGeneratedAndDeployedStacks(rootStackArtifact, sdk, {
|
|
89
|
+
generatedTemplate: rootStackArtifact.template,
|
|
90
|
+
deployedTemplate: deployedTemplate,
|
|
91
|
+
deployedStackName: rootStackArtifact.stackName,
|
|
92
|
+
});
|
|
93
|
+
return deployedTemplate;
|
|
94
|
+
}
|
|
95
|
+
async readCurrentTemplate(stackArtifact, sdk) {
|
|
95
96
|
logging_1.debug(`Reading existing template for stack ${stackArtifact.displayName}.`);
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
try {
|
|
99
|
-
const result = await prepareSdkWithLookupRoleFor(this.sdkProvider, stackArtifact);
|
|
100
|
-
if (result.didAssumeRole) {
|
|
101
|
-
stackSdk = result.sdk;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
catch (_a) { }
|
|
105
|
-
if (!stackSdk) {
|
|
106
|
-
stackSdk = (await this.prepareSdkFor(stackArtifact, undefined, aws_auth_1.Mode.ForReading)).stackSdk;
|
|
97
|
+
if (!sdk) {
|
|
98
|
+
sdk = await this.prepareSdkWithLookupOrDeployRole(stackArtifact);
|
|
107
99
|
}
|
|
108
|
-
|
|
109
|
-
const stack = await cloudformation_1.CloudFormationStack.lookup(cfn, stackArtifact.stackName);
|
|
110
|
-
return stack.template();
|
|
100
|
+
return this.readCurrentStackTemplate(stackArtifact.stackName, sdk);
|
|
111
101
|
}
|
|
112
102
|
async deployStack(options) {
|
|
113
103
|
const { stackSdk, resolvedEnvironment, cloudFormationRoleArn } = await this.prepareSdkFor(options.stack, options.roleArn);
|
|
@@ -156,6 +146,74 @@ class CloudFormationDeployments {
|
|
|
156
146
|
const stack = await cloudformation_1.CloudFormationStack.lookup(stackSdk.cloudFormation(), (_a = options.deployName) !== null && _a !== void 0 ? _a : options.stack.stackName);
|
|
157
147
|
return stack.exists;
|
|
158
148
|
}
|
|
149
|
+
async prepareSdkWithLookupOrDeployRole(stackArtifact) {
|
|
150
|
+
// try to assume the lookup role
|
|
151
|
+
try {
|
|
152
|
+
const result = await prepareSdkWithLookupRoleFor(this.sdkProvider, stackArtifact);
|
|
153
|
+
if (result.didAssumeRole) {
|
|
154
|
+
return result.sdk;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (_a) { }
|
|
158
|
+
// fall back to the deploy role
|
|
159
|
+
return (await this.prepareSdkFor(stackArtifact, undefined, aws_auth_1.Mode.ForReading)).stackSdk;
|
|
160
|
+
}
|
|
161
|
+
async readCurrentStackTemplate(stackName, stackSdk) {
|
|
162
|
+
const cfn = stackSdk.cloudFormation();
|
|
163
|
+
const stack = await cloudformation_1.CloudFormationStack.lookup(cfn, stackName);
|
|
164
|
+
return stack.template();
|
|
165
|
+
}
|
|
166
|
+
async addNestedTemplatesToGeneratedAndDeployedStacks(rootStackArtifact, sdk, parentTemplates) {
|
|
167
|
+
var _a, _b, _c, _d, _e;
|
|
168
|
+
const listStackResources = parentTemplates.deployedStackName ? new evaluate_cloudformation_template_1.LazyListStackResources(sdk, parentTemplates.deployedStackName) : undefined;
|
|
169
|
+
for (const [nestedStackLogicalId, generatedNestedStackResource] of Object.entries((_a = parentTemplates.generatedTemplate.Resources) !== null && _a !== void 0 ? _a : {})) {
|
|
170
|
+
if (!this.isCdkManagedNestedStack(generatedNestedStackResource)) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const assetPath = generatedNestedStackResource.Metadata['aws:asset:path'];
|
|
174
|
+
const nestedStackTemplates = await this.getNestedStackTemplates(rootStackArtifact, assetPath, nestedStackLogicalId, listStackResources, sdk);
|
|
175
|
+
generatedNestedStackResource.Properties.NestedTemplate = nestedStackTemplates.generatedTemplate;
|
|
176
|
+
const deployedParentTemplate = parentTemplates.deployedTemplate;
|
|
177
|
+
deployedParentTemplate.Resources = (_b = deployedParentTemplate.Resources) !== null && _b !== void 0 ? _b : {};
|
|
178
|
+
const deployedNestedStackResource = (_c = deployedParentTemplate.Resources[nestedStackLogicalId]) !== null && _c !== void 0 ? _c : {};
|
|
179
|
+
deployedParentTemplate.Resources[nestedStackLogicalId] = deployedNestedStackResource;
|
|
180
|
+
deployedNestedStackResource.Type = (_d = deployedNestedStackResource.Type) !== null && _d !== void 0 ? _d : 'AWS::CloudFormation::Stack';
|
|
181
|
+
deployedNestedStackResource.Properties = (_e = deployedNestedStackResource.Properties) !== null && _e !== void 0 ? _e : {};
|
|
182
|
+
deployedNestedStackResource.Properties.NestedTemplate = nestedStackTemplates.deployedTemplate;
|
|
183
|
+
await this.addNestedTemplatesToGeneratedAndDeployedStacks(rootStackArtifact, sdk, nestedStackTemplates);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async getNestedStackTemplates(rootStackArtifact, nestedTemplateAssetPath, nestedStackLogicalId, listStackResources, sdk) {
|
|
187
|
+
const nestedTemplatePath = path.join(rootStackArtifact.assembly.directory, nestedTemplateAssetPath);
|
|
188
|
+
// CFN generates the nested stack name in the form `ParentStackName-NestedStackLogicalID-SomeHashWeCan'tCompute,
|
|
189
|
+
// the arn is of the form: arn:aws:cloudformation:region:123456789012:stack/NestedStackName/AnotherHashWeDon'tNeed
|
|
190
|
+
// so we get the ARN and manually extract the name.
|
|
191
|
+
const nestedStackArn = await this.getNestedStackArn(nestedStackLogicalId, listStackResources);
|
|
192
|
+
const deployedStackName = nestedStackArn === null || nestedStackArn === void 0 ? void 0 : nestedStackArn.slice(nestedStackArn.indexOf('/') + 1, nestedStackArn.lastIndexOf('/'));
|
|
193
|
+
return {
|
|
194
|
+
generatedTemplate: JSON.parse(fs.readFileSync(nestedTemplatePath, 'utf-8')),
|
|
195
|
+
deployedTemplate: deployedStackName
|
|
196
|
+
? await this.readCurrentStackTemplate(deployedStackName, sdk)
|
|
197
|
+
: {},
|
|
198
|
+
deployedStackName,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
async getNestedStackArn(nestedStackLogicalId, listStackResources) {
|
|
202
|
+
var _a;
|
|
203
|
+
try {
|
|
204
|
+
const stackResources = await (listStackResources === null || listStackResources === void 0 ? void 0 : listStackResources.listStackResources());
|
|
205
|
+
return (_a = stackResources === null || stackResources === void 0 ? void 0 : stackResources.find(sr => sr.LogicalResourceId === nestedStackLogicalId)) === null || _a === void 0 ? void 0 : _a.PhysicalResourceId;
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
if (e.message.startsWith('Stack with id ') && e.message.endsWith(' does not exist')) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
throw e;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
isCdkManagedNestedStack(stackResource) {
|
|
215
|
+
return stackResource.Type === 'AWS::CloudFormation::Stack' && stackResource.Metadata && stackResource.Metadata['aws:asset:path'];
|
|
216
|
+
}
|
|
159
217
|
/**
|
|
160
218
|
* Get the environment necessary for touching the given stack
|
|
161
219
|
*
|
|
@@ -171,7 +229,7 @@ class CloudFormationDeployments {
|
|
|
171
229
|
}
|
|
172
230
|
const resolvedEnvironment = await this.sdkProvider.resolveEnvironment(stack.environment);
|
|
173
231
|
// Substitute any placeholders with information about the current environment
|
|
174
|
-
const arns = await replaceEnvPlaceholders({
|
|
232
|
+
const arns = await placeholders_1.replaceEnvPlaceholders({
|
|
175
233
|
assumeRoleArn: stack.assumeRoleArn,
|
|
176
234
|
// Use the override if given, otherwise use the field from the stack
|
|
177
235
|
cloudFormationRoleArn: roleArn !== null && roleArn !== void 0 ? roleArn : stack.cloudFormationExecutionRoleArn,
|
|
@@ -217,4 +275,4 @@ exports.CloudFormationDeployments = CloudFormationDeployments;
|
|
|
217
275
|
function isAssetManifestArtifact(art) {
|
|
218
276
|
return art instanceof cxapi.AssetManifestArtifact;
|
|
219
277
|
}
|
|
220
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmb3JtYXRpb24tZGVwbG95bWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbG91ZGZvcm1hdGlvbi1kZXBsb3ltZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBeUM7QUFDekMsMkNBQTJDO0FBRTNDLHdDQUE0QztBQUM1QywrREFBeUQ7QUFDekQseUNBQXFEO0FBQ3JELGlEQUE4RTtBQUM5RSxpREFBNkM7QUFDN0MsMERBQXNFO0FBR3RFOztHQUVHO0FBQ0ksS0FBSyxVQUFVLHNCQUFzQixDQUFnQixNQUFTLEVBQUUsR0FBc0IsRUFBRSxXQUF3QjtJQUNySCxPQUFPLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1FBQ3hELFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDN0MsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUN6QyxTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUU7O1lBQ3BCLDRDQUE0QztZQUM1QyxrREFBa0Q7WUFDbEQsRUFBRTtZQUNGLHlHQUF5RztZQUN6RywrRkFBK0Y7WUFDL0YsYUFBTyxDQUFDLE1BQU0sV0FBVyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxlQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsbUNBQUksS0FBSyxDQUFDO1FBQ3JGLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBYkQsd0RBYUM7QUEyQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBaUJJO0FBQ0csS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxXQUF3QixFQUN4QixLQUF3Qzs7SUFFeEMsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFcEYsNkVBQTZF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QyxDQUFDO1FBQzlFLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFMUUsS0FBSyxNQUFNLGFBQWEsSUFBSSxjQUFjLEVBQUU7WUFDMUMsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQ3RDLEtBQUssQ0FBQyxTQUFTLEVBQ2YsYUFBYSxDQUFDLDZCQUE2QixFQUMzQyxhQUFhLENBQUMsaUNBQWlDLEVBQy9DLFdBQVcsQ0FBQyxDQUFDO1lBRWYsTUFBTSxRQUFRLEdBQUcsMEJBQWEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVELE1BQU0sZ0NBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMzRDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyw2QkFBNkIsQ0FDekMsU0FBaUIsRUFDakIsNkJBQWlELEVBQ2pELGlDQUFxRCxFQUNyRCxXQUF3QjtRQUV4QixJQUFJLDZCQUE2QixLQUFLLFNBQVMsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUU1RCxJQUFJO1lBQ0YsTUFBTSxXQUFXLENBQUMsZUFBZSxDQUFDLDZCQUE2QixFQUFFLGlDQUFpQyxDQUFDLENBQUM7U0FDckc7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxTQUFTLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDL0M7SUFDSCxDQUFDO0NBQ0Y7QUFsS0QsOERBa0tDO0FBRUQsU0FBUyx1QkFBdUIsQ0FBQyxHQUF3QjtJQUN2RCxPQUFPLEdBQUcsWUFBWSxLQUFLLENBQUMscUJBQXFCLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgeyBBc3NldE1hbmlmZXN0IH0gZnJvbSAnY2RrLWFzc2V0cyc7XG5pbXBvcnQgeyBUYWcgfSBmcm9tICcuLi9jZGstdG9vbGtpdCc7XG5pbXBvcnQgeyBkZWJ1Zywgd2FybmluZyB9IGZyb20gJy4uL2xvZ2dpbmcnO1xuaW1wb3J0IHsgcHVibGlzaEFzc2V0cyB9IGZyb20gJy4uL3V0aWwvYXNzZXQtcHVibGlzaGluZyc7XG5pbXBvcnQgeyBNb2RlLCBTZGtQcm92aWRlciwgSVNESyB9IGZyb20gJy4vYXdzLWF1dGgnO1xuaW1wb3J0IHsgZGVwbG95U3RhY2ssIERlcGxveVN0YWNrUmVzdWx0LCBkZXN0cm95U3RhY2sgfSBmcm9tICcuL2RlcGxveS1zdGFjayc7XG5pbXBvcnQgeyBUb29sa2l0SW5mbyB9IGZyb20gJy4vdG9vbGtpdC1pbmZvJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uU3RhY2ssIFRlbXBsYXRlIH0gZnJvbSAnLi91dGlsL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IFN0YWNrQWN0aXZpdHlQcm9ncmVzcyB9IGZyb20gJy4vdXRpbC9jbG91ZGZvcm1hdGlvbi9zdGFjay1hY3Rpdml0eS1tb25pdG9yJztcblxuLyoqXG4gKiBSZXBsYWNlIHRoZSB7QUNDT1VOVH0gYW5kIHtSRUdJT059IHBsYWNlaG9sZGVycyBpbiBhbGwgc3RyaW5ncyBmb3VuZCBpbiBhIGNvbXBsZXggb2JqZWN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUVudlBsYWNlaG9sZGVyczxBIGV4dGVuZHMgeyB9PihvYmplY3Q6IEEsIGVudjogY3hhcGkuRW52aXJvbm1lbnQsIHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcik6IFByb21pc2U8QT4ge1xuICByZXR1cm4gY3hhcGkuRW52aXJvbm1lbnRQbGFjZWhvbGRlcnMucmVwbGFjZUFzeW5jKG9iamVjdCwge1xuICAgIGFjY291bnRJZDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGVudi5hY2NvdW50KSxcbiAgICByZWdpb246ICgpID0+IFByb21pc2UucmVzb2x2ZShlbnYucmVnaW9uKSxcbiAgICBwYXJ0aXRpb246IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoZXJlJ3Mgbm8gZ29vZCB3YXkgdG8gZ2V0IHRoZSBwYXJ0aXRpb24hXG4gICAgICAvLyBXZSBzaG91bGQgaGF2ZSBoYWQgaXQgYWxyZWFkeSwgZXhjZXB0IHdlIGRvbid0LlxuICAgICAgLy9cbiAgICAgIC8vIEJlc3Qgd2UgY2FuIGRvIGlzIGFzayB0aGUgXCJiYXNlIGNyZWRlbnRpYWxzXCIgZm9yIHRoaXMgZW52aXJvbm1lbnQgZm9yIHRoZWlyIHBhcnRpdGlvbi4gQ3Jvc3MtcGFydGl0aW9uXG4gICAgICAvLyBBc3N1bWVSb2xlJ2luZyB3aWxsIG5ldmVyIHdvcmsgYW55d2F5LCBzbyB0aGlzIGFuc3dlciB3b24ndCBiZSB3cm9uZyAoaXQgd2lsbCBqdXN0IGJlIHNsb3chKVxuICAgICAgcmV0dXJuIChhd2FpdCBzZGtQcm92aWRlci5iYXNlQ3JlZGVudGlhbHNQYXJ0aXRpb24oZW52LCBNb2RlLkZvclJlYWRpbmcpKSA/PyAnYXdzJztcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBTREsgb2J0YWluZWQgYnkgYXNzdW1pbmcgdGhlIGxvb2t1cCByb2xlXG4gKiBmb3IgYSBnaXZlbiBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXBhcmVkU2RrV2l0aExvb2t1cFJvbGVGb3JFbnZpcm9ubWVudCB7XG4gIC8qKlxuICAgKiBUaGUgU0RLIGZvciB0aGUgZ2l2ZW4gZW52aXJvbm1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHNkazogSVNESztcblxuICAvKipcbiAgICogVGhlIHJlc29sdmVkIGVudmlyb25tZW50IGZvciB0aGUgc3RhY2tcbiAgICogKG5vIG1vcmUgJ3Vua25vd24tYWNjb3VudC91bmtub3duLXJlZ2lvbicpXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlZEVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudDtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIGFzc3VtZSByb2xlIHdhcyBzdWNjZXNzZnVsLlxuICAgKiBJZiB0aGUgYXNzdW1lIHJvbGUgd2FzIG5vdCBzdWNjZXNzZnVsIChmYWxzZSlcbiAgICogdGhlbiB0aGF0IG1lYW5zIHRoYXQgdGhlICdzZGsnIHJldHVybmVkIGNvbnRhaW5zXG4gICAqIHRoZSBkZWZhdWx0IGNyZWRlbnRpYWxzIChub3QgdGhlIGFzc3VtZSByb2xlIGNyZWRlbnRpYWxzKVxuICAgKi9cbiAgcmVhZG9ubHkgZGlkQXNzdW1lUm9sZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gICogVHJ5IHRvIHVzZSB0aGUgYm9vdHN0cmFwIGxvb2t1cFJvbGUuIFRoZXJlIGFyZSB0d28gc2NlbmFyaW9zIHRoYXQgYXJlIGhhbmRsZWQgaGVyZVxuICAqICAxLiBUaGUgbG9va3VwIHJvbGUgbWF5IG5vdCBleGlzdCAoaXQgd2FzIGFkZGVkIGluIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uIDcpXG4gICogIDIuIFRoZSBsb29rdXAgcm9sZSBtYXkgbm90IGhhdmUgdGhlIGNvcnJlY3QgcGVybWlzc2lvbnMgKFJlYWRPbmx5QWNjZXNzIHdhcyBhZGRlZCBpblxuICAqICAgICAgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb24gOClcbiAgKlxuICAqIEluIHRoZSBjYXNlIG9mIDEgKGxvb2t1cCByb2xlIGRvZXNuJ3QgZXhpc3QpIGBmb3JFbnZpcm9ubWVudGAgd2lsbCBlaXRoZXI6XG4gICogICAxLiBSZXR1cm4gdGhlIGRlZmF1bHQgY3JlZGVudGlhbHMgaWYgdGhlIGRlZmF1bHQgY3JlZGVudGlhbHMgYXJlIGZvciB0aGUgc3RhY2sgYWNjb3VudFxuICAqICAgMi4gVGhyb3cgYW4gZXJyb3IgaWYgdGhlIGRlZmF1bHQgY3JlZGVudGlhbHMgYXJlIG5vdCBmb3IgdGhlIHN0YWNrIGFjY291bnQuXG4gICpcbiAgKiBJZiB3ZSBzdWNjZXNzZnVsbHkgYXNzdW1lIHRoZSBsb29rdXAgcm9sZSB3ZSB0aGVuIHByb2NlZWQgdG8gMiBhbmQgY2hlY2sgd2hldGhlciB0aGUgYm9vdHN0cmFwXG4gICogc3RhY2sgdmVyc2lvbiBpcyB2YWxpZC4gSWYgaXQgaXMgbm90IHdlIHRocm93IGFuIGVycm9yIHdoaWNoIHNob3VsZCBiZSBoYW5kbGVkIGluIHRoZSBjYWxsaW5nXG4gICogZnVuY3Rpb24gKGFuZCBmYWxsYmFjayB0byB1c2UgYSBkaWZmZXJlbnQgcm9sZSwgZXRjKVxuICAqXG4gICogSWYgd2UgZG8gbm90IHN1Y2Nlc3NmdWxseSBhc3N1bWUgdGhlIGxvb2t1cCByb2xlLCBidXQgZG8gZ2V0IGJhY2sgdGhlIGRlZmF1bHQgY3JlZGVudGlhbHNcbiAgKiB0aGVuIHJldHVybiB0aG9zZSBhbmQgbm90ZSB0aGF0IHdlIGFyZSByZXR1cm5pbmcgdGhlIGRlZmF1bHQgY3JlZGVudGlhbHMuIFRoZSBjYWxsaW5nXG4gICogZnVuY3Rpb24gY2FuIHRoZW4gZGVjaWRlIHRvIHVzZSB0aGVtIG9yIGZhbGxiYWNrIHRvIGFub3RoZXIgcm9sZS5cbiAgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlU2RrV2l0aExvb2t1cFJvbGVGb3IoXG4gIHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcixcbiAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbik6IFByb21pc2U8UHJlcGFyZWRTZGtXaXRoTG9va3VwUm9sZUZvckVudmlyb25tZW50PiB7XG4gIGNvbnN0IHJlc29sdmVkRW52aXJvbm1lbnQgPSBhd2FpdCBzZGtQcm92aWRlci5yZXNvbHZlRW52aXJvbm1lbnQoc3RhY2suZW52aXJvbm1lbnQpO1xuXG4gIC8vIFN1YnN0aXR1dGUgYW55IHBsYWNlaG9sZGVycyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGVudmlyb25tZW50XG4gIGNvbnN0IGFybnMgPSBhd2FpdCByZXBsYWNlRW52UGxhY2Vob2xkZXJzKHtcbiAgICBsb29rdXBSb2xlQXJuOiBzdGFjay5sb29rdXBSb2xlPy5hcm4sXG4gIH0sIHJlc29sdmVkRW52aXJvbm1lbnQsIHNka1Byb3ZpZGVyKTtcblxuICAvLyB0cnkgdG8gYXNzdW1lIHRoZSBsb29rdXAgcm9sZVxuICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IGBDb3VsZCBub3QgYXNzdW1lICR7YXJucy5sb29rdXBSb2xlQXJufSwgcHJvY2VlZGluZyBhbnl3YXkuYDtcbiAgY29uc3QgdXBncmFkZU1lc3NhZ2UgPSBgKFRvIGdldCByaWQgb2YgdGhpcyB3YXJuaW5nLCBwbGVhc2UgdXBncmFkZSB0byBib290c3RyYXAgdmVyc2lvbiA+PSAke3N0YWNrLmxvb2t1cFJvbGU/LnJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9ufSlgO1xuICB0cnkge1xuICAgIGNvbnN0IHN0YWNrU2RrID0gYXdhaXQgc2RrUHJvdmlkZXIuZm9yRW52aXJvbm1lbnQocmVzb2x2ZWRFbnZpcm9ubWVudCwgTW9kZS5Gb3JSZWFkaW5nLCB7XG4gICAgICBhc3N1bWVSb2xlQXJuOiBhcm5zLmxvb2t1cFJvbGVBcm4sXG4gICAgICBhc3N1bWVSb2xlRXh0ZXJuYWxJZDogc3RhY2subG9va3VwUm9sZT8uYXNzdW1lUm9sZUV4dGVybmFsSWQsXG4gICAgfSk7XG5cbiAgICAvLyBpZiB3ZSBzdWNjZWVkIGluIGFzc3VtaW5nIHRoZSBsb29rdXAgcm9sZSwgbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICBpZiAoc3RhY2tTZGsuZGlkQXNzdW1lUm9sZSAmJiBzdGFjay5sb29rdXBSb2xlPy5ib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIgJiYgc3RhY2subG9va3VwUm9sZS5yZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbikge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IFRvb2xraXRJbmZvLnZlcnNpb25Gcm9tU3NtUGFyYW1ldGVyKHN0YWNrU2RrLnNkaywgc3RhY2subG9va3VwUm9sZS5ib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIpO1xuICAgICAgaWYgKHZlcnNpb24gPCBzdGFjay5sb29rdXBSb2xlLnJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQm9vdHN0cmFwIHN0YWNrIHZlcnNpb24gJyR7c3RhY2subG9va3VwUm9sZS5yZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbn0nIGlzIHJlcXVpcmVkLCBmb3VuZCB2ZXJzaW9uICcke3ZlcnNpb259Jy5gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFzdGFja1Nkay5kaWRBc3N1bWVSb2xlKSB7XG4gICAgICB3YXJuaW5nKHVwZ3JhZGVNZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uc3RhY2tTZGssIHJlc29sdmVkRW52aXJvbm1lbnQgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRlYnVnKGUpO1xuICAgIHdhcm5pbmcod2FybmluZ01lc3NhZ2UpO1xuICAgIHdhcm5pbmcodXBncmFkZU1lc3NhZ2UpO1xuICAgIHRocm93IChlKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVN0YWNrT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFjayB0byBkZXBsb3lcbiAgICovXG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGlvbiByb2xlIGZvciB0aGUgZGVwbG95bWVudCAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEN1cnJlbnQgcm9sZVxuICAgKi9cbiAgcm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVG9waWMgQVJOcyB0byBzZW5kIGEgbWVzc2FnZSB3aGVuIGRlcGxveW1lbnQgZmluaXNoZXMgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBub3RpZmljYXRpb25zXG4gICAqL1xuICBub3RpZmljYXRpb25Bcm5zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG5hbWUgdW5kZXIgd2hpY2ggc3RhY2sgd2lsbCBiZSBkZXBsb3llZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFVzZSBhcnRpZmFjdCBkZWZhdWx0XG4gICAqL1xuICBkZXBsb3lOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEb24ndCBzaG93IHN0YWNrIGRlcGxveW1lbnQgZXZlbnRzLCBqdXN0IHdhaXRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHF1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdG9vbGtpdCBzdGFjaywgaWYgbm90IHRoZSBkZWZhdWx0IG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgJ0NES1Rvb2xraXQnXG4gICAqL1xuICB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFzc2V0IElEcyB3aGljaCBzaG91bGQgTk9UIGJlIGJ1aWx0IG9yIHVwbG9hZGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQnVpbGQgYWxsIGFzc2V0c1xuICAgKi9cbiAgcmV1c2VBc3NldHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3RhY2sgdGFncyAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKi9cbiAgdGFncz86IFRhZ1tdO1xuXG4gIC8qKlxuICAgKiBTdGFnZSB0aGUgY2hhbmdlIHNldCBidXQgZG9uJ3QgZXhlY3V0ZSBpdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICBleGVjdXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgbmFtZSB0byB1c2UgZm9yIHRoZSBDbG91ZEZvcm1hdGlvbiBjaGFuZ2Ugc2V0LlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgY2hhbmdlU2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRm9yY2UgZGVwbG95bWVudCwgZXZlbiBpZiB0aGUgZGVwbG95ZWQgdGVtcGxhdGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgd2UgYXJlIGFib3V0IHRvIGRlcGxveS5cbiAgICogQGRlZmF1bHQgZmFsc2UgZGVwbG95bWVudCB3aWxsIGJlIHNraXBwZWQgaWYgdGhlIHRlbXBsYXRlIGlzIGlkZW50aWNhbFxuICAgKi9cbiAgZm9yY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBwYXJhbWV0ZXJzIGZvciBDbG91ZEZvcm1hdGlvblxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGVcbiAgICovXG4gIHBhcmFtZXRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcblxuICAvKipcbiAgICogVXNlIHByZXZpb3VzIHZhbHVlcyBmb3IgdW5zcGVjaWZpZWQgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBJZiBub3Qgc2V0LCBhbGwgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZXZlcnkgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgdXNlUHJldmlvdXNQYXJhbWV0ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzcGxheSBtb2RlIGZvciBzdGFjayBkZXBsb3ltZW50IHByb2dyZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5CYXIgLSBzdGFjayBldmVudHMgd2lsbCBiZSBkaXNwbGF5ZWQgZm9yXG4gICAqICAgdGhlIHJlc291cmNlIGN1cnJlbnRseSBiZWluZyBkZXBsb3llZC5cbiAgICovXG4gIHByb2dyZXNzPzogU3RhY2tBY3Rpdml0eVByb2dyZXNzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIGFyZSBvbiBhIENJIHN5c3RlbVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSb2xsYmFjayBmYWlsZWQgZGVwbG95bWVudHNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qXG4gICAqIFdoZXRoZXIgdG8gcGVyZm9ybSBhICdob3Rzd2FwJyBkZXBsb3ltZW50LlxuICAgKiBBICdob3Rzd2FwJyBkZXBsb3ltZW50IHdpbGwgYXR0ZW1wdCB0byBzaG9ydC1jaXJjdWl0IENsb3VkRm9ybWF0aW9uXG4gICAqIGFuZCB1cGRhdGUgdGhlIGFmZmVjdGVkIHJlc291cmNlcyBsaWtlIExhbWJkYSBmdW5jdGlvbnMgZGlyZWN0bHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2UgZm9yIHJlZ3VsYXIgZGVwbG95bWVudHMsIHRydWUgZm9yICd3YXRjaCcgZGVwbG95bWVudHNcbiAgICovXG4gIHJlYWRvbmx5IGhvdHN3YXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0cmEgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgVXNlci1BZ2VudCBoZWFkZXIgd2hlbiBwZXJmb3JtaW5nIEFXUyBTREsgY2FsbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90aGluZyBleHRyYSBpcyBhcHBlbmRlZCB0byB0aGUgVXNlci1BZ2VudCBoZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhVXNlckFnZW50Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc3Ryb3lTdGFja09wdGlvbnMge1xuICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBkZXBsb3lOYW1lPzogc3RyaW5nO1xuICByb2xlQXJuPzogc3RyaW5nO1xuICBxdWlldD86IGJvb2xlYW47XG4gIGZvcmNlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja0V4aXN0c09wdGlvbnMge1xuICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBkZXBsb3lOYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvbmVyUHJvcHMge1xuICBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG59XG5cbi8qKlxuICogU0RLIG9idGFpbmVkIGJ5IGFzc3VtaW5nIHRoZSBkZXBsb3kgcm9sZVxuICogZm9yIGEgZ2l2ZW4gZW52aXJvbm1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlZFNka0ZvckVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFRoZSBTREsgZm9yIHRoZSBnaXZlbiBlbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tTZGs6IElTREs7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCBmb3IgdGhlIHN0YWNrXG4gICAqIChubyBtb3JlICd1bmtub3duLWFjY291bnQvdW5rbm93bi1yZWdpb24nKVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRFbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQ7XG4gIC8qKlxuICAgKiBUaGUgRXhlY3V0aW9uIFJvbGUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIENsb3VkRm9ybWF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4ZWN1dGlvbiByb2xlIGlzIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uUm9sZUFybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIENsb3VkRm9ybWF0aW9uIGRlcGxveW1lbnRzXG4gKlxuICogTG9va3MgdXMgdGhlIHJpZ2h0IFNESyBhbmQgQm9vdHN0cmFwIHN0YWNrIHRvIGRlcGxveSBhIGdpdmVuXG4gKiBzdGFjayBhcnRpZmFjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIENsb3VkRm9ybWF0aW9uRGVwbG95bWVudHMge1xuICBwcml2YXRlIHJlYWRvbmx5IHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogUHJvdmlzaW9uZXJQcm9wcykge1xuICAgIHRoaXMuc2RrUHJvdmlkZXIgPSBwcm9wcy5zZGtQcm92aWRlcjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkQ3VycmVudFRlbXBsYXRlKHN0YWNrQXJ0aWZhY3Q6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCk6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgICBkZWJ1ZyhgUmVhZGluZyBleGlzdGluZyB0ZW1wbGF0ZSBmb3Igc3RhY2sgJHtzdGFja0FydGlmYWN0LmRpc3BsYXlOYW1lfS5gKTtcbiAgICBsZXQgc3RhY2tTZGs6IElTREsgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLy8gdHJ5IHRvIGFzc3VtZSB0aGUgbG9va3VwIHJvbGUgYW5kIGZhbGxiYWNrIHRvIHRoZSBkZXBsb3kgcm9sZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcmVwYXJlU2RrV2l0aExvb2t1cFJvbGVGb3IodGhpcy5zZGtQcm92aWRlciwgc3RhY2tBcnRpZmFjdCk7XG4gICAgICBpZiAocmVzdWx0LmRpZEFzc3VtZVJvbGUpIHtcbiAgICAgICAgc3RhY2tTZGsgPSByZXN1bHQuc2RrO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggeyB9XG5cbiAgICBpZiAoIXN0YWNrU2RrKSB7XG4gICAgICBzdGFja1NkayA9IChhd2FpdCB0aGlzLnByZXBhcmVTZGtGb3Ioc3RhY2tBcnRpZmFjdCwgdW5kZWZpbmVkLCBNb2RlLkZvclJlYWRpbmcpKS5zdGFja1NkaztcbiAgICB9XG5cbiAgICBjb25zdCBjZm4gPSBzdGFja1Nkay5jbG91ZEZvcm1hdGlvbigpO1xuXG4gICAgY29uc3Qgc3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIHN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lKTtcbiAgICByZXR1cm4gc3RhY2sudGVtcGxhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZXBsb3lTdGFjayhvcHRpb25zOiBEZXBsb3lTdGFja09wdGlvbnMpOiBQcm9taXNlPERlcGxveVN0YWNrUmVzdWx0PiB7XG4gICAgY29uc3QgeyBzdGFja1NkaywgcmVzb2x2ZWRFbnZpcm9ubWVudCwgY2xvdWRGb3JtYXRpb25Sb2xlQXJuIH0gPSBhd2FpdCB0aGlzLnByZXBhcmVTZGtGb3Iob3B0aW9ucy5zdGFjaywgb3B0aW9ucy5yb2xlQXJuKTtcblxuICAgIGNvbnN0IHRvb2xraXRJbmZvID0gYXdhaXQgVG9vbGtpdEluZm8ubG9va3VwKHJlc29sdmVkRW52aXJvbm1lbnQsIHN0YWNrU2RrLCBvcHRpb25zLnRvb2xraXRTdGFja05hbWUpO1xuXG4gICAgLy8gUHVibGlzaCBhbnkgYXNzZXRzIGJlZm9yZSBkb2luZyB0aGUgYWN0dWFsIGRlcGxveVxuICAgIGF3YWl0IHRoaXMucHVibGlzaFN0YWNrQXNzZXRzKG9wdGlvbnMuc3RhY2ssIHRvb2xraXRJbmZvKTtcblxuICAgIC8vIERvIGEgdmVyaWZpY2F0aW9uIG9mIHRoZSBib290c3RyYXAgc3RhY2sgdmVyc2lvblxuICAgIGF3YWl0IHRoaXMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24oXG4gICAgICBvcHRpb25zLnN0YWNrLnN0YWNrTmFtZSxcbiAgICAgIG9wdGlvbnMuc3RhY2sucmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICBvcHRpb25zLnN0YWNrLmJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcixcbiAgICAgIHRvb2xraXRJbmZvKTtcblxuICAgIHJldHVybiBkZXBsb3lTdGFjayh7XG4gICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgIHJlc29sdmVkRW52aXJvbm1lbnQsXG4gICAgICBkZXBsb3lOYW1lOiBvcHRpb25zLmRlcGxveU5hbWUsXG4gICAgICBub3RpZmljYXRpb25Bcm5zOiBvcHRpb25zLm5vdGlmaWNhdGlvbkFybnMsXG4gICAgICBxdWlldDogb3B0aW9ucy5xdWlldCxcbiAgICAgIHNkazogc3RhY2tTZGssXG4gICAgICBzZGtQcm92aWRlcjogdGhpcy5zZGtQcm92aWRlcixcbiAgICAgIHJvbGVBcm46IGNsb3VkRm9ybWF0aW9uUm9sZUFybixcbiAgICAgIHJldXNlQXNzZXRzOiBvcHRpb25zLnJldXNlQXNzZXRzLFxuICAgICAgdG9vbGtpdEluZm8sXG4gICAgICB0YWdzOiBvcHRpb25zLnRhZ3MsXG4gICAgICBleGVjdXRlOiBvcHRpb25zLmV4ZWN1dGUsXG4gICAgICBjaGFuZ2VTZXROYW1lOiBvcHRpb25zLmNoYW5nZVNldE5hbWUsXG4gICAgICBmb3JjZTogb3B0aW9ucy5mb3JjZSxcbiAgICAgIHBhcmFtZXRlcnM6IG9wdGlvbnMucGFyYW1ldGVycyxcbiAgICAgIHVzZVByZXZpb3VzUGFyYW1ldGVyczogb3B0aW9ucy51c2VQcmV2aW91c1BhcmFtZXRlcnMsXG4gICAgICBwcm9ncmVzczogb3B0aW9ucy5wcm9ncmVzcyxcbiAgICAgIGNpOiBvcHRpb25zLmNpLFxuICAgICAgcm9sbGJhY2s6IG9wdGlvbnMucm9sbGJhY2ssXG4gICAgICBob3Rzd2FwOiBvcHRpb25zLmhvdHN3YXAsXG4gICAgICBleHRyYVVzZXJBZ2VudDogb3B0aW9ucy5leHRyYVVzZXJBZ2VudCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95U3RhY2sob3B0aW9uczogRGVzdHJveVN0YWNrT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgc3RhY2tTZGssIGNsb3VkRm9ybWF0aW9uUm9sZUFybjogcm9sZUFybiB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlU2RrRm9yKG9wdGlvbnMuc3RhY2ssIG9wdGlvbnMucm9sZUFybik7XG5cbiAgICByZXR1cm4gZGVzdHJveVN0YWNrKHtcbiAgICAgIHNkazogc3RhY2tTZGssXG4gICAgICByb2xlQXJuLFxuICAgICAgc3RhY2s6IG9wdGlvbnMuc3RhY2ssXG4gICAgICBkZXBsb3lOYW1lOiBvcHRpb25zLmRlcGxveU5hbWUsXG4gICAgICBxdWlldDogb3B0aW9ucy5xdWlldCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFja0V4aXN0cyhvcHRpb25zOiBTdGFja0V4aXN0c09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHN0YWNrU2RrIH0gPSBhd2FpdCB0aGlzLnByZXBhcmVTZGtGb3Iob3B0aW9ucy5zdGFjaywgdW5kZWZpbmVkLCBNb2RlLkZvclJlYWRpbmcpO1xuICAgIGNvbnN0IHN0YWNrID0gYXdhaXQgQ2xvdWRGb3JtYXRpb25TdGFjay5sb29rdXAoc3RhY2tTZGsuY2xvdWRGb3JtYXRpb24oKSwgb3B0aW9ucy5kZXBsb3lOYW1lID8/IG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lKTtcbiAgICByZXR1cm4gc3RhY2suZXhpc3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZW52aXJvbm1lbnQgbmVjZXNzYXJ5IGZvciB0b3VjaGluZyB0aGUgZ2l2ZW4gc3RhY2tcbiAgICpcbiAgICogUmV0dXJucyB0aGUgZm9sbG93aW5nOlxuICAgKlxuICAgKiAtIFRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCBmb3IgdGhlIHN0YWNrIChubyBtb3JlICd1bmtub3duLWFjY291bnQvdW5rbm93bi1yZWdpb24nKVxuICAgKiAtIFNESyBsb2FkZWQgd2l0aCB0aGUgcmlnaHQgY3JlZGVudGlhbHMgZm9yIGNhbGxpbmcgYENyZWF0ZUNoYW5nZVNldGAuXG4gICAqIC0gVGhlIEV4ZWN1dGlvbiBSb2xlIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0byBDbG91ZEZvcm1hdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVNka0ZvcihcbiAgICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICAgIHJvbGVBcm4/OiBzdHJpbmcsXG4gICAgbW9kZSA9IE1vZGUuRm9yV3JpdGluZyxcbiAgKTogUHJvbWlzZTxQcmVwYXJlZFNka0ZvckVudmlyb25tZW50PiB7XG4gICAgaWYgKCFzdGFjay5lbnZpcm9ubWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3RhY2sgJHtzdGFjay5kaXNwbGF5TmFtZX0gZG9lcyBub3QgaGF2ZSBhbiBlbnZpcm9ubWVudGApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkRW52aXJvbm1lbnQgPSBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyLnJlc29sdmVFbnZpcm9ubWVudChzdGFjay5lbnZpcm9ubWVudCk7XG5cbiAgICAvLyBTdWJzdGl0dXRlIGFueSBwbGFjZWhvbGRlcnMgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBlbnZpcm9ubWVudFxuICAgIGNvbnN0IGFybnMgPSBhd2FpdCByZXBsYWNlRW52UGxhY2Vob2xkZXJzKHtcbiAgICAgIGFzc3VtZVJvbGVBcm46IHN0YWNrLmFzc3VtZVJvbGVBcm4sXG5cbiAgICAgIC8vIFVzZSB0aGUgb3ZlcnJpZGUgaWYgZ2l2ZW4sIG90aGVyd2lzZSB1c2UgdGhlIGZpZWxkIGZyb20gdGhlIHN0YWNrXG4gICAgICBjbG91ZEZvcm1hdGlvblJvbGVBcm46IHJvbGVBcm4gPz8gc3RhY2suY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlQXJuLFxuICAgIH0sIHJlc29sdmVkRW52aXJvbm1lbnQsIHRoaXMuc2RrUHJvdmlkZXIpO1xuXG4gICAgY29uc3Qgc3RhY2tTZGsgPSBhd2FpdCB0aGlzLnNka1Byb3ZpZGVyLmZvckVudmlyb25tZW50KHJlc29sdmVkRW52aXJvbm1lbnQsIG1vZGUsIHtcbiAgICAgIGFzc3VtZVJvbGVBcm46IGFybnMuYXNzdW1lUm9sZUFybixcbiAgICAgIGFzc3VtZVJvbGVFeHRlcm5hbElkOiBzdGFjay5hc3N1bWVSb2xlRXh0ZXJuYWxJZCxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGFja1Nkazogc3RhY2tTZGsuc2RrLFxuICAgICAgcmVzb2x2ZWRFbnZpcm9ubWVudCxcbiAgICAgIGNsb3VkRm9ybWF0aW9uUm9sZUFybjogYXJucy5jbG91ZEZvcm1hdGlvblJvbGVBcm4sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGFsbCBhc3NldCBtYW5pZmVzdHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSB0aGUgZ2l2ZW4gc3RhY2tcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHVibGlzaFN0YWNrQXNzZXRzKHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsIHRvb2xraXRJbmZvOiBUb29sa2l0SW5mbykge1xuICAgIGNvbnN0IHN0YWNrRW52ID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlci5yZXNvbHZlRW52aXJvbm1lbnQoc3RhY2suZW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IGFzc2V0QXJ0aWZhY3RzID0gc3RhY2suZGVwZW5kZW5jaWVzLmZpbHRlcihpc0Fzc2V0TWFuaWZlc3RBcnRpZmFjdCk7XG5cbiAgICBmb3IgKGNvbnN0IGFzc2V0QXJ0aWZhY3Qgb2YgYXNzZXRBcnRpZmFjdHMpIHtcbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24oXG4gICAgICAgIHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgYXNzZXRBcnRpZmFjdC5yZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbixcbiAgICAgICAgYXNzZXRBcnRpZmFjdC5ib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIsXG4gICAgICAgIHRvb2xraXRJbmZvKTtcblxuICAgICAgY29uc3QgbWFuaWZlc3QgPSBBc3NldE1hbmlmZXN0LmZyb21GaWxlKGFzc2V0QXJ0aWZhY3QuZmlsZSk7XG4gICAgICBhd2FpdCBwdWJsaXNoQXNzZXRzKG1hbmlmZXN0LCB0aGlzLnNka1Byb3ZpZGVyLCBzdGFja0Vudik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgdGhlIGJvb3RzdHJhcCBzdGFjayBoYXMgdGhlIHJpZ2h0IHZlcnNpb24gZm9yIHRoaXMgc3RhY2tcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24oXG4gICAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gICAgcmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb246IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0b29sa2l0SW5mbzogVG9vbGtpdEluZm8pIHtcblxuICAgIGlmIChyZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybjsgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRvb2xraXRJbmZvLnZhbGlkYXRlVmVyc2lvbihyZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbiwgYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RhY2tOYW1lfTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzQXNzZXRNYW5pZmVzdEFydGlmYWN0KGFydDogY3hhcGkuQ2xvdWRBcnRpZmFjdCk6IGFydCBpcyBjeGFwaS5Bc3NldE1hbmlmZXN0QXJ0aWZhY3Qge1xuICByZXR1cm4gYXJ0IGluc3RhbmNlb2YgY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0O1xufVxuIl19
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmb3JtYXRpb24tZGVwbG95bWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbG91ZGZvcm1hdGlvbi1kZXBsb3ltZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0IseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQywrQkFBK0I7QUFFL0Isd0NBQTRDO0FBQzVDLCtEQUF5RDtBQUN6RCx5Q0FBcUQ7QUFDckQsaURBQThFO0FBQzlFLHlGQUFnRztBQUNoRyxpREFBNkM7QUFDN0MsMERBQXNFO0FBRXRFLHNEQUE2RDtBQTJCN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBaUJJO0FBQ0csS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxXQUF3QixFQUN4QixLQUF3Qzs7SUFFeEMsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFcEYsNkVBQTZFO0lBQzdFLE1BQU0sSUFBSSxHQUFHLE1BQU0scUNBQXNCLENBQUM7UUFDeEMsYUFBYSxRQUFFLEtBQUssQ0FBQyxVQUFVLDBDQUFFLEdBQUc7S0FDckMsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVyQyxnQ0FBZ0M7SUFDaEMsTUFBTSxjQUFjLEdBQUcsb0JBQW9CLElBQUksQ0FBQyxhQUFhLHNCQUFzQixDQUFDO0lBQ3BGLE1BQU0sY0FBYyxHQUFHLHVFQUF1RSxNQUFBLEtBQUssQ0FBQyxVQUFVLDBDQUFFLDZCQUE2QixHQUFHLENBQUM7SUFDakosSUFBSTtRQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxlQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3RGLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxvQkFBb0IsUUFBRSxLQUFLLENBQUMsVUFBVSwwQ0FBRSxvQkFBb0I7U0FDN0QsQ0FBQyxDQUFDO1FBRUgs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QVksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUUxRSxLQUFLLE1BQU0sYUFBYSxJQUFJLGNBQWMsRUFBRTtZQUMxQyxNQUFNLElBQUksQ0FBQyw2QkFBNkIsQ0FDdEMsS0FBSyxDQUFDLFNBQVMsRUFDZixhQUFhLENBQUMsNkJBQTZCLEVBQzNDLGFBQWEsQ0FBQyxpQ0FBaUMsRUFDL0MsV0FBVyxDQUFDLENBQUM7WUFFZixNQUFNLFFBQVEsR0FBRywwQkFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsTUFBTSxnQ0FBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLDZCQUE2QixDQUN6QyxTQUFpQixFQUNqQiw2QkFBaUQsRUFDakQsaUNBQXFELEVBQ3JELFdBQXdCO1FBRXhCLElBQUksNkJBQTZCLEtBQUssU0FBUyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRTVELElBQUk7WUFDRixNQUFNLFdBQVcsQ0FBQyxlQUFlLENBQUMsNkJBQTZCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztTQUNyRztRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFNBQVMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUMvQztJQUNILENBQUM7Q0FDRjtBQXpQRCw4REF5UEM7QUFFRCxTQUFTLHVCQUF1QixDQUFDLEdBQXdCO0lBQ3ZELE9BQU8sR0FBRyxZQUFZLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQztBQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgeyBBc3NldE1hbmlmZXN0IH0gZnJvbSAnY2RrLWFzc2V0cyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBUYWcgfSBmcm9tICcuLi9jZGstdG9vbGtpdCc7XG5pbXBvcnQgeyBkZWJ1Zywgd2FybmluZyB9IGZyb20gJy4uL2xvZ2dpbmcnO1xuaW1wb3J0IHsgcHVibGlzaEFzc2V0cyB9IGZyb20gJy4uL3V0aWwvYXNzZXQtcHVibGlzaGluZyc7XG5pbXBvcnQgeyBNb2RlLCBTZGtQcm92aWRlciwgSVNESyB9IGZyb20gJy4vYXdzLWF1dGgnO1xuaW1wb3J0IHsgZGVwbG95U3RhY2ssIERlcGxveVN0YWNrUmVzdWx0LCBkZXN0cm95U3RhY2sgfSBmcm9tICcuL2RlcGxveS1zdGFjayc7XG5pbXBvcnQgeyBMYXp5TGlzdFN0YWNrUmVzb3VyY2VzLCBMaXN0U3RhY2tSZXNvdXJjZXMgfSBmcm9tICcuL2V2YWx1YXRlLWNsb3VkZm9ybWF0aW9uLXRlbXBsYXRlJztcbmltcG9ydCB7IFRvb2xraXRJbmZvIH0gZnJvbSAnLi90b29sa2l0LWluZm8nO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25TdGFjaywgVGVtcGxhdGUgfSBmcm9tICcuL3V0aWwvY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgU3RhY2tBY3Rpdml0eVByb2dyZXNzIH0gZnJvbSAnLi91dGlsL2Nsb3VkZm9ybWF0aW9uL3N0YWNrLWFjdGl2aXR5LW1vbml0b3InO1xuaW1wb3J0IHsgcmVwbGFjZUVudlBsYWNlaG9sZGVycyB9IGZyb20gJy4vdXRpbC9wbGFjZWhvbGRlcnMnO1xuXG4vKipcbiAqIFNESyBvYnRhaW5lZCBieSBhc3N1bWluZyB0aGUgbG9va3VwIHJvbGVcbiAqIGZvciBhIGdpdmVuIGVudmlyb25tZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZWRTZGtXaXRoTG9va3VwUm9sZUZvckVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFRoZSBTREsgZm9yIHRoZSBnaXZlbiBlbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgc2RrOiBJU0RLO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgZW52aXJvbm1lbnQgZm9yIHRoZSBzdGFja1xuICAgKiAobm8gbW9yZSAndW5rbm93bi1hY2NvdW50L3Vua25vd24tcmVnaW9uJylcbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVkRW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgYXNzdW1lIHJvbGUgd2FzIHN1Y2Nlc3NmdWwuXG4gICAqIElmIHRoZSBhc3N1bWUgcm9sZSB3YXMgbm90IHN1Y2Nlc3NmdWwgKGZhbHNlKVxuICAgKiB0aGVuIHRoYXQgbWVhbnMgdGhhdCB0aGUgJ3NkaycgcmV0dXJuZWQgY29udGFpbnNcbiAgICogdGhlIGRlZmF1bHQgY3JlZGVudGlhbHMgKG5vdCB0aGUgYXNzdW1lIHJvbGUgY3JlZGVudGlhbHMpXG4gICAqL1xuICByZWFkb25seSBkaWRBc3N1bWVSb2xlOiBib29sZWFuO1xufVxuXG4vKipcbiAgKiBUcnkgdG8gdXNlIHRoZSBib290c3RyYXAgbG9va3VwUm9sZS4gVGhlcmUgYXJlIHR3byBzY2VuYXJpb3MgdGhhdCBhcmUgaGFuZGxlZCBoZXJlXG4gICogIDEuIFRoZSBsb29rdXAgcm9sZSBtYXkgbm90IGV4aXN0IChpdCB3YXMgYWRkZWQgaW4gYm9vdHN0cmFwIHN0YWNrIHZlcnNpb24gNylcbiAgKiAgMi4gVGhlIGxvb2t1cCByb2xlIG1heSBub3QgaGF2ZSB0aGUgY29ycmVjdCBwZXJtaXNzaW9ucyAoUmVhZE9ubHlBY2Nlc3Mgd2FzIGFkZGVkIGluXG4gICogICAgICBib290c3RyYXAgc3RhY2sgdmVyc2lvbiA4KVxuICAqXG4gICogSW4gdGhlIGNhc2Ugb2YgMSAobG9va3VwIHJvbGUgZG9lc24ndCBleGlzdCkgYGZvckVudmlyb25tZW50YCB3aWxsIGVpdGhlcjpcbiAgKiAgIDEuIFJldHVybiB0aGUgZGVmYXVsdCBjcmVkZW50aWFscyBpZiB0aGUgZGVmYXVsdCBjcmVkZW50aWFscyBhcmUgZm9yIHRoZSBzdGFjayBhY2NvdW50XG4gICogICAyLiBUaHJvdyBhbiBlcnJvciBpZiB0aGUgZGVmYXVsdCBjcmVkZW50aWFscyBhcmUgbm90IGZvciB0aGUgc3RhY2sgYWNjb3VudC5cbiAgKlxuICAqIElmIHdlIHN1Y2Nlc3NmdWxseSBhc3N1bWUgdGhlIGxvb2t1cCByb2xlIHdlIHRoZW4gcHJvY2VlZCB0byAyIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBib290c3RyYXBcbiAgKiBzdGFjayB2ZXJzaW9uIGlzIHZhbGlkLiBJZiBpdCBpcyBub3Qgd2UgdGhyb3cgYW4gZXJyb3Igd2hpY2ggc2hvdWxkIGJlIGhhbmRsZWQgaW4gdGhlIGNhbGxpbmdcbiAgKiBmdW5jdGlvbiAoYW5kIGZhbGxiYWNrIHRvIHVzZSBhIGRpZmZlcmVudCByb2xlLCBldGMpXG4gICpcbiAgKiBJZiB3ZSBkbyBub3Qgc3VjY2Vzc2Z1bGx5IGFzc3VtZSB0aGUgbG9va3VwIHJvbGUsIGJ1dCBkbyBnZXQgYmFjayB0aGUgZGVmYXVsdCBjcmVkZW50aWFsc1xuICAqIHRoZW4gcmV0dXJuIHRob3NlIGFuZCBub3RlIHRoYXQgd2UgYXJlIHJldHVybmluZyB0aGUgZGVmYXVsdCBjcmVkZW50aWFscy4gVGhlIGNhbGxpbmdcbiAgKiBmdW5jdGlvbiBjYW4gdGhlbiBkZWNpZGUgdG8gdXNlIHRoZW0gb3IgZmFsbGJhY2sgdG8gYW5vdGhlciByb2xlLlxuICAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVTZGtXaXRoTG9va3VwUm9sZUZvcihcbiAgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyLFxuICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuKTogUHJvbWlzZTxQcmVwYXJlZFNka1dpdGhMb29rdXBSb2xlRm9yRW52aXJvbm1lbnQ+IHtcbiAgY29uc3QgcmVzb2x2ZWRFbnZpcm9ubWVudCA9IGF3YWl0IHNka1Byb3ZpZGVyLnJlc29sdmVFbnZpcm9ubWVudChzdGFjay5lbnZpcm9ubWVudCk7XG5cbiAgLy8gU3Vic3RpdHV0ZSBhbnkgcGxhY2Vob2xkZXJzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnRcbiAgY29uc3QgYXJucyA9IGF3YWl0IHJlcGxhY2VFbnZQbGFjZWhvbGRlcnMoe1xuICAgIGxvb2t1cFJvbGVBcm46IHN0YWNrLmxvb2t1cFJvbGU/LmFybixcbiAgfSwgcmVzb2x2ZWRFbnZpcm9ubWVudCwgc2RrUHJvdmlkZXIpO1xuXG4gIC8vIHRyeSB0byBhc3N1bWUgdGhlIGxvb2t1cCByb2xlXG4gIGNvbnN0IHdhcm5pbmdNZXNzYWdlID0gYENvdWxkIG5vdCBhc3N1bWUgJHthcm5zLmxvb2t1cFJvbGVBcm59LCBwcm9jZWVkaW5nIGFueXdheS5gO1xuICBjb25zdCB1cGdyYWRlTWVzc2FnZSA9IGAoVG8gZ2V0IHJpZCBvZiB0aGlzIHdhcm5pbmcsIHBsZWFzZSB1cGdyYWRlIHRvIGJvb3RzdHJhcCB2ZXJzaW9uID49ICR7c3RhY2subG9va3VwUm9sZT8ucmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb259KWA7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhY2tTZGsgPSBhd2FpdCBzZGtQcm92aWRlci5mb3JFbnZpcm9ubWVudChyZXNvbHZlZEVudmlyb25tZW50LCBNb2RlLkZvclJlYWRpbmcsIHtcbiAgICAgIGFzc3VtZVJvbGVBcm46IGFybnMubG9va3VwUm9sZUFybixcbiAgICAgIGFzc3VtZVJvbGVFeHRlcm5hbElkOiBzdGFjay5sb29rdXBSb2xlPy5hc3N1bWVSb2xlRXh0ZXJuYWxJZCxcbiAgICB9KTtcblxuICAgIC8vIGlmIHdlIHN1Y2NlZWQgaW4gYXNzdW1pbmcgdGhlIGxvb2t1cCByb2xlLCBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgY29ycmVjdCBib290c3RyYXAgc3RhY2sgdmVyc2lvblxuICAgIGlmIChzdGFja1Nkay5kaWRBc3N1bWVSb2xlICYmIHN0YWNrLmxvb2t1cFJvbGU/LmJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlciAmJiBzdGFjay5sb29rdXBSb2xlLnJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgVG9vbGtpdEluZm8udmVyc2lvbkZyb21Tc21QYXJhbWV0ZXIoc3RhY2tTZGsuc2RrLCBzdGFjay5sb29rdXBSb2xlLmJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcik7XG4gICAgICBpZiAodmVyc2lvbiA8IHN0YWNrLmxvb2t1cFJvbGUucmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCb290c3RyYXAgc3RhY2sgdmVyc2lvbiAnJHtzdGFjay5sb29rdXBSb2xlLnJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9ufScgaXMgcmVxdWlyZWQsIGZvdW5kIHZlcnNpb24gJyR7dmVyc2lvbn0nLmApO1xuICAgICAgfVxuICAgICAgLy8gd2UgbWF5IG5vdCBoYXZlIGFzc3VtZWQgdGhlIGxvb2t1cCByb2xlIGJlY2F1c2Ugb25lIHdhcyBub3QgcHJvdmlkZWRcbiAgICAgIC8vIGlmIHRoYXQgaXMgdGhlIGNhc2UgdGhlbiBkb24ndCBwcmludCB0aGUgdXBncmFkZSB3YXJuaW5nXG4gICAgfSBlbHNlIGlmICghc3RhY2tTZGsuZGlkQXNzdW1lUm9sZSAmJiBzdGFjay5sb29rdXBSb2xlPy5yZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbikge1xuICAgICAgd2FybmluZyh1cGdyYWRlTWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiB7IC4uLnN0YWNrU2RrLCByZXNvbHZlZEVudmlyb25tZW50IH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkZWJ1ZyhlKTtcbiAgICAvLyBvbmx5IHByaW50IG91dCB0aGUgd2FybmluZ3MgaWYgdGhlIGxvb2t1cFJvbGUgZXhpc3RzIEFORCB0aGVyZSBpcyBhIHJlcXVpcmVkXG4gICAgLy8gYm9vdHN0cmFwIHZlcnNpb24sIG90aGVyd2lzZSB0aGUgd2FybmluZ3Mgd2lsbCBwcmludCBgdW5kZWZpbmVkYFxuICAgIGlmIChzdGFjay5sb29rdXBSb2xlICYmIHN0YWNrLmxvb2t1cFJvbGUucmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24pIHtcbiAgICAgIHdhcm5pbmcod2FybmluZ01lc3NhZ2UpO1xuICAgICAgd2FybmluZyh1cGdyYWRlTWVzc2FnZSk7XG4gICAgfVxuICAgIHRocm93IChlKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVN0YWNrT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFjayB0byBkZXBsb3lcbiAgICovXG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGlvbiByb2xlIGZvciB0aGUgZGVwbG95bWVudCAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEN1cnJlbnQgcm9sZVxuICAgKi9cbiAgcm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVG9waWMgQVJOcyB0byBzZW5kIGEgbWVzc2FnZSB3aGVuIGRlcGxveW1lbnQgZmluaXNoZXMgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBub3RpZmljYXRpb25zXG4gICAqL1xuICBub3RpZmljYXRpb25Bcm5zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG5hbWUgdW5kZXIgd2hpY2ggc3RhY2sgd2lsbCBiZSBkZXBsb3llZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFVzZSBhcnRpZmFjdCBkZWZhdWx0XG4gICAqL1xuICBkZXBsb3lOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEb24ndCBzaG93IHN0YWNrIGRlcGxveW1lbnQgZXZlbnRzLCBqdXN0IHdhaXRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHF1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdG9vbGtpdCBzdGFjaywgaWYgbm90IHRoZSBkZWZhdWx0IG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgJ0NES1Rvb2xraXQnXG4gICAqL1xuICB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFzc2V0IElEcyB3aGljaCBzaG91bGQgTk9UIGJlIGJ1aWx0IG9yIHVwbG9hZGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQnVpbGQgYWxsIGFzc2V0c1xuICAgKi9cbiAgcmV1c2VBc3NldHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3RhY2sgdGFncyAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKi9cbiAgdGFncz86IFRhZ1tdO1xuXG4gIC8qKlxuICAgKiBTdGFnZSB0aGUgY2hhbmdlIHNldCBidXQgZG9uJ3QgZXhlY3V0ZSBpdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICBleGVjdXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgbmFtZSB0byB1c2UgZm9yIHRoZSBDbG91ZEZvcm1hdGlvbiBjaGFuZ2Ugc2V0LlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgY2hhbmdlU2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRm9yY2UgZGVwbG95bWVudCwgZXZlbiBpZiB0aGUgZGVwbG95ZWQgdGVtcGxhdGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgd2UgYXJlIGFib3V0IHRvIGRlcGxveS5cbiAgICogQGRlZmF1bHQgZmFsc2UgZGVwbG95bWVudCB3aWxsIGJlIHNraXBwZWQgaWYgdGhlIHRlbXBsYXRlIGlzIGlkZW50aWNhbFxuICAgKi9cbiAgZm9yY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBwYXJhbWV0ZXJzIGZvciBDbG91ZEZvcm1hdGlvblxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGVcbiAgICovXG4gIHBhcmFtZXRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcblxuICAvKipcbiAgICogVXNlIHByZXZpb3VzIHZhbHVlcyBmb3IgdW5zcGVjaWZpZWQgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBJZiBub3Qgc2V0LCBhbGwgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZXZlcnkgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgdXNlUHJldmlvdXNQYXJhbWV0ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzcGxheSBtb2RlIGZvciBzdGFjayBkZXBsb3ltZW50IHByb2dyZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5CYXIgLSBzdGFjayBldmVudHMgd2lsbCBiZSBkaXNwbGF5ZWQgZm9yXG4gICAqICAgdGhlIHJlc291cmNlIGN1cnJlbnRseSBiZWluZyBkZXBsb3llZC5cbiAgICovXG4gIHByb2dyZXNzPzogU3RhY2tBY3Rpdml0eVByb2dyZXNzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIGFyZSBvbiBhIENJIHN5c3RlbVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSb2xsYmFjayBmYWlsZWQgZGVwbG95bWVudHNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qXG4gICAqIFdoZXRoZXIgdG8gcGVyZm9ybSBhICdob3Rzd2FwJyBkZXBsb3ltZW50LlxuICAgKiBBICdob3Rzd2FwJyBkZXBsb3ltZW50IHdpbGwgYXR0ZW1wdCB0byBzaG9ydC1jaXJjdWl0IENsb3VkRm9ybWF0aW9uXG4gICAqIGFuZCB1cGRhdGUgdGhlIGFmZmVjdGVkIHJlc291cmNlcyBsaWtlIExhbWJkYSBmdW5jdGlvbnMgZGlyZWN0bHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2UgZm9yIHJlZ3VsYXIgZGVwbG95bWVudHMsIHRydWUgZm9yICd3YXRjaCcgZGVwbG95bWVudHNcbiAgICovXG4gIHJlYWRvbmx5IGhvdHN3YXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0cmEgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgVXNlci1BZ2VudCBoZWFkZXIgd2hlbiBwZXJmb3JtaW5nIEFXUyBTREsgY2FsbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90aGluZyBleHRyYSBpcyBhcHBlbmRlZCB0byB0aGUgVXNlci1BZ2VudCBoZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhVXNlckFnZW50Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc3Ryb3lTdGFja09wdGlvbnMge1xuICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBkZXBsb3lOYW1lPzogc3RyaW5nO1xuICByb2xlQXJuPzogc3RyaW5nO1xuICBxdWlldD86IGJvb2xlYW47XG4gIGZvcmNlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja0V4aXN0c09wdGlvbnMge1xuICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBkZXBsb3lOYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvbmVyUHJvcHMge1xuICBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG59XG5cbi8qKlxuICogU0RLIG9idGFpbmVkIGJ5IGFzc3VtaW5nIHRoZSBkZXBsb3kgcm9sZVxuICogZm9yIGEgZ2l2ZW4gZW52aXJvbm1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlZFNka0ZvckVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFRoZSBTREsgZm9yIHRoZSBnaXZlbiBlbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tTZGs6IElTREs7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCBmb3IgdGhlIHN0YWNrXG4gICAqIChubyBtb3JlICd1bmtub3duLWFjY291bnQvdW5rbm93bi1yZWdpb24nKVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRFbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQ7XG4gIC8qKlxuICAgKiBUaGUgRXhlY3V0aW9uIFJvbGUgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIENsb3VkRm9ybWF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4ZWN1dGlvbiByb2xlIGlzIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uUm9sZUFybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIENsb3VkRm9ybWF0aW9uIGRlcGxveW1lbnRzXG4gKlxuICogTG9va3MgdXMgdGhlIHJpZ2h0IFNESyBhbmQgQm9vdHN0cmFwIHN0YWNrIHRvIGRlcGxveSBhIGdpdmVuXG4gKiBzdGFjayBhcnRpZmFjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIENsb3VkRm9ybWF0aW9uRGVwbG95bWVudHMge1xuICBwcml2YXRlIHJlYWRvbmx5IHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogUHJvdmlzaW9uZXJQcm9wcykge1xuICAgIHRoaXMuc2RrUHJvdmlkZXIgPSBwcm9wcy5zZGtQcm92aWRlcjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyhyb290U3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIGNvbnN0IHNkayA9IGF3YWl0IHRoaXMucHJlcGFyZVNka1dpdGhMb29rdXBPckRlcGxveVJvbGUocm9vdFN0YWNrQXJ0aWZhY3QpO1xuICAgIGNvbnN0IGRlcGxveWVkVGVtcGxhdGUgPSBhd2FpdCB0aGlzLnJlYWRDdXJyZW50VGVtcGxhdGUocm9vdFN0YWNrQXJ0aWZhY3QsIHNkayk7XG4gICAgYXdhaXQgdGhpcy5hZGROZXN0ZWRUZW1wbGF0ZXNUb0dlbmVyYXRlZEFuZERlcGxveWVkU3RhY2tzKHJvb3RTdGFja0FydGlmYWN0LCBzZGssIHtcbiAgICAgIGdlbmVyYXRlZFRlbXBsYXRlOiByb290U3RhY2tBcnRpZmFjdC50ZW1wbGF0ZSxcbiAgICAgIGRlcGxveWVkVGVtcGxhdGU6IGRlcGxveWVkVGVtcGxhdGUsXG4gICAgICBkZXBsb3llZFN0YWNrTmFtZTogcm9vdFN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiBkZXBsb3llZFRlbXBsYXRlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlYWRDdXJyZW50VGVtcGxhdGUoc3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LCBzZGs/OiBJU0RLKTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIGRlYnVnKGBSZWFkaW5nIGV4aXN0aW5nIHRlbXBsYXRlIGZvciBzdGFjayAke3N0YWNrQXJ0aWZhY3QuZGlzcGxheU5hbWV9LmApO1xuICAgIGlmICghc2RrKSB7XG4gICAgICBzZGsgPSBhd2FpdCB0aGlzLnByZXBhcmVTZGtXaXRoTG9va3VwT3JEZXBsb3lSb2xlKHN0YWNrQXJ0aWZhY3QpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZWFkQ3VycmVudFN0YWNrVGVtcGxhdGUoc3RhY2tBcnRpZmFjdC5zdGFja05hbWUsIHNkayk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVwbG95U3RhY2sob3B0aW9uczogRGVwbG95U3RhY2tPcHRpb25zKTogUHJvbWlzZTxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IHsgc3RhY2tTZGssIHJlc29sdmVkRW52aXJvbm1lbnQsIGNsb3VkRm9ybWF0aW9uUm9sZUFybiB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlU2RrRm9yKG9wdGlvbnMuc3RhY2ssIG9wdGlvbnMucm9sZUFybik7XG5cbiAgICBjb25zdCB0b29sa2l0SW5mbyA9IGF3YWl0IFRvb2xraXRJbmZvLmxvb2t1cChyZXNvbHZlZEVudmlyb25tZW50LCBzdGFja1Nkaywgb3B0aW9ucy50b29sa2l0U3RhY2tOYW1lKTtcblxuICAgIC8vIFB1Ymxpc2ggYW55IGFzc2V0cyBiZWZvcmUgZG9pbmcgdGhlIGFjdHVhbCBkZXBsb3lcbiAgICBhd2FpdCB0aGlzLnB1Ymxpc2hTdGFja0Fzc2V0cyhvcHRpb25zLnN0YWNrLCB0b29sa2l0SW5mbyk7XG5cbiAgICAvLyBEbyBhIHZlcmlmaWNhdGlvbiBvZiB0aGUgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uKFxuICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICBvcHRpb25zLnN0YWNrLnJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uLFxuICAgICAgb3B0aW9ucy5zdGFjay5ib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIsXG4gICAgICB0b29sa2l0SW5mbyk7XG5cbiAgICByZXR1cm4gZGVwbG95U3RhY2soe1xuICAgICAgc3RhY2s6IG9wdGlvbnMuc3RhY2ssXG4gICAgICByZXNvbHZlZEVudmlyb25tZW50LFxuICAgICAgZGVwbG95TmFtZTogb3B0aW9ucy5kZXBsb3lOYW1lLFxuICAgICAgbm90aWZpY2F0aW9uQXJuczogb3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zLFxuICAgICAgcXVpZXQ6IG9wdGlvbnMucXVpZXQsXG4gICAgICBzZGs6IHN0YWNrU2RrLFxuICAgICAgc2RrUHJvdmlkZXI6IHRoaXMuc2RrUHJvdmlkZXIsXG4gICAgICByb2xlQXJuOiBjbG91ZEZvcm1hdGlvblJvbGVBcm4sXG4gICAgICByZXVzZUFzc2V0czogb3B0aW9ucy5yZXVzZUFzc2V0cyxcbiAgICAgIHRvb2xraXRJbmZvLFxuICAgICAgdGFnczogb3B0aW9ucy50YWdzLFxuICAgICAgZXhlY3V0ZTogb3B0aW9ucy5leGVjdXRlLFxuICAgICAgY2hhbmdlU2V0TmFtZTogb3B0aW9ucy5jaGFuZ2VTZXROYW1lLFxuICAgICAgZm9yY2U6IG9wdGlvbnMuZm9yY2UsXG4gICAgICBwYXJhbWV0ZXJzOiBvcHRpb25zLnBhcmFtZXRlcnMsXG4gICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IG9wdGlvbnMudXNlUHJldmlvdXNQYXJhbWV0ZXJzLFxuICAgICAgcHJvZ3Jlc3M6IG9wdGlvbnMucHJvZ3Jlc3MsXG4gICAgICBjaTogb3B0aW9ucy5jaSxcbiAgICAgIHJvbGxiYWNrOiBvcHRpb25zLnJvbGxiYWNrLFxuICAgICAgaG90c3dhcDogb3B0aW9ucy5ob3Rzd2FwLFxuICAgICAgZXh0cmFVc2VyQWdlbnQ6IG9wdGlvbnMuZXh0cmFVc2VyQWdlbnQsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVzdHJveVN0YWNrKG9wdGlvbnM6IERlc3Ryb3lTdGFja09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHN0YWNrU2RrLCBjbG91ZEZvcm1hdGlvblJvbGVBcm46IHJvbGVBcm4gfSA9IGF3YWl0IHRoaXMucHJlcGFyZVNka0ZvcihvcHRpb25zLnN0YWNrLCBvcHRpb25zLnJvbGVBcm4pO1xuXG4gICAgcmV0dXJuIGRlc3Ryb3lTdGFjayh7XG4gICAgICBzZGs6IHN0YWNrU2RrLFxuICAgICAgcm9sZUFybixcbiAgICAgIHN0YWNrOiBvcHRpb25zLnN0YWNrLFxuICAgICAgZGVwbG95TmFtZTogb3B0aW9ucy5kZXBsb3lOYW1lLFxuICAgICAgcXVpZXQ6IG9wdGlvbnMucXVpZXQsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhY2tFeGlzdHMob3B0aW9uczogU3RhY2tFeGlzdHNPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBzdGFja1NkayB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlU2RrRm9yKG9wdGlvbnMuc3RhY2ssIHVuZGVmaW5lZCwgTW9kZS5Gb3JSZWFkaW5nKTtcbiAgICBjb25zdCBzdGFjayA9IGF3YWl0IENsb3VkRm9ybWF0aW9uU3RhY2subG9va3VwKHN0YWNrU2RrLmNsb3VkRm9ybWF0aW9uKCksIG9wdGlvbnMuZGVwbG95TmFtZSA/PyBvcHRpb25zLnN0YWNrLnN0YWNrTmFtZSk7XG4gICAgcmV0dXJuIHN0YWNrLmV4aXN0cztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVNka1dpdGhMb29rdXBPckRlcGxveVJvbGUoc3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KTogUHJvbWlzZTxJU0RLPiB7XG4gICAgLy8gdHJ5IHRvIGFzc3VtZSB0aGUgbG9va3VwIHJvbGVcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJlcGFyZVNka1dpdGhMb29rdXBSb2xlRm9yKHRoaXMuc2RrUHJvdmlkZXIsIHN0YWNrQXJ0aWZhY3QpO1xuICAgICAgaWYgKHJlc3VsdC5kaWRBc3N1bWVSb2xlKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQuc2RrO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggeyB9XG4gICAgLy8gZmFsbCBiYWNrIHRvIHRoZSBkZXBsb3kgcm9sZVxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5wcmVwYXJlU2RrRm9yKHN0YWNrQXJ0aWZhY3QsIHVuZGVmaW5lZCwgTW9kZS5Gb3JSZWFkaW5nKSkuc3RhY2tTZGs7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRDdXJyZW50U3RhY2tUZW1wbGF0ZShzdGFja05hbWU6IHN0cmluZywgc3RhY2tTZGs6IElTREspIDogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIGNvbnN0IGNmbiA9IHN0YWNrU2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIHN0YWNrTmFtZSk7XG4gICAgcmV0dXJuIHN0YWNrLnRlbXBsYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZE5lc3RlZFRlbXBsYXRlc1RvR2VuZXJhdGVkQW5kRGVwbG95ZWRTdGFja3MoXG4gICAgcm9vdFN0YWNrQXJ0aWZhY3Q6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgICBzZGs6IElTREssXG4gICAgcGFyZW50VGVtcGxhdGVzOiBTdGFja1RlbXBsYXRlcyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbGlzdFN0YWNrUmVzb3VyY2VzID0gcGFyZW50VGVtcGxhdGVzLmRlcGxveWVkU3RhY2tOYW1lID8gbmV3IExhenlMaXN0U3RhY2tSZXNvdXJjZXMoc2RrLCBwYXJlbnRUZW1wbGF0ZXMuZGVwbG95ZWRTdGFja05hbWUpIDogdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW25lc3RlZFN0YWNrTG9naWNhbElkLCBnZW5lcmF0ZWROZXN0ZWRTdGFja1Jlc291cmNlXSBvZiBPYmplY3QuZW50cmllcyhwYXJlbnRUZW1wbGF0ZXMuZ2VuZXJhdGVkVGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9KSkge1xuICAgICAgaWYgKCF0aGlzLmlzQ2RrTWFuYWdlZE5lc3RlZFN0YWNrKGdlbmVyYXRlZE5lc3RlZFN0YWNrUmVzb3VyY2UpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhc3NldFBhdGggPSBnZW5lcmF0ZWROZXN0ZWRTdGFja1Jlc291cmNlLk1ldGFkYXRhWydhd3M6YXNzZXQ6cGF0aCddO1xuICAgICAgY29uc3QgbmVzdGVkU3RhY2tUZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmdldE5lc3RlZFN0YWNrVGVtcGxhdGVzKHJvb3RTdGFja0FydGlmYWN0LCBhc3NldFBhdGgsIG5lc3RlZFN0YWNrTG9naWNhbElkLCBsaXN0U3RhY2tSZXNvdXJjZXMsIHNkayk7XG5cbiAgICAgIGdlbmVyYXRlZE5lc3RlZFN0YWNrUmVzb3VyY2UuUHJvcGVydGllcy5OZXN0ZWRUZW1wbGF0ZSA9IG5lc3RlZFN0YWNrVGVtcGxhdGVzLmdlbmVyYXRlZFRlbXBsYXRlO1xuXG4gICAgICBjb25zdCBkZXBsb3llZFBhcmVudFRlbXBsYXRlID0gcGFyZW50VGVtcGxhdGVzLmRlcGxveWVkVGVtcGxhdGU7XG4gICAgICBkZXBsb3llZFBhcmVudFRlbXBsYXRlLlJlc291cmNlcyA9IGRlcGxveWVkUGFyZW50VGVtcGxhdGUuUmVzb3VyY2VzID8/IHt9O1xuICAgICAgY29uc3QgZGVwbG95ZWROZXN0ZWRTdGFja1Jlc291cmNlID0gZGVwbG95ZWRQYXJlbnRUZW1wbGF0ZS5SZXNvdXJjZXNbbmVzdGVkU3RhY2tMb2dpY2FsSWRdID8/IHt9O1xuICAgICAgZGVwbG95ZWRQYXJlbnRUZW1wbGF0ZS5SZXNvdXJjZXNbbmVzdGVkU3RhY2tMb2dpY2FsSWRdID0gZGVwbG95ZWROZXN0ZWRTdGFja1Jlc291cmNlO1xuICAgICAgZGVwbG95ZWROZXN0ZWRTdGFja1Jlc291cmNlLlR5cGUgPSBkZXBsb3llZE5lc3RlZFN0YWNrUmVzb3VyY2UuVHlwZSA/PyAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snO1xuICAgICAgZGVwbG95ZWROZXN0ZWRTdGFja1Jlc291cmNlLlByb3BlcnRpZXMgPSBkZXBsb3llZE5lc3RlZFN0YWNrUmVzb3VyY2UuUHJvcGVydGllcyA/PyB7fTtcbiAgICAgIGRlcGxveWVkTmVzdGVkU3RhY2tSZXNvdXJjZS5Qcm9wZXJ0aWVzLk5lc3RlZFRlbXBsYXRlID0gbmVzdGVkU3RhY2tUZW1wbGF0ZXMuZGVwbG95ZWRUZW1wbGF0ZTtcblxuICAgICAgYXdhaXQgdGhpcy5hZGROZXN0ZWRUZW1wbGF0ZXNUb0dlbmVyYXRlZEFuZERlcGxveWVkU3RhY2tzKFxuICAgICAgICByb290U3RhY2tBcnRpZmFjdCxcbiAgICAgICAgc2RrLFxuICAgICAgICBuZXN0ZWRTdGFja1RlbXBsYXRlcyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXROZXN0ZWRTdGFja1RlbXBsYXRlcyhcbiAgICByb290U3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LCBuZXN0ZWRUZW1wbGF0ZUFzc2V0UGF0aDogc3RyaW5nLCBuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nLFxuICAgIGxpc3RTdGFja1Jlc291cmNlczogTGlzdFN0YWNrUmVzb3VyY2VzIHwgdW5kZWZpbmVkLCBzZGs6IElTREssXG4gICk6IFByb21pc2U8U3RhY2tUZW1wbGF0ZXM+IHtcbiAgICBjb25zdCBuZXN0ZWRUZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4ocm9vdFN0YWNrQXJ0aWZhY3QuYXNzZW1ibHkuZGlyZWN0b3J5LCBuZXN0ZWRUZW1wbGF0ZUFzc2V0UGF0aCk7XG5cbiAgICAvLyBDRk4gZ2VuZXJhdGVzIHRoZSBuZXN0ZWQgc3RhY2sgbmFtZSBpbiB0aGUgZm9ybSBgUGFyZW50U3RhY2tOYW1lLU5lc3RlZFN0YWNrTG9naWNhbElELVNvbWVIYXNoV2VDYW4ndENvbXB1dGUsXG4gICAgLy8gdGhlIGFybiBpcyBvZiB0aGUgZm9ybTogYXJuOmF3czpjbG91ZGZvcm1hdGlvbjpyZWdpb246MTIzNDU2Nzg5MDEyOnN0YWNrL05lc3RlZFN0YWNrTmFtZS9Bbm90aGVySGFzaFdlRG9uJ3ROZWVkXG4gICAgLy8gc28gd2UgZ2V0IHRoZSBBUk4gYW5kIG1hbnVhbGx5IGV4dHJhY3QgdGhlIG5hbWUuXG4gICAgY29uc3QgbmVzdGVkU3RhY2tBcm4gPSBhd2FpdCB0aGlzLmdldE5lc3RlZFN0YWNrQXJuKG5lc3RlZFN0YWNrTG9naWNhbElkLCBsaXN0U3RhY2tSZXNvdXJjZXMpO1xuICAgIGNvbnN0IGRlcGxveWVkU3RhY2tOYW1lID0gbmVzdGVkU3RhY2tBcm4/LnNsaWNlKG5lc3RlZFN0YWNrQXJuLmluZGV4T2YoJy8nKSArIDEsIG5lc3RlZFN0YWNrQXJuLmxhc3RJbmRleE9mKCcvJykpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdlbmVyYXRlZFRlbXBsYXRlOiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhuZXN0ZWRUZW1wbGF0ZVBhdGgsICd1dGYtOCcpKSxcbiAgICAgIGRlcGxveWVkVGVtcGxhdGU6IGRlcGxveWVkU3RhY2tOYW1lXG4gICAgICAgID8gYXdhaXQgdGhpcy5yZWFkQ3VycmVudFN0YWNrVGVtcGxhdGUoZGVwbG95ZWRTdGFja05hbWUsIHNkaylcbiAgICAgICAgOiB7fSxcbiAgICAgIGRlcGxveWVkU3RhY2tOYW1lLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE5lc3RlZFN0YWNrQXJuKFxuICAgIG5lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmcsIGxpc3RTdGFja1Jlc291cmNlcz86IExpc3RTdGFja1Jlc291cmNlcyxcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhY2tSZXNvdXJjZXMgPSBhd2FpdCBsaXN0U3RhY2tSZXNvdXJjZXM/Lmxpc3RTdGFja1Jlc291cmNlcygpO1xuICAgICAgcmV0dXJuIHN0YWNrUmVzb3VyY2VzPy5maW5kKHNyID0+IHNyLkxvZ2ljYWxSZXNvdXJjZUlkID09PSBuZXN0ZWRTdGFja0xvZ2ljYWxJZCk/LlBoeXNpY2FsUmVzb3VyY2VJZDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5tZXNzYWdlLnN0YXJ0c1dpdGgoJ1N0YWNrIHdpdGggaWQgJykgJiYgZS5tZXNzYWdlLmVuZHNXaXRoKCcgZG9lcyBub3QgZXhpc3QnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNDZGtNYW5hZ2VkTmVzdGVkU3RhY2soc3RhY2tSZXNvdXJjZTogYW55KTogc3RhY2tSZXNvdXJjZSBpcyBOZXN0ZWRTdGFja1Jlc291cmNlIHtcbiAgICByZXR1cm4gc3RhY2tSZXNvdXJjZS5UeXBlID09PSAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snICYmIHN0YWNrUmVzb3VyY2UuTWV0YWRhdGEgJiYgc3RhY2tSZXNvdXJjZS5NZXRhZGF0YVsnYXdzOmFzc2V0OnBhdGgnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVudmlyb25tZW50IG5lY2Vzc2FyeSBmb3IgdG91Y2hpbmcgdGhlIGdpdmVuIHN0YWNrXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGZvbGxvd2luZzpcbiAgICpcbiAgICogLSBUaGUgcmVzb2x2ZWQgZW52aXJvbm1lbnQgZm9yIHRoZSBzdGFjayAobm8gbW9yZSAndW5rbm93bi1hY2NvdW50L3Vua25vd24tcmVnaW9uJylcbiAgICogLSBTREsgbG9hZGVkIHdpdGggdGhlIHJpZ2h0IGNyZWRlbnRpYWxzIGZvciBjYWxsaW5nIGBDcmVhdGVDaGFuZ2VTZXRgLlxuICAgKiAtIFRoZSBFeGVjdXRpb24gUm9sZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gQ2xvdWRGb3JtYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZXBhcmVTZGtGb3IoXG4gICAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgICByb2xlQXJuPzogc3RyaW5nLFxuICAgIG1vZGUgPSBNb2RlLkZvcldyaXRpbmcsXG4gICk6IFByb21pc2U8UHJlcGFyZWRTZGtGb3JFbnZpcm9ubWVudD4ge1xuICAgIGlmICghc3RhY2suZW52aXJvbm1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHN0YWNrICR7c3RhY2suZGlzcGxheU5hbWV9IGRvZXMgbm90IGhhdmUgYW4gZW52aXJvbm1lbnRgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZEVudmlyb25tZW50ID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlci5yZXNvbHZlRW52aXJvbm1lbnQoc3RhY2suZW52aXJvbm1lbnQpO1xuXG4gICAgLy8gU3Vic3RpdHV0ZSBhbnkgcGxhY2Vob2xkZXJzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnRcbiAgICBjb25zdCBhcm5zID0gYXdhaXQgcmVwbGFjZUVudlBsYWNlaG9sZGVycyh7XG4gICAgICBhc3N1bWVSb2xlQXJuOiBzdGFjay5hc3N1bWVSb2xlQXJuLFxuXG4gICAgICAvLyBVc2UgdGhlIG92ZXJyaWRlIGlmIGdpdmVuLCBvdGhlcndpc2UgdXNlIHRoZSBmaWVsZCBmcm9tIHRoZSBzdGFja1xuICAgICAgY2xvdWRGb3JtYXRpb25Sb2xlQXJuOiByb2xlQXJuID8/IHN0YWNrLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZUFybixcbiAgICB9LCByZXNvbHZlZEVudmlyb25tZW50LCB0aGlzLnNka1Byb3ZpZGVyKTtcblxuICAgIGNvbnN0IHN0YWNrU2RrID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlci5mb3JFbnZpcm9ubWVudChyZXNvbHZlZEVudmlyb25tZW50LCBtb2RlLCB7XG4gICAgICBhc3N1bWVSb2xlQXJuOiBhcm5zLmFzc3VtZVJvbGVBcm4sXG4gICAgICBhc3N1bWVSb2xlRXh0ZXJuYWxJZDogc3RhY2suYXNzdW1lUm9sZUV4dGVybmFsSWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhY2tTZGs6IHN0YWNrU2RrLnNkayxcbiAgICAgIHJlc29sdmVkRW52aXJvbm1lbnQsXG4gICAgICBjbG91ZEZvcm1hdGlvblJvbGVBcm46IGFybnMuY2xvdWRGb3JtYXRpb25Sb2xlQXJuLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhbGwgYXNzZXQgbWFuaWZlc3RzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdGhlIGdpdmVuIHN0YWNrXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHB1Ymxpc2hTdGFja0Fzc2V0cyhzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LCB0b29sa2l0SW5mbzogVG9vbGtpdEluZm8pIHtcbiAgICBjb25zdCBzdGFja0VudiA9IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIucmVzb2x2ZUVudmlyb25tZW50KHN0YWNrLmVudmlyb25tZW50KTtcbiAgICBjb25zdCBhc3NldEFydGlmYWN0cyA9IHN0YWNrLmRlcGVuZGVuY2llcy5maWx0ZXIoaXNBc3NldE1hbmlmZXN0QXJ0aWZhY3QpO1xuXG4gICAgZm9yIChjb25zdCBhc3NldEFydGlmYWN0IG9mIGFzc2V0QXJ0aWZhY3RzKSB7XG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uKFxuICAgICAgICBzdGFjay5zdGFja05hbWUsXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QucmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QuYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgICB0b29sa2l0SW5mbyk7XG5cbiAgICAgIGNvbnN0IG1hbmlmZXN0ID0gQXNzZXRNYW5pZmVzdC5mcm9tRmlsZShhc3NldEFydGlmYWN0LmZpbGUpO1xuICAgICAgYXdhaXQgcHVibGlzaEFzc2V0cyhtYW5pZmVzdCwgdGhpcy5zZGtQcm92aWRlciwgc3RhY2tFbnYpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBib290c3RyYXAgc3RhY2sgaGFzIHRoZSByaWdodCB2ZXJzaW9uIGZvciB0aGlzIHN0YWNrXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uKFxuICAgIHN0YWNrTmFtZTogc3RyaW5nLFxuICAgIHJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdG9vbGtpdEluZm86IFRvb2xraXRJbmZvKSB7XG5cbiAgICBpZiAocmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24gPT09IHVuZGVmaW5lZCkgeyByZXR1cm47IH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0b29sa2l0SW5mby52YWxpZGF0ZVZlcnNpb24ocmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24sIGJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3N0YWNrTmFtZX06ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0Fzc2V0TWFuaWZlc3RBcnRpZmFjdChhcnQ6IGN4YXBpLkNsb3VkQXJ0aWZhY3QpOiBhcnQgaXMgY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0IHtcbiAgcmV0dXJuIGFydCBpbnN0YW5jZW9mIGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdDtcbn1cblxuaW50ZXJmYWNlIFN0YWNrVGVtcGxhdGVzIHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkVGVtcGxhdGU6IGFueTtcbiAgcmVhZG9ubHkgZGVwbG95ZWRUZW1wbGF0ZTogYW55O1xuICByZWFkb25seSBkZXBsb3llZFN0YWNrTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgTmVzdGVkU3RhY2tSZXNvdXJjZSB7XG4gIHJlYWRvbmx5IE1ldGFkYXRhOiB7ICdhd3M6YXNzZXQ6cGF0aCc6IHN0cmluZyB9O1xuICByZWFkb25seSBQcm9wZXJ0aWVzOiBhbnk7XG59XG4iXX0=
|