deployable-awscdk-app-ts 0.1.680 → 0.1.682

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/lib/steps.js CHANGED
@@ -1,163 +1,512 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.checkoutStep = checkoutStep;
4
- exports.setNodeVersionStep = setNodeVersionStep;
5
- exports.installDependenciesStep = installDependenciesStep;
6
- exports.deploymentStep = deploymentStep;
7
- exports.setAwsCredentialsSteps = setAwsCredentialsSteps;
8
- exports.setNpmConfig = setNpmConfig;
9
- exports.checkActiveDeploymentStep = checkActiveDeploymentStep;
10
- exports.postDeploymentStep = postDeploymentStep;
11
- exports.preDeploymentStep = preDeploymentStep;
12
- exports.preInstallDependenciesStep = preInstallDependenciesStep;
13
- const projen_1 = require("projen");
3
+ exports.DeployableAwsCdkTypeScriptAppStepsFactory = void 0;
4
+ const github_1 = require("projen/lib/github");
5
+ const workflows_model_1 = require("projen/lib/github/workflows-model");
14
6
  const javascript_1 = require("projen/lib/javascript");
15
- function checkoutStep() {
16
- return {
17
- name: 'Checkout',
18
- uses: 'actions/checkout@v4',
19
- with: {
20
- 'ref': '${{ github.sha }}',
21
- 'fetch-depth': 0,
22
- },
23
- };
24
- }
25
- function setNodeVersionStep(nodeVersion, checkActiveDeployment) {
26
- return {
27
- ...getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment),
28
- name: 'Setup Node.js',
29
- uses: 'actions/setup-node@v4',
30
- with: {
31
- 'node-version': nodeVersion,
32
- },
33
- };
34
- }
35
- function installDependenciesStep(command, checkActiveDeployment) {
36
- return {
37
- ...getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment),
38
- name: 'Install dependencies',
39
- run: command,
40
- };
41
- }
42
- function getPackageManagerCommandPrefix(packageManager) {
43
- if (packageManager === projen_1.javascript.NodePackageManager.NPM) {
44
- return 'npm run';
7
+ const types_1 = require("./types");
8
+ const checkActiveDeploymentStepId = 'deployment-check';
9
+ const skipIfAlreadyActiveDeploymentCondition = `steps.${checkActiveDeploymentStepId}.outputs.has_active_deployment != 'true'`;
10
+ /**
11
+ * Factory to create reusable steps for the deployment workflow
12
+ * @experimental
13
+ */
14
+ class DeployableAwsCdkTypeScriptAppStepsFactory {
15
+ /**
16
+ * Validate that the provided environment deployment dependencies are valid
17
+ * @param deployOptions The deployment options
18
+ * @param environmentDependencies The environment deployment dependencies to validate
19
+ */
20
+ static validateEnvironmentDeploymentDependencies(deployOptions, environmentDependencies) {
21
+ if (deployOptions.jobStrategy !== types_1.DeployJobStrategy.MULTI_JOB) {
22
+ throw new Error('Environment deployment dependencies are only supported for MULTI_JOB strategy');
23
+ }
24
+ Object.entries(environmentDependencies).forEach(([env, deps]) => {
25
+ const hasEnvironment = deployOptions.environments.some(e => e.name === env);
26
+ if (!hasEnvironment) {
27
+ throw new Error(`Environment "${env}" defined in dependencies does not exist in deployOptions.environments`);
28
+ }
29
+ deps.forEach(dep => {
30
+ const hasDepEnvironment = deployOptions.environments.some(e => e.name === dep);
31
+ if (!hasDepEnvironment) {
32
+ throw new Error(`Dependency environment "${dep}" for environment "${env}" does not exist in deployOptions.environments`);
33
+ }
34
+ });
35
+ });
45
36
  }
46
- if (packageManager === projen_1.javascript.NodePackageManager.YARN) {
47
- return 'yarn';
37
+ /**
38
+ * Create a new DeployableAwsCdkTypeScriptAppStepsFactory
39
+ * @param project The project
40
+ * @param props The factory properties
41
+ */
42
+ constructor(project, props) {
43
+ this.project = project;
44
+ this.props = props;
48
45
  }
49
- if (packageManager === projen_1.javascript.NodePackageManager.PNPM) {
50
- return 'pnpm';
46
+ /**
47
+ * Condition to skip a step if an active deployment is already present
48
+ * @returns JobStep condition or undefined if checkActiveDeployment is false
49
+ */
50
+ get skipIfAlreadyActiveDeploymentCondition() {
51
+ return this.props.checkActiveDeployment ? { if: `\${{ ${skipIfAlreadyActiveDeploymentCondition} }}` } : undefined;
51
52
  }
52
- throw new Error(`Invalid package manager selected (${packageManager})`);
53
- }
54
- function deploymentStep(checkActiveDeployment, packageManager) {
55
- return {
56
- ...getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment),
57
- name: 'Deployment',
58
- run: `${getPackageManagerCommandPrefix(packageManager)} deploy:workflow`,
59
- };
60
- }
61
- function setAwsCredentialsInEnvironment(checkActiveDeployment) {
62
- const commands = [
63
- 'echo "AWS_ACCESS_KEY_ID=$accessKeyId" >> $GITHUB_ENV',
64
- 'echo "AWS_SECRET_ACCESS_KEY=$secretAccessKey" >> $GITHUB_ENV',
65
- 'echo "AWS_REGION=$region" >> $GITHUB_ENV',
66
- ];
67
- const condition = checkActiveDeployment ?
68
- `\${{ matrix.assumeRole == 'false' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
69
- '${{ matrix.assumeRole == \'false\' }}';
70
- return {
71
- if: condition,
72
- name: 'Configure AWS Credentials',
73
- run: `${commands.join('\n')}`,
74
- env: {
75
- accessKeyId: '${{ secrets[matrix.accessKeyIdSecretName] }}',
76
- secretAccessKey: '${{ secrets[matrix.secretAccessKeySecretName] }}',
77
- region: '${{ matrix.region }}',
78
- },
79
- };
80
- }
81
- function assumeAwsRoleStep(checkActiveDeployment, authProvider) {
82
- const condition = checkActiveDeployment ?
83
- `\${{ matrix.assumeRole == 'true' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
84
- '${{ matrix.assumeRole == \'true\' }}';
85
- const secretsParams = authProvider === javascript_1.CodeArtifactAuthProvider.ACCESS_AND_SECRET_KEY_PAIR ?
86
- {
87
- 'aws-access-key-id': '${{ secrets[matrix.accessKeyIdSecretName] }}',
88
- 'aws-secret-access-key': '${{ secrets[matrix.secretAccessKeySecretName] }}',
53
+ get checkoutStep() {
54
+ return github_1.WorkflowSteps.checkout({
55
+ with: {
56
+ fetchDepth: 0,
57
+ ref: '${{ github.sha }}',
58
+ },
59
+ });
60
+ }
61
+ /**
62
+ * Step to run before installing dependencies if exists
63
+ * @returns JobStep or undefined if no preInstallTaskName is provided
64
+ */
65
+ get preInstallDependenciesStep() {
66
+ if (!this.props.preInstallTaskName) {
67
+ return undefined;
68
+ }
69
+ return {
70
+ ...this.skipIfAlreadyActiveDeploymentCondition,
71
+ name: this.props.preInstallTaskName,
72
+ run: `npx projen ${this.props.preInstallTaskName}`,
73
+ };
74
+ }
75
+ /**
76
+ * Step to check if there is an active deployment for the environment in the matrix strategy
77
+ * @returns JobStep
78
+ */
79
+ get checkActiveDeploymentStepForMatrix() {
80
+ return this.getCheckActiveDeploymentStepForEnvironment('${{ matrix.environment }}');
81
+ }
82
+ /**
83
+ * Step to check if there is an active deployment for a specific environment
84
+ * @param environment The environment to check
85
+ * @returns JobStep
86
+ */
87
+ getCheckActiveDeploymentStepForEnvironment(environment) {
88
+ if (!this.props.checkActiveDeployment) {
89
+ return undefined;
90
+ }
91
+ return {
92
+ id: checkActiveDeploymentStepId,
93
+ uses: 'AminFazlMondo/check-deployed-environment@v1',
94
+ with: {
95
+ environment: environment,
96
+ },
97
+ env: {
98
+ GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}',
99
+ },
100
+ };
101
+ }
102
+ /**
103
+ * Step to setup AWS credentials in the environment for the matrix strategy
104
+ * @returns JobStep[]
105
+ */
106
+ get setupAwsCredentialsStepsForMatrix() {
107
+ return [
108
+ this.setupAwsCredentialsInEnvironmentForMatrix,
109
+ this.assumeAwsRoleStepForMatrix,
110
+ ];
111
+ }
112
+ /**
113
+ * Get the steps to setup AWS credentials for a specific environment
114
+ * @param environmentOptions The environment options
115
+ * @returns JobStep[]
116
+ */
117
+ getSetupAwsCredentialsStepsForEnvironment(environmentOptions) {
118
+ const steps = [];
119
+ const fromEnvVariableStep = this.getSetupAwsCredentialsInEnvironmentForEnvironment(environmentOptions.awsCredentials.roleToAssume ? true : false, environmentOptions.awsCredentials.accessKeyIdSecretName ?? 'AWS_ACCESS_KEY_ID', environmentOptions.awsCredentials.secretAccessKeySecretName ?? 'AWS_SECRET_ACCESS_KEY', environmentOptions.awsCredentials.region);
120
+ if (fromEnvVariableStep) {
121
+ steps.push(fromEnvVariableStep);
122
+ }
123
+ const assumeRoleStep = this.getAssumeAwsRoleStepForEnvironment(environmentOptions.awsCredentials.roleToAssume ? true : false, environmentOptions.awsCredentials.accessKeyIdSecretName ?? 'AWS_ACCESS_KEY_ID', environmentOptions.awsCredentials.secretAccessKeySecretName ?? 'AWS_SECRET_ACCESS_KEY', environmentOptions.awsCredentials.region, environmentOptions.awsCredentials.roleToAssume ?? '', environmentOptions.awsCredentials.assumeRoleDurationSeconds ?? 900);
124
+ if (assumeRoleStep) {
125
+ steps.push(assumeRoleStep);
126
+ }
127
+ return steps;
128
+ }
129
+ /**
130
+ * Step to setup AWS credentials in the environment for the matrix strategy
131
+ * @returns JobStep
132
+ */
133
+ get setupAwsCredentialsInEnvironmentForMatrix() {
134
+ return this.getSetupAwsCredentialsInEnvironmentForEnvironment('matrix.assumeRole', 'matrix.accessKeyIdSecretName', 'matrix.secretAccessKeySecretName', '${{ matrix.region }}');
135
+ }
136
+ /**
137
+ * Step to setup AWS credentials in the environment for a specific environment
138
+ * @param assumeRoleFlag Whether to assume a role, can be a boolean or a string for matrix strategy
139
+ * @param accessKeyIdSecretName The GitHub secret name for the access key ID
140
+ * @param secretAccessKeySecretName The GitHub secret name for the secret access key
141
+ * @param region The region
142
+ * @returns JobStep or undefined if no AWS credentials are provided,
143
+ * if assumeRoleFlag is boolean will be evaluated and return a JobStep only if false
144
+ * if assumeRoleFlag is string will always return a JobStep (for matrix strategy)
145
+ */
146
+ getSetupAwsCredentialsInEnvironmentForEnvironment(assumeRoleFlag, accessKeyIdSecretName, secretAccessKeySecretName, region) {
147
+ function getCondition(factory) {
148
+ if (typeof assumeRoleFlag === 'boolean') {
149
+ if (assumeRoleFlag) {
150
+ return undefined;
151
+ }
152
+ return factory.props.checkActiveDeployment ? skipIfAlreadyActiveDeploymentCondition : undefined;
153
+ }
154
+ return factory.props.checkActiveDeployment ?
155
+ `\${{ ${assumeRoleFlag} == 'false' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
156
+ `\${{ ${assumeRoleFlag} == 'false' }}`;
157
+ }
158
+ const commands = [
159
+ 'echo "AWS_ACCESS_KEY_ID=$accessKeyId" >> $GITHUB_ENV',
160
+ 'echo "AWS_SECRET_ACCESS_KEY=$secretAccessKey" >> $GITHUB_ENV',
161
+ 'echo "AWS_REGION=$region" >> $GITHUB_ENV',
162
+ ];
163
+ if (typeof assumeRoleFlag === 'boolean' && assumeRoleFlag) {
164
+ return undefined;
165
+ }
166
+ const condition = getCondition(this);
167
+ return {
168
+ if: condition,
169
+ name: 'Configure AWS Credentials',
170
+ run: `${commands.join('\n')}`,
171
+ env: {
172
+ accessKeyId: `\${{ secrets[${accessKeyIdSecretName}] }}`,
173
+ secretAccessKey: `\${{ secrets[${secretAccessKeySecretName}] }}`,
174
+ region,
175
+ },
176
+ };
177
+ }
178
+ /**
179
+ * Step to assume an AWS role for the matrix strategy
180
+ * @returns JobStep
181
+ */
182
+ get assumeAwsRoleStepForMatrix() {
183
+ return this.getAssumeAwsRoleStepForEnvironment('matrix.assumeRole', 'matrix.accessKeyIdSecretName', 'matrix.secretAccessKeySecretName', '${{ matrix.region }}', '${{ matrix.roleToAssume }}', '${{ matrix.assumeRoleDurationSeconds }}');
184
+ }
185
+ /**
186
+ * Step to assume an AWS role for a specific environment
187
+ * @param assumeRoleFlag Whether to assume a role, can be a boolean or a string for matrix strategy
188
+ * @param accessKeyIdSecretName The GitHub secret name for the access key ID
189
+ * @param secretAccessKeySecretName The GitHub secret name for the secret access key
190
+ * @param region The region
191
+ * @param roleToAssume The role to assume
192
+ * @param assumeRoleDurationSeconds The duration for assuming the role
193
+ * @returns JobStep or undefined if assumeRoleFlag is boolean and false
194
+ * if assumeRoleFlag is string will always return a JobStep (for matrix strategy)
195
+ */
196
+ getAssumeAwsRoleStepForEnvironment(assumeRoleFlag, accessKeyIdSecretName, secretAccessKeySecretName, region, roleToAssume, assumeRoleDurationSeconds) {
197
+ function getCondition(factory) {
198
+ if (typeof assumeRoleFlag === 'boolean') {
199
+ if (!assumeRoleFlag) {
200
+ return undefined;
201
+ }
202
+ return factory.props.checkActiveDeployment ? skipIfAlreadyActiveDeploymentCondition : undefined;
203
+ }
204
+ return factory.props.checkActiveDeployment ?
205
+ `\${{ ${assumeRoleFlag} == 'true' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
206
+ `\${{ ${assumeRoleFlag} == 'true' }}`;
207
+ }
208
+ if (typeof assumeRoleFlag === 'boolean' && !assumeRoleFlag) {
209
+ return undefined;
210
+ }
211
+ const condition = getCondition(this);
212
+ const secretsParams = this.props.authProvider === javascript_1.CodeArtifactAuthProvider.ACCESS_AND_SECRET_KEY_PAIR ?
213
+ {
214
+ 'aws-access-key-id': `\${{ secrets[${accessKeyIdSecretName}] }}`,
215
+ 'aws-secret-access-key': `\${{ secrets[${secretAccessKeySecretName}] }}`,
216
+ } : undefined;
217
+ return {
218
+ if: condition,
219
+ name: 'Assume AWS Role',
220
+ uses: 'aws-actions/configure-aws-credentials@v4',
221
+ with: {
222
+ ...secretsParams,
223
+ 'role-to-assume': roleToAssume,
224
+ 'aws-region': region,
225
+ 'role-duration-seconds': assumeRoleDurationSeconds,
226
+ },
227
+ };
228
+ }
229
+ /**
230
+ * Step to setup NPM config if provided
231
+ * @returns JobStep or undefined if no npmConfig is provided
232
+ */
233
+ get setupNpmConfigForMatrix() {
234
+ return this.getSetupNpmConfigForEnvironment('${{ matrix.environment }}');
235
+ }
236
+ getSetupNpmConfigForEnvironment(environment) {
237
+ const { npmConfigEnvironment } = this.props;
238
+ if (!npmConfigEnvironment) {
239
+ return undefined;
240
+ }
241
+ const environmentVariableName = 'CONFIG_VALUE';
242
+ return {
243
+ ...this.skipIfAlreadyActiveDeploymentCondition,
244
+ name: 'Setting NPM Config',
245
+ env: {
246
+ [environmentVariableName]: environment,
247
+ },
248
+ run: `npm config set ${npmConfigEnvironment} $${environmentVariableName}`,
249
+ };
250
+ }
251
+ /**
252
+ * Get the step to run a specific script
253
+ * @param scriptName The name of the script to run
254
+ * @param stepName The name of the step in the workflow
255
+ * @param hasScriptFlag Whether the script should be run
256
+ * @returns The job step to run the script or undefined if not applicable
257
+ * If hasScriptFlag is boolean and false will return undefined
258
+ * If hasScriptFlag is string will always return a JobStep (for matrix strategy)
259
+ */
260
+ getRunScriptStep(scriptName, stepName, hasScriptFlag) {
261
+ function getCondition(factory) {
262
+ if (typeof hasScriptFlag === 'boolean') {
263
+ if (!hasScriptFlag) {
264
+ return undefined;
265
+ }
266
+ return factory.props.checkActiveDeployment ? skipIfAlreadyActiveDeploymentCondition : undefined;
267
+ }
268
+ return factory.props.checkActiveDeployment ?
269
+ `\${{ ${hasScriptFlag} == 'true' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
270
+ `\${{ ${hasScriptFlag} == 'true' }}`;
271
+ }
272
+ if (typeof hasScriptFlag === 'boolean' && !hasScriptFlag) {
273
+ return undefined;
274
+ }
275
+ const condition = getCondition(this);
276
+ return {
277
+ if: condition,
278
+ name: `Run ${stepName}`,
279
+ run: `${this.project.runScriptCommand} ${scriptName}`,
280
+ };
281
+ }
282
+ /**
283
+ * Step to deploy the workflow
284
+ * @returns JobStep
285
+ */
286
+ get deploymentStep() {
287
+ return this.getRunScriptStep('deploy:workflow', 'Deployment', true);
288
+ }
289
+ /**
290
+ * Step to run post deployment script in matrix strategy
291
+ * @returns JobStep
292
+ */
293
+ get preDeploymentStepForMatrix() {
294
+ return this.getPreDeploymentStepForEnvironment('matrix.hasPreDeployTask', '${{ matrix.preDeploymentScript }}');
295
+ }
296
+ /**
297
+ * Get the pre-deployment step for a specific environment
298
+ * @param hasPreDeployTaskFlag Whether the pre-deployment task should be run
299
+ * @param preDeploymentScript The script to run
300
+ * @returns The job step to run the pre-deployment script or undefined if not applicable
301
+ * If hasPreDeployTaskFlag is boolean and false will return undefined
302
+ * If hasPreDeployTaskFlag is string will always return a JobStep (for matrix strategy)
303
+ */
304
+ getPreDeploymentStepForEnvironment(hasPreDeployTaskFlag, preDeploymentScript) {
305
+ return this.getRunScriptStep(preDeploymentScript, 'Pre Deployment', hasPreDeployTaskFlag);
306
+ }
307
+ /**
308
+ * Step to run post deployment script in matrix strategy
309
+ * @returns JobStep
310
+ */
311
+ get postDeploymentStepForMatrix() {
312
+ return this.getPostDeploymentStepForEnvironment('matrix.hasPostDeployTask', '${{ matrix.postDeploymentScript }}');
313
+ }
314
+ /**
315
+ * Get the post-deployment step for a specific environment
316
+ * @param hasPostDeployTaskFlag Whether the post-deployment task should be run
317
+ * @param postDeploymentScript The script to run
318
+ * @returns The job step to run the post-deployment script or undefined if not applicable
319
+ * If hasPostDeployTaskFlag is boolean and false will return undefined
320
+ * If hasPostDeployTaskFlag is string will always return a JobStep (for matrix strategy)
321
+ */
322
+ getPostDeploymentStepForEnvironment(hasPostDeployTaskFlag, postDeploymentScript) {
323
+ return this.getRunScriptStep(postDeploymentScript, 'Post Deployment', hasPostDeployTaskFlag);
324
+ }
325
+ /**
326
+ * Get all deployment jobs whether for matrix strategy or not
327
+ * @returns Record of jobs
328
+ */
329
+ get deploymentJobs() {
330
+ if (this.props.deployOptions.environments.length === 0) {
331
+ this.project.logger.warn('The project does not have any environment set, make sure this is desired setting');
332
+ }
333
+ return this.props.jobStrategy === types_1.DeployJobStrategy.MATRIX ? this.deploymentJobsForMatrix : this.getDeploymentJobsForMultiJob();
334
+ }
335
+ /**
336
+ * Get deployment jobs for matrix strategy
337
+ * @returns Record of jobs
338
+ */
339
+ get deploymentJobsForMatrix() {
340
+ const { environments, environmentVariableName } = this.props.deployOptions;
341
+ const include = environments.map(environmentOptions => {
342
+ const { awsCredentials } = environmentOptions;
343
+ const assumeRole = awsCredentials.roleToAssume ? 'true' : 'false';
344
+ const assumeRoleSettings = awsCredentials.roleToAssume ? {
345
+ roleToAssume: awsCredentials.roleToAssume,
346
+ assumeRoleDurationSeconds: awsCredentials.assumeRoleDurationSeconds || 900,
347
+ } : undefined;
348
+ const accessKeyIdSecretName = awsCredentials.accessKeyIdSecretName ?? 'AWS_ACCESS_KEY_ID';
349
+ const secretAccessKeySecretName = awsCredentials.secretAccessKeySecretName ?? 'AWS_SECRET_ACCESS_KEY';
350
+ const hasPostDeployTask = environmentOptions.postDeployWorkflowScript ? 'true' : 'false';
351
+ const hasPreDeployTask = environmentOptions.preDeployWorkflowScript ? 'true' : 'false';
352
+ return {
353
+ environment: environmentOptions.name,
354
+ accessKeyIdSecretName,
355
+ secretAccessKeySecretName,
356
+ region: awsCredentials.region,
357
+ assumeRole,
358
+ hasPostDeployTask,
359
+ postDeploymentScript: environmentOptions.postDeployWorkflowScript || '',
360
+ hasPreDeployTask,
361
+ preDeploymentScript: environmentOptions.preDeployWorkflowScript || '',
362
+ ...assumeRoleSettings,
363
+ };
364
+ });
365
+ const deployJobEnv = environmentVariableName ? {
366
+ [environmentVariableName]: '${{ matrix.environment }}',
89
367
  } : undefined;
90
- return {
91
- if: condition,
92
- name: 'Assume AWS Role',
93
- uses: 'aws-actions/configure-aws-credentials@v4',
94
- with: {
95
- ...secretsParams,
96
- 'role-to-assume': '${{ matrix.roleToAssume }}',
97
- 'aws-region': '${{ matrix.region }}',
98
- 'role-duration-seconds': '${{ matrix.assumeRoleDurationSeconds }}',
99
- },
100
- };
101
- }
102
- function setAwsCredentialsSteps(checkActiveDeployment, authProvider = javascript_1.CodeArtifactAuthProvider.ACCESS_AND_SECRET_KEY_PAIR) {
103
- return [
104
- setAwsCredentialsInEnvironment(checkActiveDeployment),
105
- assumeAwsRoleStep(checkActiveDeployment, authProvider),
106
- ];
107
- }
108
- function setNpmConfig(configName, configValue, checkActiveDeployment) {
109
- const environmentVariableName = 'CONFIG_VALUE';
110
- return {
111
- ...getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment),
112
- name: 'Setting NPM Config',
113
- env: {
114
- [environmentVariableName]: configValue,
115
- },
116
- run: `npm config set ${configName} $${environmentVariableName}`,
117
- };
118
- }
119
- const checkActiveDeploymentStepId = 'deployment-check';
120
- function checkActiveDeploymentStep() {
121
- return {
122
- id: checkActiveDeploymentStepId,
123
- uses: 'AminFazlMondo/check-deployed-environment@v1',
124
- with: {
125
- environment: '${{ matrix.environment }}',
126
- },
127
- env: {
128
- GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}',
129
- },
130
- };
131
- }
132
- const skipIfAlreadyActiveDeploymentCondition = `steps.${checkActiveDeploymentStepId}.outputs.has_active_deployment != 'true'`;
133
- function getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment) {
134
- return checkActiveDeployment ? { if: `\${{ ${skipIfAlreadyActiveDeploymentCondition} }}` } : undefined;
135
- }
136
- function postDeploymentStep(checkActiveDeployment, packageManager) {
137
- const condition = checkActiveDeployment ?
138
- `\${{ matrix.hasPostDeployTask == 'true' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
139
- '${{ matrix.hasPostDeployTask == \'true\' }}';
140
- return {
141
- if: condition,
142
- name: 'Post Deployment',
143
- run: `${getPackageManagerCommandPrefix(packageManager)} \${{ matrix.postDeploymentScript }}`,
144
- };
145
- }
146
- function preDeploymentStep(checkActiveDeployment, packageManager) {
147
- const condition = checkActiveDeployment ?
148
- `\${{ matrix.hasPreDeployTask == 'true' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
149
- '${{ matrix.hasPreDeployTask == \'true\' }}';
150
- return {
151
- if: condition,
152
- name: 'Pre Deployment',
153
- run: `${getPackageManagerCommandPrefix(packageManager)} \${{ matrix.preDeploymentScript }}`,
154
- };
368
+ const jobDefinition = {
369
+ runsOn: ['ubuntu-latest'],
370
+ concurrency: {
371
+ 'group': '${{ matrix.environment }}-deploy',
372
+ 'cancel-in-progress': false,
373
+ },
374
+ needs: [
375
+ 'release_github',
376
+ ],
377
+ permissions: {
378
+ contents: workflows_model_1.JobPermission.READ,
379
+ deployments: workflows_model_1.JobPermission.READ,
380
+ idToken: this.props.authProvider === javascript_1.CodeArtifactAuthProvider.GITHUB_OIDC ? workflows_model_1.JobPermission.WRITE : undefined,
381
+ },
382
+ strategy: {
383
+ maxParallel: 1,
384
+ matrix: {
385
+ domain: {
386
+ environment: include.map(e => e.environment),
387
+ },
388
+ include,
389
+ },
390
+ },
391
+ environment: {
392
+ name: '${{ matrix.environment }}',
393
+ },
394
+ env: deployJobEnv,
395
+ steps: [],
396
+ };
397
+ jobDefinition.steps.push(this.checkoutStep);
398
+ const preInstallDependenciesStep = this.preInstallDependenciesStep;
399
+ if (preInstallDependenciesStep) {
400
+ jobDefinition.steps.push(preInstallDependenciesStep);
401
+ }
402
+ jobDefinition.steps.push(...(this.project).renderWorkflowSetup());
403
+ const checkActiveDeploymentStepForMatrix = this.checkActiveDeploymentStepForMatrix;
404
+ if (checkActiveDeploymentStepForMatrix) {
405
+ jobDefinition.steps.push(checkActiveDeploymentStepForMatrix);
406
+ }
407
+ jobDefinition.steps.push(...this.setupAwsCredentialsStepsForMatrix);
408
+ const setupNpmConfigStep = this.setupNpmConfigForMatrix;
409
+ if (setupNpmConfigStep) {
410
+ jobDefinition.steps.push(setupNpmConfigStep);
411
+ }
412
+ jobDefinition.steps.push(this.preDeploymentStepForMatrix);
413
+ jobDefinition.steps.push(this.deploymentStep);
414
+ jobDefinition.steps.push(this.postDeploymentStepForMatrix);
415
+ return { deploy: jobDefinition };
416
+ }
417
+ /**
418
+ * Get the IDs of the jobs that must be completed before the specified environment's deployment job
419
+ * @param environmentName The name of the environment
420
+ * @returns An array of job IDs
421
+ */
422
+ getDeploymentJobPrerequisiteJobIds(environmentName) {
423
+ const result = ['release_github'];
424
+ if (!this.props.environmentDependencies) {
425
+ const index = this.props.deployOptions.environments.findIndex(env => env.name === environmentName);
426
+ const prerequisiteEnvironment = index > 0 ? this.props.deployOptions.environments[index - 1] : undefined;
427
+ if (prerequisiteEnvironment) {
428
+ result.push(getDeployJobId(prerequisiteEnvironment.name));
429
+ }
430
+ }
431
+ else {
432
+ const dependencies = this.props.environmentDependencies[environmentName];
433
+ if (dependencies) {
434
+ dependencies.forEach(dep => {
435
+ result.push(getDeployJobId(dep));
436
+ });
437
+ }
438
+ }
439
+ return result;
440
+ }
441
+ /**
442
+ * Get deployment jobs for multi-job strategy
443
+ * @returns Record of jobs
444
+ */
445
+ getDeploymentJobsForMultiJob() {
446
+ const { environmentVariableName, environments } = this.props.deployOptions;
447
+ const jobs = environments.map((environmentOptions) => {
448
+ return [getDeployJobId(environmentOptions.name), this.getJobForEnvironment(environmentOptions, environmentVariableName)];
449
+ });
450
+ return Object.fromEntries(jobs);
451
+ }
452
+ /**
453
+ * Get the job definition for a specific environment
454
+ * @param environmentOptions The environment options
455
+ * @param environmentVariableName The name of the environment variable to set with the environment name, if any
456
+ * @returns The job definition for the environment
457
+ */
458
+ getJobForEnvironment(environmentOptions, environmentVariableName) {
459
+ const { name } = environmentOptions;
460
+ const deployJobEnv = environmentVariableName ? {
461
+ [environmentVariableName]: name,
462
+ } : undefined;
463
+ const jobDefinition = {
464
+ runsOn: ['ubuntu-latest'],
465
+ concurrency: {
466
+ 'group': `${name}-deploy`,
467
+ 'cancel-in-progress': false,
468
+ },
469
+ needs: this.getDeploymentJobPrerequisiteJobIds(name),
470
+ permissions: {
471
+ contents: workflows_model_1.JobPermission.READ,
472
+ deployments: workflows_model_1.JobPermission.READ,
473
+ idToken: this.props.authProvider === javascript_1.CodeArtifactAuthProvider.GITHUB_OIDC ? workflows_model_1.JobPermission.WRITE : undefined,
474
+ },
475
+ environment: {
476
+ name: name,
477
+ },
478
+ env: deployJobEnv,
479
+ steps: [],
480
+ };
481
+ jobDefinition.steps.push(this.checkoutStep);
482
+ const preInstallDependenciesStep = this.preInstallDependenciesStep;
483
+ if (preInstallDependenciesStep) {
484
+ jobDefinition.steps.push(preInstallDependenciesStep);
485
+ }
486
+ jobDefinition.steps.push(...(this.project).renderWorkflowSetup());
487
+ const checkActiveDeploymentStep = this.getCheckActiveDeploymentStepForEnvironment(name);
488
+ if (checkActiveDeploymentStep) {
489
+ jobDefinition.steps.push(checkActiveDeploymentStep);
490
+ }
491
+ jobDefinition.steps.push(...this.getSetupAwsCredentialsStepsForEnvironment(environmentOptions));
492
+ const setupNpmConfigStep = this.getSetupNpmConfigForEnvironment(name);
493
+ if (setupNpmConfigStep) {
494
+ jobDefinition.steps.push(setupNpmConfigStep);
495
+ }
496
+ const preDeploymentStep = this.getPreDeploymentStepForEnvironment(environmentOptions.preDeployWorkflowScript ? true : false, environmentOptions.preDeployWorkflowScript || '');
497
+ if (preDeploymentStep) {
498
+ jobDefinition.steps.push(preDeploymentStep);
499
+ }
500
+ jobDefinition.steps.push(this.deploymentStep);
501
+ const postDeploymentStep = this.getPostDeploymentStepForEnvironment(environmentOptions.postDeployWorkflowScript ? true : false, environmentOptions.postDeployWorkflowScript || '');
502
+ if (postDeploymentStep) {
503
+ jobDefinition.steps.push(postDeploymentStep);
504
+ }
505
+ return jobDefinition;
506
+ }
155
507
  }
156
- function preInstallDependenciesStep(taskName, checkActiveDeployment) {
157
- return {
158
- ...getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment),
159
- name: taskName,
160
- run: `npx projen ${taskName}`,
161
- };
508
+ exports.DeployableAwsCdkTypeScriptAppStepsFactory = DeployableAwsCdkTypeScriptAppStepsFactory;
509
+ function getDeployJobId(environmentName) {
510
+ return `Deploy-${environmentName}`;
162
511
  }
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSxvQ0FTQztBQUVELGdEQVNDO0FBRUQsMERBTUM7QUFZRCx3Q0FPQztBQW1ERCx3REFRQztBQUVELG9DQVVDO0FBR0QsOERBV0M7QUFRRCxnREFVQztBQUVELDhDQVVDO0FBRUQsZ0VBTUM7QUE5S0QsbUNBQW9DO0FBRXBDLHNEQUFpRTtBQUVqRSxTQUFnQixZQUFZO0lBQzFCLE9BQU87UUFDTCxJQUFJLEVBQUUsVUFBVTtRQUNoQixJQUFJLEVBQUUscUJBQXFCO1FBQzNCLElBQUksRUFBRTtZQUNKLEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsYUFBYSxFQUFFLENBQUM7U0FDakI7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLFdBQW1CLEVBQUUscUJBQThCO0lBQ3BGLE9BQU87UUFDTCxHQUFHLHlDQUF5QyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksRUFBRSxlQUFlO1FBQ3JCLElBQUksRUFBRSx1QkFBdUI7UUFDN0IsSUFBSSxFQUFFO1lBQ0osY0FBYyxFQUFFLFdBQVc7U0FDNUI7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLE9BQWUsRUFBRSxxQkFBOEI7SUFDckYsT0FBTztRQUNMLEdBQUcseUNBQXlDLENBQUMscUJBQXFCLENBQUM7UUFDbkUsSUFBSSxFQUFFLHNCQUFzQjtRQUM1QixHQUFHLEVBQUUsT0FBTztLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyw4QkFBOEIsQ0FBQyxjQUE2QztJQUNuRixJQUFJLGNBQWMsS0FBSyxtQkFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQUEsT0FBTyxTQUFTLENBQUM7SUFBQSxDQUFDO0lBRTdFLElBQUksY0FBYyxLQUFLLG1CQUFVLENBQUMsa0JBQWtCLENBQUMsSUFB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QUksRUFBRSxRQUFRO1FBQ2QsR0FBRyxFQUFFLGNBQWMsUUFBUSxFQUFFO0tBQzlCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgamF2YXNjcmlwdCB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBKb2JTdGVwIH0gZnJvbSAncHJvamVuL2xpYi9naXRodWIvd29ya2Zsb3dzLW1vZGVsJztcbmltcG9ydCB7IENvZGVBcnRpZmFjdEF1dGhQcm92aWRlciB9IGZyb20gJ3Byb2plbi9saWIvamF2YXNjcmlwdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja291dFN0ZXAoKTogSm9iU3RlcCB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0NoZWNrb3V0JyxcbiAgICB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NCcsXG4gICAgd2l0aDoge1xuICAgICAgJ3JlZic6ICcke3sgZ2l0aHViLnNoYSB9fScsXG4gICAgICAnZmV0Y2gtZGVwdGgnOiAwLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXROb2RlVmVyc2lvblN0ZXAobm9kZVZlcnNpb246IHN0cmluZywgY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuKTogSm9iU3RlcCB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0U2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oY2hlY2tBY3RpdmVEZXBsb3ltZW50KSxcbiAgICBuYW1lOiAnU2V0dXAgTm9kZS5qcycsXG4gICAgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NCcsXG4gICAgd2l0aDoge1xuICAgICAgJ25vZGUtdmVyc2lvbic6IG5vZGVWZXJzaW9uLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jaWVzU3RlcChjb21tYW5kOiBzdHJpbmcsIGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbik6IEpvYlN0ZXAge1xuICByZXR1cm4ge1xuICAgIC4uLmdldFNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uKGNoZWNrQWN0aXZlRGVwbG95bWVudCksXG4gICAgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJyxcbiAgICBydW46IGNvbW1hbmQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZFByZWZpeChwYWNrYWdlTWFuYWdlcjogamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIpOiBzdHJpbmcge1xuICBpZiAocGFja2FnZU1hbmFnZXIgPT09IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTSkge3JldHVybiAnbnBtIHJ1bic7fVxuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIuWUFSTikge3JldHVybiAneWFybic7fVxuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIuUE5QTSkge3JldHVybiAncG5wbSc7fVxuXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrYWdlIG1hbmFnZXIgc2VsZWN0ZWQgKCR7cGFja2FnZU1hbmFnZXJ9KWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95bWVudFN0ZXAoY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuLCBwYWNrYWdlTWFuYWdlcjogamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIpOiBKb2JTdGVwIHtcblxuICByZXR1cm4ge1xuICAgIC4uLmdldFNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uKGNoZWNrQWN0aXZlRGVwbG95bWVudCksXG4gICAgbmFtZTogJ0RlcGxveW1lbnQnLFxuICAgIHJ1bjogYCR7Z2V0UGFja2FnZU1hbmFnZXJDb21tYW5kUHJlZml4KHBhY2thZ2VNYW5hZ2VyKX0gZGVwbG95OndvcmtmbG93YCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2V0QXdzQ3JlZGVudGlhbHNJbkVudmlyb25tZW50KGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbik6IEpvYlN0ZXAge1xuICBjb25zdCBjb21tYW5kcyA9IFtcbiAgICAnZWNobyBcIkFXU19BQ0NFU1NfS0VZX0lEPSRhY2Nlc3NLZXlJZFwiID4+ICRHSVRIVUJfRU5WJyxcbiAgICAnZWNobyBcIkFXU19TRUNSRVRfQUNDRVNTX0tFWT0kc2VjcmV0QWNjZXNzS2V5XCIgPj4gJEdJVEhVQl9FTlYnLFxuICAgICdlY2hvIFwiQVdTX1JFR0lPTj0kcmVnaW9uXCIgPj4gJEdJVEhVQl9FTlYnLFxuICBdO1xuXG4gIGNvbnN0IGNvbmRpdGlvbiA9XG4gICAgY2hlY2tBY3RpdmVEZXBsb3ltZW50ID9cbiAgICAgIGBcXCR7eyBtYXRyaXguYXNzdW1lUm9sZSA9PSAnZmFsc2UnICYmICR7c2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb259IH19YCA6XG4gICAgICAnJHt7IG1hdHJpeC5hc3N1bWVSb2xlID09IFxcJ2ZhbHNlXFwnIH19JztcblxuICByZXR1cm4ge1xuICAgIGlmOiBjb25kaXRpb24sXG4gICAgbmFtZTogJ0NvbmZpZ3VyZSBBV1MgQ3JlZGVudGlhbHMnLFxuICAgIHJ1bjogYCR7Y29tbWFuZHMuam9pbignXFxuJyl9YCxcbiAgICBlbnY6IHtcbiAgICAgIGFjY2Vzc0tleUlkOiAnJHt7IHNlY3JldHNbbWF0cml4LmFjY2Vzc0tleUlkU2VjcmV0TmFtZV0gfX0nLFxuICAgICAgc2VjcmV0QWNjZXNzS2V5OiAnJHt7IHNlY3JldHNbbWF0cml4LnNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWVdIH19JyxcbiAgICAgIHJlZ2lvbjogJyR7eyBtYXRyaXgucmVnaW9uIH19JyxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBhc3N1bWVBd3NSb2xlU3RlcChjaGVja0FjdGl2ZURlcGxveW1lbnQ6IGJvb2xlYW4sIGF1dGhQcm92aWRlcjogQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyKTogSm9iU3RlcCB7XG4gIGNvbnN0IGNvbmRpdGlvbiA9XG4gICAgY2hlY2tBY3RpdmVEZXBsb3ltZW50ID9cbiAgICAgIGBcXCR7eyBtYXRyaXguYXNzdW1lUm9sZSA9PSAndHJ1ZScgJiYgJHtza2lwSWZBbHJlYWR5QWN0aXZlRGVwbG95bWVudENvbmRpdGlvbn0gfX1gIDpcbiAgICAgICcke3sgbWF0cml4LmFzc3VtZVJvbGUgPT0gXFwndHJ1ZVxcJyB9fSc7XG5cbiAgY29uc3Qgc2VjcmV0c1BhcmFtcyA9XG4gICAgYXV0aFByb3ZpZGVyID09PSBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIuQUNDRVNTX0FORF9TRUNSRVRfS0VZX1BBSVIgP1xuICAgICAge1xuICAgICAgICAnYXdzLWFjY2Vzcy1rZXktaWQnOiAnJHt7IHNlY3JldHNbbWF0cml4LmFjY2Vzc0tleUlkU2VjcmV0TmFtZV0gfX0nLFxuICAgICAgICAnYXdzLXNlY3JldC1hY2Nlc3Mta2V5JzogJyR7eyBzZWNyZXRzW21hdHJpeC5zZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lXSB9fScsXG4gICAgICB9IDogdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGlmOiBjb25kaXRpb24sXG4gICAgbmFtZTogJ0Fzc3VtZSBBV1MgUm9sZScsXG4gICAgdXNlczogJ2F3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNAdjQnLFxuICAgIHdpdGg6IHtcbiAgICAgIC4uLnNlY3JldHNQYXJhbXMsXG4gICAgICAncm9sZS10by1hc3N1bWUnOiAnJHt7IG1hdHJpeC5yb2xlVG9Bc3N1bWUgfX0nLFxuICAgICAgJ2F3cy1yZWdpb24nOiAnJHt7IG1hdHJpeC5yZWdpb24gfX0nLFxuICAgICAgJ3JvbGUtZHVyYXRpb24tc2Vjb25kcyc6ICcke3sgbWF0cml4LmFzc3VtZVJvbGVEdXJhdGlvblNlY29uZHMgfX0nLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBd3NDcmVkZW50aWFsc1N0ZXBzKFxuICBjaGVja0FjdGl2ZURlcGxveW1lbnQ6IGJvb2xlYW4sXG4gIGF1dGhQcm92aWRlcjogQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyID0gQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyLkFDQ0VTU19BTkRfU0VDUkVUX0tFWV9QQUlSKVxuICA6IEpvYlN0ZXBbXSB7XG4gIHJldHVybiBbXG4gICAgc2V0QXdzQ3JlZGVudGlhbHNJbkVudmlyb25tZW50KGNoZWNrQWN0aXZlRGVwbG95bWVudCksXG4gICAgYXNzdW1lQXdzUm9sZVN0ZXAoY2hlY2tBY3RpdmVEZXBsb3ltZW50LCBhdXRoUHJvdmlkZXIpLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TnBtQ29uZmlnKGNvbmZpZ05hbWU6IHN0cmluZywgY29uZmlnVmFsdWU6IHN0cmluZywgY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuKTogSm9iU3RlcCB7XG4gIGNvbnN0IGVudmlyb25tZW50VmFyaWFibGVOYW1lID0gJ0NPTkZJR19WQUxVRSc7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0U2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oY2hlY2tBY3RpdmVEZXBsb3ltZW50KSxcbiAgICBuYW1lOiAnU2V0dGluZyBOUE0gQ29uZmlnJyxcbiAgICBlbnY6IHtcbiAgICAgIFtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZV06IGNvbmZpZ1ZhbHVlLFxuICAgIH0sXG4gICAgcnVuOiBgbnBtIGNvbmZpZyBzZXQgJHtjb25maWdOYW1lfSAkJHtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZX1gLFxuICB9O1xufVxuXG5jb25zdCBjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwSWQgPSAnZGVwbG95bWVudC1jaGVjayc7XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcCgpOiBKb2JTdGVwIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcElkLFxuICAgIHVzZXM6ICdBbWluRmF6bE1vbmRvL2NoZWNrLWRlcGxveWVkLWVudmlyb25tZW50QHYxJyxcbiAgICB3aXRoOiB7XG4gICAgICBlbnZpcm9ubWVudDogJyR7eyBtYXRyaXguZW52aXJvbm1lbnQgfX0nLFxuICAgIH0sXG4gICAgZW52OiB7XG4gICAgICBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nLFxuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IHNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uPSBgc3RlcHMuJHtjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwSWR9Lm91dHB1dHMuaGFzX2FjdGl2ZV9kZXBsb3ltZW50ICE9ICd0cnVlJ2A7XG5cbmZ1bmN0aW9uIGdldFNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uKGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbik6IEpvYlN0ZXAgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2hlY2tBY3RpdmVEZXBsb3ltZW50ID8geyBpZjogYFxcJHt7ICR7c2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb259IH19YCB9IDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zdERlcGxveW1lbnRTdGVwKGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbiwgcGFja2FnZU1hbmFnZXI6IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyKTogSm9iU3RlcCB7XG4gIGNvbnN0IGNvbmRpdGlvbiA9XG4gIGNoZWNrQWN0aXZlRGVwbG95bWVudCA/XG4gICAgYFxcJHt7IG1hdHJpeC5oYXNQb3N0RGVwbG95VGFzayA9PSAndHJ1ZScgJiYgJHtza2lwSWZBbHJlYWR5QWN0aXZlRGVwbG95bWVudENvbmRpdGlvbn0gfX1gIDpcbiAgICAnJHt7IG1hdHJpeC5oYXNQb3N0RGVwbG95VGFzayA9PSBcXCd0cnVlXFwnIH19JztcbiAgcmV0dXJuIHtcbiAgICBpZjogY29uZGl0aW9uLFxuICAgIG5hbWU6ICdQb3N0IERlcGxveW1lbnQnLFxuICAgIHJ1bjogYCR7Z2V0UGFja2FnZU1hbmFnZXJDb21tYW5kUHJlZml4KHBhY2thZ2VNYW5hZ2VyKX0gXFwke3sgbWF0cml4LnBvc3REZXBsb3ltZW50U2NyaXB0IH19YCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZURlcGxveW1lbnRTdGVwKGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbiwgcGFja2FnZU1hbmFnZXI6IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyKTogSm9iU3RlcCB7XG4gIGNvbnN0IGNvbmRpdGlvbiA9XG4gIGNoZWNrQWN0aXZlRGVwbG95bWVudCA/XG4gICAgYFxcJHt7IG1hdHJpeC5oYXNQcmVEZXBsb3lUYXNrID09ICd0cnVlJyAmJiAke3NraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9ufSB9fWAgOlxuICAgICcke3sgbWF0cml4Lmhhc1ByZURlcGxveVRhc2sgPT0gXFwndHJ1ZVxcJyB9fSc7XG4gIHJldHVybiB7XG4gICAgaWY6IGNvbmRpdGlvbixcbiAgICBuYW1lOiAnUHJlIERlcGxveW1lbnQnLFxuICAgIHJ1bjogYCR7Z2V0UGFja2FnZU1hbmFnZXJDb21tYW5kUHJlZml4KHBhY2thZ2VNYW5hZ2VyKX0gXFwke3sgbWF0cml4LnByZURlcGxveW1lbnRTY3JpcHQgfX1gLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlSW5zdGFsbERlcGVuZGVuY2llc1N0ZXAodGFza05hbWU6IHN0cmluZywgY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuKTogSm9iU3RlcCB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0U2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oY2hlY2tBY3RpdmVEZXBsb3ltZW50KSxcbiAgICBuYW1lOiB0YXNrTmFtZSxcbiAgICBydW46IGBucHggcHJvamVuICR7dGFza05hbWV9YCxcbiAgfTtcbn0iXX0=
512
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsOENBQWtEO0FBQ2xELHVFQUFnRjtBQUNoRixzREFBaUU7QUFDakUsbUNBQWtIO0FBRWxILE1BQU0sMkJBQTJCLEdBQUcsa0JBQWtCLENBQUM7QUFDdkQsTUFBTSxzQ0FBc0MsR0FBRSxTQUFTLDJCQUEyQiwwQ0FBMEMsQ0FBQztBQXdDN0g7OztHQUdHO0FBQ0gsTUFBYSx5Q0FBeUM7SUFFcEQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FDckQsYUFBNEIsRUFDNUIsdUJBQTBEO1FBRzFELElBQUksYUFBYSxDQUFDLFdBQVcsS0FBSyx5QkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLCtFQUErRSxDQUFDLENBQUM7UUFDbkcsQ0FBQztRQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQzlELE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsd0VBQXdFLENBQUMsQ0FBQztZQUMvRyxDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDakIsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQy9FLElBQUksQ0FB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O1FBRUQsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG1DQUFtQyxDQUNqRSxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQzFELGtCQUFrQixDQUFDLHdCQUF3QixJQUFJLEVBQUUsQ0FDbEQsQ0FBQztRQUNGLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0NBRUY7QUF2b0JELDhGQXVvQkM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxlQUF1QjtJQUM3QyxPQUFPLFVBQVUsZUFBZSxFQUFFLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGphdmFzY3JpcHQgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgV29ya2Zsb3dTdGVwcyB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViJztcbmltcG9ydCB7IEpvYlBlcm1pc3Npb24sIEpvYlN0ZXAsIEpvYiB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViL3dvcmtmbG93cy1tb2RlbCc7XG5pbXBvcnQgeyBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIgfSBmcm9tICdwcm9qZW4vbGliL2phdmFzY3JpcHQnO1xuaW1wb3J0IHsgRGVwbG95Sm9iU3RyYXRlZ3ksIERlcGxveU9wdGlvbnMsIEVudmlyb25tZW50RGVwbG95bWVudERlcGVuZGVuY2llcywgRW52aXJvbm1lbnRPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IGNoZWNrQWN0aXZlRGVwbG95bWVudFN0ZXBJZCA9ICdkZXBsb3ltZW50LWNoZWNrJztcbmNvbnN0IHNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uPSBgc3RlcHMuJHtjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwSWR9Lm91dHB1dHMuaGFzX2FjdGl2ZV9kZXBsb3ltZW50ICE9ICd0cnVlJ2A7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95YWJsZUF3c0Nka1R5cGVTY3JpcHRBcHBTdGVwc0ZhY3RvcnlQcm9wcyB7XG4gIC8qKlxuICAgKiBEZXBsb3ltZW50IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveU9wdGlvbnM6IERlcGxveU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gY2hlY2sgZm9yIGFjdGl2ZSBkZXBsb3ltZW50cyBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIGRlcGxveW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHRhc2sgdG8gcnVuIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcywgaWYgYW55XG4gICAqL1xuICByZWFkb25seSBwcmVJbnN0YWxsVGFza05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBmb3IgQ29kZUFydGlmYWN0LCBpZiBhbnlcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhQcm92aWRlcj86IENvZGVBcnRpZmFjdEF1dGhQcm92aWRlcjtcblxuICAvKipcbiAgICogVGhlIG5wbSBjb25maWcgdG8gc2V0IHdpdGggdGhlIGVudmlyb25tZW50IHRoYXQgaXMgYmVpbmcgZGVwbG95ZWQsIGlmIGFueVxuICAgKiBOb3RlOiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vZGUgdmVyc2lvbnMgYWJvdmUgMThcbiAgICovXG4gIHJlYWRvbmx5IG5wbUNvbmZpZ0Vudmlyb25tZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXBsb3ltZW50IGpvYiBzdHJhdGVneSwgd2hldGhlciB0byB1c2UgYSBtYXRyaXggam9iIG9yIG11bHRpcGxlIGpvYnMgZm9yIGVhY2ggZW52aXJvbm1lbnRcbiAgICovXG4gIHJlYWRvbmx5IGpvYlN0cmF0ZWd5OiBEZXBsb3lKb2JTdHJhdGVneTtcblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgZGVwbG95bWVudCBkZXBlbmRlbmNpZXMsIGlmIGFueVxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnREZXBlbmRlbmNpZXM/OiBFbnZpcm9ubWVudERlcGxveW1lbnREZXBlbmRlbmNpZXM7XG59XG5cbi8qKlxuICogRmFjdG9yeSB0byBjcmVhdGUgcmV1c2FibGUgc3RlcHMgZm9yIHRoZSBkZXBsb3ltZW50IHdvcmtmbG93XG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3lhYmxlQXdzQ2RrVHlwZVNjcmlwdEFwcFN0ZXBzRmFjdG9yeSB7XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgdGhlIHByb3ZpZGVkIGVudmlyb25tZW50IGRlcGxveW1lbnQgZGVwZW5kZW5jaWVzIGFyZSB2YWxpZFxuICAgKiBAcGFyYW0gZGVwbG95T3B0aW9ucyBUaGUgZGVwbG95bWVudCBvcHRpb25zXG4gICAqIEBwYXJhbSBlbnZpcm9ubWVudERlcGVuZGVuY2llcyBUaGUgZW52aXJvbm1lbnQgZGVwbG95bWVudCBkZXBlbmRlbmNpZXMgdG8gdmFsaWRhdGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVFbnZpcm9ubWVudERlcGxveW1lbnREZXBlbmRlbmNpZXMoXG4gICAgZGVwbG95T3B0aW9uczogRGVwbG95T3B0aW9ucyxcbiAgICBlbnZpcm9ubWVudERlcGVuZGVuY2llczogRW52aXJvbm1lbnREZXBsb3ltZW50RGVwZW5kZW5jaWVzLFxuICApOiB2b2lkIHtcblxuICAgIGlmIChkZXBsb3lPcHRpb25zLmpvYlN0cmF0ZWd5ICE9PSBEZXBsb3lKb2JTdHJhdGVneS5NVUxUSV9KT0IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW52aXJvbm1lbnQgZGVwbG95bWVudCBkZXBlbmRlbmNpZXMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciBNVUxUSV9KT0Igc3RyYXRlZ3knKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZW50cmllcyhlbnZpcm9ubWVudERlcGVuZGVuY2llcykuZm9yRWFjaCgoW2VudiwgZGVwc10pID0+IHtcbiAgICAgIGNvbnN0IGhhc0Vudmlyb25tZW50ID0gZGVwbG95T3B0aW9ucy5lbnZpcm9ubWVudHMuc29tZShlID0+IGUubmFtZSA9PT0gZW52KTtcbiAgICAgIGlmICghaGFzRW52aXJvbm1lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnZpcm9ubWVudCBcIiR7ZW52fVwiIGRlZmluZWQgaW4gZGVwZW5kZW5jaWVzIGRvZXMgbm90IGV4aXN0IGluIGRlcGxveU9wdGlvbnMuZW52aXJvbm1lbnRzYCk7XG4gICAgICB9XG4gICAgICBkZXBzLmZvckVhY2goZGVwID0+IHtcbiAgICAgICAgY29uc3QgaGFzRGVwRW52aXJvbm1lbnQgPSBkZXBsb3lPcHRpb25zLmVudmlyb25tZW50cy5zb21lKGUgPT4gZS5uYW1lID09PSBkZXApO1xuICAgICAgICBpZiAoIWhhc0RlcEVudmlyb25tZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXBlbmRlbmN5IGVudmlyb25tZW50IFwiJHtkZXB9XCIgZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCIgZG9lcyBub3QgZXhpc3QgaW4gZGVwbG95T3B0aW9ucy5lbnZpcm9ubWVudHNgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IERlcGxveWFibGVBd3NDZGtUeXBlU2NyaXB0QXBwU3RlcHNGYWN0b3J5XG4gICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0XG4gICAqIEBwYXJhbSBwcm9wcyBUaGUgZmFjdG9yeSBwcm9wZXJ0aWVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3Q6IGphdmFzY3JpcHQuTm9kZVByb2plY3QsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogRGVwbG95YWJsZUF3c0Nka1R5cGVTY3JpcHRBcHBTdGVwc0ZhY3RvcnlQcm9wcyxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBDb25kaXRpb24gdG8gc2tpcCBhIHN0ZXAgaWYgYW4gYWN0aXZlIGRlcGxveW1lbnQgaXMgYWxyZWFkeSBwcmVzZW50XG4gICAqIEByZXR1cm5zIEpvYlN0ZXAgY29uZGl0aW9uIG9yIHVuZGVmaW5lZCBpZiBjaGVja0FjdGl2ZURlcGxveW1lbnQgaXMgZmFsc2VcbiAgICovXG4gIHB1YmxpYyBnZXQgc2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oKTogSm9iU3RlcCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hlY2tBY3RpdmVEZXBsb3ltZW50ID8geyBpZjogYFxcJHt7ICR7c2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb259IH19YCB9IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGVja291dFN0ZXAoKTogSm9iU3RlcCB7XG4gICAgcmV0dXJuIFdvcmtmbG93U3RlcHMuY2hlY2tvdXQoe1xuICAgICAgd2l0aDoge1xuICAgICAgICBmZXRjaERlcHRoOiAwLFxuICAgICAgICByZWY6ICcke3sgZ2l0aHViLnNoYSB9fScsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdG8gcnVuIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcyBpZiBleGlzdHNcbiAgICogQHJldHVybnMgSm9iU3RlcCBvciB1bmRlZmluZWQgaWYgbm8gcHJlSW5zdGFsbFRhc2tOYW1lIGlzIHByb3ZpZGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByZUluc3RhbGxEZXBlbmRlbmNpZXNTdGVwKCk6IEpvYlN0ZXAgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5wcm9wcy5wcmVJbnN0YWxsVGFza05hbWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuc2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24sXG4gICAgICBuYW1lOiB0aGlzLnByb3BzLnByZUluc3RhbGxUYXNrTmFtZSxcbiAgICAgIHJ1bjogYG5weCBwcm9qZW4gJHt0aGlzLnByb3BzLnByZUluc3RhbGxUYXNrTmFtZX1gLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0byBjaGVjayBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGVwbG95bWVudCBmb3IgdGhlIGVudmlyb25tZW50IGluIHRoZSBtYXRyaXggc3RyYXRlZ3lcbiAgICogQHJldHVybnMgSm9iU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCBjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwRm9yTWF0cml4KCk6IEpvYlN0ZXAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldENoZWNrQWN0aXZlRGVwbG95bWVudFN0ZXBGb3JFbnZpcm9ubWVudCgnJHt7IG1hdHJpeC5lbnZpcm9ubWVudCB9fScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdG8gY2hlY2sgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRlcGxveW1lbnQgZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnRcbiAgICogQHBhcmFtIGVudmlyb25tZW50IFRoZSBlbnZpcm9ubWVudCB0byBjaGVja1xuICAgKiBAcmV0dXJucyBKb2JTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcEZvckVudmlyb25tZW50KGVudmlyb25tZW50OiBzdHJpbmcpOiBKb2JTdGVwIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMucHJvcHMuY2hlY2tBY3RpdmVEZXBsb3ltZW50KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcElkLFxuICAgICAgdXNlczogJ0FtaW5GYXpsTW9uZG8vY2hlY2stZGVwbG95ZWQtZW52aXJvbm1lbnRAdjEnLFxuICAgICAgd2l0aDoge1xuICAgICAgICBlbnZpcm9ubWVudDogZW52aXJvbm1lbnQsXG4gICAgICB9LFxuICAgICAgZW52OiB7XG4gICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0byBzZXR1cCBBV1MgY3JlZGVudGlhbHMgaW4gdGhlIGVudmlyb25tZW50IGZvciB0aGUgbWF0cml4IHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEpvYlN0ZXBbXVxuICAgKi9cbiAgcHVibGljIGdldCBzZXR1cEF3c0NyZWRlbnRpYWxzU3RlcHNGb3JNYXRyaXgoKTogSm9iU3RlcFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5zZXR1cEF3c0NyZWRlbnRpYWxzSW5FbnZpcm9ubWVudEZvck1hdHJpeCxcbiAgICAgIHRoaXMuYXNzdW1lQXdzUm9sZVN0ZXBGb3JNYXRyaXgsXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0ZXBzIHRvIHNldHVwIEFXUyBjcmVkZW50aWFscyBmb3IgYSBzcGVjaWZpYyBlbnZpcm9ubWVudFxuICAgKiBAcGFyYW0gZW52aXJvbm1lbnRPcHRpb25zIFRoZSBlbnZpcm9ubWVudCBvcHRpb25zXG4gICAqIEByZXR1cm5zIEpvYlN0ZXBbXVxuICAgKi9cbiAgcHVibGljIGdldFNldHVwQXdzQ3JlZGVudGlhbHNTdGVwc0ZvckVudmlyb25tZW50KGVudmlyb25tZW50T3B0aW9uczogRW52aXJvbm1lbnRPcHRpb25zKTogSm9iU3RlcFtdIHtcbiAgICBjb25zdCBzdGVwczogSm9iU3RlcFtdID0gW107XG5cbiAgICBjb25zdCBmcm9tRW52VmFyaWFibGVTdGVwID0gdGhpcy5nZXRTZXR1cEF3c0NyZWRlbnRpYWxzSW5FbnZpcm9ubWVudEZvckVudmlyb25tZW50KFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLmF3c0NyZWRlbnRpYWxzLnJvbGVUb0Fzc3VtZSA/IHRydWUgOiBmYWxzZSxcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5hd3NDcmVkZW50aWFscy5hY2Nlc3NLZXlJZFNlY3JldE5hbWUgPz8gJ0FXU19BQ0NFU1NfS0VZX0lEJyxcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5hd3NDcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lID8/ICdBV1NfU0VDUkVUX0FDQ0VTU19LRVknLFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLmF3c0NyZWRlbnRpYWxzLnJlZ2lvbixcbiAgICApO1xuXG4gICAgaWYgKGZyb21FbnZWYXJpYWJsZVN0ZXApIHtcbiAgICAgIHN0ZXBzLnB1c2goZnJvbUVudlZhcmlhYmxlU3RlcCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXNzdW1lUm9sZVN0ZXAgPSB0aGlzLmdldEFzc3VtZUF3c1JvbGVTdGVwRm9yRW52aXJvbm1lbnQoXG4gICAgICBlbnZpcm9ubWVudE9wdGlvbnMuYXdzQ3JlZGVudGlhbHMucm9sZVRvQXNzdW1lID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLmF3c0NyZWRlbnRpYWxzLmFjY2Vzc0tleUlkU2VjcmV0TmFtZSA/PyAnQVdTX0FDQ0VTU19LRVlfSUQnLFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLmF3c0NyZWRlbnRpYWxzLnNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWUgPz8gJ0FXU19TRUNSRVRfQUNDRVNTX0tFWScsXG4gICAgICBlbnZpcm9ubWVudE9wdGlvbnMuYXdzQ3JlZGVudGlhbHMucmVnaW9uLFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLmF3c0NyZWRlbnRpYWxzLnJvbGVUb0Fzc3VtZSA/PyAnJyxcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5hd3NDcmVkZW50aWFscy5hc3N1bWVSb2xlRHVyYXRpb25TZWNvbmRzID8/IDkwMCxcbiAgICApO1xuXG4gICAgaWYgKGFzc3VtZVJvbGVTdGVwKSB7XG4gICAgICBzdGVwcy5wdXNoKGFzc3VtZVJvbGVTdGVwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RlcHM7XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0byBzZXR1cCBBV1MgY3JlZGVudGlhbHMgaW4gdGhlIGVudmlyb25tZW50IGZvciB0aGUgbWF0cml4IHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEpvYlN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgc2V0dXBBd3NDcmVkZW50aWFsc0luRW52aXJvbm1lbnRGb3JNYXRyaXgoKTogSm9iU3RlcCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2V0dXBBd3NDcmVkZW50aWFsc0luRW52aXJvbm1lbnRGb3JFbnZpcm9ubWVudChcbiAgICAgICdtYXRyaXguYXNzdW1lUm9sZScsXG4gICAgICAnbWF0cml4LmFjY2Vzc0tleUlkU2VjcmV0TmFtZScsXG4gICAgICAnbWF0cml4LnNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWUnLFxuICAgICAgJyR7eyBtYXRyaXgucmVnaW9uIH19JyxcbiAgICApITtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwIHRvIHNldHVwIEFXUyBjcmVkZW50aWFscyBpbiB0aGUgZW52aXJvbm1lbnQgZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnRcbiAgICogQHBhcmFtIGFzc3VtZVJvbGVGbGFnIFdoZXRoZXIgdG8gYXNzdW1lIGEgcm9sZSwgY2FuIGJlIGEgYm9vbGVhbiBvciBhIHN0cmluZyBmb3IgbWF0cml4IHN0cmF0ZWd5XG4gICAqIEBwYXJhbSBhY2Nlc3NLZXlJZFNlY3JldE5hbWUgVGhlIEdpdEh1YiBzZWNyZXQgbmFtZSBmb3IgdGhlIGFjY2VzcyBrZXkgSURcbiAgICogQHBhcmFtIHNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWUgVGhlIEdpdEh1YiBzZWNyZXQgbmFtZSBmb3IgdGhlIHNlY3JldCBhY2Nlc3Mga2V5XG4gICAqIEBwYXJhbSByZWdpb24gVGhlIHJlZ2lvblxuICAgKiBAcmV0dXJucyBKb2JTdGVwIG9yIHVuZGVmaW5lZCBpZiBubyBBV1MgY3JlZGVudGlhbHMgYXJlIHByb3ZpZGVkLFxuICAgKiBpZiBhc3N1bWVSb2xlRmxhZyBpcyBib29sZWFuIHdpbGwgYmUgZXZhbHVhdGVkIGFuZCByZXR1cm4gYSBKb2JTdGVwIG9ubHkgaWYgZmFsc2VcbiAgICogaWYgYXNzdW1lUm9sZUZsYWcgaXMgc3RyaW5nIHdpbGwgYWx3YXlzIHJldHVybiBhIEpvYlN0ZXAgKGZvciBtYXRyaXggc3RyYXRlZ3kpXG4gICAqL1xuICBwdWJsaWMgZ2V0U2V0dXBBd3NDcmVkZW50aWFsc0luRW52aXJvbm1lbnRGb3JFbnZpcm9ubWVudChcbiAgICBhc3N1bWVSb2xlRmxhZzogYm9vbGVhbiB8IHN0cmluZyxcbiAgICBhY2Nlc3NLZXlJZFNlY3JldE5hbWU6IHN0cmluZyxcbiAgICBzZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lOiBzdHJpbmcsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICk6IEpvYlN0ZXAgfCB1bmRlZmluZWQge1xuXG4gICAgZnVuY3Rpb24gZ2V0Q29uZGl0aW9uKGZhY3Rvcnk6IERlcGxveWFibGVBd3NDZGtUeXBlU2NyaXB0QXBwU3RlcHNGYWN0b3J5KSB7XG4gICAgICBpZiAodHlwZW9mIGFzc3VtZVJvbGVGbGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgaWYgKGFzc3VtZVJvbGVGbGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFjdG9yeS5wcm9wcy5jaGVja0FjdGl2ZURlcGxveW1lbnQgPyBza2lwSWZBbHJlYWR5QWN0aXZlRGVwbG95bWVudENvbmRpdGlvbiA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWN0b3J5LnByb3BzLmNoZWNrQWN0aXZlRGVwbG95bWVudCA/XG4gICAgICAgIGBcXCR7eyAke2Fzc3VtZVJvbGVGbGFnfSA9PSAnZmFsc2UnICYmICR7c2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb259IH19YCA6XG4gICAgICAgIGBcXCR7eyAke2Fzc3VtZVJvbGVGbGFnfSA9PSAnZmFsc2UnIH19YDtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtcbiAgICAgICdlY2hvIFwiQVdTX0FDQ0VTU19LRVlfSUQ9JGFjY2Vzc0tleUlkXCIgPj4gJEdJVEhVQl9FTlYnLFxuICAgICAgJ2VjaG8gXCJBV1NfU0VDUkVUX0FDQ0VTU19LRVk9JHNlY3JldEFjY2Vzc0tleVwiID4+ICRHSVRIVUJfRU5WJyxcbiAgICAgICdlY2hvIFwiQVdTX1JFR0lPTj0kcmVnaW9uXCIgPj4gJEdJVEhVQl9FTlYnLFxuICAgIF07XG5cbiAgICBpZiAodHlwZW9mIGFzc3VtZVJvbGVGbGFnID09PSAnYm9vbGVhbicgJiYgYXNzdW1lUm9sZUZsYWcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9uID0gZ2V0Q29uZGl0aW9uKHRoaXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlmOiBjb25kaXRpb24sXG4gICAgICBuYW1lOiAnQ29uZmlndXJlIEFXUyBDcmVkZW50aWFscycsXG4gICAgICBydW46IGAke2NvbW1hbmRzLmpvaW4oJ1xcbicpfWAsXG4gICAgICBlbnY6IHtcbiAgICAgICAgYWNjZXNzS2V5SWQ6IGBcXCR7eyBzZWNyZXRzWyR7YWNjZXNzS2V5SWRTZWNyZXROYW1lfV0gfX1gLFxuICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6IGBcXCR7eyBzZWNyZXRzWyR7c2VjcmV0QWNjZXNzS2V5U2VjcmV0TmFtZX1dIH19YCxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdG8gYXNzdW1lIGFuIEFXUyByb2xlIGZvciB0aGUgbWF0cml4IHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEpvYlN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgYXNzdW1lQXdzUm9sZVN0ZXBGb3JNYXRyaXgoKTogSm9iU3RlcCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXNzdW1lQXdzUm9sZVN0ZXBGb3JFbnZpcm9ubWVudChcbiAgICAgICdtYXRyaXguYXNzdW1lUm9sZScsXG4gICAgICAnbWF0cml4LmFjY2Vzc0tleUlkU2VjcmV0TmFtZScsXG4gICAgICAnbWF0cml4LnNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWUnLFxuICAgICAgJyR7eyBtYXRyaXgucmVnaW9uIH19JyxcbiAgICAgICcke3sgbWF0cml4LnJvbGVUb0Fzc3VtZSB9fScsXG4gICAgICAnJHt7IG1hdHJpeC5hc3N1bWVSb2xlRHVyYXRpb25TZWNvbmRzIH19JyxcbiAgICApITtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwIHRvIGFzc3VtZSBhbiBBV1Mgcm9sZSBmb3IgYSBzcGVjaWZpYyBlbnZpcm9ubWVudFxuICAgKiBAcGFyYW0gYXNzdW1lUm9sZUZsYWcgV2hldGhlciB0byBhc3N1bWUgYSByb2xlLCBjYW4gYmUgYSBib29sZWFuIG9yIGEgc3RyaW5nIGZvciBtYXRyaXggc3RyYXRlZ3lcbiAgICogQHBhcmFtIGFjY2Vzc0tleUlkU2VjcmV0TmFtZSBUaGUgR2l0SHViIHNlY3JldCBuYW1lIGZvciB0aGUgYWNjZXNzIGtleSBJRFxuICAgKiBAcGFyYW0gc2VjcmV0QWNjZXNzS2V5U2VjcmV0TmFtZSBUaGUgR2l0SHViIHNlY3JldCBuYW1lIGZvciB0aGUgc2VjcmV0IGFjY2VzcyBrZXlcbiAgICogQHBhcmFtIHJlZ2lvbiBUaGUgcmVnaW9uXG4gICAqIEBwYXJhbSByb2xlVG9Bc3N1bWUgVGhlIHJvbGUgdG8gYXNzdW1lXG4gICAqIEBwYXJhbSBhc3N1bWVSb2xlRHVyYXRpb25TZWNvbmRzIFRoZSBkdXJhdGlvbiBmb3IgYXNzdW1pbmcgdGhlIHJvbGVcbiAgICogQHJldHVybnMgSm9iU3RlcCBvciB1bmRlZmluZWQgaWYgYXNzdW1lUm9sZUZsYWcgaXMgYm9vbGVhbiBhbmQgZmFsc2VcbiAgICogaWYgYXNzdW1lUm9sZUZsYWcgaXMgc3RyaW5nIHdpbGwgYWx3YXlzIHJldHVybiBhIEpvYlN0ZXAgKGZvciBtYXRyaXggc3RyYXRlZ3kpXG4gICAqL1xuICBwdWJsaWMgZ2V0QXNzdW1lQXdzUm9sZVN0ZXBGb3JFbnZpcm9ubWVudChcbiAgICBhc3N1bWVSb2xlRmxhZzogYm9vbGVhbiB8IHN0cmluZyxcbiAgICBhY2Nlc3NLZXlJZFNlY3JldE5hbWU6IHN0cmluZyxcbiAgICBzZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lOiBzdHJpbmcsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcm9sZVRvQXNzdW1lOiBzdHJpbmcsXG4gICAgYXNzdW1lUm9sZUR1cmF0aW9uU2Vjb25kcz86IHN0cmluZyB8IG51bWJlcixcbiAgKTogSm9iU3RlcCB8IHVuZGVmaW5lZCB7XG4gICAgZnVuY3Rpb24gZ2V0Q29uZGl0aW9uKGZhY3Rvcnk6IERlcGxveWFibGVBd3NDZGtUeXBlU2NyaXB0QXBwU3RlcHNGYWN0b3J5KSB7XG4gICAgICBpZiAodHlwZW9mIGFzc3VtZVJvbGVGbGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgaWYgKCFhc3N1bWVSb2xlRmxhZykge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhY3RvcnkucHJvcHMuY2hlY2tBY3RpdmVEZXBsb3ltZW50ID8gc2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFjdG9yeS5wcm9wcy5jaGVja0FjdGl2ZURlcGxveW1lbnQgP1xuICAgICAgICBgXFwke3sgJHthc3N1bWVSb2xlRmxhZ30gPT0gJ3RydWUnICYmICR7c2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb259IH19YCA6XG4gICAgICAgIGBcXCR7eyAke2Fzc3VtZVJvbGVGbGFnfSA9PSAndHJ1ZScgfX1gO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXNzdW1lUm9sZUZsYWcgPT09ICdib29sZWFuJyAmJiAhYXNzdW1lUm9sZUZsYWcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9uID0gZ2V0Q29uZGl0aW9uKHRoaXMpO1xuXG4gICAgY29uc3Qgc2VjcmV0c1BhcmFtcyA9XG4gICAgICB0aGlzLnByb3BzLmF1dGhQcm92aWRlciA9PT0gQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyLkFDQ0VTU19BTkRfU0VDUkVUX0tFWV9QQUlSID9cbiAgICAgICAge1xuICAgICAgICAgICdhd3MtYWNjZXNzLWtleS1pZCc6IGBcXCR7eyBzZWNyZXRzWyR7YWNjZXNzS2V5SWRTZWNyZXROYW1lfV0gfX1gLFxuICAgICAgICAgICdhd3Mtc2VjcmV0LWFjY2Vzcy1rZXknOiBgXFwke3sgc2VjcmV0c1ske3NlY3JldEFjY2Vzc0tleVNlY3JldE5hbWV9XSB9fWAsXG4gICAgICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlmOiBjb25kaXRpb24sXG4gICAgICBuYW1lOiAnQXNzdW1lIEFXUyBSb2xlJyxcbiAgICAgIHVzZXM6ICdhd3MtYWN0aW9ucy9jb25maWd1cmUtYXdzLWNyZWRlbnRpYWxzQHY0JyxcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgLi4uc2VjcmV0c1BhcmFtcyxcbiAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogcm9sZVRvQXNzdW1lLFxuICAgICAgICAnYXdzLXJlZ2lvbic6IHJlZ2lvbixcbiAgICAgICAgJ3JvbGUtZHVyYXRpb24tc2Vjb25kcyc6IGFzc3VtZVJvbGVEdXJhdGlvblNlY29uZHMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0byBzZXR1cCBOUE0gY29uZmlnIGlmIHByb3ZpZGVkXG4gICAqIEByZXR1cm5zIEpvYlN0ZXAgb3IgdW5kZWZpbmVkIGlmIG5vIG5wbUNvbmZpZyBpcyBwcm92aWRlZFxuICAgKi9cbiAgcHVibGljIGdldCBzZXR1cE5wbUNvbmZpZ0Zvck1hdHJpeCgpOiBKb2JTdGVwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTZXR1cE5wbUNvbmZpZ0ZvckVudmlyb25tZW50KCcke3sgbWF0cml4LmVudmlyb25tZW50IH19Jyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dXBOcG1Db25maWdGb3JFbnZpcm9ubWVudChlbnZpcm9ubWVudDogc3RyaW5nKTogSm9iU3RlcCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBucG1Db25maWdFbnZpcm9ubWVudCB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoIW5wbUNvbmZpZ0Vudmlyb25tZW50KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50VmFyaWFibGVOYW1lID0gJ0NPTkZJR19WQUxVRSc7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuc2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24sXG4gICAgICBuYW1lOiAnU2V0dGluZyBOUE0gQ29uZmlnJyxcbiAgICAgIGVudjoge1xuICAgICAgICBbZW52aXJvbm1lbnRWYXJpYWJsZU5hbWVdOiBlbnZpcm9ubWVudCxcbiAgICAgIH0sXG4gICAgICBydW46IGBucG0gY29uZmlnIHNldCAke25wbUNvbmZpZ0Vudmlyb25tZW50fSAkJHtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZX1gLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdGVwIHRvIHJ1biBhIHNwZWNpZmljIHNjcmlwdFxuICAgKiBAcGFyYW0gc2NyaXB0TmFtZSBUaGUgbmFtZSBvZiB0aGUgc2NyaXB0IHRvIHJ1blxuICAgKiBAcGFyYW0gc3RlcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHN0ZXAgaW4gdGhlIHdvcmtmbG93XG4gICAqIEBwYXJhbSBoYXNTY3JpcHRGbGFnIFdoZXRoZXIgdGhlIHNjcmlwdCBzaG91bGQgYmUgcnVuXG4gICAqIEByZXR1cm5zIFRoZSBqb2Igc3RlcCB0byBydW4gdGhlIHNjcmlwdCBvciB1bmRlZmluZWQgaWYgbm90IGFwcGxpY2FibGVcbiAgICogSWYgaGFzU2NyaXB0RmxhZyBpcyBib29sZWFuIGFuZCBmYWxzZSB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICogSWYgaGFzU2NyaXB0RmxhZyBpcyBzdHJpbmcgd2lsbCBhbHdheXMgcmV0dXJuIGEgSm9iU3RlcCAoZm9yIG1hdHJpeCBzdHJhdGVneSlcbiAgICovXG4gIHB1YmxpYyBnZXRSdW5TY3JpcHRTdGVwKFxuICAgIHNjcmlwdE5hbWU6IHN0cmluZyxcbiAgICBzdGVwTmFtZTogc3RyaW5nLFxuICAgIGhhc1NjcmlwdEZsYWc6IGJvb2xlYW4gfCBzdHJpbmcsXG4gICk6IEpvYlN0ZXAgfCB1bmRlZmluZWQge1xuICAgIGZ1bmN0aW9uIGdldENvbmRpdGlvbihmYWN0b3J5OiBEZXBsb3lhYmxlQXdzQ2RrVHlwZVNjcmlwdEFwcFN0ZXBzRmFjdG9yeSkge1xuICAgICAgaWYgKHR5cGVvZiBoYXNTY3JpcHRGbGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgaWYgKCFoYXNTY3JpcHRGbGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFjdG9yeS5wcm9wcy5jaGVja0FjdGl2ZURlcGxveW1lbnQgPyBza2lwSWZBbHJlYWR5QWN0aXZlRGVwbG95bWVudENvbmRpdGlvbiA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWN0b3J5LnByb3BzLmNoZWNrQWN0aXZlRGVwbG95bWVudCA/XG4gICAgICAgIGBcXCR7eyAke2hhc1NjcmlwdEZsYWd9ID09ICd0cnVlJyAmJiAke3NraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9ufSB9fWAgOlxuICAgICAgICBgXFwke3sgJHtoYXNTY3JpcHRGbGFnfSA9PSAndHJ1ZScgfX1gO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGhhc1NjcmlwdEZsYWcgPT09ICdib29sZWFuJyAmJiAhaGFzU2NyaXB0RmxhZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25kaXRpb24gPSBnZXRDb25kaXRpb24odGhpcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWY6IGNvbmRpdGlvbixcbiAgICAgIG5hbWU6IGBSdW4gJHtzdGVwTmFtZX1gLFxuICAgICAgcnVuOiBgJHt0aGlzLnByb2plY3QucnVuU2NyaXB0Q29tbWFuZH0gJHtzY3JpcHROYW1lfWAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwIHRvIGRlcGxveSB0aGUgd29ya2Zsb3dcbiAgICogQHJldHVybnMgSm9iU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCBkZXBsb3ltZW50U3RlcCgpOiBKb2JTdGVwIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSdW5TY3JpcHRTdGVwKFxuICAgICAgJ2RlcGxveTp3b3JrZmxvdycsXG4gICAgICAnRGVwbG95bWVudCcsXG4gICAgICB0cnVlLFxuICAgICkhO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdG8gcnVuIHBvc3QgZGVwbG95bWVudCBzY3JpcHQgaW4gbWF0cml4IHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEpvYlN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJlRGVwbG95bWVudFN0ZXBGb3JNYXRyaXgoKTogSm9iU3RlcCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJlRGVwbG95bWVudFN0ZXBGb3JFbnZpcm9ubWVudChcbiAgICAgICdtYXRyaXguaGFzUHJlRGVwbG95VGFzaycsXG4gICAgICAnJHt7IG1hdHJpeC5wcmVEZXBsb3ltZW50U2NyaXB0IH19JyxcbiAgICApITtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHByZS1kZXBsb3ltZW50IHN0ZXAgZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnRcbiAgICogQHBhcmFtIGhhc1ByZURlcGxveVRhc2tGbGFnIFdoZXRoZXIgdGhlIHByZS1kZXBsb3ltZW50IHRhc2sgc2hvdWxkIGJlIHJ1blxuICAgKiBAcGFyYW0gcHJlRGVwbG95bWVudFNjcmlwdCBUaGUgc2NyaXB0IHRvIHJ1blxuICAgKiBAcmV0dXJucyBUaGUgam9iIHN0ZXAgdG8gcnVuIHRoZSBwcmUtZGVwbG95bWVudCBzY3JpcHQgb3IgdW5kZWZpbmVkIGlmIG5vdCBhcHBsaWNhYmxlXG4gICAqIElmIGhhc1ByZURlcGxveVRhc2tGbGFnIGlzIGJvb2xlYW4gYW5kIGZhbHNlIHdpbGwgcmV0dXJuIHVuZGVmaW5lZFxuICAgKiBJZiBoYXNQcmVEZXBsb3lUYXNrRmxhZyBpcyBzdHJpbmcgd2lsbCBhbHdheXMgcmV0dXJuIGEgSm9iU3RlcCAoZm9yIG1hdHJpeCBzdHJhdGVneSlcbiAgICovXG4gIHB1YmxpYyBnZXRQcmVEZXBsb3ltZW50U3RlcEZvckVudmlyb25tZW50KFxuICAgIGhhc1ByZURlcGxveVRhc2tGbGFnOiBib29sZWFuIHwgc3RyaW5nLFxuICAgIHByZURlcGxveW1lbnRTY3JpcHQ6IHN0cmluZyxcbiAgKTogSm9iU3RlcCB8IHVuZGVmaW5lZCB7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRSdW5TY3JpcHRTdGVwKFxuICAgICAgcHJlRGVwbG95bWVudFNjcmlwdCxcbiAgICAgICdQcmUgRGVwbG95bWVudCcsXG4gICAgICBoYXNQcmVEZXBsb3lUYXNrRmxhZyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdG8gcnVuIHBvc3QgZGVwbG95bWVudCBzY3JpcHQgaW4gbWF0cml4IHN0cmF0ZWd5XG4gICAqIEByZXR1cm5zIEpvYlN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcG9zdERlcGxveW1lbnRTdGVwRm9yTWF0cml4KCk6IEpvYlN0ZXAge1xuICAgIHJldHVybiB0aGlzLmdldFBvc3REZXBsb3ltZW50U3RlcEZvckVudmlyb25tZW50KFxuICAgICAgJ21hdHJpeC5oYXNQb3N0RGVwbG95VGFzaycsXG4gICAgICAnJHt7IG1hdHJpeC5wb3N0RGVwbG95bWVudFNjcmlwdCB9fScsXG4gICAgKSE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwb3N0LWRlcGxveW1lbnQgc3RlcCBmb3IgYSBzcGVjaWZpYyBlbnZpcm9ubWVudFxuICAgKiBAcGFyYW0gaGFzUG9zdERlcGxveVRhc2tGbGFnIFdoZXRoZXIgdGhlIHBvc3QtZGVwbG95bWVudCB0YXNrIHNob3VsZCBiZSBydW5cbiAgICogQHBhcmFtIHBvc3REZXBsb3ltZW50U2NyaXB0IFRoZSBzY3JpcHQgdG8gcnVuXG4gICAqIEByZXR1cm5zIFRoZSBqb2Igc3RlcCB0byBydW4gdGhlIHBvc3QtZGVwbG95bWVudCBzY3JpcHQgb3IgdW5kZWZpbmVkIGlmIG5vdCBhcHBsaWNhYmxlXG4gICAqIElmIGhhc1Bvc3REZXBsb3lUYXNrRmxhZyBpcyBib29sZWFuIGFuZCBmYWxzZSB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICogSWYgaGFzUG9zdERlcGxveVRhc2tGbGFnIGlzIHN0cmluZyB3aWxsIGFsd2F5cyByZXR1cm4gYSBKb2JTdGVwIChmb3IgbWF0cml4IHN0cmF0ZWd5KVxuICAgKi9cbiAgcHVibGljIGdldFBvc3REZXBsb3ltZW50U3RlcEZvckVudmlyb25tZW50KFxuICAgIGhhc1Bvc3REZXBsb3lUYXNrRmxhZzogYm9vbGVhbiB8IHN0cmluZyxcbiAgICBwb3N0RGVwbG95bWVudFNjcmlwdDogc3RyaW5nLFxuICApOiBKb2JTdGVwIHwgdW5kZWZpbmVkIHtcblxuICAgIHJldHVybiB0aGlzLmdldFJ1blNjcmlwdFN0ZXAoXG4gICAgICBwb3N0RGVwbG95bWVudFNjcmlwdCxcbiAgICAgICdQb3N0IERlcGxveW1lbnQnLFxuICAgICAgaGFzUG9zdERlcGxveVRhc2tGbGFnLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBkZXBsb3ltZW50IGpvYnMgd2hldGhlciBmb3IgbWF0cml4IHN0cmF0ZWd5IG9yIG5vdFxuICAgKiBAcmV0dXJucyBSZWNvcmQgb2Ygam9ic1xuICAgKi9cbiAgcHVibGljIGdldCBkZXBsb3ltZW50Sm9icygpOiBSZWNvcmQ8c3RyaW5nLCBKb2I+IHtcblxuICAgIGlmICh0aGlzLnByb3BzLmRlcGxveU9wdGlvbnMuZW52aXJvbm1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci53YXJuKCdUaGUgcHJvamVjdCBkb2VzIG5vdCBoYXZlIGFueSBlbnZpcm9ubWVudCBzZXQsIG1ha2Ugc3VyZSB0aGlzIGlzIGRlc2lyZWQgc2V0dGluZycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5qb2JTdHJhdGVneSA9PT0gRGVwbG95Sm9iU3RyYXRlZ3kuTUFUUklYID8gdGhpcy5kZXBsb3ltZW50Sm9ic0Zvck1hdHJpeCA6IHRoaXMuZ2V0RGVwbG95bWVudEpvYnNGb3JNdWx0aUpvYigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZXBsb3ltZW50IGpvYnMgZm9yIG1hdHJpeCBzdHJhdGVneVxuICAgKiBAcmV0dXJucyBSZWNvcmQgb2Ygam9ic1xuICAgKi9cbiAgcHVibGljIGdldCBkZXBsb3ltZW50Sm9ic0Zvck1hdHJpeCgpOiBSZWNvcmQ8c3RyaW5nLCBKb2I+IHtcblxuICAgIGNvbnN0IHsgZW52aXJvbm1lbnRzLCBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZSB9ID0gdGhpcy5wcm9wcy5kZXBsb3lPcHRpb25zO1xuXG4gICAgY29uc3QgaW5jbHVkZSA9IGVudmlyb25tZW50cy5tYXAoZW52aXJvbm1lbnRPcHRpb25zID0+IHtcbiAgICAgIGNvbnN0IHsgYXdzQ3JlZGVudGlhbHMgfSA9IGVudmlyb25tZW50T3B0aW9ucztcblxuICAgICAgY29uc3QgYXNzdW1lUm9sZSA9IGF3c0NyZWRlbnRpYWxzLnJvbGVUb0Fzc3VtZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG5cbiAgICAgIGNvbnN0IGFzc3VtZVJvbGVTZXR0aW5ncyA9IGF3c0NyZWRlbnRpYWxzLnJvbGVUb0Fzc3VtZSA/IHtcbiAgICAgICAgcm9sZVRvQXNzdW1lOiBhd3NDcmVkZW50aWFscy5yb2xlVG9Bc3N1bWUsXG4gICAgICAgIGFzc3VtZVJvbGVEdXJhdGlvblNlY29uZHM6IGF3c0NyZWRlbnRpYWxzLmFzc3VtZVJvbGVEdXJhdGlvblNlY29uZHMgfHwgOTAwLFxuICAgICAgfTogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBhY2Nlc3NLZXlJZFNlY3JldE5hbWUgPSBhd3NDcmVkZW50aWFscy5hY2Nlc3NLZXlJZFNlY3JldE5hbWUgPz8gJ0FXU19BQ0NFU1NfS0VZX0lEJztcbiAgICAgIGNvbnN0IHNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWUgPSBhd3NDcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lID8/ICdBV1NfU0VDUkVUX0FDQ0VTU19LRVknO1xuXG4gICAgICBjb25zdCBoYXNQb3N0RGVwbG95VGFzayA9IGVudmlyb25tZW50T3B0aW9ucy5wb3N0RGVwbG95V29ya2Zsb3dTY3JpcHQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgY29uc3QgaGFzUHJlRGVwbG95VGFzayA9IGVudmlyb25tZW50T3B0aW9ucy5wcmVEZXBsb3lXb3JrZmxvd1NjcmlwdCA/ICd0cnVlJyA6ICdmYWxzZSc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudE9wdGlvbnMubmFtZSxcbiAgICAgICAgYWNjZXNzS2V5SWRTZWNyZXROYW1lLFxuICAgICAgICBzZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lLFxuICAgICAgICByZWdpb246IGF3c0NyZWRlbnRpYWxzLnJlZ2lvbixcbiAgICAgICAgYXNzdW1lUm9sZSxcbiAgICAgICAgaGFzUG9zdERlcGxveVRhc2ssXG4gICAgICAgIHBvc3REZXBsb3ltZW50U2NyaXB0OiBlbnZpcm9ubWVudE9wdGlvbnMucG9zdERlcGxveVdvcmtmbG93U2NyaXB0IHx8ICcnLFxuICAgICAgICBoYXNQcmVEZXBsb3lUYXNrLFxuICAgICAgICBwcmVEZXBsb3ltZW50U2NyaXB0OiBlbnZpcm9ubWVudE9wdGlvbnMucHJlRGVwbG95V29ya2Zsb3dTY3JpcHQgfHwgJycsXG4gICAgICAgIC4uLmFzc3VtZVJvbGVTZXR0aW5ncyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBkZXBsb3lKb2JFbnYgPSBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZSA/IHtcbiAgICAgIFtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZV06ICcke3sgbWF0cml4LmVudmlyb25tZW50IH19JyxcbiAgICB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgam9iRGVmaW5pdGlvbjogSm9iID0ge1xuICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgICdncm91cCc6ICcke3sgbWF0cml4LmVudmlyb25tZW50IH19LWRlcGxveScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBuZWVkczogW1xuICAgICAgICAncmVsZWFzZV9naXRodWInLFxuICAgICAgXSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgIGRlcGxveW1lbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgIGlkVG9rZW46IHRoaXMucHJvcHMuYXV0aFByb3ZpZGVyID09PSBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIuR0lUSFVCX09JREMgPyBKb2JQZXJtaXNzaW9uLldSSVRFIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHN0cmF0ZWd5OiB7XG4gICAgICAgIG1heFBhcmFsbGVsOiAxLFxuICAgICAgICBtYXRyaXg6IHtcbiAgICAgICAgICBkb21haW46IHtcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBpbmNsdWRlLm1hcChlID0+IGUuZW52aXJvbm1lbnQpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5jbHVkZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBuYW1lOiAnJHt7IG1hdHJpeC5lbnZpcm9ubWVudCB9fScsXG4gICAgICB9LFxuICAgICAgZW52OiBkZXBsb3lKb2JFbnYsXG4gICAgICBzdGVwczogW10sXG4gICAgfTtcblxuICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaCh0aGlzLmNoZWNrb3V0U3RlcCk7XG5cbiAgICBjb25zdCBwcmVJbnN0YWxsRGVwZW5kZW5jaWVzU3RlcCA9IHRoaXMucHJlSW5zdGFsbERlcGVuZGVuY2llc1N0ZXA7XG4gICAgaWYgKHByZUluc3RhbGxEZXBlbmRlbmNpZXNTdGVwKSB7XG4gICAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2gocHJlSW5zdGFsbERlcGVuZGVuY2llc1N0ZXApO1xuICAgIH1cblxuICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaCguLi4odGhpcy5wcm9qZWN0KS5yZW5kZXJXb3JrZmxvd1NldHVwKCkpO1xuXG4gICAgY29uc3QgY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcEZvck1hdHJpeCA9IHRoaXMuY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcEZvck1hdHJpeDtcbiAgICBpZiAoY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcEZvck1hdHJpeCkge1xuICAgICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKGNoZWNrQWN0aXZlRGVwbG95bWVudFN0ZXBGb3JNYXRyaXgpO1xuICAgIH1cblxuICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaCguLi50aGlzLnNldHVwQXdzQ3JlZGVudGlhbHNTdGVwc0Zvck1hdHJpeCk7XG5cbiAgICBjb25zdCBzZXR1cE5wbUNvbmZpZ1N0ZXAgPSB0aGlzLnNldHVwTnBtQ29uZmlnRm9yTWF0cml4O1xuICAgIGlmIChzZXR1cE5wbUNvbmZpZ1N0ZXApIHtcbiAgICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaChzZXR1cE5wbUNvbmZpZ1N0ZXApO1xuICAgIH1cblxuICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaCh0aGlzLnByZURlcGxveW1lbnRTdGVwRm9yTWF0cml4KTtcbiAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2godGhpcy5kZXBsb3ltZW50U3RlcCk7XG4gICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKHRoaXMucG9zdERlcGxveW1lbnRTdGVwRm9yTWF0cml4KTtcblxuICAgIHJldHVybiB7IGRlcGxveTogam9iRGVmaW5pdGlvbiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgSURzIG9mIHRoZSBqb2JzIHRoYXQgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQncyBkZXBsb3ltZW50IGpvYlxuICAgKiBAcGFyYW0gZW52aXJvbm1lbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudFxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBqb2IgSURzXG4gICAqL1xuICBwdWJsaWMgZ2V0RGVwbG95bWVudEpvYlByZXJlcXVpc2l0ZUpvYklkcyhlbnZpcm9ubWVudE5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbJ3JlbGVhc2VfZ2l0aHViJ107XG4gICAgaWYgKCF0aGlzLnByb3BzLmVudmlyb25tZW50RGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMucHJvcHMuZGVwbG95T3B0aW9ucy5lbnZpcm9ubWVudHMuZmluZEluZGV4KGVudiA9PiBlbnYubmFtZSA9PT0gZW52aXJvbm1lbnROYW1lKTtcbiAgICAgIGNvbnN0IHByZXJlcXVpc2l0ZUVudmlyb25tZW50ID0gaW5kZXggPiAwID8gdGhpcy5wcm9wcy5kZXBsb3lPcHRpb25zLmVudmlyb25tZW50c1tpbmRleCAtIDFdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHByZXJlcXVpc2l0ZUVudmlyb25tZW50KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGdldERlcGxveUpvYklkKHByZXJlcXVpc2l0ZUVudmlyb25tZW50Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gdGhpcy5wcm9wcy5lbnZpcm9ubWVudERlcGVuZGVuY2llc1tlbnZpcm9ubWVudE5hbWVdO1xuICAgICAgaWYgKGRlcGVuZGVuY2llcykge1xuICAgICAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaChkZXAgPT4ge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGdldERlcGxveUpvYklkKGRlcCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGVwbG95bWVudCBqb2JzIGZvciBtdWx0aS1qb2Igc3RyYXRlZ3lcbiAgICogQHJldHVybnMgUmVjb3JkIG9mIGpvYnNcbiAgICovXG4gIHB1YmxpYyBnZXREZXBsb3ltZW50Sm9ic0Zvck11bHRpSm9iKCk6IFJlY29yZDxzdHJpbmcsIEpvYj4ge1xuICAgIGNvbnN0IHsgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWUsIGVudmlyb25tZW50cyB9ID0gdGhpcy5wcm9wcy5kZXBsb3lPcHRpb25zO1xuICAgIGNvbnN0IGpvYnMgPSBlbnZpcm9ubWVudHMubWFwKChlbnZpcm9ubWVudE9wdGlvbnMpOiBbc3RyaW5nLCBKb2JdID0+IHtcbiAgICAgIHJldHVybiBbZ2V0RGVwbG95Sm9iSWQoZW52aXJvbm1lbnRPcHRpb25zLm5hbWUpLCB0aGlzLmdldEpvYkZvckVudmlyb25tZW50KGVudmlyb25tZW50T3B0aW9ucywgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWUpXTtcbiAgICB9KTtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGpvYnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgam9iIGRlZmluaXRpb24gZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnRcbiAgICogQHBhcmFtIGVudmlyb25tZW50T3B0aW9ucyBUaGUgZW52aXJvbm1lbnQgb3B0aW9uc1xuICAgKiBAcGFyYW0gZW52aXJvbm1lbnRWYXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNldCB3aXRoIHRoZSBlbnZpcm9ubWVudCBuYW1lLCBpZiBhbnlcbiAgICogQHJldHVybnMgVGhlIGpvYiBkZWZpbml0aW9uIGZvciB0aGUgZW52aXJvbm1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXRKb2JGb3JFbnZpcm9ubWVudChcbiAgICBlbnZpcm9ubWVudE9wdGlvbnM6IEVudmlyb25tZW50T3B0aW9ucyxcbiAgICBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApOiBKb2Ige1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gZW52aXJvbm1lbnRPcHRpb25zO1xuICAgIGNvbnN0IGRlcGxveUpvYkVudiA9IGVudmlyb25tZW50VmFyaWFibGVOYW1lID8ge1xuICAgICAgW2Vudmlyb25tZW50VmFyaWFibGVOYW1lXTogbmFtZSxcbiAgICB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgam9iRGVmaW5pdGlvbjogSm9iID0ge1xuICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgICdncm91cCc6IGAke25hbWV9LWRlcGxveWAsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBuZWVkczogdGhpcy5nZXREZXBsb3ltZW50Sm9iUHJlcmVxdWlzaXRlSm9iSWRzKG5hbWUpLFxuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgZGVwbG95bWVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgaWRUb2tlbjogdGhpcy5wcm9wcy5hdXRoUHJvdmlkZXIgPT09IENvZGVBcnRpZmFjdEF1dGhQcm92aWRlci5HSVRIVUJfT0lEQyA/IEpvYlBlcm1pc3Npb24uV1JJVEUgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgIH0sXG4gICAgICBlbnY6IGRlcGxveUpvYkVudixcbiAgICAgIHN0ZXBzOiBbXSxcbiAgICB9O1xuXG4gICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKHRoaXMuY2hlY2tvdXRTdGVwKTtcblxuICAgIGNvbnN0IHByZUluc3RhbGxEZXBlbmRlbmNpZXNTdGVwID0gdGhpcy5wcmVJbnN0YWxsRGVwZW5kZW5jaWVzU3RlcDtcbiAgICBpZiAocHJlSW5zdGFsbERlcGVuZGVuY2llc1N0ZXApIHtcbiAgICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaChwcmVJbnN0YWxsRGVwZW5kZW5jaWVzU3RlcCk7XG4gICAgfVxuXG4gICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKC4uLih0aGlzLnByb2plY3QpLnJlbmRlcldvcmtmbG93U2V0dXAoKSk7XG5cbiAgICBjb25zdCBjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwID0gdGhpcy5nZXRDaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwRm9yRW52aXJvbm1lbnQobmFtZSk7XG4gICAgaWYgKGNoZWNrQWN0aXZlRGVwbG95bWVudFN0ZXApIHtcbiAgICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaChjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwKTtcbiAgICB9XG5cbiAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2goLi4udGhpcy5nZXRTZXR1cEF3c0NyZWRlbnRpYWxzU3RlcHNGb3JFbnZpcm9ubWVudChlbnZpcm9ubWVudE9wdGlvbnMpKTtcblxuICAgIGNvbnN0IHNldHVwTnBtQ29uZmlnU3RlcCA9IHRoaXMuZ2V0U2V0dXBOcG1Db25maWdGb3JFbnZpcm9ubWVudChuYW1lKTtcbiAgICBpZiAoc2V0dXBOcG1Db25maWdTdGVwKSB7XG4gICAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2goc2V0dXBOcG1Db25maWdTdGVwKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVEZXBsb3ltZW50U3RlcCA9IHRoaXMuZ2V0UHJlRGVwbG95bWVudFN0ZXBGb3JFbnZpcm9ubWVudChcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5wcmVEZXBsb3lXb3JrZmxvd1NjcmlwdCA/IHRydWUgOiBmYWxzZSxcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5wcmVEZXBsb3lXb3JrZmxvd1NjcmlwdCB8fCAnJyxcbiAgICApO1xuICAgIGlmIChwcmVEZXBsb3ltZW50U3RlcCkge1xuICAgICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKHByZURlcGxveW1lbnRTdGVwKTtcbiAgICB9XG5cbiAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2godGhpcy5kZXBsb3ltZW50U3RlcCk7XG5cbiAgICBjb25zdCBwb3N0RGVwbG95bWVudFN0ZXAgPSB0aGlzLmdldFBvc3REZXBsb3ltZW50U3RlcEZvckVudmlyb25tZW50KFxuICAgICAgZW52aXJvbm1lbnRPcHRpb25zLnBvc3REZXBsb3lXb3JrZmxvd1NjcmlwdCA/IHRydWUgOiBmYWxzZSxcbiAgICAgIGVudmlyb25tZW50T3B0aW9ucy5wb3N0RGVwbG95V29ya2Zsb3dTY3JpcHQgfHwgJycsXG4gICAgKTtcbiAgICBpZiAocG9zdERlcGxveW1lbnRTdGVwKSB7XG4gICAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2gocG9zdERlcGxveW1lbnRTdGVwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gam9iRGVmaW5pdGlvbjtcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIGdldERlcGxveUpvYklkKGVudmlyb25tZW50TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBEZXBsb3ktJHtlbnZpcm9ubWVudE5hbWV9YDtcbn1cbiJdfQ==